Skip to content

feat(agents): give agent conversations the thread composer and prompt bubble - #619

Merged
klNuno merged 14 commits into
mainfrom
boite/agents-unified-thread
Oct 20, 2026
Merged

klNuno merged 14 commits into
mainfrom
boite/agents-unified-thread

Conversation

@klNuno

@klNuno klNuno commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Note

Clanker Claude Opus 5.5 is responding on behalf of meetsu

Talking to an agent now uses the same box and the same prompt bubble as a thread: paste or attach pictures and files, dictate, recall past messages, stop the agent, pick its model, effort and mode from the chips, and see the pictures you sent as thumbnails that open in the viewer.

agent conversation after

what changed

  • The agent conversation renders the shared Composer through a new ComposerTarget (lib/composer-target.ts) instead of its own form.
  • An agent target keeps attach, paste, drop, dictation, ArrowUp recall, undo, the stash chord and Stop; Escape cancels the running work.
  • The Plan chip next to the agent's box is gone; planned tasks stay behind the header's calendar button.
  • Prompt receipts move into MessageReceipts.svelte, used by thread prompts and agent messages alike, and agent replies get the copy button and time.
  • A direct conversation shows the thread's model, effort and mode chips to the owner. A pick saves the agent's main route through agents.runtime.configure, the way the Settings tab does, and allows that model if it was not. A group keeps its recipient chips; a paired device gets no chips.
  • The user's messages are drawn by the thread's own UserMessage (it now takes accepted and responded instead of the timeline's progress, and opens a deferred picture from the bytes loadMessageAttachment returns). The first turn that takes a message's attachments sets each one's source (AgentMessageAttachment.source: that turn's prompt in the agent's thread and the part's index), so the bubble reads thumbnails and originals with messages.attachment, like a thread's. Until a turn took them, the message lists names and sizes.
  • agents.message.send takes attachments from the user: the message keeps name, type and size, the bytes wait in a core setting with the agents whose turn took them, so a resume before the turn still sends them and a decision's continuation does not.
  • The bytes leave once every delivery is processed, cancelled or over the limit, including a message nobody receives and an agent archived before its turn.
  • A retried send keeps its request id only for the same bytes: the app hashes each file, and the core's request fingerprint covers the bytes.
  • An agent's own message refusing attachments, and a message made only of attachments, are covered in agents-runtime.test.ts.
  • To keep the bundles from growing, the agent store reuses the contracts' base64 size helper, and duplicated helpers now share one copy: the required-text validator (requiredText in errors.ts), the group's positive and revision-order checks, the Windows worker error text, the drivers' question and tool-result text, and the loopback port probe (loopback-port.ts).

to question

Inventory of the thread view against the old Agents conversation:

Thread feature Old agent page Now
History, day separators, older pages yes kept
Growing box, attach, paste, drop no added
Microphone no added
ArrowUp recall, undo, stash no added
Stop and Escape while working no added, cancels the work
Copy, send time, two ticks no added
Model, effort, mode chips no added for a direct conversation, saved as the agent's setting
Worktree chip no left out: an agent has no draft folder
Picture thumbnails and viewer on the user's messages no added, read from the agent's turn
Queue and steer no left out: a message becomes new work, never a queued prompt
Slash and mention menus no left out: they act on a thread's commands and project files
Edit, rewind, fork, retry no left out: an agent conversation has no checkpoints
Plan chip yes removed, the header's button covers it

Agent-only parts stay: identity header, settings, memory, routines, activity, missions, group recipients, memory pass chip, entrusted thread markers and questions.

The transcript is not the thread's MessageList: agent messages are not thread messages. The user's bubble is the thread's UserMessage; the agent's replies keep their bubble and share the copy action and time. Edit, retry and fork stay out: an agent conversation has no checkpoint to rewind to, and a rewind would also have to undo the agent's memory pass.

verified

Head 101883c1 (main 39bed7ed merged in, no conflict):

  • bun run check passes (svelte-check 0 errors, architecture check green after moving two rejects matchers to thrown()).
  • UI: AgentConversation.svelte.test.ts 11 pass; the chips case and the thumbnail case fail with the change undone (3 failed). ImageViewer, Composer, MessageList, ComposerGrow, agents components and fake-agents pass.
  • Core: agents-runtime.test.ts checks the attachment source and reads the picture back with messages.attachment; red without the store change. test/agents* and test/agent*: 86 pass.
  • Captures on ?fake=1&agents=1 in headless Chrome (ANGLE): a 1440 x 900 screenshot attached, sent and opened in the viewer, desktop and 390 px.

Earlier heads:

  • bun run check passes.
  • UI vitest: 321 files, 2178 tests pass; the new conversation case fails on main (no shared composer, the old input).
  • Core: agents*.test.ts and agent.test.ts, 80 pass, including the attachment case.
  • E2E: agents.test.ts 6 pass; agent-setting-cards, resident-agent, agent-shape 4 pass.
  • bun scripts/ci/budgets.ts measure on Linux, head against main 18aa29cf: core JavaScript 4,499,394 against 4,499,556, UI total 4,870,956 against 4,871,593, entry chunk 483,003 against 492,029; no measure grows.
  • Core: full suite 2614 pass after the validator sharing; agents, drivers, speech and plugins files 555 pass on the final head, with the resume, release and retry cases red before their fix.
  • UI: the retry-key case is red before the hash; agent and composer files 83 pass.
  • not verified: the Windows app, a real phone, dictation with a real microphone, a real provider reading the attached files.

captures

The original opens in the thread's viewer.

viewer

Phone, 390 px: the thread's Options and model chips, the thumbnail and the receipts.

phone parity

A thread at the same size, for comparison.

thread

Earlier head, before the chips and thumbnails:

Before: the agent's own box with its Plan chip.

agent conversation before

A thread, for comparison at 1280x900.

thread

A picture and a file waiting in the agent's box.

attaching

The sent message with its attachments, copy, time and ticks.

attached

Phone, 390 px.

phone

@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 36 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository: beboite/boite/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: b2357ccc-9c7f-4598-a39f-98038fa20219
📥 Commits

Reviewing files that changed from the base of the PR and between 39bed7e and 59be8db.

📒 Files selected for processing: 44
  • docs/agents.md
  • packages/contracts/src/agents.ts
  • packages/contracts/src/attachment-validation.ts
  • packages/contracts/src/file-preview.ts
  • packages/contracts/src/index.ts
  • packages/core/src/agents/runtime.ts
  • packages/core/src/agents/store.ts
  • packages/core/src/attachments.ts
  • packages/core/src/coordination-letter.ts
  • packages/core/src/delegation.ts
  • packages/core/src/drivers/acp/turn.ts
  • packages/core/src/drivers/claude/mapping.ts
  • packages/core/src/drivers/codex/mapping.ts
  • packages/core/src/drivers/muse/mapping.ts
  • packages/core/src/drivers/pi/mapping.ts
  • packages/core/src/drivers/tool-text.ts
  • packages/core/src/errors.ts
  • packages/core/src/group/device-keys.ts
  • packages/core/src/group/roster.ts
  • packages/core/src/loopback-port.ts
  • packages/core/src/platform/windows/guard.ts
  • packages/core/src/platform/windows/jobs.ts
  • packages/core/src/platform/windows/worker-entry.ts
  • packages/core/src/plugins/gateway.ts
  • packages/core/src/speech-server.ts
  • packages/core/src/threads/spawn.ts
  • packages/core/src/workflows/validation.ts
  • packages/core/test/agents-runtime.test.ts
  • packages/ui/src/components/Composer.svelte
  • packages/ui/src/components/ComposerBar.svelte
  • packages/ui/src/components/ImageViewer.test.ts
  • packages/ui/src/components/MessageList.svelte
  • packages/ui/src/components/MessageReceipts.svelte
  • packages/ui/src/components/UserMessage.svelte
  • packages/ui/src/components/agents/AgentConversation.svelte
  • packages/ui/src/components/agents/AgentConversation.svelte.test.ts
  • packages/ui/src/components/agents/AgentsPage.svelte
  • packages/ui/src/components/agents/agents.css
  • packages/ui/src/lib/composer-target.ts
  • packages/ui/src/lib/fake-agents.ts
  • packages/ui/src/lib/fake-client/context.ts
  • packages/ui/src/lib/strings/en/agents.ts
  • packages/ui/src/lib/strings/fr/agents.ts
  • tests/e2e/agents.test.ts
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@github-actions github-actions Bot added documentation Improvements or additions to documentation core packages/core and packages/contracts ui packages/ui ci Workflows and CI scripts labels Oct 18, 2026
@klNuno

klNuno commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

Note

Clanker Claude Opus 5.5 is responding on behalf of meetsu

#614 split strings.en.ts and strings.fr.ts into one file per part. When git merge origin/main stops on them, run bun scripts/migrate/split-catalogues.ts: it replays this branch's catalogue edits onto main's parts and stages them. A part both sides changed on the same lines keeps conflict markers.

@klNuno

klNuno commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

Note

Clanker Claude Opus 5.5 is responding on behalf of meetsu

#621 split packages/contracts/src/index.ts into one file per domain. When git merge origin/main stops on it, run bun scripts/migrate/split-contracts.ts: it replays this branch's contract edits onto main's domain files, rewrites their imports and stages them. A domain both sides changed on the same lines keeps conflict markers.

…thread

# Conflicts:
#	packages/contracts/src/index.ts
…versations

A direct conversation shows the thread's model, effort and mode chips, saved as the agent's main route. The user's messages are drawn by UserMessage, with thumbnails read from the agent's turn once it took the attachments (AgentMessageAttachment.source).
@klNuno klNuno changed the title feat(agents): give agent conversations the thread composer feat(agents): give agent conversations the thread composer and prompt bubble Oct 20, 2026
A pick made while a message was being sent was dropped by view.call, and its revision was read before the runtime fetch. It now goes through view.save and reads the agent's revision when its turn comes.
@klNuno
klNuno added this pull request to the merge queue Oct 20, 2026
Merged via the queue into main with commit fdc299f Oct 20, 2026
33 checks passed
@klNuno
klNuno deleted the boite/agents-unified-thread branch October 20, 2026 21:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci Workflows and CI scripts core packages/core and packages/contracts documentation Improvements or additions to documentation ui packages/ui

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant