feat(inbox): an open ask is the composer, with no helper text
What was asked
The developer approved design "C · The ask is the composer". Until now, an open Inbox ask's controls sat at the top of the draft reply's box, over its own multi-line text field, with helper lines like "Replying keeps the ask open". In design C, while an ask waits, the draft reply's box is the ask, and the box has no helper text.
What changed
One box (inbox-answer-box.tsx, inbox-pane.tsx, tasks.css, desktop.css)
- The box's body is the ask's controls: options, checkboxes, yes/no buttons, to-do steps with Mark done / Couldn't do it, or form fields. There's no card, border, hairline, or heading around them.
- The foot is one row: + (attach), the note line, the mic, and the round Send. The note line is the composer's own field (same editor, so mentions, skills, quotes, paste and dictation work as before), with the placeholder "Add a note". It starts one line tall and grows as you type, with the presses staying on its last line. The multi-line text area above the foot is gone.
- While dictating, the strip sits under the note line in place of the presses.
- Words-only ask, no ask (a notice), or a settled item: the same row with nothing above it, and the placeholder "Reply". A words-only ask has no "Answer" button any more: words or files sent to it answer it (
attachedAnswersininbox-model.ts). So the agent's message keeps "✓ Answered", as before.
No helper text
- Removed: "Replying keeps the ask open", the needs-no-reply lines ("Without a note, this won't message the agent." and the others), the missing-answer lines ("Pick an option", "Fill in …"), and the "2 picked" count.
inboxMissingno longer returns a line, andpickedWordsis deleted. - Send is disabled until there's something to send: a pick, a tick, a filled field, words, or files.
- "Got it": a notice waiting on your nod keeps "Got it", but only as the Send button's own label, while the box is empty. Once you type a word, it's the round Send again. A notice that opening already acknowledged shows no Got it. That fits "no helper text": it's the button's label, not a line beside it.
- The thread's "Reply ⏎" button is now the same round Send every other composer uses.
Keyboard: unchanged. The number keys pick options while focus isn't in a text field. The field still doesn't take focus when an item opens, because J/K step the list and the number keys pick. Enter sends once Send is enabled, and Shift+Enter makes a new line in the note. In the older single-item layout, Enter with an incomplete answer still moves focus to what's missing, but no longer says anything.
Answered state: unchanged (#4248).
Older single-item layout: same treatment. Its controls are the body, and its foot is the same one row with "Add a note" under controls. A words-only item uses the agent's own placeholder if it gave one, and "Reply" otherwise. A settled item's box also reads "Reply", where it used to read "Message …".
Narrow widths: at a 360px window the draft reply's card is about 288px, and the foot keeps +, the note line, the mic and Send in one row. The mic only drops out below a 240px card. Before, it dropped out below 300px.
Rebased onto main after #4289 (no "Waiting on you" pill on the reader's own ask) #4291 (the shared AttachFilesButton, which is now the foot's +), and #4297 (chip heads). Every change is kept, and the after shots are taken on top of it.
Out of scope, not touched: the comment heads ("You draft", avatars, name chips).
Tests
desktop-inbox.test.ts:- New helpers:
footWords(the foot's words outside the note line, which must be empty, or just "Got it" on a notice) andfootParts(the foot, left to right:Attach files,line: Add a note/line: Reply,Dictate,Send). - Every ask kind's tests now check that Send is disabled or enabled where they used to check the helper line.
- New: a words-only ask is a plain "Reply" box with no controls, and its words answer it, leaving "Answered" on the agent's message.
- The two needs-no-reply line tests are merged into one test that says nothing is shown.
- New helpers:
inbox-model.test.ts: a words-only ask's words or files attachansweredwith no press.inboxMissingreturns no line.narrow-composers.test.ts: at a 360px window's card, the Inbox foot keeps all four in one row and the line grows into it.- Without the change, 31 of these tests fail.
pnpm check:affected(withTURBO_CONCURRENCY=1): repository checks and typecheck passed, andpnpm lintpassed alone.discarded-effectwas OOM-killed in the sandbox, and two unrelated panel tests (tab-look,new-task-composer-narrow) timed out under load. Both pass alone. CI runs the full set.
Screenshots
Rendered from the inbox test harness's fixtures with the bundled panel stylesheet (light, desktop profile).
| Ask | Open, before | Open, after | Answered, before | Answered, after |
|---|---|---|---|---|
| Pick one | ![]() | ![]() | ![]() | ![]() |
| Pick several | ![]() | ![]() | ![]() | ![]() |
| Yes / no | ![]() | ![]() | ![]() | ![]() |
| To-do | ![]() | ![]() | ![]() | ![]() |
| Form | ![]() | ![]() | ![]() | ![]() |
| Words only | ![]() | ![]() | ![]() | ![]() |
Open means fresh: nothing picked yet. Before, the foot says "Replying keeps the ask open". After, the box says nothing and Send is disabled. The words-only "answered, before" shot pressed the old Answer button. The "after" shot just sent words.
360px window, after (picked, with a note where typed)
| Pick one | Pick several | Yes / no | To-do | Form | Words only |
|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Made with Luke





























