Repository navigation
feat(desktop,host,features): an Inbox thread draws its messages, and every item keeps its box - #3486
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
luke-agent Bot
added a commit
that referenced
this pull request
Oct 17, 2026
Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…every item keeps its box An item's thread now draws its messages as comments among the question and the answer or withdrawal, in the order they were written (`settledAt` for the settlement): a member's by their face and name, the reader's own as You, the agent's by its tile and name, their words through SentWords so mentions are chips, and their files drawn as an answer's are. A thread read cut to its latest 50 says the earlier ones are in the agent's tab. The box is docked on every item. While an item waits it answers it exactly as before; once settled, the same composer writes a message on the thread, "Message <agent>…", Send, files allowed, over a new `codingAgents.inboxMessage` act through the host to `HostedCodingAgentClient.messageInbox`. The returned item replaces the one held, the reader's own new comment is scrolled into view inside the board, the draft is kept per item, and a refusal is said under the card. Next stays offered over the box. The agent's `reply_inbox` call draws as its own collapsed row naming the item's key. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
An answer typed on an open item that another member answered meanwhile stayed as the settled item's draft, since settling leaves the revision as it was, so its note stood ready to send as a message and its picks were stuck. A draft now says whether it is a thread's, and a read lets go of an answer's once its item is settled. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
luke-agent
Bot
force-pushed
the
luke/inbox-thread-composer
branch
from
October 17, 2026 14:10
11197ee to
bfc6362
Compare
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This is the desktop half of "a message on an Inbox thread at any point". It stacks on #3469 (the thread's wire and service).
Comments, mixed in by time with the question (atpostedAt) and the answer or withdrawal (atsettledAt, falling back toupdatedAton an older service). A message written while the item was open therefore shows before the answer that came after it.personActor), and "You" for your own. A member whose account is gone shows as someone unnamed.SentWords, so mentions show as chips. Files show the way an answer's do. A message with files and no words shows the files alone.MAX_MESSAGES_READ(50) messages, a line says earlier messages are in the agent's tab. Pressing the agent's name opens that tab.settledAt, so a later message no longer moves them.InboxNextUpnow sits above the box.codingAgents.inboxMessageact: anACT_KINDentry with its payload schema (codingAgentInboxMessageParamsSchema) and result guard, a router row, a gateway method, aHostOperatormethod, and a composer row that callsHostedCodingAgentClient.messageInbox.scrollIntoView.reply_inboxrow. The agent'sreply_inboxcall (feat(features,service,dev): the agent reads and replies on its Inbox threads #3482) gets its own collapsed row,CALL_KIND.INBOX_REPLY("Replied in your inbox:"). The row names the item's key and lists the reply's words and image paths. The tool name is matched as a string, so this PR doesn't depend on feat(features,service,dev): the agent reads and replies on its Inbox threads #3482.Screenshots
Both were rendered from the jsdom fixtures' DOM with the built
styles.cssand captured with Playwright.Evidence
desktop-inbox,composer-drafts,tool-call-model,inbox-model, all ofhost,features, andgateway.tscpasses for desktop, host, and service. Biome and oxlint are clean.check:affectedrun had its@luke/service#typecheckOOM-killed (exit 137) in the sandbox. Run alone, that typecheck passes.desktop-inbox.test.ts:reply_inboxrow.Invariants
./scripts/check.shgreen. (CI)LUKE_UPDATE_FIXTURESnot run, or diff explained line by line). (CI) One golden was added:coding-agent-view-codingAgentInboxMessageParamsSchema.json, for the new act's params, which areitemIdplusinboxMessageRequestSchema's fields.AGENTS.md"Testing")astype assertion outside the allowlisted files. (CI via anti-slop)Effect.runPromise/runSync/runForkoutside the runtime edges and the shimstools/anti-slop/effect-edges.jsonrecords. (CI viaanti-slop/no-run-promise-outside-edges)setTimeout/setInterval/new Promise/AbortController/fs.watchoutside the filestools/anti-slop/effect-edges.jsonrecords. (CI viaanti-slop/no-raw-async-primitives)pnpm discarded-effect)desktop-inbox.test.ts, +1 incoding-agent-acts.test.ts, +1 intool-call-model.test.ts)AGENTS.md's "The permanent adaptors" with the reason it stays.CLAUDE.md/AGENTS.mdsentence naming a changed part is edited; root pair stays byte-identical. (CI for pair existence; manual for wording)PRIVACY.mdunchanged, or the change is a product decision called out in the PR body.package.jsondeps match what the sources import by bare specifier;effectviacatalog:. (CI)@effect/platform-node,effect/sql) behind a barrel the renderer or a web function opens. (CI: existing renderernode:grep plus a new grep for those specifiers in renderer bundles)Notes
REPLY_INBOX_TOOLintool-call-model.tscan readINBOX_TOOL.REPLYinstead.Made with Luke
Summary by cubic
Lets an Inbox thread draw its messages and keeps the message box docked on every item, so a settled item can still be discussed without changing its status.
New Features
postedAt) and the answer or withdrawal (atsettledAt, falling back toupdatedAton older services), so a message written while the item was open shows before the answer that followed it; the answer's and withdrawal's times no longer move when a later message lands.<agent>…", Send or Enter, files by picker, paste, or drop, up to 8,000 characters, while the next item that needs you stays offered above the box.codingAgents.inboxMessageact and matching gateway method and host operator; a refusal is shown under the card, and the send key is reused only for a retry of the same words, because the service now refuses a reused key.reply_inboxcall draws as its own collapsed row naming the item's key and listing the reply's words and image paths.Written for commit bfc6362. Summary will update on new commits.