feat(chat): inline question cards in the stream, house-style options, answered Q→A history #60
No reviewers
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Cloonar/coding-lab!60
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "afk/56"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #56
Questions the agent asks now live in the conversation, not over it — pending as an interactive card in the one scrollable chat pane, answered as a readable Q→A summary instead of a raw JSON tool chip.
Provider contract (ADR-0028)
provider.Dialoggains a nullableoutcome(dismissed/ per-questionresults{question, chosen, other_text}/ planapproved+feedback), derived indialogoutcome.gofrom the same compat §5toolUseResult/toolDenialKindground truth the verification backstop reads — no new Claude Code coupling.deriveStatereportsquestiononly while a trailing dialog is unanswered;internal/chat's dormant-fallbacklastDialogskips answered dialogs soAnswerDialogcan never target a resolved picker.planDialogno longer truncates the plan — plans render in full (pending spool, pending transcript, and history alike).pending_dialogside channel); placement is purely client-side.Chat UI
tool_idagainst a matching stream message — never rendered twice); composer collapses to a waiting note + Interrupt, textarea returns on resolve. Nomax-heightscrollboxes — multi-question forms and full plan markdown flow naturally, approve/reject after the whole plan. A newly arriving card scrolls its top (the question text) into view only when the viewer is following the live tail; scrolled-up readers keep their place (jump pill unchanged).--radius-control— bold label, muted description now visible on all three picker paths (the flat multi-select path previously dropped it), accent border + check when selected, ≥44px targets, no pill radius/tooltips/truncation. Interaction semantics unchanged (single-select taps to answer, gated Submit on multi paths, busy disable, reset ontool_idchange).Verification
go test ./...andgo test -tags ui ./...: green (theinternal/tmuxxintegration tests fail in this sandbox on clean main too — environmental, no tmux sessions available).gofmt/go vetclean. New coverage:TestParseTranscript_answeredDialogOutcomes,TestParseTranscript_planPromptUntruncated, extended state edges, andTestCompat_LiveTranscripts_resolutionShapesre-pinned against the captured live 2.1.198 fixtures (answered single/multi-question, other-text, timeout, plan approve/reject-with-feedback).npm run lint,format:check,npm test(34 files, 475 tests),npm run build— all green;go build -tags uiwith the embedded dist OK. New tests cover the inline card (position, dedupe, resolve-returns-textarea), waiting-note composer, arrival scroll both ways, all answered-summary shapes, and the restyled toggles with visible descriptions.🤖 Generated with Claude Code
https://claude.ai/code/session_01X9qAh94KTrYTSUoWYkUPpk
Backend (provider chat contract, ADR-0028): an answered dialog tool (AskUserQuestion / ExitPlanMode) stays a dialog message instead of demoting to a raw tool chip. provider.Dialog gains a nullable Outcome (DialogOutcome{dismissed, results, approved, feedback} with QuestionResult{question, chosen, other_text}), derived at parse time in dialogoutcome.go from the compat §5 toolUseResult/toolDenialKind ground truth — a second reader of an already-pinned coupling. deriveState reports question only for an unanswered trailing dialog; internal/chat's dormant-fallback lastDialog skips answered dialogs; planDialog no longer truncates the plan markdown. Web: the pending dialog renders as an interactive card inline in the chat stream (at its transcript message's position when one matches by tool_id, else appended — never twice), with the composer collapsed to a waiting note + Interrupt; no nested scrollboxes — the chat pane is the only scroll container, plans render in full with the actions at the end; a newly arriving card scrolls its top into view only when following the live tail. Options move off the seg pill onto full-width card buttons (control radius, bold label, always-visible muted description on all three picker paths, accent border + check when selected, 44px targets). Answered dialogs render as compact inert Q→A summaries (per-question pairs, quoted other-text, dismissed marker); interaction semantics are unchanged (tap-to-answer single-select, gated Submit, busy disable, reset on tool_id change). Closes #56 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X9qAh94KTrYTSUoWYkUPpk