feat(chat): model chip in chat header + mobile menu info row; remove "New conversation" and "Show thinking" #68
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Cloonar/coding-lab#68
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Design was grilled and resolved interactively on 2026-07-09. All decisions below are final; implement as specified.
What
[←] Title (working) (Sonnet 5 · high) …… [actions].role="menuitem"(excluded from keyboard menu navigation), separated from the action items below.Resolved decisions
runs.model/run().model, already loaded in RunChat viagetRun). A mid-session/modelswitch is knowingly NOT reflected — no backend work.model · effort(mirrors History.tsx:128). Use pretty labels from the provider catalog (GET /providers→models/effortsoption labels, same as the NewRun composer chips), falling back to the raw id when the catalog has no match. Hide the chip/row entirely ifrun().modelis empty (legacy rows).clearConfirmingstate, the two-step confirm UI, and thecanClear/onClearprop wiring in RunChat.tsx. Do not touch the backend clear endpoint / provider clear capability.showThinkingsignal and props, and make the paint-time filter unconditionally drop thinking blocks (thinking is permanently hidden in the web chat; transcripts on disk keep everything).Code map (verified 2026-07-09, branch main)
web/src/routes/RunChat.tsx— everything chat:ChatHeadercomponent at:779; desktop actions cluster with "New conversation":912-934(incl. confirm) and "Show thinking":937-945.ChatMenu(mobile ••• panel) at:1026; menu items Show/Hide thinking:1077-1088, New conversation… + confirm:1103-1137.showThinkingsignal at:126; thinking filtered at paint viahiddenThinking:622-623, applied:690.run().model/run().provider/run().effortin scope (resource at:89-92); providers list loaded at:95;runProvider()at:491-497.web/src/base.css—.chipbase class:723; mobile-first hiding of.chat-desktop-actions/.chat-state-chip:2562-2568; chat-menu panel styles:2570-2593; desktop@media (min-width: 640px)flip:2882-2904. The new desktop chip should hide <640px the same way.chat-state-chipdoes.web/src/api.ts—Run.provider/model/effort:421-439;Provider/listProviders:356-370.web/src/routes/History.tsx:128({model} · {effort}).Acceptance
model · effortchip beside the state chip; nothing shown when model is empty.rg -n "showThinking|clearConfirming|canClear|onToggleThinking" web/srcreturns nothing.webdiff only).Landing audit — PR #69 (
afk/68) → VERDICT: PASSVerification signal: No readable CI/forge token in this session, so nothing pre-vouched — ran the project's own checks on the PR head (
dc66f7e):npm run test→ 546/546 across 37 files (incl. the 5 new model-chip tests)npm run lint→ cleannpm run build(tsc --noEmit+ vite) → cleanMergeability:
origin/mainis an ancestor ofafk/68— merges cleanly, no conflict.Convention & AFK contract: Title is Conventional Commits (
feat(chat): …); body carries a workingCloses #68.Diff review (web-only:
RunChat.tsx,RunChat.test.tsx,base.css): Matches every resolved decision on this issue —.chat-model-chip: muted,display:none<640px andinline-block≥640px (same gate as the state chip); catalog pretty label with raw-id fallback; hidden on empty model; no dangling separator on empty effort..chat-menu-info: non-interactiverole="none"div pinned atop the ••• panel, set off by a bottom border; excluded from[role=menuitem]navigation.showThinking,clearConfirming/clearing,canClear/clearCommand/sendClear,composerLocked, and all prop wiring gone; thinking dropped unconditionally at paint (stream + expanded tool groups) while grouping still runs over the full list.rg -n "showThinking|clearConfirming|canClear|onToggleThinking" web/src→ no matches; no dangling refs to any other removed symbol.No blockers. Awaiting explicit free-text merge go-ahead.