deepseek-harness/apps/web/tests
Yichen Jiang 3d68185480 feat(web): move the agent plane behind per-session presets
The Web overlay disables base's 32 agent-plane rows and mounts the preset
roster instead, so each session composes its own tools and prompt rather than
sharing one process-wide set. The TUI keeps base unchanged: it is single-session
and composing its agent process-wide is correct there.

`roots` is patched in by AppCLIEntry, like `distIndex`: the shipped presets sit
beside the composition that names them and the user's live under the Harness
home, neither of which a config author chooses.

A session's preset is fixed at creation. Naming a different one for an existing
identity is `agent-preset-conflict` rather than a switch, because that
session's history was produced under the first preset's tools. The guard sits
after `await creation`, beside the cwd check, so it covers every path that
yields a live agent — freshly created, adopted live, resumed, or recovered by
the concurrent-creation catch. A request naming no preset adopts the session as
it is, keeping reconnect and retry ordinary.

Two bugs the real-composition test caught, both invisible to unit tests:

`PresetTree` now refuses to write. The Loader persists a tree whose plugin
self-disposed, and tearing an agent down disposes its whole subtree — inherited,
that rewrote the shipped composition, truncating a 241-line preset to `[]` the
first time a session ended.

`dsh-tool-skill` compared against a lookup of its own name in the global layer,
so it threw inside any preset: `register()` files into the calling context's
scope. It now compares against the definition it registered, which is what the
identity check meant all along.

The `standard` catalog is asserted exactly, not spot-checked: a row that
registers into the wrong layer mounts cleanly and simply contributes nothing, so
an omission is this design's quietest failure. It matches the shipped TUI
catalog plus `glob`/`grep`, the pair that composition documents as
ripgrep-dependent.

Re-records `cordis-inspect-jsdoc`, whose rendered `SessionHeader` gains the
`agentPreset` field. `fs-glob-sampling` fails identically on pristine master
and is untouched here.

The browser e2e scaffold gains the roster fact AppCLIEntry supplies. `roots` is
resolved and patched in by the CLI entry, like `distIndex` on the webserver row,
and this lane boots the shipped tree without that entry — so it has to supply
the same fact or the roster resolves nothing and every session in the lane
composes an agent with no tools, no persona, and no token meter. Only the
shipped root: a developer's own `~/.dsh/.agent-presets` must not decide a golden. The
`cordis:group` builtin comes with it, exactly as `boot()` registers it, because
a preset resolving package names from its own directory cannot reach
`@cordisjs/plugin-group` by name.

The lane stays red through this layer and the next four for the reason stated
above — the api-proxy injects `subagents`, `workspace`, and `tools`, so
`api-gateway` cannot activate and the browser has no `/api` at all. It goes
green again in the layer that returns those registries to the host plane; this
change is what makes that layer's fix sufficient rather than partial.
2026-08-07 00:35:30 +08:00
..
snapshots Merge pull request #1599 from deepseek-harness/codex/web-slash-fuzzy-search 2026-08-06 19:21:47 +08:00
support fix(web): verify current GUI updates end to end 2026-07-29 11:22:48 +08:00
access-confirmation.e2e.ts Merge remote-tracking branch 'origin/master' into worktree/custom-deepseek-models 2026-08-03 16:20:55 +08:00
approval-composer.e2e.ts Merge origin/master into worktree/composer-caret-binding 2026-08-04 14:44:09 +08:00
bash-abort-row.e2e.ts test(web): follow the structured abort message in the bash-abort-row scenario 2026-08-03 20:57:26 +08:00
built-boot.snapshot.ts fix(fixture): mirror context breakdown projection 2026-08-06 00:21:17 +08:00
chat-continuous-conversation.e2e.ts test(web): align long-chat contracts with master 2026-08-04 14:23:34 +08:00
chat-long-interactions.e2e.ts test(web): await stopped queue state 2026-08-04 15:09:55 +08:00
chat-scroll-contract.e2e.ts test(web): align snapshots with responsive chrome 2026-08-04 17:16:53 +08:00
chat-scroll-fixture.ts Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification 2026-08-05 21:42:33 +08:00
code-mode-round.e2e.ts fix: remove scoped bash 2026-07-31 20:47:55 +08:00
complex-history.perf.ts Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification 2026-08-05 13:53:35 +08:00
composer-draft-scroll.e2e.ts Merge origin/master into worktree/composer-caret-binding 2026-08-04 14:44:09 +08:00
composer-tab-geometry.e2e.ts Merge remote-tracking branch 'origin/master' into worktree/composer-scrollbar-gutter 2026-08-05 15:36:06 +08:00
cordis-tool-round.e2e.ts Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification 2026-07-31 22:16:40 +08:00
core-web-profile.snapshot.ts fix(cli): keep the core-web overlay at its documented two-tool surface 2026-08-02 14:05:36 +08:00
details-session-lifecycle.e2e.ts cleanup(web): give adding a Workspace one route 2026-07-31 15:47:40 +08:00
goal-bar.e2e.ts fix(web): single-flight goal clear 2026-07-31 20:54:23 +08:00
goal-bar.overlay.yml fix(web): single-flight goal clear 2026-07-31 20:54:23 +08:00
hmr-live.e2e.ts Merge fix/web-agent-runtime-context into fix/web-gui-feedback-loop 2026-08-01 22:15:36 +08:00
lifecycle-chrome.e2e.ts Merge remote-tracking branch 'origin/master' into codex/web-slash-fuzzy-search 2026-08-06 14:48:35 +08:00
live-interactions.e2e.ts test(web): wait on the request marker button, not the hairline row 2026-08-03 19:37:52 +08:00
markdown-cjk-strong.e2e.ts test: stabilize markdown web snapshots 2026-08-06 15:37:40 +08:00
markdown-images.e2e.ts test(web): pin the remaining markdown fixture's event times 2026-08-06 16:24:20 +08:00
markdown-inline-code-links.e2e.ts test: stabilize markdown web snapshots 2026-08-06 15:37:40 +08:00
math-rendering.e2e.ts fix(web): localize stats and close stale context meter 2026-08-06 00:21:34 +08:00
message-actions.e2e.ts Merge remote-tracking branch 'origin/master' into worktree/custom-deepseek-models 2026-08-03 19:02:29 +08:00
models-settings.e2e.ts fix(web): address UI polish review feedback 2026-08-04 16:25:09 +08:00
navigation-panes.e2e.ts test(web): expand long-chat regression and performance coverage 2026-08-04 14:23:34 +08:00
onboarding-deepseek-config.e2e.ts feat(web): align the model catalog with the pi-ai provider form 2026-08-04 14:53:17 +08:00
permission-policy-context.e2e.ts fix(web): pass the scaffold root in the new permission-policy scenario 2026-07-31 16:58:42 +08:00
pin-browse-picker.overlay.yml fix: retire leftovers of the removed $DSH_HOME/config.yaml personal overlay 2026-08-06 17:28:58 +08:00
plan-review.e2e.ts feat(client): surface pending session interactions 2026-08-04 17:15:10 +08:00
pwsh-terminal.e2e.ts fix(web): probe pwsh through the executor's path resolution 2026-08-05 11:42:43 +08:00
pwsh-terminal.overlay.yml feat(pwsh): render pwsh calls as bash-shaped terminal cards in the Web UI 2026-08-05 02:05:06 +08:00
question-composer.e2e.ts feat(client): surface pending session interactions 2026-08-04 17:15:10 +08:00
queue-actions.e2e.ts test(web): await stopped queue state 2026-08-04 15:09:55 +08:00
remote-welcome.e2e.ts fix(web): unblock remote welcome onboarding 2026-08-02 12:56:31 -07:00
replay-round-trip.e2e.ts Merge fix/web-agent-runtime-context into fix/web-gui-feedback-loop 2026-08-01 22:15:36 +08:00
scaffold-hermetic.e2e.ts fix(web): isolate replay skill discovery 2026-07-30 19:30:06 +08:00
scaffold.ts feat(web): move the agent plane behind per-session presets 2026-08-07 00:35:30 +08:00
search-card.snapshot.ts fix(client): load plugin bundles as external scripts 2026-08-04 14:18:47 +08:00
seeded-history.e2e.ts Merge remote-tracking branch 'origin/master' into worktree/context-source-cards 2026-08-06 12:03:15 +08:00
settings-chrome.e2e.ts feat(web): open the local settings file 2026-08-04 16:59:37 +08:00
shipped-composition.e2e.ts Merge remote-tracking branch 'origin/master' into feat/ripgrep-packaged-binary 2026-08-02 16:18:46 +08:00
sidebar-scrollbar.e2e.ts Merge origin/master into worktree/sidebar-scrollbar-reveal 2026-08-04 15:46:53 +08:00
skill-invocation-policy.e2e.ts cleanup(web): give adding a Workspace one route 2026-07-31 15:47:40 +08:00
smoke-real.e2e.ts Merge remote-tracking branch 'origin/master' into feat/profile-plugin-management 2026-08-06 06:55:42 +08:00
startup-auto-selection.e2e.ts fix(ui): preserve Hero tree when selecting a Workspace 2026-08-06 18:01:11 +08:00
steering.e2e.ts refactor(agent-loop): drop the steering/message session event 2026-08-03 16:04:26 +08:00
subagent-conversation.e2e.ts fix(web): preserve subagent catalog styling 2026-08-03 18:24:25 +08:00
support.ts Merge remote-tracking branch 'origin/master' into worktree/custom-deepseek-models 2026-08-03 16:20:55 +08:00
trajectory-virtualization.e2e.ts fix(trajectory): bound work during long streams 2026-08-04 20:37:33 +08:00
vite-entry.e2e.ts fix(web): verify current GUI updates end to end 2026-07-29 11:22:48 +08:00
web-search-round.e2e.ts fix(ui-primitives): keep two-digit source markers out of the scroll clip 2026-08-03 18:58:44 +08:00
workspace-management.e2e.ts fix(client): address CI and review findings on blank-session reuse 2026-08-05 12:21:09 +08:00