Skip to content

feat(control-ui): add right-click Reply in Dashboard webchat#92654

Merged
vincentkoc merged 3 commits into
openclaw:mainfrom
programmingWTF:feat/webchat-reply
Jun 29, 2026
Merged

feat(control-ui): add right-click Reply in Dashboard webchat#92654
vincentkoc merged 3 commits into
openclaw:mainfrom
programmingWTF:feat/webchat-reply

Conversation

@programmingWTF

@programmingWTF programmingWTF commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds right-click Reply to messages in the Dashboard / Control UI webchat
  • Right-click any chat bubble → "Reply" option → reply preview bar appears above the composer → type reply → message auto-prepended with Markdown blockquote
  • Click ✕ on the preview bar or press Escape to cancel the reply

How it works

Three new optional props on ChatProps (replyTarget, onSetReply, onClearReply) wired through app-render.ts into renderChat. A @state() chatReplyTarget on the app class holds the transient reply target. On send, handleSendChat reads the target, prepends a Markdown blockquote via prependReplyQuote, and clears the state.

Quote format (what the model receives)

Quoted message Your reply Sent to model
hello world got it > **User:** hello world

got it
line one
line two
ok > **User:**
> line one
> line two

ok

Linked context

Closes #16896

Real behavior proof

  • Behavior or issue addressed: Users previously had to manually copy-paste messages to reference them. Now right-click → Reply sets a reply target with a visual preview, and the message is automatically quoted on send.
  • Real environment tested: OpenClaw dev build (vite), WSL2 Ubuntu 22.04 on Windows 11, Chromium
  • Exact steps or command run after this patch:
    1. cd ui && pnpm dev
    2. Right-click a chat bubble → context menu shows speech-bubble icon + "Reply"
    3. Click "Reply" → preview bar appears above composer with sender name, quoted text, and visible ✕
    4. Type a response and send
    5. Sent message includes > **User:** ... Markdown blockquote
    6. Click ✕ or press Escape → preview bar dismissed, plain send unaffected
  • Evidence after fix:
Right-click context menu with Reply option Reply preview bar above composer with dismiss button Sent message showing Markdown blockquote
  • Observed result after fix: Right-click reply works end-to-end. Context menu shows proper icon. Preview bar appears with sender name, quoted text, and visible dismiss button. Quoted message is prepended with correct Markdown format on send. Dismiss clears the state. Plain send without reply target is unaffected.
  • What was not tested: Long message truncation in preview (>120 chars), interaction with slash commands while reply target is active, queueing behavior when chat is busy
  • Before evidence: Before this change, the Control UI had no reply affordance — users had to manually copy text and paste with > prefix.

Files changed

ui/src/ui/app-chat.ts        — prependReplyQuote + queue ordering fix
ui/src/ui/app-render.ts      — wire replyTarget/onSetReply/onClearReply into renderChat
ui/src/ui/app-view-state.ts  — add chatReplyTarget to AppViewState type
ui/src/ui/app.ts             — add @state() chatReplyTarget to OpenClawApp
ui/src/ui/views/chat.ts      — context-menu handler, reply preview bar, ChatProps additions
ui/src/styles/chat/layout.css — reply preview bar + context menu styles

Risk checklist

  • User-visible behavior change: Yes — new right-click Reply in Control UI
  • Config / migration / security / network: No changes
  • Highest-risk area: bubble.textContent extraction for quote text; mitigated by .trim().slice(0, 500)
  • Risk mitigation: Reply target is transient state only, cleared on send or dismiss. No persistence.

Copilot AI review requested due to automatic review settings June 13, 2026 10:32
@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui size: M proof: supplied External PR includes structured after-fix real behavior proof. labels Jun 13, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a “reply to message” UX to chat by letting users pick a message via right-click, showing a reply preview above the composer, and prefixing outgoing messages with a quoted block.

