imccyu
3a9f78c55e
feat(web): restore actions after steering consumption
2026-08-02 17:53:07 +08:00
imccyu
dffe955ed2
feat(web): surface and configure composer steering
2026-08-02 17:53:07 +08:00
kingwl
5b17d3bab5
fix(web): match queue steer icon to design
2026-08-02 17:53:07 +08:00
kingwl
955a12cca4
feat(web): steer queued messages into active turns
2026-08-02 17:53:07 +08:00
kingwl
6e3f77da60
Merge remote-tracking branch 'origin/master' into codex/fork-real-turn-tail
...
# Conflicts:
# packages/client/ui-conversation/README.i18n.yaml
2026-08-02 16:25:38 +08:00
kingwl
76547dfe0c
fix(web): restrict message forks to completed turn tails
2026-08-02 16:25:02 +08:00
kingwl
cf70a52dcc
Merge origin/master into codex/todo-goal-queue-layout
2026-08-02 14:34:13 +08:00
kingwl
6332b5b952
fix(web): align context cards on narrow screens
2026-08-02 13:26:08 +08:00
imccyu
b94d2f9c1d
fix(web): stabilize nested subagent navigation
2026-08-02 12:51:11 +08:00
imccyu
ca1d838afc
style(web): refine subagent navigation chrome
2026-08-02 12:51:11 +08:00
imccyu
42d34473af
fix(web): allow follow-ups to running subagents
2026-08-02 12:51:11 +08:00
imccyu
130410bb98
fix(web): preserve subagent navigation and fork grouping
2026-08-02 12:51:11 +08:00
imccyu
5d56019d22
feat: revert crumbs navigation for subagents
2026-08-02 12:51:11 +08:00
imccyu
5ef5feb01a
fix(web): reconcile rebased subagent contracts
2026-08-02 12:51:09 +08:00
imccyu
5113b831e8
test(client): align card fixtures with subagent session state
2026-08-02 12:51:09 +08:00
Dudu-0223
8a518e353b
feat(web): rewrite subagent conversations for FIFO activation
2026-08-02 12:51:09 +08:00
Dudu-0223
16ffd63115
feat(web): add nested subagent conversations
2026-08-02 12:51:09 +08:00
kingwl
cd121c636a
fix(web): align composer context stack
2026-08-02 12:45:36 +08:00
_Kerman
0efbb7d87a
Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification
...
# Conflicts:
# .agents/notes/implemented/feature/2026-07-22-docked-web-goal-bar.i18n.yaml
# .agents/notes/implemented/feature/2026-07-22-docked-web-goal-bar.md
# .agents/notes/implemented/feature/2026-07-22-docked-web-goal-bar.zh.md
# docs/config-catalog.md
# packages/client/ui-goal/README.i18n.yaml
# packages/host/apiproxy/tests/api-proxy-fork.spec.ts
# packages/ui/tui/README.i18n.yaml
2026-08-02 00:59:11 +08:00
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
35e9122a65
feat(web): list a turn's produced files under its closing message
...
The paths come from the mutation tools' follow-along locations, not from the
closing prose, so a turn's output is listed whether or not the model named
it. Each chip opens through the same openFile the tool rows use.
Reads contribute nothing (looking at a file does not produce it), a failed
mutation contributes nothing, a file touched twice is one entry, and the row
shows six with an explicit remainder rather than burying the answer.
2026-07-31 22:13:34 -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
kingwl
5e1c4b2b7b
Merge remote-tracking branch 'origin/master' into codex/remove-scoped-bash
...
# Conflicts:
# packages/client/ui-conversation/README.i18n.yaml
2026-07-31 22:41:07 +08:00
_Kerman
e0988abc74
Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification
...
# Conflicts:
# .agents/notes/implemented/architecture/2026-06-21-bounded-llm-request-recovery.i18n.yaml
# .agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.i18n.yaml
# .agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md
# .agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.zh.md
# .agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml
# .agents/notes/implemented/feature/2026-07-06-sandbox.md
# .agents/notes/implemented/feature/2026-07-06-sandbox.zh.md
# .agents/notes/implemented/feature/2026-07-27-tmux-location-context.i18n.yaml
# .agents/notes/implemented/simplification/2026-06-20-public-agent-stop-surface.i18n.yaml
# .agents/notes/implemented/simplification/2026-07-28-remove-synthetic-log-only-turns.i18n.yaml
# .agents/notes/implemented/simplification/2026-07-30-private-agent-send.i18n.yaml
# docs/architecture.i18n.yaml
# docs/architecture.md
# docs/architecture.zh.md
# docs/config-catalog.md
# docs/cordis-catalog/events.md
# docs/cordis-catalog/services.md
# docs/core-data-structures/compaction.i18n.yaml
# docs/core-data-structures/core.i18n.yaml
# docs/core-data-structures/core.md
# docs/core-data-structures/core.zh.md
# docs/core-data-structures/llm-streaming.i18n.yaml
# docs/core-data-structures/llm-streaming.md
# docs/core-data-structures/llm-streaming.zh.md
# docs/core-data-structures/session.i18n.yaml
# docs/event-producer-consumer.md
# docs/module-graph.md
# docs/persistence-catalog.md
# examples/acp-agent/tests/goal-snapshots/goal-session/session.expected.jsonl
# examples/acp-agent/tests/snapshots/advanced-toolchain/session.1.jsonl
# examples/acp-agent/tests/snapshots/advanced-toolchain/session.2.jsonl
# examples/acp-agent/tests/snapshots/advanced-toolchain/session.jsonl
# examples/acp-agent/tests/snapshots/bash-spill/session.jsonl
# examples/acp-agent/tests/snapshots/bash-tool-turn/session.jsonl
# examples/acp-agent/tests/snapshots/both-mode-turn/session.jsonl
# examples/acp-agent/tests/snapshots/cancel-tool-calls/session.jsonl
# examples/acp-agent/tests/snapshots/cancel/session.jsonl
# examples/acp-agent/tests/snapshots/code-mode-turn/session.jsonl
# examples/acp-agent/tests/snapshots/code-mode-workspace-context/session.jsonl
# examples/acp-agent/tests/snapshots/cordis-inspect-jsdoc/session.jsonl
# examples/acp-agent/tests/snapshots/empty-response-retry/session.jsonl
# examples/acp-agent/tests/snapshots/error-finish/session.jsonl
# examples/acp-agent/tests/snapshots/escalation-approved/session.jsonl
# examples/acp-agent/tests/snapshots/escalation-rejected/session.jsonl
# examples/acp-agent/tests/snapshots/fs-edit/session.jsonl
# examples/acp-agent/tests/snapshots/fs-escalation-approved/session.jsonl
# examples/acp-agent/tests/snapshots/fs-glob-sampling/session.jsonl
# examples/acp-agent/tests/snapshots/fs-policy-reject/session.jsonl
# examples/acp-agent/tests/snapshots/fs-read-window/session.jsonl
# examples/acp-agent/tests/snapshots/fs-read/session.jsonl
# examples/acp-agent/tests/snapshots/fs-write-overwrite/session.jsonl
# examples/acp-agent/tests/snapshots/fs-write/session.jsonl
# examples/acp-agent/tests/snapshots/hook-cc-invalid-matcher/session.jsonl
# examples/acp-agent/tests/snapshots/hook-cc-posttool-block/session.jsonl
# examples/acp-agent/tests/snapshots/hook-cc-posttool-context/session.jsonl
# examples/acp-agent/tests/snapshots/hook-cc-pretool-ask/session.jsonl
# examples/acp-agent/tests/snapshots/hook-cc-pretool-deny/session.jsonl
# examples/acp-agent/tests/snapshots/hook-cc-promptsubmit-context/session.jsonl
# examples/acp-agent/tests/snapshots/hook-cc-stop-continue/session.jsonl
# examples/acp-agent/tests/snapshots/hook-codex-invalid-matcher/session.jsonl
# examples/acp-agent/tests/snapshots/hook-codex-posttool-block/session.jsonl
# examples/acp-agent/tests/snapshots/hook-codex-posttool-context/session.jsonl
# examples/acp-agent/tests/snapshots/hook-codex-pretool-block/session.jsonl
# examples/acp-agent/tests/snapshots/hook-codex-promptsubmit-context/session.jsonl
# examples/acp-agent/tests/snapshots/hook-codex-stop-continue/session.jsonl
# examples/acp-agent/tests/snapshots/lsp-definition/session.jsonl
# examples/acp-agent/tests/snapshots/multi-turn/session.jsonl
# examples/acp-agent/tests/snapshots/packed-chunks/session.jsonl
# examples/acp-agent/tests/snapshots/parallel-tool-calls/session.jsonl
# examples/acp-agent/tests/snapshots/pty-tools/session.jsonl
# examples/acp-agent/tests/snapshots/repeat-tool-guard/session.jsonl
# examples/acp-agent/tests/snapshots/session-query-spill/session.jsonl
# examples/acp-agent/tests/snapshots/session-sandbox-root/session.jsonl
# examples/acp-agent/tests/snapshots/session-title-after-turn/session.jsonl
# examples/acp-agent/tests/snapshots/skill-load/session.jsonl
# examples/acp-agent/tests/snapshots/subagent-depth-two-rejection/session.1.jsonl
# examples/acp-agent/tests/snapshots/subagent-depth-two-rejection/session.2.jsonl
# examples/acp-agent/tests/snapshots/subagent-depth-two-rejection/session.jsonl
# examples/acp-agent/tests/snapshots/subagent-fork/session.1.jsonl
# examples/acp-agent/tests/snapshots/subagent-fork/session.jsonl
# examples/acp-agent/tests/snapshots/subagent-mixed/session.1.jsonl
# examples/acp-agent/tests/snapshots/subagent-mixed/session.2.jsonl
# examples/acp-agent/tests/snapshots/subagent-mixed/session.jsonl
# examples/acp-agent/tests/snapshots/subagent-multi/session.1.jsonl
# examples/acp-agent/tests/snapshots/subagent-multi/session.2.jsonl
# examples/acp-agent/tests/snapshots/subagent-multi/session.jsonl
# examples/acp-agent/tests/snapshots/subagent-spawn/session.1.jsonl
# examples/acp-agent/tests/snapshots/subagent-spawn/session.jsonl
# examples/acp-agent/tests/snapshots/text-turn/session.jsonl
# examples/acp-agent/tests/snapshots/todo-write/session.jsonl
# examples/acp-agent/tests/snapshots/tool-call-turn/session.jsonl
# examples/acp-agent/tests/snapshots/web-fetch/session.jsonl
# examples/acp-agent/tests/snapshots/workflow-run/session.1.jsonl
# examples/acp-agent/tests/snapshots/workflow-run/session.jsonl
# examples/acp-agent/tests/snapshots/workspace-context/session.jsonl
# examples/acp-agent/tests/snapshots/workspace-edit/session.jsonl
# examples/headless-agent/tests/semantic-checkpoint-snapshots/tool-outcome-unknown/session.expected.jsonl
# examples/headless-agent/tests/snapshots/advanced-toolchain/session.1.jsonl
# examples/headless-agent/tests/snapshots/advanced-toolchain/session.2.jsonl
# examples/headless-agent/tests/snapshots/advanced-toolchain/session.jsonl
# examples/headless-agent/tests/snapshots/advanced-toolchain/stream-json.expected.jsonl
# examples/headless-agent/tests/snapshots/goal-tools/stream-json.expected.jsonl
# examples/headless-agent/tests/snapshots/missing-credential/stream-json.expected.jsonl
# examples/headless-agent/tests/snapshots/provider-retry/stream-json.expected.jsonl
# examples/headless-agent/tests/snapshots/pty-tools/session.jsonl
# examples/headless-agent/tests/snapshots/pty-tools/stream-json.expected.jsonl
# examples/headless-agent/tests/snapshots/ralph-loop/stream-json.expected.jsonl
# examples/headless-agent/tests/subagent-inheritance-snapshots/parent-override/child.expected.jsonl
# examples/headless-agent/tests/subagent-inheritance-snapshots/parent-override/parent.expected.jsonl
# examples/jsonrpc-agent/tests/snapshots/bash-tool/notifications.expected.jsonl
# examples/jsonrpc-agent/tests/snapshots/bash-tool/session.jsonl
# examples/jsonrpc-agent/tests/snapshots/persistent-tools/notifications.expected.jsonl
# examples/jsonrpc-agent/tests/snapshots/persistent-tools/session.jsonl
# examples/jsonrpc-agent/tests/snapshots/subagent-spawn/notifications.expected.jsonl
# examples/jsonrpc-agent/tests/snapshots/subagent-spawn/session.1.jsonl
# examples/jsonrpc-agent/tests/snapshots/subagent-spawn/session.jsonl
# examples/jsonrpc-agent/tests/snapshots/text-turn/notifications.expected.jsonl
# examples/jsonrpc-agent/tests/snapshots/text-turn/session.jsonl
# packages/client/runtime/README.i18n.yaml
# packages/client/runtime/src/client/sessions/request-inspection.ts
# packages/compact/compact-basic/README.i18n.yaml
# packages/compact/compact-basic/README.md
# packages/compact/compact-basic/README.zh.md
# packages/compact/compact-basic/src/index.ts
# packages/context/time-context/tests/time-context.spec.ts
# packages/context/tmux-context/README.i18n.yaml
# packages/context/tmux-context/tests/tmux-context.spec.ts
# packages/context/workspace-context/tests/workspace-context.spec.ts
# packages/cordis/tool-cordis/src/api-catalog.ts
# packages/core/agent-loop/README.i18n.yaml
# packages/core/agent-loop/README.md
# packages/core/agent-loop/README.zh.md
# packages/core/agent-loop/src/agent.ts
# packages/core/agent/README.i18n.yaml
# packages/core/agent/README.md
# packages/core/agent/README.zh.md
# packages/core/agent/src/types.ts
# packages/core/session/README.i18n.yaml
# packages/core/session/README.md
# packages/core/session/README.zh.md
# packages/fs/tool-str-replace-editor/tests/tools.spec.ts
# packages/goal/command-goal/tests/command-goal.spec.ts
# packages/goal/goal/tests/goal.spec.ts
# packages/host/apiproxy/README.i18n.yaml
# packages/host/apiproxy/README.md
# packages/host/apiproxy/README.zh.md
# packages/host/apiproxy/src/api/index.ts
# packages/host/apiproxy/tests/api-proxy-workspace.spec.ts
# packages/llm/llm/README.i18n.yaml
# packages/llm/llm/README.md
# packages/llm/llm/README.zh.md
# packages/llm/llm/src/index.ts
# packages/pty/pty-local/tests/index.spec.ts
# packages/pty/pty-local/tests/local.spec.ts
# packages/pty/pty/tests/service.spec.ts
# packages/pty/tool-bash-persistent/tests/loader-composition.spec.ts
# packages/pty/tool-bash-persistent/tests/tools.spec.ts
# packages/pty/tool-pty/tests/loader-composition.spec.ts
# packages/pty/tool-pty/tests/tools.spec.ts
# packages/session-persistence/session-checkpoint-policy/tests/crash-recovery.e2e.ts
# packages/skill/tool-skill/tests/tool-skill.spec.ts
# packages/tasks/tasks-local/tests/tasks.spec.ts
# packages/ui/tui/README.i18n.yaml
# packages/ui/tui/tests/tui.spec.ts
# packages/ui/user-approval/src/index.ts
# packages/ui/user-approval/tests/approval.spec.ts
2026-07-31 22:16:40 +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
7b826bf16c
Merge remote-tracking branch 'origin/master' into codex/remove-scoped-bash
...
# Conflicts:
# packages/client/ui-conversation/README.i18n.yaml
2026-07-31 21:32:02 +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
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
kingwl
ddda8be736
docs: record scoped bash translation pairs
2026-07-31 20:48:52 +08:00
07akioni
575e1217bb
fix: remove scoped bash
2026-07-31 20:47:55 +08:00
ZiyaZhang
5e68d812d1
fix(web): let context injection cards fit content
2026-07-31 05:20:54 -07:00
07akioni
410a837e02
Merge remote-tracking branch 'origin/master' into fix/remove-badge
2026-07-31 19:33:01 +08:00
07akioni
57d6d9ee1c
fix: ci
2026-07-31 19:20:23 +08:00
07akioni
1766461947
Merge remote-tracking branch 'origin/master' into fix/remove-badge
2026-07-31 19:13:22 +08:00
07akioni
f9dc4aa702
feat: remove "插话" badge displayed in user message
2026-07-31 19:12:16 +08:00
Ziya
4f13ce7b7f
Merge branch 'master' into fix/web-turn-error-surface
2026-07-31 07:07:05 -04: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
CreatixChu
e18efd3375
Merge branch 'master' into worktree/hero-blank-session-settling
2026-07-31 18:39:38 +08:00
creatixchu
3b2ee5ce87
test(ui-conversation): pin all three list-summary shapes for the settling exemption
...
The mount fixture always listed the session, so the case named "no list
summary" actually exercised a row proving non-blank. An omitSummaryRow
option drops the row, and the three cases now pin blank:false, an absent
row, and the summary-proven blank open.
2026-07-31 18:37:04 +08:00
ZiyaZhang
215bf15f78
fix(web): surface terminal turn failures
2026-07-31 03:10:48 -07:00
creatixchu
8acb924f82
doc(ui-conversation): note that the settling exemption spans every open state
2026-07-31 18:09:31 +08:00
creatixchu
4afcc3810b
test(ui-conversation): pin the settling exemption for summary-blank sessions
...
The mount helper's 4th positional argument becomes an options object so a
test can set the session list row's blank flag independently of the
conversation snapshot's; the two new cases cover both branches of the
settling condition.
2026-07-31 17:57:10 +08:00
imccyu
f0989d9cd2
fix(ui-conversation): keep hero visible while a blank session opens
...
A summary-proven blank session can only land back on the hero, so the
settling phase (visibility:hidden composer seat) blanked the center
column for the whole history round-trip during startup auto-selection.
Exempt such sessions from settling and treat them as hero while loading.
2026-07-31 17:46:17 +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
Chinesezjc
b93120a280
Merge remote-tracking branch 'origin/master' into feat/web-cards-toolrow
...
# Conflicts:
# packages/client/connection/src/client/fixture.ts
# packages/client/ui-conversation/README.i18n.yaml
# packages/client/ui-conversation/src/client/apply.ts
# packages/client/ui-conversation/src/client/chat/GenericToolCard.tsx
# packages/client/ui-conversation/src/client/skeleton/DetailsPanel.tsx
# packages/client/ui-conversation/src/client/toolviews/file-mutation-row.tsx
# packages/client/ui-conversation/src/client/toolviews/search-row.tsx
# packages/client/ui-conversation/tests/chat-apply.spec.tsx
# packages/client/ui-primitives/src/index.ts
2026-07-31 17:38:17 +08:00
CreatixChu
aba776b179
Merge pull request #1056 from deepseek-harness/worktree/locale-browser-default
...
feat(web): open a fresh browser in the language it asks for
2026-07-31 17:32:52 +08:00