Commit Graph

12041 Commits

Author SHA1 Message Date
ZiyaZhang
1d7ce83894 style(web): use black hero whale with hover motion 2026-08-11 07:41:51 -07:00
Chinesezjc
47f108bf50 test(tools): use type-safe error assertions instead of any casts
oxlint's no-unsafe-member-access rejects member access through an any
cast; the error info is reachable through the declared optional chain.
2026-08-11 22:40:36 +08:00
Chinesezjc
610dc74ea8 test(tools): fix error code assertions for collapsed call tests
The error code lives on ToolFailure.info.code, not ToolFailure.code.
2026-08-11 22:40:36 +08:00
Chinesezjc
6d0a7c12e1 test(tools): add coverage for collapsed model-direct call under code mode
Add two executor-level tests covering the previously uncovered branches
in createExecution:
- collapsed call (non-aborted signal) returns UNKNOWN_TOOL
- collapsed call (pre-aborted signal) returns ABORTED_BEFORE_DISPATCH
2026-08-11 22:40:36 +08:00
Chinesezjc
846969900a ci: retrigger 2026-08-11 22:40:36 +08:00
Chinesezjc
1e78513806 fix(tools): add collapses() method and fix createExecution collapse logic 2026-08-11 22:40:36 +08:00
Chinesezjc
24dd48b133 fix(tools): collapse code-mode executor to run_code for model-direct calls
wireSchemas() already advertised only run_code under mode: 'code', but the
executor resolved every call through get(), which returns the full visible
map plus the reserved transport. A model could name a native tool directly
and bypass run_code entirely. Route the execution-path lookups through a
new private resolveExecution() that applies the mode collapse at the
operation boundary: model-direct calls under 'code' may only name run_code
(UNKNOWN_TOOL otherwise), while SDK sub-dispatches (parent token set) keep
every visible tool. get()/schemas() public semantics are unchanged.

The denial happens at createExecution, before the extensible policy
pipeline — pre-execute listeners, approval ask, and guards never observe
a call that is deterministically denied. A collapsed call honors the
pre-dispatch cancellation contract, routes aborted results through the
visible tool's finalizeContent, and captures the finalizer before
argument materialization.

Regenerated docs, catalogs, graphs, scoped events, re-recorded
translation pairs, and updated test assertions.

Fixes #1815
2026-08-11 22:40:36 +08:00
Chinesezjc
2aef2d83fa fix(tools): remove tool:* prompt filtering per review feedback
LegGasai noted that filtering prompt sections by tool:* prefix is a poor
heuristic: it conflates section naming convention with presentation
semantics and would incorrectly drop tool:structured_output. The executor
collapse already enforces the boundary — a model-direct native call is
rejected as UNKNOWN_TOOL regardless of what the prompt says, so filtering
the prompt adds no security and only risks losing useful guidance.

The tool:read/tool:bash/etc sections describe capability usage patterns
that apply to both native and code presentations, and keeping them does
not reopen the native direct-call path because the executor blocks it.
2026-08-11 22:40:36 +08:00
Chinesezjc
b558afc373 fix(tools): use @deepseek-ai/cordis import in README type blocks 2026-08-11 22:40:20 +08:00
Chinesezjc
6f6defd64a fix(tools): collapse code-mode executor to run_code for model-direct calls
wireSchemas() already advertised only run_code under mode: 'code', but the
executor resolved every call through get(), which returns the full visible
map plus the reserved transport. A model could name a native tool directly
and bypass run_code entirely. Route the execution-path lookups through a
new private resolveExecution() that applies the mode collapse at the
operation boundary: model-direct calls under 'code' may only name run_code
(UNKNOWN_TOOL otherwise), while SDK sub-dispatches (parent token set) keep
every visible tool. get()/schemas() public semantics are unchanged.

The denial happens at createExecution, before the extensible policy
pipeline — pre-execute listeners, approval ask, and guards never observe
a call that is deterministically denied. A collapsed call honors the
pre-dispatch cancellation contract, routes aborted results through the
visible tool's finalizeContent, and captures the finalizer before
argument materialization.

Under code mode, a system-prompt/assemble listener filters out tool:*
guidance sections that told the model to call native tools directly.
The tools:sdk section and SDK types remain so programs can still use
all tools through run_code.

Regenerated docs, catalogs, graphs, scoped events, and re-recorded
translation pairs.

Fixes #1815
2026-08-11 22:40:20 +08:00
Chinesezjc
75a09efd51 fix(tools): use @deepseek-ai/cordis and @deepseek-ai/schemastery imports 2026-08-11 22:40:19 +08:00
Chinesezjc
4806fdabab fix(tools): collapse code-mode executor to run_code for model-direct calls
wireSchemas() already advertised only run_code under mode: 'code', but the
executor resolved every call through get(), which returns the full visible
map plus the reserved transport. A model could name a native tool directly
and bypass run_code entirely. Route the execution-path lookups through a
new private resolveExecution() that applies the mode collapse at the
operation boundary: model-direct calls under 'code' may only name run_code
(UNKNOWN_TOOL otherwise), while SDK sub-dispatches (parent token set) keep
every visible tool. get()/schemas() public semantics are unchanged.