Changes:

  • Add reply-target props + UI preview bar in the chat composer
  • Add a custom right-click context menu on chat bubbles to set the reply target
  • Prefix sent messages with a Markdown quote of the selected message; add CSS for preview/menu styling

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 11 comments.

File Description
ui/src/ui/views/chat.ts Adds context-menu selection of a reply target and renders the reply preview in the composer.
ui/src/ui/app-chat.ts Stores reply target in the host and prepends a quoted reply block to outgoing messages.
ui/src/styles/chat/layout.css Styles the reply preview and custom context menu; includes a few unrelated style tweaks.

Comment thread ui/src/ui/views/chat.ts Outdated
Comment on lines +1648 to +1654
const handleChatContextMenu = (e: MouseEvent, p: ChatProps) => {
const bubble = (e.target as HTMLElement).closest(".chat-bubble");
// Always suppress native menu on chat bubbles; we show our own Reply menu.
if (!bubble) return;
e.preventDefault();
e.stopPropagation();
if (typeof p.onSetReply !== "function") return;
Comment thread ui/src/ui/views/chat.ts Outdated
Comment on lines +1678 to +1684
document.addEventListener(
"keydown",
(ev) => {
if (ev.key === "Escape") removeReplyContextMenu();
},
{ once: true },
);
Comment thread ui/src/ui/views/chat.ts Outdated
const senderLabel = senderEl?.textContent?.trim() ?? undefined;
const text = bubble.textContent?.trim().slice(0, 500) ?? "";
if (!text) return;
const messageId = `msg-${Date.now()}`;
Comment thread ui/src/ui/views/chat.ts Outdated
Comment on lines +1666 to +1668
const menu = document.createElement("div");
menu.className = "chat-reply-context-menu";
menu.innerHTML = `<button type="button"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" stroke="none"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg> Reply</button>`;
Comment thread ui/src/ui/views/chat.ts Outdated
Comment on lines +1675 to +1677
document.body.appendChild(menu);
requestAnimationFrame(() => {
document.addEventListener("click", removeReplyContextMenu, { once: true });
Comment thread ui/src/styles/chat/layout.css Outdated
.chat-settings-popover__label {
color: var(--muted);
font-size: 12px; /* was 11px */
font-size: 11px;
Comment thread ui/src/styles/chat/layout.css Outdated
Comment on lines +1146 to +1147
.agent-chat__talk-options input:focus,
.agent-chat__talk-options select:focus {
Comment thread ui/src/styles/chat/layout.css Outdated
.chat-session-picker__option-meta {
color: var(--muted);
font-size: 12px; /* was 11px */
font-size: 11px;
Comment thread ui/src/styles/chat/layout.css Outdated
padding: 4px 8px 3px;
color: var(--muted);
font-size: 12px; /* was 10px */
font-size: 10px;
Comment thread ui/src/styles/chat/layout.css Outdated
display: inline-block;
padding: 1px 6px;
font-size: 12px; /* was 11px */
font-size: 11px;
@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed June 29, 2026, 2:36 AM ET / 06:36 UTC.

Summary
The PR adds a Control UI webchat Reply action with a right-click context menu, reply preview state, Markdown quote prepending on send, and focused tests.

PR surface: Source +330, Tests +238. Total +568 across 10 files.

Reproducibility: yes. by source inspection: set chatReplyTarget, send while isChatBusy(host) is true, and handleSendChat enqueues effectiveMessage then returns before the only reply-target clear branch can run.

Review metrics: 1 noteworthy metric.

  • Transient reply state: 1 added. The new chatReplyTarget state controls quote prepending across async send and queue paths, so cleanup timing matters before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #16896
Summary: This PR is the active implementation candidate for the canonical narrow Dashboard webchat right-click Reply issue; broader reactions and feedback work only partially overlaps.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P2] Fix reply-target cleanup for busy queued sends and add a focused app-chat regression test.

Risk before merge

Maintainer options:

  1. Fix queued reply cleanup (recommended)
    Update the send path so the busy queued-send branch clears the captured reply target after the quoted message is safely in the queue, with a focused regression test.
  2. Accept stale-preview risk
    Maintain the current implementation and accept that users can accidentally quote the same prior message again after sending while the chat is busy.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Fix the Control UI reply send path so a reply target is cleared once a quoted message has been successfully captured in the queue, including the isChatBusy queued path, while preserving failed pre-acceptance retry behavior; add a focused app-chat test for busy queued sends with chatReplyTarget.

Next step before merge

  • [P2] A narrow repair can clear reply state in the queued-busy path and add one focused test; no broader product decision is needed for that mechanical blocker.

Security
Cleared: No concrete security or supply-chain concern found; the diff is limited to Control UI TypeScript, CSS, and tests with no dependency, workflow, lockfile, secret, or install-script changes.

Review findings

  • [P2] Clear reply state when a quoted message is queued — ui/src/ui/app-chat.ts:1940-1947
Review details

Best possible solution:

Clear the captured reply target once a quoted message is successfully queued or accepted, preserve failed pre-acceptance retry behavior, and keep structured reply metadata and reactions in separate product/API work.

Do we have a high-confidence way to reproduce the issue?

Yes by source inspection: set chatReplyTarget, send while isChatBusy(host) is true, and handleSendChat enqueues effectiveMessage then returns before the only reply-target clear branch can run.

Is this the best way to solve the issue?

No, not quite yet: the UI-only quoted-Markdown approach is a reasonable narrow first step, but the cleanup point misses the queued busy-send path.

Full review comments:

  • [P2] Clear reply state when a quoted message is queued — ui/src/ui/app-chat.ts:1940-1947
    chatReplyTarget is only cleared after sendChatMessageNow() accepts the message. If the user sends a reply while isChatBusy(host) is true, this function has already enqueued effectiveMessage with the quote and then returns, leaving the same reply target selected for the next message; clear the captured target in the queued-busy path while keeping failed pre-acceptance sends retryable.
    Confidence: 0.9

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 68ddb9744f78.

Label changes

Label justifications:

  • P3: This is a bounded Control UI ergonomics feature with a limited state cleanup bug and no outage, data-loss, security, config, or provider impact.
  • merge-risk: 🚨 session-state: The PR adds transient reply-target state that can remain stale after a quoted busy-send is queued and affect the next outgoing message.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (screenshot): The PR body supplies inspected screenshots showing the right-click Reply menu, reply preview, and sent quoted message in a real browser session after the change.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body supplies inspected screenshots showing the right-click Reply menu, reply preview, and sent quoted message in a real browser session after the change.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. The PR body supplies inspected screenshots showing the right-click Reply menu, reply preview, and sent quoted message in a real browser session after the change.
Evidence reviewed

PR surface:

Source +330, Tests +238. Total +568 across 10 files.

View PR surface stats
Area Files Added Removed Net
Source 8 335 5 +330
Tests 2 238 0 +238
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 10 573 5 +568

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs ui/src/ui/app-chat.test.ts ui/src/ui/views/chat.test.ts.
  • [P1] git diff --check -- ui/src/ui/app-chat.ts ui/src/ui/app-chat.test.ts ui/src/ui/views/chat.ts ui/src/ui/views/chat.test.ts.

What I checked:

  • Repository policy applied: Root AGENTS.md and the UI-scoped guide were read; their high-confidence PR review and Control UI ownership guidance apply to this review. (AGENTS.md:1, 68ddb9744f78)
  • Scoped UI guide checked: ui/AGENTS.md contains Control UI-specific guidance and no conflicting rule for this chat UI change. (ui/AGENTS.md:1, 68ddb9744f78)
  • Current main lacks outgoing reply workflow: Current main ChatProps has no selected reply target or set/clear reply callbacks, and the chat thread binds scroll/copy events without a contextmenu reply handler. (ui/src/ui/views/chat.ts:203, 68ddb9744f78)
  • PR implements the visible Reply UI: At PR head, renderChat adds reply props, context-menu creation, viewport clamping, focus handling, reply preview rendering, Escape dismissal, and thread contextmenu wiring. (ui/src/ui/views/chat.ts:206, 70a96db4d709)
  • Queued busy send bug: At PR head, handleSendChat builds effectiveMessage from chatReplyTarget and enqueues it, but the isChatBusy path returns before the only reply-target clear branch after sendChatMessageNow. (ui/src/ui/app-chat.ts:1940, 70a96db4d709)
  • Adjacent tests miss busy reply cleanup: The added app-chat tests cover acknowledged direct send and failed pre-acceptance send, but no test combines chatReplyTarget with an already busy chat run. (ui/src/ui/app-chat.test.ts:2448, 70a96db4d709)

Likely related people:

  • vincentkoc: Recent history touches the central chat view, app chat send path, and grouped renderer areas involved in this PR, and this handle authored the latest lint-fix commit on the PR branch. (role: recent Control UI chat contributor; confidence: high; commits: f5482efbd75e, aa69b12d0086, 70a96db4d709; files: ui/src/ui/views/chat.ts, ui/src/ui/app-chat.ts, ui/src/ui/chat/grouped-render.ts)
  • Takhoffman: Commit cc5c691 added assistant directive rendering and the display-side replyTarget path adjacent to this outgoing reply workflow. (role: adjacent reply-display feature contributor; confidence: medium; commits: cc5c691f0069; files: ui/src/ui/chat/message-normalizer.ts, ui/src/ui/chat/grouped-render.ts, ui/src/ui/types/chat-types.ts)
  • steipete: History shows repeated Control UI formatting, refactor, and test work, and the linked issue includes detailed routing context from this handle. (role: frequent UI refactor/test contributor and triage reviewer; confidence: medium; commits: 7c862da6a1de, f665da8dbcf3, 94c61aa19d2d; files: ui/src/ui/views/chat.ts, ui/src/ui/app-chat.ts, ui/src/ui/chat/grouped-render.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jun 13, 2026
@openclaw-barnacle openclaw-barnacle Bot added triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed proof: supplied External PR includes structured after-fix real behavior proof. labels Jun 13, 2026
@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 13, 2026
@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@programmingWTF
programmingWTF requested a review from Copilot June 13, 2026 14:25

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated 6 comments.

Comment thread ui/src/ui/app-chat.ts Outdated
Comment on lines +1805 to +1807
const replyTarget = host.chatReplyTarget;
const effectiveMessage = replyTarget ? prependReplyQuote(message, replyTarget) : message;
host.chatReplyTarget = null;
Comment thread ui/src/ui/views/chat.ts
Comment on lines +1694 to +1703
requestAnimationFrame(() => {
document.addEventListener("click", removeReplyContextMenu, { once: true });
const handleKeydown = (ev: KeyboardEvent) => {
if (ev.key === "Escape") {
removeReplyContextMenu();
}
};
contextMenuKeydownHandler = handleKeydown;
document.addEventListener("keydown", handleKeydown);
});
Comment thread ui/src/ui/views/chat.ts Outdated
removeReplyContextMenu();
const menu = document.createElement("div");
menu.className = "chat-reply-context-menu";
menu.innerHTML = `<button type="button"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" stroke="none"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg> Reply</button>`;
Comment thread ui/src/ui/views/chat.ts
Comment on lines +1687 to +1688
menu.style.left = `${e.clientX}px`;
menu.style.top = `${e.clientY}px`;
Comment thread ui/src/ui/views/chat.ts Outdated
if (!text) {
return;
}
const messageId = `msg-${Date.now()}`;
Comment thread ui/src/ui/views/chat.ts
menu.style.left = `${e.clientX}px`;
menu.style.top = `${e.clientY}px`;
menu.querySelector("button")?.addEventListener("click", () => {
p.onSetReply?.({ messageId, text, senderLabel });
@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@programmingWTF

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Add right-click reply in Dashboard webchat

3 participants