Commit Graph
709 Commits
Author SHA1 Message Date
ZiyaZhang 8fb6c2bd69 refactor(web): open produced files through the Host, not over HTTP
Scope decision: previews for a browser that is not on the Host machine are
not supported. With that settled, host.openPath answers the supported case
completely — a file:// document in a real browser has full page capabilities
and no reach into /api — and the HTTP serving this branch had built answered
only the unsupported one.

Removed: the /f route and its listener, the workspace-file URL shape,
ApiProxy.workspaceRootOf, ConnectionHandle.fileUrl, and the port published
into the index page.

Kept, and finished:
- the produced-files row a turn ends with, derived from mutation locations;
- the path link now reads as a link at rest, not only on hover — the reported
  "I can't open what it made" was this, sitting on a working capability;
- the Host opener prefers the default BROWSER for .html/.htm/.xhtml/.svg, so
  a developer who binds .html to an editor still gets a rendered page
  (macOS via the LaunchServices https handler, Linux via $BROWSER, every
  failure falling back to the default application).

The retired designs and their measurements stay in the Agent Note, including
why same-origin serving was unsafe and why the sandbox that fixed it broke
the pages invisibly.
2026-08-01 03:15:54 -07:00
ZiyaZhang 59bfe77fb8 feat(web): serve workspace files from their own origin
A sandbox header bought isolation by taking the document's origin away, and
measuring that cost decided against it: the reported artifact throws
SecurityError on load, and because an uncaught exception aborts the rest of
its <script>, every listener declared after that line — theme toggle, mobile
menu, model tabs — never binds. Two of the four artifacts in the reporting
user's workspace were dead pages under it, and they still looked right.

A second listener on the API's host, answering /f and nothing else, is the
same boundary without the amputation: cross-origin to /api (refused by the
Origin fence and by CORS), same-origin with itself (localStorage, cookies and
fetch all work). Its port is published into the index page; the browser half
reads it to address previews, and its absence — the keyless fixture lane — is
what makes a file row fall back to the Host opener instead of a dead tab.

fileUrl moves from IWorkspaces to ConnectionHandle: the transport owns both
the listener that serves the bytes and the port that addresses it.
2026-08-01 02:17:25 -07:00
ZiyaZhang dcf485ac5c fix(web): address the review of the workspace-file route
Isolation is restored on the premise the review corrected: a workspace file
need not be agent-authored — a read row makes every file in a cloned
repository openable — and a same-origin active document was measured driving
/api/settings.describe to a 200 with full data. Script-capable documents go
back into an opaque origin; the preview's lost localStorage is the known cost,
and a separate serving origin is the way to retire it.

- confine(): a workspace rooted at a filesystem root has a realpath already
  ending in the separator, and the doubled prefix 403'd every child.
- turnDeliverables(): reset on the turn boundary, not only at a closing
  assistant, so an interrupted turn cannot spill into the next turn's row;
  and recognize a mutation by render intent (diff card, or generic with
  kind 'edit') so str_replace_editor's insert counts.
- 405 answers name the methods it allows.
- The e2e now cold-seeds a recorded WRITE turn, so the assembled application
  covers the Produced row, its chip's served URL, and the isolation header.
- Agent Note matched to what shipped (the row is in this PR, not deferred);
  ui-conversation README documents the new destination and the row; the
  fixture lane's dead-tab quirk and the cold-path listing cost are recorded.
2026-08-01 01:08:16 -07:00
ZiyaZhang 00390ae851 feat(web): open a produced file from the conversation
Serve one file at a time out of a Session's workspace under /f on the web
transport, and point the conversation's existing file-open affordance at it.
Clicking a write/edit/read row's path now opens that file in a browser tab —
including from a LAN client, where the Host's system opener is fenced to
loopback and answered nothing.

- /f/<sessionId>/<segments> in client-connection, behind the same
  browser-trust fence as /api; realpath confinement, streamed reads,
  GET/HEAD only, nosniff + no-store.
- Script-capable documents carry CSP sandbox: model-authored markup must not
  be same-origin with /api, where events.mux is a readable GET stream.
- ApiProxy.workspaceRootOf answers where a Session's files live without
  resuming an agent; the client program cannot reach the core services.
- The /f URL shape lives in dsh-host-apiproxy/api so both ends share one
  encoding (client bundles may not value-import another plugin).
2026-07-31 12:07:43 -07:00
Turtle 3a6c253cc7 test(web): refresh queue-actions golden for the lineage-free header
PR #1100 recorded the golden with the session-lineage navigation still in
the header; PR #1099 removed it. Master's snapshots job was skipped on the
combining merge, so the conflict first surfaced on the next PR's CI.
2026-07-31 22:29:14 +08:00
Wenlu Wang 9a3bdd599c Merge pull request #1099 from deepseek-harness/codex/hide-session-lineage-header
fix(web): hide session lineage in header
2026-07-31 21:51:56 +08:00
kingwl 6879c0c9ca Merge remote-tracking branch 'origin/master' into codex/hide-session-lineage-header
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-07-31 21:31:04 +08:00
kingwl 32972f1675 Merge remote-tracking branch 'origin/master' into codex/web-stop-preserve-queue 2026-07-31 21:30:19 +08:00
Ziya 3a01dc814e Merge pull request #1088 from deepseek-harness/agent/web-context-injection-auto-height
fix(web): let context injection cards fit content
2026-07-31 09:28:45 -04:00
kingwl 07b0efc49e fix(web): hide session lineage in header 2026-07-31 21:08:57 +08:00
kingwl 32a0e871b7 fix(web): preserve queue on stop 2026-07-31 20:51:05 +08:00
ZiyaZhang 5e68d812d1 fix(web): let context injection cards fit content 2026-07-31 05:20:54 -07:00
_Kerman 966add3305 Merge remote-tracking branch 'github/master' into xtr/trajectory-timeline-polish 2026-07-31 20:01:50 +08:00
_Kerman dd98d15b1d Merge remote-tracking branch 'github/master' into xtr/trajectory-timeline-polish
# Conflicts:
#	packages/client/ui-trajectory/src/client/timeline.ts
#	packages/client/ui-trajectory/tests/views.spec.tsx
2026-07-31 20:01:16 +08:00
_Kerman 094f1976c4 fix(trajectory): lighten summary section headings 2026-07-31 19:53:55 +08:00
imccyu 23ee31efc0 Merge branch 'master' into fix/remove-badge 2026-07-31 19:47:55 +08:00
Tianyi Cui d64b032311 Merge pull request #1082 from deepseek-harness/worktree/fix-web-duplicate-folder-names-20260731
fix(workspace): allow same-basename folders in Web
2026-07-31 19:37:38 +08:00
07akioni 410a837e02 Merge remote-tracking branch 'origin/master' into fix/remove-badge 2026-07-31 19:33:01 +08:00
Ziya 9b1486f90f Merge pull request #1078 from deepseek-harness/fix/web-turn-error-surface
fix(web): surface terminal turn failures
2026-07-31 07:23:09 -04:00
07akioni 94a600eddd Merge branch 'master' into fix/remove-badge 2026-07-31 19:19:55 +08:00
Tianyi Cui c16e33d8db Merge latest master into feat/recommended-deployment-presets
# Conflicts:
#	apps/cli/README.i18n.yaml
#	apps/web/tsconfig.json
#	tsconfig.host.json
2026-07-31 19:16:05 +08:00
07akioni 1766461947 Merge remote-tracking branch 'origin/master' into fix/remove-badge 2026-07-31 19:13:22 +08:00
Ziya 9473951c79 Merge branch 'master' into fix/web-turn-error-surface 2026-07-31 07:13:02 -04:00
07akioni f9dc4aa702 feat: remove "插话" badge displayed in user message 2026-07-31 19:12:16 +08:00
hypatiamay 57761539b4 Merge pull request #989 from deepseek-harness/feat/manual-compact-single-lock
feat(compact): add queued manual /compact
2026-07-31 19:10:48 +08:00
Ziya 4f13ce7b7f Merge branch 'master' into fix/web-turn-error-surface 2026-07-31 07:07:05 -04:00
creatixchu 2dde4e7f09 test(web): follow connectFreshWorkspace's staged-directory signature 2026-07-31 18:46:22 +08:00
creatixchu 404c58717a Merge remote-tracking branch 'origin/worktree/hero-blank-session-settling' into worktree/hero-blank-session-settling 2026-07-31 18:43:37 +08:00
Tianyi Cui ce04a85d80 Merge origin/master into same-basename workspace fix
# Conflicts:
#	packages/client/ui-workspace/README.i18n.yaml
2026-07-31 18:42:20 +08:00
Tianyi Cui 678ad97f9a Allow same-basename Workspace paths 2026-07-31 18:37:34 +08:00
creatixchu da500aae67 test(web): pin the startup auto-selection hero in the assembled app
Holds the session.history response at the browser's network boundary so
the auto-selected open is observable, then asserts the visible frame and
the recorded phase timeline. Registered host-plane like the other
scaffold-booting e2e files (host include + client project exclude).
2026-07-31 18:37:06 +08:00
Tianyi Cui 1c1a65f208 Merge origin/master into feat/recommended-deployment-presets
# Conflicts:
#	apps/cli/README.i18n.yaml
#	apps/cli/package.json
#	pnpm-lock.yaml
2026-07-31 18:32:24 +08:00
Tianyi Cui 54242bef1c Merge latest master into manual compaction 2026-07-31 18:26:40 +08:00
Tianyi Cui e9c040894f fix(cli): align shipped composition contracts 2026-07-31 18:25:03 +08:00
Ziya 05608d9098 Merge branch 'master' into fix/web-turn-error-surface 2026-07-31 06:19:46 -04:00
Tianyi Cui 5d87f8b291 Merge latest master into manual compaction 2026-07-31 18:11:53 +08:00
ZiyaZhang 215bf15f78 fix(web): surface terminal turn failures 2026-07-31 03:10:48 -07:00
Tianyi Cui 21163711ea Merge origin/master into worktree/core-web-minimal-profile 2026-07-31 18:10:48 +08:00
creatixchu 42ca5cd31c Merge remote-tracking branch 'origin/master' into worktree-session-hover-menu-fix
# Conflicts:
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-primitives/README.zh.md
2026-07-31 18:00:02 +08:00
Tianyi Cui 20cb7e7360 Merge latest master into manual compaction 2026-07-31 17:58:30 +08:00
Tianyi Cui 6e26f9fd83 Merge latest master into manual compaction
# Conflicts:
#	apps/cli/README.i18n.yaml
#	docs/architecture.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	examples/acp-agent/tests/snapshots/cordis-inspect-jsdoc/session.jsonl
#	packages/compact/compact-basic/README.i18n.yaml
#	packages/pty/pty-local/tests/index.spec.ts
2026-07-31 17:57:11 +08:00
Tianyi Cui 43a1c0bd8f Merge branch 'master' into worktree/core-web-minimal-profile 2026-07-31 17:57:09 +08:00
creatixchu 31e467e744 Merge remote-tracking branch 'origin/master' into worktree-session-hover-menu-fix
# Conflicts:
#	apps/web/tests/workspace-management.e2e.ts
#	packages/client/ui-workspace/README.i18n.yaml
2026-07-31 17:56:06 +08:00
Chinesezjc bcb474d13e Merge pull request #1066 from deepseek-harness/feat/web-cards-toolrow
refactor(web): collapse every card tool row through one ToolRow
2026-07-31 17:54:38 +08:00
Tianyi Cui d03927f69b Merge branch 'master' into worktree/core-web-minimal-profile 2026-07-31 17:52:08 +08:00
Tianyi Cui a3905519fb Merge pull request #1068 from deepseek-harness/codex/dsh-home-path
refactor(config): centralize DSH home paths
2026-07-31 17:50:41 +08:00
Tianyi Cui c77f889a2a Merge branch 'master' into worktree/core-web-minimal-profile
# Conflicts:
#	apps/cli/README.i18n.yaml
2026-07-31 17:50:21 +08:00
NI0317 d558cb4fd4 feat(cli): even out the shipped tool rosters across both surfaces
The two shipped surfaces offered different tools for no recorded reason:
session checkpoints, tool-result pruning, the goal tools, and Ralph were in
`tui.cordis.yml`; `tool-todo` and web search were in `web.cordis.yml`. Neither
offered session search, a string-replacement editor, or a repeat-tool guard,
though none of the three is surface-specific.

