Repository navigation
feat(webui): close four downgraded detail gaps (turn navigator, slash palette, context hint, todo summary) - #269
Conversation
…nTranscript SessionTranscript passed only turns to TurnNavigator; the component's hover and activate callbacks were no-ops at the integration. The transcript now owns the hover state and projects a preview card (turn number, timestamp, first answer line, neighbouring user queries) through the component's existing preview slot, and a tick activation jumps to the turn's message root (data-message-id anchor, centered scrollIntoView) after releasing the bottom-follow, flashing the destination with a reduced-motion-aware highlight. The pure halves are exported and covered by the node suite; the mouse-event wiring itself remains the SSR-unreachable boundary.
All six WEBUI_RUN_COMMAND_NAMES were reachable through runCommand but only compact had a palette row, so the other five were undiscoverable. Add rows for help/new/status/usage/model with names aligned to the contract list (in /help order, after the composer modes), Chinese descriptions grounded in runtime/commands/runner.ts behaviour, and supported: true. Reuse the existing WebuiIconCommandUsage, WebuiIconNewTask and WebuiIconModel glyphs and add WebuiIconCommandHelp/Status wrappers for the two rows without one. The palette tests now pin the full run-command roster instead of the compact-only snapshot.
The catalog states which context window bills as the heavier choice
(contextWindowOptionHints, e.g. { "1000000": "higher_usage" }), and the
server projection passes it through, but the panel rendered nothing from
it: a 1M window read exactly like the 200K one beside it.
Render the hint as a quiet suffix on the option it annotates —『较高用量』
in the tertiary text role, so the size stays what the eye sorts by and the
hint stays quieter in both themes. A model whose catalog carries no hints,
or a value the wire contract does not name, renders the size alone.
The roadmap's completion-percentage affordance was never rendered: the Todo section listed items but its header showed only the title. The progress section header now carries a quiet tertiary-text summary (`3/7 已完成 · 43%`) computed client-side from the todo list — completed count over all todos, rounded to a whole percent. It renders only when todos exist, rides in the header button so it survives collapsing, and the empty state stays as plain copy. The live browser spec's Todo heading selector moves from the exact accessible name to a title-anchored pattern because the summary is now part of the button's name; the stream test also pins that the summary tracks a live todo update.
…n host close The V1 stores share one cached better-sqlite3 connection per data directory (withLocalRuntimeDb), and nothing owned its lifetime: after apiHost.close() resolved, runtime-state.sqlite and its -shm stayed locked by a handle. POSIX unlinks open files silently, so only Windows surfaced it — every isolated-data-dir consumer's cleanup rm hung on EBUSY and the integration hooks timed out. closeResources now closes that cached connection last, keyed by the construction-time data directory rather than the live configGetter, which a second host booted in the same process has already moved.
isInsideDataDir compared resolve()d paths with a `${root}/` prefix, which
never matches on Windows where resolve keeps the platform separator: every
in-profile path was refused as outside. Compare through path.relative
instead — separator-agnostic, and sibling roots such as <root>-other still
climb out with a leading '..' and are rejected.
…tracts - Speak the '/' path dialect where assertions meet path helpers or TypeScript's normalized file names (boundary-check, dependency-check fixtures, plugin-action-inventory, design-tokens, host-event-generation): the host-event-generation mutation hook in particular compared a backslash path by strict equality against TS's normalized names, so the rewrite never landed and the case asserted against an unmutated program. - Build the archive fixtures without assuming Info-ZIP or a colon-free archive path: adapter-conversions writes the same single-entry zip byte by byte when the CLI is absent, and the archive suite passes --force-local on Windows so MSYS tar does not read the drive-letter colon as a remote host spec. - webui-service takes openClient's up-front closed promise so the post-shutdown case cannot miss the client's close event while awaiting service.close(); agent-transcript polls the rewound row's removal (the socket frame and the React commit are separate steps), follows the Todo heading to the summary-carrying accessible name the 405c793 header introduced, and reads the attachment path out of the JSON-stringified prompt without excluding Windows separators. - Register webui-turn-jump-flash in the W0 animation inventories the b9c85a9 TurnNavigator feature added to transcript.css.
…paths The tar fixtures passed the archive as an absolute path and reached for --force-local on win32, which covers MSYS GNU tar but not the bsdtar that ships with Windows and answers "Option --force-local is not supported". Write the archive as a sibling-relative path (../<name> from the source directory) instead: no drive-letter colon for GNU tar to mistake for a host spec, and no flag for bsdtar to reject, on any platform.
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.
|
Follow-up ordinary push tip
Local re-verify: PR body Verification updated. Ready for upstream review when convenient. Logs: |
What
Four small client-side gaps, each confirmed by the 2026-10-26 source-layer satisfaction retest (99-row sweep at
e2de9a1a) as a ✅→🟡 downgrade, plus the Windows gate fixes this branch needed to prove them:TurnNavigatorexposed hover/activate callbacks butSessionTranscriptpassed onlyturns, so ticks were no-ops. Hover now projects a preview card through the component's existing preview slot; activation jumps to the turn's message root via its existingdata-message-idanchor (centered scroll, transient reduced-motion-aware flash). No new anchor system.WEBUI_RUN_COMMAND_NAMEShas help/new/compact/status/usage/model; the palette showed only the built-in three, andslash-palette.tsitself documented the other five as undiscoverable. Rows added with names aligned to the contract list and descriptions grounded inruntime/commands/runner.ts.contextWindowOptionHints(e.g.{"1000000":"higher_usage"}) reaches the wire but was never rendered. The tier it annotates now carries a quiet 『较高用量』 suffix in the tertiary role; no hints, no suffix.3/7 已完成 · 43%computed from the todo list; renders only when todos exist and survives collapsing.Supporting fixes on this branch:
fix(local-runtime): release the process-cached V1 sqlite connection on host close (Windows real-host integration suites were hanging on it)fix(webui): make the profile-root guard separator-agnostic--force-local)release/public-source.jsonfor the new test fileVerification (Windows, this branch)
typecheck:client✅ ·typecheck:server✅ ·typecheck:test✅pnpm test: 226 test files passed | 5 skipped, 0 failed (3507 tests), including the real-host integration suitespnpm check:source✅;check:webui-dependency✅ (re-run by an independent reviewer over the whole diff)Follow-up tip
cdd54251(local re-verify)After the earlier local NO-GO on
f1b6d32e, ordinary push tipcdd54251fixes:release/public-source.json— drop stray.zcode/*entries from the inventoryagent-transcriptfrozen-contract selectors — backslash path truncationprogress-panel/composer-command-overlayLocal re-verify (
gh-check):check:source/agent-transcript/ visual baselines 8/8 pass. Remaining failures on that runner are only missing host tools (make/zip) for node-pty / packaging cases — not PR-introduced.Logs:
/workspace/minimax-code-logs/269-fix-20261028/,/workspace/check-logs/minimax-code-269-cdd54251/.Advisories from review (known, not addressed here)
agent-transcriptselectors) live in a later commit than the features that need them, so intermediate commits don't individually pass the frozen-contract suitesprojectTurnNavigatorPreviewmirrors the turn-group projection's numbering rules; the two could driftIconMessageQuestionis shared by the help row and the ask-matt skill row in the same paletteScope
Client-only features plus gate fixes; no wire/protocol changes.