Skip to content

feat(frontend): rich markdown agent chat composer#4927

Open
ardaerzin wants to merge 9 commits into
big-agentsfrom
fe-feat/agent-rich-chat-input
Open

feat(frontend): rich markdown agent chat composer#4927
ardaerzin wants to merge 9 commits into
big-agentsfrom
fe-feat/agent-rich-chat-input

Conversation

@ardaerzin

Copy link
Copy Markdown
Contributor

What

Replaces the agent playground's plain-textarea composer (Ant Design X Sender) with a Lexical-based rich markdown composerRichChatInput, a new component in @agenta/ui, built on the 0.46 extension system (RichTextExtension + HistoryExtension).

Composer features

  • Live markdown shortcuts (round-trip to markdown on send): bold/italic, bullet + ordered lists, blockquote, inline code, and fenced code blocks. Curated transformer set — no headings/checklists/tables/links, to keep a chat message lightweight.
  • Enter-to-send, structure-aware: plain Enter sends; Enter continues the structure when the caret is inside a list or code block; Cmd/Ctrl+Enter and Shift+Enter insert a newline.
  • Composer shell: imperative handle (focus / clear / setMarkdown — used for rewind-to-edit), prefix / header / footer slots, a send button, and onPasteFile.
  • Char count, shortcut hints, antd-semantic-token theming (dark mode via tokens, no dark:).

Agent panel integration

AgentChatPanel keeps all prior behavior by hosting its existing UI through the new slots — attachments (paperclip / drag / paste), the message queue, HITL approval, and stop-while-streaming — and drives send through the unchanged handleSubmit. Rewind-to-edit now uses the composer's imperative setMarkdown + focus.

Notes

Verification

  • @agenta/ui tsc + lint clean; oss tsc shows no new errors in touched files.
  • Live in the agent playground: rich markdown incl. code blocks, Enter-to-send + list/code continuation, send button → agent streams, composer clears, stop-while-streaming, attachments — no console errors.
  • Not auto-verifiable via tooling (synthetic modifier keys): Cmd/Ctrl+Enter newline — confirm with a real keypress.

