deepseek-harness/apps/web/tests
07akioni 62a437c082 review: address ds-review-bot findings on session-stats
- stateVersion starts at 1: the package is new, no persisted rows predate it
- pendingCalls pairs by own key so a provider callId naming a prototype
  property cannot fold toolMs to NaN on an unmatched crash-recovery result
- StatsLine folds the window fallback only when no sessionStats value is
  served, and gates the token group on actual token activity instead of
  steps, so failed-only sessions drop the zero-token group
- correct the crash-step counting semantics in the README and Agent Note:
  recovery closes interrupted steps with a synthetic step/end on reload
- reword the window-scoped alternative as a plain rejected option and name
  isTokenDelta's home beside the StreamChunk type
2026-08-12 21:43:35 +08:00
..
snapshots review: address ds-review-bot findings on session-stats 2026-08-12 21:43:35 +08:00
support
access-confirmation.e2e.ts
agent-preset-authoring.e2e.ts fix(web): clamp preset card descriptions instead of sizing the roster 2026-08-11 14:09:04 +08:00
agent-preset-authoring.overlay.yml refactor(agent-presets,web): copy-only preset authoring with a path to the files 2026-08-08 22:35:26 +08:00
agent-preset-selection.e2e.ts feat(session-export): add command and Header action 2026-08-12 17:41:36 +08:00
approval-composer.e2e.ts docs: make technical prose concrete 2026-08-10 16:34:20 +08:00
assembled-boot.ts feat(session-export): add command and Header action 2026-08-12 17:41:36 +08:00
background-task-list.e2e.ts fix(tasks): correct the change-feed contract and its documentation 2026-08-10 13:37:18 +08:00
bash-abort-row.e2e.ts
built-boot.snapshot.ts test(web): adapt workspace browser e2e interactions to the compact sidebar 2026-08-12 01:32:08 +08:00
chat-continuous-conversation.e2e.ts Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-12 10:43:23 +08:00
chat-long-interactions.e2e.ts Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-12 10:43:23 +08:00
chat-scroll-contract.e2e.ts fix: 分页问题 2026-08-12 20:26:47 +08:00
chat-scroll-fixture.ts
code-mode-round.e2e.ts docs: purge chain-of-thought leakage from prose 2026-08-09 21:10:59 +08:00
complex-history.perf.ts fix: 分页问题 2026-08-12 20:26:47 +08:00
composer-draft-scroll.e2e.ts Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-12 10:43:23 +08:00
composer-tab-geometry.e2e.ts test(web): adapt workspace browser e2e interactions to the compact sidebar 2026-08-12 01:32:08 +08:00
conversation-column-overflow.e2e.ts docs: purge chain-of-thought leakage from prose 2026-08-09 21:10:59 +08:00
cordis-tool-round.e2e.ts
declared-reasoning.e2e.ts fix(headless): dsh run is a direct core front door 2026-08-09 13:44:44 +08:00
declared-reasoning.overlay.yml fix(headless): dsh run is a direct core front door 2026-08-09 13:44:44 +08:00
default-model.e2e.ts docs: reserve seam for complete capabilities 2026-08-09 17:26:57 +08:00
default-model.overlay.yml docs: purge chain-of-thought leakage from prose 2026-08-09 21:10:59 +08:00
details-session-lifecycle.e2e.ts docs: make technical prose concrete 2026-08-10 16:34:20 +08:00
feedback-command.e2e.ts test(feedback): fix the assembled e2e record path and teardown restore 2026-08-11 11:01:48 +08:00
goal-bar.e2e.ts
goal-bar.overlay.yml
goal-command-presentation.e2e.ts feat(web): show command inputs in the human transcript 2026-08-11 17:19:51 +08:00
goal-multi-turn-actions.e2e.ts Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-12 10:43:23 +08:00
hmr-live.e2e.ts refactor(web): remove --dev; mount the reload chain unconditionally 2026-08-11 18:01:25 +08:00
image-display.snapshot.ts Merge pull request #2346 from deepseek-harness/fix/web-max-tokens-turn-end-notice 2026-08-12 20:07:35 +08:00
lifecycle-chrome.e2e.ts test(web): adapt workspace browser e2e interactions to the compact sidebar 2026-08-12 01:32:08 +08:00
live-interactions.e2e.ts docs: reserve seam for complete capabilities 2026-08-09 17:26:57 +08:00
markdown-cjk-strong.e2e.ts
markdown-images.e2e.ts
markdown-inline-code-links.e2e.ts
math-rendering.e2e.ts review: address ds-review-bot findings on session-stats 2026-08-12 21:43:35 +08:00
max-tokens-notice.snapshot.ts fix(web): surface max-tokens turn ends as a localized truncation notice 2026-08-12 15:36:27 +08:00
message-actions.e2e.ts fix(ci): await token stats before aria snapshot 2026-08-11 00:28:00 +08:00
message-feedback-protocol.snapshot.ts fix(feedback): address backend review gaps 2026-08-10 21:40:03 -07:00
message-feedback.e2e.ts feat(feedback): add the Web surface for message feedback 2026-08-11 17:14:21 +08:00
minimal-preset.snapshot.ts feat: align minimal runtime profiles 2026-08-11 15:19:33 +08:00
models-settings.e2e.ts fix(web): answer the review on the declared-provider editor 2026-08-10 23:31:21 +08:00
navigation-panes.e2e.ts fix(session-export): preserve streamed browser downloads 2026-08-12 18:44:04 +08:00
onboarding-deepseek-config.e2e.ts docs: state the Host-face rule for the browser e2e and settle the follow-ups 2026-08-11 19:25:41 +08:00
onboarding-usable-provider.e2e.ts fix(web): end first-run onboarding on any usable provider 2026-08-12 12:50:45 +08:00
permission-policy-context.e2e.ts
pin-browse-picker.overlay.yml Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-12 10:43:23 +08:00
plan-review.e2e.ts
plugin-config.e2e.ts feat(web): add read-only Loader plugin inventory 2026-08-11 21:10:14 -07:00
produced-file-mentions.e2e.ts feat(web): a prose mention of a produced file opens it 2026-08-07 03:02:10 -07:00
produced-files.e2e.ts Merge upstream master into feat/produced-files-folder 2026-08-11 05:22:59 -07:00
produced-files.overlay.yml feat(web): make produced-file overflow discoverable 2026-08-10 21:53:38 -07:00
pwa-manifest.e2e.ts revert(web): drop the 32x32 PNG favicon fallback 2026-08-10 14:17:17 +08:00
pwsh-terminal.e2e.ts test(web): adapt workspace browser e2e interactions to the compact sidebar 2026-08-12 01:32:08 +08:00
pwsh-terminal.overlay.yml
question-composer.e2e.ts docs: make technical prose concrete 2026-08-10 16:34:20 +08:00
queue-actions.e2e.ts
README.i18n.yaml docs: state the Host-face rule for the browser e2e and settle the follow-ups 2026-08-11 19:25:41 +08:00
README.md docs: state the Host-face rule for the browser e2e and settle the follow-ups 2026-08-11 19:25:41 +08:00
README.zh.md docs: state the Host-face rule for the browser e2e and settle the follow-ups 2026-08-11 19:25:41 +08:00
remote-welcome.e2e.ts test(web): keep the browser e2e out of the Client build graph 2026-08-11 19:25:40 +08:00
replay-round-trip.e2e.ts refactor(web): remove --dev; mount the reload chain unconditionally 2026-08-11 18:01:25 +08:00
scaffold-hermetic.e2e.ts fix(agent-presets): unify the session event entrypoint and re-address the hermetic skills probe 2026-08-09 23:42:44 +08:00
scaffold.ts test(web): pin full telemetry in scaffold 2026-08-12 20:14:43 +08:00
schedule-after.e2e.ts Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-12 10:43:23 +08:00
search-card.snapshot.ts docs: make technical prose concrete 2026-08-10 16:34:20 +08:00
seeded-history.e2e.ts fix: 分页问题 2026-08-12 20:26:47 +08:00
settings-chrome.e2e.ts feat(web): add read-only Loader plugin inventory 2026-08-11 21:10:14 -07:00
shipped-composition.e2e.ts refactor: replace overloaded surface terminology 2026-08-11 15:23:05 +08:00
sidebar-scrollbar.e2e.ts test(web): cover workspace sidebar behavior 2026-08-11 15:25:11 +08:00
sidebar-subagent-activity.e2e.ts docs: reserve seam for complete capabilities 2026-08-09 17:26:57 +08:00
skill-invocation-policy.e2e.ts test(web): cover user-only skill invocation end to end 2026-08-08 01:27:25 +08:00
skill-tool-row.e2e.ts
skill-user-invoke.e2e.ts test: update conversation assembly coverage and docs 2026-08-09 18:16:44 +08:00
smoke-real.e2e.ts feat(session-export): add command and Header action 2026-08-12 17:41:36 +08:00
startup-auto-selection.e2e.ts fix(web): stabilize hero whale hover 2026-08-11 08:53:39 -07:00
stats-paged-history.e2e.ts fix: 分页问题 2026-08-12 20:26:47 +08:00
steering.e2e.ts test: stabilize steering mid-turn snapshot 2026-08-11 21:45:30 +08:00
subagent-conversation.e2e.ts test(web): wait for the transcript the subagent golden pins 2026-08-11 22:03:50 +08:00
subagent-interrupt-ui.e2e.ts docs: purge chain-of-thought leakage from prose 2026-08-09 21:10:59 +08:00
subagent-interrupt.e2e.ts docs: purge chain-of-thought leakage from prose 2026-08-09 21:10:59 +08:00
support.ts Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-12 10:43:23 +08:00
todo-row.snapshot.ts fix(web): surface max-tokens turn ends as a localized truncation notice 2026-08-12 15:36:27 +08:00
trajectory-virtualization.e2e.ts test(web): adapt workspace browser e2e interactions to the compact sidebar 2026-08-12 01:32:08 +08:00
turn-tail-actions.e2e.ts docs: make technical prose concrete 2026-08-10 16:34:20 +08:00
vite-entry.e2e.ts
web-search-round.e2e.ts
workflow-run.e2e.ts fix(workflow): refold coalesced disclosure cycles 2026-08-12 01:01:25 +08:00
workspace-management.e2e.ts test(web): adapt workspace browser e2e interactions to the compact sidebar 2026-08-12 01:32:08 +08:00

apps/web browser e2e

English | 中文

These tests boot the real web composition in-process and drive it with a real Chromium over real HTTP. The lane's mechanics — modes, fixtures, goldens, and the deliberate composition divergences from dsh web — are documented in scaffold.ts and the browser e2e Agent Note.

These are Host-face tests

They type-check in the root tsconfig.host.json, not in the Client aggregate, because they read Host services directly: ctx.apiProxy, the Host SessionStore, ctx.sessionProjectionCache. Driving a browser at runtime does not make a file part of the Client program — the two faces merge cordis Context under the same keys with different services, so one program cannot see both. Moving these files into the Client aggregate makes every Host-service access fail to compile.

Do not import @deepseek-ai/dsh-client-* here

Importing a Client package — a value or a type — pulls its whole TypeScript project, and every project it references, into the Host build graph. That has bitten this lane once already: four Client consumer packages reference api/remotes' Client face, which cannot compile until Host tsdown has generated @deepseek-ai/dsh-goal/remote, so the Host build phase ended up waiting on an artifact it produces itself.

When a scenario needs a Client-owned constant or pure function, mirror it here instead, next to the commented-out import that names the source module. A drift then surfaces as a missed selector or an unsuppressed notice — a loud failure, never a silent pass. scaffold.ts holds the mirrored welcome-notice values and exports them for the scenarios that assert on them.

Two kinds of Client import stand. assembled-boot.ts drives the shell itself, so it imports AppWebEntry from @deepseek-ai/dsh-client-web and the boot-manifest type from @deepseek-ai/dsh-client-modules/client: booting the real shell is what that harness is for, and both packages are already in the Host graph. Separately, the chat scenarios import conversationContextKey from @deepseek-ai/dsh-client-runtime/client because client/runtime is reachable through the unsplit directory-picker packages and pulls nothing further in. That reachability is incidental, not a guarantee — if it ever leaves the graph, mirror the helper like the rest.

Nothing mechanically enforces this rule; keep it in review.