Move the rows that are not surface-specific into `base.cordis.yml` and add
those three. Web search moves there too — the TUI decision the change that
made it a Web default deferred. Both surfaces now assemble the same 27 tools.

This adds only. No row is removed from either surface and no existing row's
configuration is edited: executors, sandbox composition, access defaults,
`tools.mode`, and the workflow tool are exactly what they were. Two rows stay
surface-specific: `tmux-context` (no terminal multiplexer in a browser) and
`session-reference` (its index has one writer owner).

Ship `dsh-mcp-client` as a dependency without a row: the plugin mounts one
server per instance and `command` is required, so a default would name a
third-party server and spawn it outside `ctx.bash` on every launch. The CLI
README carries the YAML for mounting one from a personal config.
2026-07-31 17:45:49 +08:00
Chinesezjc 0be76f5552 Merge remote-tracking branch 'origin/master' into feat/web-cards-toolrow
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-07-31 17:45:31 +08:00
Turtle ef201014d0 Merge remote-tracking branch 'origin/master' into codex/dsh-home-path
# Conflicts:
#	packages/ui/app-boot/README.i18n.yaml
#	packages/ui/app-boot/README.md
#	packages/ui/app-boot/README.zh.md
#	packages/ui/app-boot/src/index.ts
2026-07-31 17:40:48 +08:00