Test plan

  • Type markdown (**b**, - list, > quote, `code`, ```fenced ) — renders live
  • Enter sends; Enter inside a list/code continues it; Cmd/Ctrl+Enter & Shift+Enter add a newline
  • Send button sends; composer clears; Stop appears while streaming
  • Attach a file (paperclip/drag/paste); send with attachment
  • Rewind a user turn — composer prefills + focuses

Replace the agent playground's plain-textarea Ant X Sender with a
Lexical-based rich composer (RichChatInput in @agenta/ui), built on the
0.46 extension system (RichTextExtension + HistoryExtension).

Composer features:
- Live markdown shortcuts: bold/italic, bullet + ordered lists, quote,
  inline code and fenced code blocks — round-trip to markdown on send via
  a curated transformer set (no headings/checklists/tables/links).
- Enter-to-send, structure-aware: plain Enter sends, but continues a list
  or code block when the caret is inside one; Cmd/Ctrl+Enter and
  Shift+Enter insert a newline.
- Composer shell: imperative handle (focus/clear/setMarkdown for rewind-
  to-edit), prefix/header/footer slots, send button, onPasteFile.

AgentChatPanel keeps all prior behavior by hosting its existing UI in the
slots — attachments (paperclip/drop/paste), the message queue, HITL, and
stop-while-streaming — and drives send through the unchanged handleSubmit.

Adds @lexical/history to @agenta/ui and exports @agenta/ui/rich-chat-input.
@dosubot dosubot Bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Jun 29, 2026
@vercel

vercel Bot commented Jun 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agenta-documentation Ready Ready Preview, Comment Jun 29, 2026 2:11pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 187f3ef9-247a-4a04-8979-3a51a645c59d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a Lexical-based RichChatInput package with markdown submission, rich-text plugins, and new exports, then replaces AgentChatPanel’s Sender composer with it and updates rewind, submit, and status-row behavior.

Changes

RichChatInput component and AgentChatPanel integration

Layer / File(s) Summary
Markdown assets and submit flow
web/packages/agenta-ui/src/RichChatInput/assets/transformers.ts, web/packages/agenta-ui/src/RichChatInput/assets/theme.ts, web/packages/agenta-ui/src/RichChatInput/assets/submit.ts
CHAT_TRANSFORMERS defines the markdown formats, chatInputTheme maps Lexical nodes to chat styling, and submitEditorAsMarkdown serializes, trims, submits, and resets editor content.
Lexical plugins
web/packages/agenta-ui/src/RichChatInput/plugins/SubmitPlugin.tsx, web/packages/agenta-ui/src/RichChatInput/plugins/SendButton.tsx, web/packages/agenta-ui/src/RichChatInput/plugins/CharacterCountPlugin.tsx, web/packages/agenta-ui/src/RichChatInput/plugins/EditableSyncPlugin.tsx, web/packages/agenta-ui/src/RichChatInput/plugins/EditorRefBridge.tsx
SubmitPlugin handles Enter and newline insertion, SendButton switches between send and stop behavior, CharacterCountPlugin tracks plain-text length, EditableSyncPlugin mirrors editable state, and EditorRefBridge exposes the editor instance.
RichChatInput component and exports
web/packages/agenta-ui/src/RichChatInput/RichChatInput.tsx, web/packages/agenta-ui/src/RichChatInput/index.ts, web/packages/agenta-ui/package.json
Defines RichChatInputHandle and RichChatInputProps, implements the RichChatInput composer with Lexical plugins and imperative methods, and adds the package subpath export plus @lexical/history dependency entries.
AgentChatPanel composer swap
web/oss/src/components/AgentChatSlice/AgentChatPanel.tsx
Removes Sender-based composer state, switches rewind to setMarkdown plus focus, adjusts message reveal timing, inserts a queued/HITL status row, and mounts RichChatInput with attachment, paste, and streaming controls.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Agenta-AI/agenta#4903: Modifies AgentChatPanel.tsx for composer/status behavior, which directly overlaps with the new RichChatInput integration and rewind/submit flow.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: a rich markdown agent chat composer in the frontend.
Description check ✅ Passed The description is detailed and clearly matches the implemented Lexical-based rich chat composer changes.
Docstring Coverage ✅ Passed Docstring coverage is 85.71% which is sufficient. The required threshold is 60.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fe-feat/agent-rich-chat-input

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…ubbles

- Plain Enter always sends (even inside a list/code block). Shift+Enter
  and Cmd/Ctrl+Enter insert a context-aware newline (new list item in a
  list, new line in code, new paragraph in text) via insertParagraph, so
  block markdown shortcuts still fire on the new line.
- Add TabIndentationPlugin: Tab / Shift+Tab nest + outdent list items.
- Harden MessageRow fade-in: reveal once on mount (rAF not cancelled by an
  'enter' flip when a sibling arrives) + 'shown || !enter' fallback, so a
  just-sent user bubble can't stay stuck at opacity-0 during the agent run.
Newline now dispatches INSERT_PARAGRAPH_COMMAND instead of calling
selection.insertParagraph() directly, so ListPlugin's handler runs: a
Shift+Enter (or Cmd/Ctrl+Enter) on an empty list item exits the list to a
paragraph, matching native editor behavior. Non-empty items still get a
new item; code/quote/paragraph are unchanged.
The queue / streaming / approval status was hosted in the composer's
footer slot, so showing it grew the composer and pushed the editor
upward (layout shift). Render it as a sibling between the message list
and the composer instead — it now appears in the gap above the input
without moving it.
Replace the separate Stop control in the status row with a send button
that becomes a Stop button during an in-flight stream, so there is a
single affordance instead of two competing ones.
@ardaerzin

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Wrap the streaming Stop button in a spinning ring so the button itself
signals an in-flight stream, and drop the separate "Streaming…" status
row.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
web/oss/src/components/AgentChatSlice/AgentChatPanel.tsx (1)

655-674: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep the draft until submit finishes

RichChatInput clears immediately after calling onSubmit, but handleSubmit is async and can still fail while filesToParts() runs. That drops the drafted text/files on a read error. Await onSubmit before clearing, or restore the draft in a catch.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3597362b-9cc6-4eb6-9060-0206b4a614c3

📥 Commits

Reviewing files that changed from the base of the PR and between 0755d86 and 3ba8b44.

⛔ Files ignored due to path filters (1)
  • web/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (12)
  • web/oss/src/components/AgentChatSlice/AgentChatPanel.tsx
  • web/packages/agenta-ui/package.json
  • web/packages/agenta-ui/src/RichChatInput/RichChatInput.tsx
  • web/packages/agenta-ui/src/RichChatInput/assets/submit.ts
  • web/packages/agenta-ui/src/RichChatInput/assets/theme.ts
  • web/packages/agenta-ui/src/RichChatInput/assets/transformers.ts
  • web/packages/agenta-ui/src/RichChatInput/index.ts
  • web/packages/agenta-ui/src/RichChatInput/plugins/CharacterCountPlugin.tsx
  • web/packages/agenta-ui/src/RichChatInput/plugins/EditableSyncPlugin.tsx
  • web/packages/agenta-ui/src/RichChatInput/plugins/EditorRefBridge.tsx
  • web/packages/agenta-ui/src/RichChatInput/plugins/SendButton.tsx
  • web/packages/agenta-ui/src/RichChatInput/plugins/SubmitPlugin.tsx

Comment thread web/packages/agenta-ui/package.json
Comment thread web/packages/agenta-ui/src/RichChatInput/assets/submit.ts
Comment thread web/packages/agenta-ui/src/RichChatInput/plugins/SubmitPlugin.tsx
Comment thread web/packages/agenta-ui/src/RichChatInput/RichChatInput.tsx Outdated
Comment thread web/packages/agenta-ui/src/RichChatInput/RichChatInput.tsx
- Guard the Enter handler against event.isComposing so confirming an IME
  candidate no longer triggers a send.
- Unify the "blank message" definition behind $isBlankMessage so the send
  button, plain-Enter, and the submit path agree — a whitespace-only draft
  no longer looks sendable while doing nothing.
- preventDefault on a file paste so the editor doesn't also insert a
  sibling text/html clipboard payload.
- Fix backwards onSubmit/submit docs (plain Enter sends; Cmd/Ctrl+Enter is
  newline).
Focus-within used the full brand-primary color, which read as a loud ring
on the chat composer; drop it to a neutral border darkening. Add
overflow-hidden so the footer row and its top border clip to the rounded
corners instead of squaring off the bottom edges.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature Frontend size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant