2288 Commits

Author SHA1 Message Date
Huanqi Cao
7eadde5c58 Merge remote-tracking branch 'origin/feat/windows-pwsh-default' into feat/windows-acl-sandbox
# Conflicts:
#	apps/cli/reference/README.i18n.yaml
2026-08-08 20:18:56 +08:00
Huanqi Cao
03cf9caba2 Merge remote-tracking branch 'origin/master' into HEAD 2026-08-08 20:15:08 +08:00
Tianyi Cui
f91305ef5c Merge latest master into native Windows CI 2026-08-08 20:06:38 +08:00
Hypatia May
d769d3cbb7 feat(subagent): let ancestors interrupt descendants
interrupt_agent(agent_id) passes the calling agent as the ancestor
authority for ctx.subagents.interrupt(); the service verifies live
registry identity and recorded lineage, so a direct child or deeper
descendant stops with the same generic parameter while send_message keeps
its exact-direct-parent authority.

Discovery: list_agents gains an optional scope. descendants walks the new
SubagentService.listDescendants() — one lineage trace flattened in stable
pre-order across ordinary and one-shot intermediates, each entry carrying
its verified parentId and depth — and every status now comes from the
live Agent registry (running/idle/complete).

Refs #1535
2026-08-08 20:02:37 +08:00
Hypatia May
4b29f9ca7a test(web): refresh interrupt UI golden after master merge 2026-08-08 20:02:36 +08:00
Hypatia May
5793614b86 feat(web): expose continuable subagent interrupt
The composer's single primary action now stops a running continuable
child: Session.cancel() routes a continuable address through
subagent.interrupt (ordinary sessions keep session.cancel; one-shot
addresses stay uncancellable), and InputBar switches the same Send button
to Stop while a continuable child runs. A running parent-offline child
keeps the default composer with disabled input so that Stop stays
reachable; the read-only takeover returns once it stops.

Refs #1535
2026-08-08 20:02:36 +08:00
Hypatia May
82019134b1 test(web): verify subagent.interrupt over the real composition
A browserless keyless-replay e2e boots the shipped web composition, holds
a continuable child's turn open with a replay hang entry, queues a
follow-up and interrupts over plain HTTP, and proves from the real
session state that the turn aborted, the follow-up parked without a new
turn, and a waking send resumed the preserved FIFO order.

Refs #1535
2026-08-08 20:02:36 +08:00
Tianyi Cui
bdbc6c3da4 fix(windows): preserve graceful CLI shutdown 2026-08-08 19:57:31 +08:00
ZiyaZhang
4db962ecbb Merge remote-tracking branch 'origin/master' into feat/web-inline-file-mentions 2026-08-08 04:46:48 -07:00
Yichen Jiang
78238a3248 Merge remote-tracking branch 'origin/master' into worktree/web-theme-settings-integration-fde706
# Conflicts:
#	packages/client/runtime/README.i18n.yaml
#	packages/client/runtime/src/client/index.ts
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/package.json
#	packages/client/ui-conversation/src/client/apply.ts
#	packages/client/ui-conversation/tests/coverage-tails.spec.tsx
#	vitest.config.ts
2026-08-08 19:34:10 +08:00
Yichen Jiang
cacc8fbca7 Merge branch 'stack/agent-profiles-5-web-ui' into stack/agent-profiles-8-authoring
Authoring meets standing mounts: write() and remove() drop the standing
pointer so the NEXT session composes the edited roster, while every session
already joined keeps the generation it runs on — a superseded generation is
never disposed while the process lives. The settings-dialog golden re-records
with this layer's Agent Preset nav entry, which the incoming layer-3 record
had overwritten.
2026-08-08 19:09:32 +08:00
Yichen Jiang
01bd8ecefe Merge branch 'stack/agent-profiles-3-wire' into stack/agent-profiles-5-web-ui
recompose becomes a parent re-link: the new preset's standing mount is
ensured BEFORE the link moves, so a failed switch leaves the agent exactly as
it was — the unmount-then-restore dance (and unmountPresetFor with it) is
gone, and the restore-failure test now asserts the agent KEEPS its tools with
the source directory deleted, because the standing mount is not the file.
2026-08-08 18:52:45 +08:00
Yichen Jiang
46649858f6 Merge branch 'stack/agent-profiles-1-seam' into stack/agent-profiles-3-wire
Rewires this layer onto the standing-mount model:

- serviceForAgent roots its search at the agent's standing mount (parent
  scope key → live mount fiber) — the composition no longer lives under the
  agent's own fiber, and two agents on one preset now address ONE instance,
  which the sharing test asserts instead of distinctness.
- viewFor/historyPage take a registry view SCOPE. A live agent is that scope;
  a cold read uses the recorded preset's standing key via standingKeyFor —
  composing plugins but starting no agent, session, or turn. A header without
  a preset (a pre-roster log) renders through the DEFAULT preset's standing
  layer; an unusable preset degrades the read to generic cards, never fails
  it. This turns produced-files and chat-scroll green structurally, with the
  token counts untouched (no resume, so the projections fold stays detached).
- The detached projections baseline now includes every standing unit's key at
  its empty fold (todos: null): the standing mount registers units
  deterministically, which is what makes the client's "omitted key =
  capability absence → clear" rule safe again. seeded-history's contract test
  asserts the new shape.
- The standard preset's realm preamble no longer claims a shared label pools
  instances — provide() throws on the second registration under one realm
  symbol; labels join REALMS.
2026-08-08 18:41:07 +08:00
Huanqi Cao
69fd67bfd8 fix(docs): restore the cli reference pairing record to the multi-line contract after the merge-forward 2026-08-08 18:25:48 +08:00
Yichen Jiang
ec9a08bdde Merge remote-tracking branch 'origin/master' into worktree/web-multimodal-image-input
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-05-reconstructable-requests.i18n.yaml
#	docs/core-data-structures/core.i18n.yaml
#	docs/module-graph.md
#	packages/client/ui-conversation/src/client/chat/AssistantMarkdown.tsx
#	packages/client/ui-conversation/src/client/index.ts
#	packages/compact/compact-basic/README.i18n.yaml
2026-08-08 17:56:53 +08:00
Huanqi Cao
cc64c729db Merge remote-tracking branch 'origin/feat/windows-pwsh-default' into feat/windows-acl-sandbox
# Conflicts:
#	apps/cli/reference/README.i18n.yaml
#	knip.json
#	packages/sandbox/sandbox-local/package.json
#	pnpm-lock.yaml
#	scripts/check-workspace-constraints.ts
2026-08-08 17:50:39 +08:00
Huanqi Cao
d1b080a68d Merge remote-tracking branch 'origin/master' into HEAD
# Conflicts:
#	.agents/notes/implemented/feature/2026-08-05-pwsh-ui-bash-parity.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-05-pwsh-ui-bash-parity.md
#	.agents/notes/implemented/feature/2026-08-05-pwsh-ui-bash-parity.zh.md
#	apps/cli/reference/README.i18n.yaml
2026-08-08 17:42:47 +08:00
Yichen Jiang
21c3bb1713 Merge remote-tracking branch 'origin/master' into worktree/web-theme-settings-integration-fde706
# Conflicts:
#	docs/module-graph.md
#	packages/client/runtime/README.i18n.yaml
#	packages/client/runtime/tsconfig.json
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
2026-08-08 16:56:49 +08:00
imccyu
67c753dcb7 fix(client): restore built Tool presentation snapshots 2026-08-08 16:53:24 +08:00
Yichen Jiang
3b10120d60 Merge remote-tracking branch 'origin/master' into worktree/sidebar-subagent-activity
# Conflicts:
#	packages/client/runtime/README.i18n.yaml
2026-08-08 16:37:29 +08:00
Turtle
bd518cb684 Merge pull request #1696 from deepseek-harness/codex/dsh-badge-plugin
feat: add optional dsh badge skill provider
2026-08-08 16:33:00 +08:00
Yichen Jiang
d174edf9eb Merge pull request #2034 from deepseek-harness/worktree/merge-compact-card
feat(web): merge compact status and summary cards
2026-08-08 16:23:00 +08:00
Yichen Jiang
fb1d230518 test(web): avoid replay timing assertions 2026-08-08 15:56:36 +08:00
Yichen Jiang
65730f2aef fix(agent-presets): keep the goal service on the host plane in the other presets
`cordis` and `code` are full copies of `standard`, so each carried its own
copy of the goals group the Gateway cannot reach through. Same change, same
reason.
2026-08-08 15:56:22 +08:00
Yichen Jiang
e52dd048f9 Merge branch 'stack/agent-profiles-5-web-ui' into stack/agent-profiles-8-authoring
# Conflicts:
#	packages/host/apiproxy/tests/api-proxy-agent-preset.spec.ts
2026-08-08 15:54:27 +08:00
Yichen Jiang
5e892aa6dc Merge branch 'stack/agent-profiles-3-wire' into stack/agent-profiles-5-web-ui
# Conflicts:
#	packages/host/apiproxy/tests/api-proxy-agent-preset.spec.ts
2026-08-08 15:54:16 +08:00
Yichen Jiang
a21644af59 fix(web-app,agent-presets): keep the goal service on the host plane
The Gateway serves the goal domain as Remote endpoints, and a Remote method
picks its receiver Service from a generated descriptor — `clear(agent, ref)`
takes its agent as a PARAMETER, so the invocation is direct and the receiver
resolves on the host. Behind the preset's entry-local realm there was nothing
to resolve, and every browser goal call answered `service-unavailable`: the
composer's Clear goal button left the bar on screen.

That is the `bash-env` criterion read from the other side. Injection is not the
only host relationship a Service can have; being READ from a host row is one
too. The registry is keyed by session, so one host instance serves every
session exactly as it did before presets. The preset keeps the model-facing
tool, which is the choice a preset is for.

Also reverts the cold-transcript presenter resolve: resuming an agent to reach
its presenters made the context meter drop its cache and token counts on every
cold-opened session, trading one silent degradation for another. The card
degradation it addressed is diagnosed and still open.
2026-08-08 15:53:39 +08:00
Yichen Jiang
81d32bf52c test(web): isolate sidebar subagent activity snapshot 2026-08-08 15:46:08 +08:00
Tianyi Cui
6d0a14d428 Merge origin/master into codex/dsh-badge-plugin 2026-08-08 15:42:47 +08:00
Tianyi Cui
b9e7db5abf fix(skill-badge): align with current base contracts 2026-08-08 15:39:19 +08:00
Tianyi Cui
e0f113f55b Merge origin/master into codex/dsh-badge-plugin 2026-08-08 15:33:41 +08:00
Tianyi Cui
d301dbdc7d Merge pull request #1995 from deepseek-harness/worktree/remove-dsh-cli-demo
cleanup(cli): remove separate dsh-cli-demo app
2026-08-08 15:26:56 +08:00
Yichen Jiang
ebd3a87834 fix(web): stabilize compact card snapshots 2026-08-08 15:24:50 +08:00
Yichen Jiang
a06df4aa41 Merge branch 'stack/agent-profiles-5-web-ui' into stack/agent-profiles-8-authoring
The composer's preset seat stays removed here — this layer moved it to the
hero chip and the session-header action — so only the model seat takes the
`modelSeatLocked` narrowing master introduced.

Conflicts:
	apps/web/tests/snapshots/*/*.expected.md
	packages/client/connection/README.md
	packages/client/connection/README.zh.md
	packages/client/ui-conversation/src/client/skeleton/InputBar.tsx
	packages/host/apiproxy/src/fetch/client.ts
2026-08-08 15:09:37 +08:00
Tianyi Cui
bdd2f49df7 fix(cli): address dsh run review feedback 2026-08-08 15:05:50 +08:00
Yichen Jiang
beec364e04 Merge branch 'stack/agent-profiles-3-wire' into stack/agent-profiles-5-web-ui
The Client API carrier's `agentPresets` member was the one member of its class
without an `IApiClient[...]` annotation. Inferring it inlined `AgentPresetEntry`
into the emitted declaration by the specifier TS picks — the host `index.ts` —
dragging the whole gateway, and with it the host `Context` merges, into every
Client program importing the carrier. Annotated like its siblings.

`ApiRemoteAgentOptions.setup` now takes the inspected session rather than its
header alone: this layer resolves a resumed session's preset from the LOG,
because a session that switched while blank ran its turns under the newer
composition and the header is written once at creation.

Conflicts:
	apps/web/tests/snapshots/*/*.expected.md
	packages/client/ui-conversation/src/client/skeleton/InputBar.tsx
	packages/host/apiproxy/src/api-proxy.ts
	scripts/doc-budgets.manifest.json
2026-08-08 15:00:31 +08:00
Yichen Jiang
7aca4c6b94 Merge branch 'master' into worktree/merge-compact-card 2026-08-08 14:45:55 +08:00
Yichen Jiang
04e6a98064 feat(client): surface subagent activity in sidebar 2026-08-08 14:42:14 +08:00
Yichen Jiang
c5ca12eabd Merge branch 'stack/agent-profiles-1-seam' into stack/agent-profiles-3-wire
master extracted this layer's inline cold-resume resolver into
@deepseek-ai/dsh-api-remotes, whose `setup` was a fixed AgentSetup. A resumed
session composes the preset ITS header recorded, so the option becomes a
function of that header; the resolver builds the setup before the published
re-checks so those stay adjacent to `resume`.

Conflicts:
	docs/cordis-catalog/services.md
	docs/module-graph.md
	packages/host/apiproxy/package.json
	packages/host/apiproxy/src/api-proxy.ts
	pnpm-lock.yaml
2026-08-08 14:26:38 +08:00
Yichen Jiang
915a56208d Merge pull request #1977 from deepseek-harness/worktree/pi-ai-per-model-reasoning
feat(llm-pi-ai): per-model reasoning efforts, dialect switches, and modelOverrides in settings.yaml
2026-08-08 14:23:07 +08:00
Tianyi Cui
f32aa54aeb feat(cli)!: make dsh run the headless entrypoint 2026-08-08 14:21:42 +08:00
Yichen Jiang
1db327ea6c feat(web): merge compact status and summary cards 2026-08-08 14:11:26 +08:00
Yichen Jiang
18dee248a6 Merge remote-tracking branch 'origin/master' into feature/issue-1470-skill-invoke
# Conflicts:
#	docs/module-graph.md
2026-08-08 14:03:29 +08:00
Tianyi Cui
67a92226cf Merge pull request #961 from deepseek-harness/worktree/stable-snapshot-message-ids-20260730
fix(snapshot): retain unchanged message IDs
2026-08-08 14:01:07 +08:00
Huanqi Cao
2ecfe383c7 fix(cli): resolve the pwsh-sandbox layer row from the cold-start module closure
The launcher's healProfilesModuleFallback BFS-links the apps/cli dependency closure into the profile's node_modules (the pwsh-local precedent): without dsh-pwsh-sandbox in apps/cli dependencies, a fresh Windows host cannot resolve the inserted row. Assert the closure reaches both inserted packages in the real-layers composition; rewrap the windows-shell layer comment.
2026-08-08 13:44:05 +08:00
Yichen Jiang
0d53752c49 refactor(host)!: retire the skill.invoke RPC for the gesture boundary
Invocation is an ordinary session.prompt again: the pre-step gesture
boundary makes it deterministic host-side for every front end, so the
dedicated RPC (handler, wire schema, error codes, client face, fixtures)
and ui-skill's claim machinery are net deletions. The menu keeps decision
21 exactly — a pick lands literal /name text — plus the user-only marker
from skill.list's modelInvocable flag.
2026-08-08 13:15:52 +08:00
Huanqi Cao
b60e64c592 Merge remote-tracking branch 'origin/feat/windows-pwsh-default' into feat/windows-acl-sandbox
# Conflicts:
#	apps/cli/reference/README.i18n.yaml
2026-08-08 12:13:23 +08:00
Huanqi Cao
94f1a7741c Merge remote-tracking branch 'origin/master' into HEAD
# Conflicts:
#	apps/cli/reference/README.i18n.yaml
2026-08-08 12:09:04 +08:00
imccyu
d85d0806cd fix(build): align Client build metadata 2026-08-08 12:02:58 +08:00
Yichen Jiang
86fbc5fc15 Merge remote-tracking branch 'origin/master' into worktree/pi-ai-per-model-reasoning
# Conflicts:
#	docs/config-catalog.md
#	docs/user/guide/providers.i18n.yaml
#	packages/llm/llm-pi-ai/README.i18n.yaml
#	packages/llm/llm-pi-ai/README.md
#	packages/llm/llm-pi-ai/README.zh.md
#	packages/llm/llm-pi-ai/tests/config.spec.ts
2026-08-08 10:32:22 +08:00