The denial happens at createExecution, before the extensible policy
pipeline — pre-execute listeners, approval ask, and guards never observe
a call that is deterministically denied. A collapsed call honors the
pre-dispatch cancellation contract, routes aborted results through the
visible tool's finalizeContent, and captures the finalizer before
argument materialization.

Under code mode, a system-prompt/assemble listener filters out tool:*
guidance sections that told the model to call native tools directly.
The tools:sdk section and SDK types remain so programs can still use
all tools through run_code.

Fixes #1815
2026-08-11 22:40:19 +08:00
_Kerman
a1d0d6a3a1 Merge remote-tracking branch 'origin/master' into dshw/pr-2250 2026-08-11 22:33:12 +08:00
pku-xht
e3ac9e85e5 Merge commit '5a0d28e200d89dca2b8004d9cd624629a1409a3f' into codex/bounded-background-tasks-v2
# Conflicts:
#	.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml
#	.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.md
#	.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md
2026-08-11 22:28:38 +08:00
Chinesezjc
9958275cf5 Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-11 22:25:19 +08:00
Chinesezjc
f389df1954 Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-11 22:21:51 +08:00
Tianyi Cui
564a853a04 Merge pull request #2277 from deepseek-harness/codex/background-first-continuable-subagents
feat(subagent): default continuable delegation to background
2026-08-11 22:21:02 +08:00
Yichen Jiang
92f86345db Merge remote-tracking branch 'origin/master' into worktree/python-pypi-release-prep 2026-08-11 22:08:54 +08:00
Yichen Jiang
5091d31370 test(web): wait for the transcript the subagent golden pins
CI captured `- text: Loading history…` where the golden holds the grandchild's
first message. The only wait before that capture is the offline banner, which
renders from the descriptor and says nothing about the transcript below it,
and `captureStableAria` calls two identical polls stable — two of which can
both be the loading placeholder on a loaded machine.

Waiting for the message the golden asserts makes the precondition match the
assertion. The race is not observable here (the history is already loaded when
the banner appears, so the wait returns in ~1ms), so this is reasoned from the
CI log and the helper's semantics rather than from a local reproduction; if
the history instead never arrives on CI, the lane now times out on the missing
message rather than committing a loading placeholder to the diff.
2026-08-11 22:03:50 +08:00
Chinesezjc
8c7b02a51d test(web): refresh the workflow-run golden for the feedback buttons 2026-08-11 22:00:43 +08:00
Yichen Jiang
770f289029 test(agent-presets): name the rosterless case for what now makes it one
Empty `roots` stopped meaning "no roster" when the harness-home root became
a default, so the case that keeps the unjoined-agent diagnostic silent is the
one opting out of every root — which is what it already passes and what its
name now says.
2026-08-11 21:59:15 +08:00
Yichen Jiang
925df04112 Merge pull request #2249 from deepseek-harness/worktree/minimal-profiles-bare-runtime
feat: align minimal runtime profiles
2026-08-11 21:57:03 +08:00
Tianyi Cui
cb235da37f Merge pull request #2282 from deepseek-harness/worktree/deny-deepseek-base-urls-519
fix(boot): deny DeepSeek endpoint env overrides
2026-08-11 21:55:26 +08:00
Dudu-0223
c778b5b0db fix(subagent): address background-first review 2026-08-11 21:52:59 +08:00
Dudu-0223
98d4551597 docs: refresh module graph 2026-08-11 21:52:59 +08:00
Dudu-0223
8344d64363 feat(subagent): default continuable delegation to background 2026-08-11 21:52:59 +08:00
Yichen Jiang
a5853244ed Merge remote-tracking branch 'origin/master' into worktree/minimal-profiles-bare-runtime 2026-08-11 21:45:38 +08:00
Yichen Jiang
d9dca88f33 test: stabilize steering mid-turn snapshot 2026-08-11 21:45:30 +08:00
Ziya
43b66c0a74 Merge pull request #2210 from deepseek-harness/feat/produced-files-folder
feat(web): make produced-file overflow discoverable
2026-08-11 21:45:13 +08:00
Chinesezjc
d8e766e56c Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui 2026-08-11 21:42:12 +08:00
Chinesezjc
5b900508f7 Merge remote-tracking branch 'origin/feat/web-message-feedback-ui' into feat/web-message-feedback-ui 2026-08-11 21:40:12 +08:00
Huanqi Cao
05a8846c6e refactor(preset): trim the shell-row comments
Drop the filler and factually loose comments added with the tool-pwsh rows:
the platform expressions self-explain, the web-app overlay comment repeats
the file header, and the spec comments now state only the platform-scoped
evaluation fact.
2026-08-11 21:38:51 +08:00
Chinesezjc
0fdb1c944f Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui
Resolve additive conflicts in the api-remotes client assembly by keeping
both the message-feedback remote mount and master's forwarded-event
allowlist, and regenerate the module graph.
2026-08-11 21:37:55 +08:00
Ziya
37cdddd137 Merge branch 'master' into feat/produced-files-folder 2026-08-11 21:36:30 +08:00
Chinesezjc
11b73126b4 ci: retrigger checks 2026-08-11 21:36:13 +08:00
Yichen Jiang
02e7b25bc3 Merge master into worktree/preset-user-root-in-package
Regenerates docs/config-catalog and re-records its pairing hashes: master's
side of that generated file merged textually, which leaves the recorded blob
hashes describing neither side's content.
2026-08-11 21:34:34 +08:00
Tianyi Cui
4c9c6c8217 test(cli): align endpoint fixture with boot trust 2026-08-11 21:33:06 +08:00
Yichen Jiang
3625ba1c9b Merge remote-tracking branch 'origin/master' into worktree/minimal-profiles-bare-runtime 2026-08-11 21:30:15 +08:00
Yichen Jiang
87c26ce78f Merge pull request #2275 from deepseek-harness/feat/wake-idle-owner-on-task-completion
feat(tasks): wake an idle owner when a background task completes
2026-08-11 21:29:55 +08:00
Tianyi Cui
a767cd357f Merge pull request #2280 from deepseek-harness/worktree/naming-contract-proposal
docs: propose repository naming contract and rename ledger
2026-08-11 21:28:54 +08:00
Yichen Jiang
1b2181dccd test: align Web minimal compaction assertion 2026-08-11 21:23:17 +08:00
Yichen Jiang
ccde5e78b7 test(snapshot): refresh translation prompt fixture 2026-08-11 21:21:01 +08:00
Yichen Jiang
d647ce9f7d test(agent-presets): assert the derived root through the shipped bundles
The new default's whole claim is that a launcher configuring nothing still
finds a person's presets, and nothing asserted it through a real composition —
`user-root.spec.ts` plugs the service directly, and every other lane pins
`includeUserRoot: false` so the machine's home cannot decide a golden.

