Skip to content

feat(webui): close four downgraded detail gaps (turn navigator, slash palette, context hint, todo summary) - #269

Merged
Hylouis233 merged 12 commits into
mcode-webui:webuifrom
Hylouis233:feat/webui-detail-gaps
Oct 28, 2026
Merged

Hylouis233 merged 12 commits into
mcode-webui:webuifrom
Hylouis233:feat/webui-detail-gaps

Conversation

@Hylouis233

@Hylouis233 Hylouis233 commented Oct 27, 2026 •

Copy link
Copy Markdown

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:

  1. Turn navigator wiring (transcript) — TurnNavigator exposed hover/activate callbacks but SessionTranscript passed only turns, 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 existing data-message-id anchor (centered scroll, transient reduced-motion-aware flash). No new anchor system.
  2. Slash palette lists all six run commands (composer) — WEBUI_RUN_COMMAND_NAMES has help/new/compact/status/usage/model; the palette showed only the built-in three, and slash-palette.ts itself documented the other five as undiscoverable. Rows added with names aligned to the contract list and descriptions grounded in runtime/commands/runner.ts.
  3. Context-window tier usage hint (models) — 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.
  4. Todo completion summary (workspace) — the progress section header now shows 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
  • test: carry the frozen-contract suites' Windows dialect, and build archive fixtures through sibling-relative tar paths (Windows bsdtar rejects --force-local)
  • chore(source): regenerate release/public-source.json for the new test file

Verification (Windows, this branch)

  • typecheck:client ✅ · typecheck:server ✅ · typecheck:test ✅
  • full suite pnpm test: 226 test files passed | 5 skipped, 0 failed (3507 tests), including the real-host integration suites
  • pnpm check:source ✅; check:webui-dependency ✅ (re-run by an independent reviewer over the whole diff)
  • independent review pass over all 9 commits: 1 blocking finding (source inventory, fixed in f1b6d32); advisories disclosed below

Follow-up tip cdd54251 (local re-verify)

After the earlier local NO-GO on f1b6d32e, ordinary push tip cdd54251 fixes:

  1. release/public-source.json — drop stray .zcode/* entries from the inventory
  2. agent-transcript frozen-contract selectors — backslash path truncation
  3. visual baselines — refresh progress-panel / composer-command-overlay

Local 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)

  • pin-list updates (W0 css structure, agent-transcript selectors) live in a later commit than the features that need them, so intermediate commits don't individually pass the frozen-contract suites
  • the local-runtime sqlite fix is functionally unrelated to the four features (kept here because the Windows gates need it); a dedicated regression test pinning "host.close releases the cached connection" would be welcome
  • projectTurnNavigatorPreview mirrors the turn-group projection's numbering rules; the two could drift
  • the jump-flash duration is duplicated in TS (1200ms) and CSS (1.2s) without a test interlock
  • IconMessageQuestion is shared by the help row and the ask-matt skill row in the same palette

Scope

Client-only features plus gate fixes; no wire/protocol changes.

…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.
Copilot AI balanced review requested due to automatic review settings October 27, 2026 15:41

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@Hylouis233

Copy link
Copy Markdown
Author

Follow-up ordinary push tip cdd54251 (no force-push) clears the three local gate failures found on f1b6d32e:

  1. release/public-source.json — removed stray .zcode/* inventory entries
  2. agent-transcript frozen-contract selectors — backslash path truncation
  3. visual baselines — refreshed progress-panel / composer-command-overlay

Local re-verify: 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 introduced by this PR.

PR body Verification updated. Ready for upstream review when convenient.

Logs: /workspace/minimax-code-logs/269-fix-20261028/, /workspace/check-logs/minimax-code-269-cdd54251/.

@Hylouis233
Hylouis233 merged commit 0fa9d0e into mcode-webui:webui Oct 28, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants