deepseek-harness/apps/web/tests
imccyu 50bfb00985 feat(web): single-build preview page and its acceptance e2e
One Vite build emits dist/index.html and dist/preview.html sharing every
chunk; the only difference is one prepended bootstrap entry whose module
connects the worker host, so the page from the stock entry onward is the
served startup chain verbatim. The dist moves to a relative base so the
preview mounts under any static directory, and the served form anchors
deep SPA-fallback paths with a rendered <base href="/">. The preview-boot
e2e serves the real built pages, packs the VFS image when absent, and
holds the boot line's lowering contract, the interactive hero, and a
clean page-error channel in headless Chromium.
2026-08-21 20:35:33 +08:00
..
snapshots Revert "Merge pull request #2608 from deepseek-harness/fix/permission-copy-and-default" 2026-08-21 16:21:13 +08:00
support
access-confirmation.e2e.ts Revert "Merge pull request #2608 from deepseek-harness/fix/permission-copy-and-default" 2026-08-21 16:21:13 +08:00
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(web): refine subagent header switcher 2026-08-20 20:18:55 +08:00
approval-composer.e2e.ts docs: make technical prose concrete 2026-08-10 16:34:20 +08:00
assembled-boot.ts feat(webserver): structured index injection table and the client boot seams 2026-08-20 16:13:04 +08:00
background-job-list.e2e.ts refactor: apply repository naming contract 2026-08-13 00:54:38 +08:00
bash-abort-row.e2e.ts
built-boot.snapshot.ts feat(client): compose deployment branding through slots 2026-08-19 18:21:35 +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 refactor: apply repository naming contract 2026-08-13 00:54:38 +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 docs: purge chain-of-thought leakage from prose 2026-08-09 21:10:59 +08:00
cold-blank-session.e2e.ts fix(web): hide verified cold blank sessions 2026-08-13 14:04:16 +08:00
command-image-envelope.snapshot.ts fix(plan): accept image-only plan requests 2026-08-18 15:43: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 review: address ds-review-bot findings on composer geometry 2026-08-12 23:51:46 +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 test(web): make Cordis continuation turn deterministic 2026-08-18 11:58:11 +08:00
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 feat(web): unify onboarding dialogs 2026-08-13 01:19:52 -07:00
goal-bar.overlay.yml feat(web): 移除首启内测声明,遥测保持默认关闭 2026-08-13 13:47:09 +08:00
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 refactor: apply repository naming contract 2026-08-13 00:54:38 +08:00
hmr-live.e2e.ts feat(build): bind client artifacts to build profiles 2026-08-19 18:21:27 +08:00
home-path-tilde.snapshot.ts feat(ui-tool): integrate connection handling for POSIX home path abbreviation 2026-08-18 19:25:13 +08:00
image-display.snapshot.ts fix(attachment): address dimension-limit review 2026-08-18 11:30:07 +08:00
lifecycle-chrome.e2e.ts feat(web): preserve near-full cache-hit precision 2026-08-19 14:41:23 +08:00
live-interactions.e2e.ts fix(ui-conversation): render the terminal turn error after same-turn retries exhaust 2026-08-20 18:19:30 +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
markdown-wide-table.e2e.ts feat(web): reveal the wide-table scrollbar on hover instead of painting it 2026-08-20 14:45:15 +08:00
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 refactor(test): keep session fixture projection local 2026-08-19 13:41:42 +08:00
message-feedback-layout.e2e.ts feat(feedback): float the note editor in a popover, not inline in the actions row 2026-08-19 13:49:30 +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 Merge remote-tracking branch 'origin/master' into worktree/minimal-no-runtime-context 2026-08-13 10:24:29 +08:00
models-settings.e2e.ts feat(web): add model picker bulk selection 2026-08-18 13:07:11 +08:00
navigation-panes.e2e.ts feat(web): Implement file-open failure handling in chat view 2026-08-18 17:39:38 +08:00
onboarding-deepseek-config.e2e.ts feat(llm-deepseek): publish the vision model 2026-08-19 11:50:34 +08:00
onboarding-usable-provider.e2e.ts feat(web): unify onboarding dialogs 2026-08-13 01:19:52 -07:00
permission-policy-context.e2e.ts
pin-browse-picker.overlay.yml refactor: apply repository naming contract 2026-08-13 00:54:38 +08:00
plan-control-row.e2e.ts fix(web): resolve the remaining review suggestions on the header, guard, and note 2026-08-08 03:31:58 +08:00
plan-review.e2e.ts
plugin-config.e2e.ts feat(web): combine plugin settings into tabs 2026-08-12 01:06:01 -07:00
preview-boot.e2e.ts feat(web): single-build preview page and its acceptance e2e 2026-08-21 20:35:33 +08: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 feat(web): single-build preview page and its acceptance e2e 2026-08-21 20:35:33 +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 Merge pull request #2417 from deepseek-harness/fix/pwsh-terminal-overlay-dup 2026-08-17 12:10:31 +08:00
question-composer.e2e.ts fix(web): cap the answer field at six text lines in both variants 2026-08-20 16:58:41 +08:00
queue-actions.e2e.ts fix(web): harden the composer submit transaction 2026-08-17 18:35:45 +08:00
rail-search-expand.e2e.ts review: address ds-review-bot findings on rail-search fix 2026-08-19 14:34:17 +08:00
README.i18n.yaml docs(i18n): localize Chinese internal links 2026-08-18 19:00:37 +08:00
README.md feat(web): unify onboarding dialogs 2026-08-13 01:19:52 -07:00
README.zh.md docs(i18n): localize Chinese internal links 2026-08-18 19:00:37 +08:00
reference-composer.e2e.ts fix(web): derive the caret-delete range from what the draft lost 2026-08-20 17:11:35 +08:00
remote-welcome.e2e.ts feat(web): unify onboarding dialogs 2026-08-13 01:19:52 -07: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 Merge remote-tracking branch 'origin/master' into xtr/2701-stable-session-snapshots 2026-08-21 11:43:58 +08:00
schedule-after.e2e.ts refactor: apply repository naming contract 2026-08-13 00:54:38 +08:00
search-card.snapshot.ts docs: make technical prose concrete 2026-08-10 16:34:20 +08:00
seeded-history.e2e.ts Merge remote-tracking branch 'github/master' into xtr/2701-stable-session-snapshots 2026-08-19 14:35:52 +08:00
settings-chrome.e2e.ts Revert "Merge pull request #2608 from deepseek-harness/fix/permission-copy-and-default" 2026-08-21 16:21:13 +08:00
shipped-composition.e2e.ts refactor(llm): use one five-retry default 2026-08-18 16:33:22 +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 refactor: apply repository naming contract 2026-08-13 00:54:38 +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 test(web): refresh product subagent skill rendering 2026-08-18 19:19:58 +08:00
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(client): compose deployment branding through slots 2026-08-19 18:21:35 +08:00
startup-auto-selection.e2e.ts feat(client): compose deployment branding through slots 2026-08-19 18:21:35 +08:00
startup-rpc-budget.e2e.ts fix(client): harden settings describe mirror 2026-08-18 15:26:16 +08:00
stats-paged-history.e2e.ts fix: 分页问题 2026-08-12 20:26:47 +08:00
steering.e2e.ts Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-08-19 11:01:27 +08:00
subagent-conversation.e2e.ts feat(web): refine subagent header switcher 2026-08-20 20:18:55 +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 fix(locale): correct two stale product-default-Chinese comments 2026-08-18 17:39:06 +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 fix(web): address trajectory pagination review 2026-08-13 14:38:15 +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 fix multi-query web search review feedback 2026-08-19 10:33:43 +08:00
workflow-run.e2e.ts fix(workflow): preserve disclosure intent across completion 2026-08-17 17:31:00 +08:00
workspace-management.e2e.ts perf(ci): parallelize coverage and web snapshots in-job 2026-08-18 21:15:20 +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 a stale mirrored value — a loud failure, never a silent pass. scaffold.ts follows this rule for the welcome-notice namespace, acknowledgement field, version, and asserted Chinese copy.

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.