This lane boots the real base and web-app bundles with only the shipped root
patched in, points `$DSH_HOME` at a temp home before boot (the derived root is
resolved when the plugin is constructed), and asserts a preset placed there is
listed as `user`, reported healthy, authorable, and mountable into an agent
whose tool catalog it decides.
2026-08-11 21:18:37 +08:00
Yichen Jiang
18c33b5fab Merge remote-tracking branch 'origin/master' into feat/wake-idle-owner-on-task-completion 2026-08-11 21:18:32 +08:00
ZiyaZhang
b1c1c93899 Merge remote-tracking branch 'upstream/master' into feat/produced-files-folder 2026-08-11 06:17:51 -07:00
Tianyi Cui
b735af91fa Merge remote-tracking branch 'origin/master' into worktree/naming-contract-proposal 2026-08-11 21:16:36 +08:00
Yichen Jiang
bac3a77dd9 Merge master into worktree/preset-user-root-in-package
Clean merge with no resolution edits: the branch is refreshed onto current
master so the PR's mergeability is computed against a base it contains.
2026-08-11 21:14:52 +08:00
Yichen Jiang
715baae6c1 fix(agent-presets): let the invariant follow the roster it actually scans
The service moved its "is a roster composed" reads to the derived root set;
the invariant companion still read `config.roots`. In the shape this change
exists for — an app configures nothing and the roster is the harness home
alone — that made the advisory warning fire while the fail-loud invariant
stayed silent, so an agent could address a model against an empty global
layer unchecked.

Both now read one source: `roots` exposes the resolved set, and the invariant
asks it. That decides the behavior deliberately rather than by omission — a
composition that mounts the roster now fails an unjoined agent whether its
roots were configured or derived, and `includeUserRoot: false` with no
configured roots is how a deployment keeps its agents on the host plane. Both
shapes are pinned; the derived-only case fails against the old predicate.

Three pieces of prose went stale with the first commit: the web-app bundle
comment still called the writable root an assembly fact patched in by
AppCLIEntry (removed in the profile-plugin-bundles refactor — `composeProfile`
owns it now, and only for the shipped root), and the shipped skill and its
Agent Note still called both roots "configuration". The README gains the
resolved-roster reader and the discoverable-but-undeletable preset a second
writable root produces.
2026-08-11 21:13:41 +08:00
Wenlu Wang
73a59bf60f Merge pull request #2272 from deepseek-harness/codex/fix-packed-install-pwsh-path
test: fix packed install closure and macOS path comparisons
2026-08-11 21:13:13 +08:00
Wenlu Wang
5b5ea127dd Merge pull request #2236 from deepseek-harness/codex/deepseek-user-id-header
feat(llm): send DeepSeek user identity header
2026-08-11 21:12:33 +08:00