Commit Graph
11104 Commits
Author SHA1 Message Date
Turtle 820bb29035 docs: sync repository removal translations 2026-08-10 21:32:13 +08:00
Turtle a33ee3d4f0 docs: refresh MCP config catalog 2026-08-10 21:32:13 +08:00
Turtle 541591d5f6 fix: address repository removal review 2026-08-10 21:32:13 +08:00
Turtle 993550e6c8 refactor: remove repository plugin path 2026-08-10 21:32:13 +08:00
Huanqi Cao cd226191a8 Merge pull request #2182 from deepseek-harness/fix/windows-native-acl-coverage
fix(ci): restore the native Windows coverage denominator to green
2026-08-10 21:21:53 +08:00
imccyu 32f4235981 Merge pull request #2194 from deepseek-harness/worktree-dshclient
refactor: nest client manifest metadata under dsh
2026-08-10 21:19:28 +08:00
imccyu 717792b631 refactor: nest client manifest metadata under dsh 2026-08-10 21:11:09 +08:00
imccyu 854f6623bb docs: rename client manifest field references 2026-08-10 21:11:09 +08:00
Huanqi Cao 539d116d57 Merge remote-tracking branch 'origin/master' into fix/windows-native-acl-coverage 2026-08-10 21:05:38 +08:00
Huanqi Cao 84964ba661 Merge remote-tracking branch 'origin/master' into fix/windows-native-acl-coverage
# Conflicts:
#	packages/preset/agent-presets/src/authoring.ts
#	vitest.config.ts
2026-08-10 21:04:44 +08:00
Yichen Jiang 8164161522 Merge pull request #2168 from deepseek-harness/worktree/subagent-missing-tools-fb2359
fix(subagent): 子 agent 加入父会话的 preset 组装
2026-08-10 21:04:08 +08:00
Yichen Jiang b90cb1b0b0 test(web): re-record the subagent goldens against a rebuilt client
The child session now shows the preset badge its parent shows, which is the
visible consequence of recording the composition it runs. The first recording
of these two goldens was taken against a dist built before the master merge,
so it captured the fallback Chinese label instead of the English one
`newEnglishPage` pins — the web lane replays the BUILT client, and a stale
build reads as a product difference. Re-recorded after `pnpm run build`.
2026-08-10 20:55:32 +08:00
Yichen Jiang 43f3324a7b fix(tools): restrict what a scope inherits, not just the global layer
A restriction was compiled against the global tool layer alone: only
global-layer tools were tested against `admits()`, and every chain-layer
tool was overlaid unfiltered afterward. That read the exempt set as "the
global layer" when what it means is "what this scope registers itself" —
two descriptions of the same set only while every model-facing tool sat in
the host composition.

Moving those rows onto the agent plane separated them. A preset's tools are
an ANCESTOR contribution to a joined agent, so a subagent's `toolFilter`
stopped constraining anything it was given; and with the global layer empty
`restrict()` rejected every name it received as unknown, failing the child
outright. With the same tools in the global layer the filter still admits
and applies normally, which is what makes this a regression of the move
rather than a standing limitation.

`view()` now filters everything a scope inherits — the global layer and
every ancestor layer on its chain — and exempts only the layer the scope
owns. That exemption is load-bearing rather than incidental: the delegation
runtime registers a child's `report` and structured-output tools into the
child's own layer, and a filter naming the capabilities the child may use
must not strip the machinery it answers through. Tool order, and with it
prefix-cache reuse, is unchanged: inherited names keep their global-then-
ancestor position and own-layer names still come last.

The diagnostic said "unknown global tool" while listing what is really the
inherited surface; it now names the surface it checks and says why an
own-layer name is not restrictable.

Fixes #2185
2026-08-10 20:34:45 +08:00
Yichen Jiang 6301320a63 Merge remote-tracking branch 'origin/master' into worktree/subagent-missing-tools-fb2359 2026-08-10 20:32:58 +08:00
Yichen Jiang e365c7d601 Merge pull request #2163 from deepseek-harness/worktree/fix-session-header-preset-order
fix(web): order session preset before subagent list
2026-08-10 20:30:35 +08:00
Yichen Jiang 5a69fa9258 Merge branch 'master' into worktree/fix-session-header-preset-order 2026-08-10 20:21:52 +08:00
Yichen Jiang 7ca8751584 test(web): refresh localized preset snapshots 2026-08-10 20:20:31 +08:00
Ziya 216b5eab42 Merge pull request #967 from deepseek-harness/fix/workspace-context-rendered-change-proof
fix(workspace-context): commit only represented changes
2026-08-10 05:19:17 -07:00
Ziya 45df59391a Merge pull request #1986 from deepseek-harness/fs-overwrite-diff-bound-v2
fix(fs-local): bound overwrite contextual diff bases
2026-08-10 05:18:27 -07:00
ZiyaZhang 4ec9e310c3 Merge remote-tracking branch 'upstream/master' into fix/workspace-context-rendered-change-proof 2026-08-10 05:10:39 -07:00
Ziya 5cdebcf5f3 Merge branch 'master' into fs-overwrite-diff-bound-v2 2026-08-10 05:10:30 -07:00
Yichen Jiang 9ce8340dd9 fix(web): pin preset before subagent header action 2026-08-10 19:54:08 +08:00
ZiyaZhang bf39cef48f fix(ci): tolerate platform-specific coverage and curl retries 2026-08-10 04:52:07 -07:00
Yichen Jiang cec716717f Merge branch 'master' into worktree/fix-session-header-preset-order 2026-08-10 19:46:29 +08:00
Yichen Jiang 13d4d4b3f3 fix(web): focus creator preset description 2026-08-10 19:44:42 +08:00
Yichen Jiang 5e3dd2fd34 fix(web): clarify shipped preset capabilities 2026-08-10 19:40:19 +08:00
Huanqi Cao 0a17575040 fix(sandbox): address review: leak FIXME, legal ACL fixture, stronger offset test, prose 2026-08-10 19:34:01 +08:00
Yichen Jiang 2f481fa352 fix(apiproxy): echo the preset a created session runs, not its header
`session.create` also adopts an already-live session, and the preceding
commit newly allows adopting one under the preset it switched to while
blank. Its response still echoed `header.agentPreset`, so that adoption
answered with the preset the session had just left — contradicting the
request it had accepted and the row `session.list` serves for the same
session from `resolveSessionPreset()`. The echo now resolves the same way.

The `assertPresetUnchanged` parameter doc said `existing` was the preset
the session was created under; both callers now pass what it runs.

`composeFrom()` was documented as "infallible" and "cannot fail" beside two
`@throws`. It has no composition failure mode — no roster read, no mount, no
file — but it does reject a caller error, and the wording now says which.

The package-level "switched preset" test re-linked to the same preset id,
so it could not tell reading the parent's live scope chain from reading its
creation header. A second fixture preset makes the switch real.

The Web browser lane's subagent goldens gain the preset badge a child now
shows, which is the visible consequence of recording its composition. That
lane runs only under DSH_EXAMPLE_MODE=lib and was missed before.

The Agent Note records two limits found in review: a cold-resumed
continuable child joins its parent's current composition rather than the one
its header names, and `toolFilter` does not constrain a joined child. The
latter is a regression from the agent-plane move rather than anything this
change introduces — with the same tools in the global layer the filter
applies normally — and is tracked in #2185.

Refs #2185
2026-08-10 19:28:40 +08:00
Yichen Jiang 08b85654f4 feat(web): localize shipped agent presets 2026-08-10 19:28:02 +08:00
Turtle 243ed09aaf Merge pull request #2046 from deepseek-harness/worktree/lightweight-doc-translation-20260808
docs(skill): make routine translation lightweight
2026-08-10 19:09:30 +08:00
Huanqi Cao 59a2e4d825 fix(ci): restore the native Windows coverage denominator to green
The windows-native job has been red since #1990 put the sandbox-windows-acl sources into the Windows 100%-per-file denominator without tests carrying them, and #1543 dropped the authoring.ts V8 ignore for the POSIX-only owner-execute branch. Non-blocking at merge time, the red state has propagated to every later pull request.

Cover every in-process ACL-sandbox failure branch with stub-based failure-path suites (ffi/acl/token/spawn/index), following the package's existing failure-paths pattern; the package now measures 100% per file under the Windows denominator. Exclude only the runner entry from the win32 denominator: it executes exclusively as a spawned child outside the instrumented run, and its behavior is pinned end-to-end by the runner suite. Restore the authoring.ts narrow V8 ignore and add one for the dispose token guard whose absent-token arm is lifecycle-unreachable. Update the dual-lane Agent Note with the denominator composition.
2026-08-10 19:07:35 +08:00
Yichen Jiang da5f60300a Merge pull request #1808 from deepseek-harness/worktree/persist-web-theme-settings
fix(web): persist general preferences in settings
2026-08-10 19:05:19 +08:00
Tianyi Cui ef7195a00a fix(skill): enforce manual invocation policy 2026-08-10 18:04:26 +08:00
Tianyi Cui b4581c8b97 test(snapshot): refresh translation prompt fixture 2026-08-10 17:58:37 +08:00
Tianyi Cui c5dd99124c docs: make routine translation lightweight 2026-08-10 17:58:09 +08:00
Yichen Jiang da5d9aaee9 Merge remote-tracking branch 'origin/master' into worktree/subagent-missing-tools-fb2359 2026-08-10 17:57:59 +08:00
Yichen Jiang e53f448650 fix(subagent): compose children from their parent's preset
Tool and prompt-section visibility is inherited along dsh-scope's parent
chain, and an agent's scope key is minted with no parent. Per-session agent
presets moved every model-facing row onto the agent plane and made
AgentPresets.mount() the one thing that binds that link, from the api-proxy's
session create, resume, and fork paths. The two in-process subagent drivers
installed only the per-child persona and tool filter, so a child's scope chain
had length one and its registry view resolved the global layer alone — which
is empty wherever a preset roster is composed. One-shot children reached the
model with no tools, continuable ones with only the host-plane `report`, and
neither carried its parent's persona, workspace context, or skill catalog.

AgentPresets.composeFrom() joins one agent to the standing composition another
already runs on. It is a bind, not a mount: the child gets its parent's exact
generation, so a composition edited since the parent started cannot fork it
onto another one, and it is synchronous, which is what lets a child creation
window use it. applyChildComposition() now takes the parent and performs the
join first, making a child composed without it unrepresentable at the call
sites. childSessionMeta() records the joined id so a cold read rebuilds the
composition the child actually ran under.

The audit that followed found two api-proxy readers on the wrong authority:
presenterScopeFor() and the live-agent branch of assertPresetUnchanged() both
read header.agentPreset, which goes stale the moment a blank session switches
preset. A switched session's cold transcript resolved presenters in the older
composition's layer and silently degraded to generic cards, and the gateway
refused to adopt a live session under the preset it actually runs while
accepting the one it left. Both now resolve through resolveSessionPreset(),
matching the resume branch fifteen lines above. The owning architecture Agent
Note carried the stale claim that the header records what a session runs; it
is corrected to name the header/log pair and its three readers.

Fixes #2165
2026-08-10 17:46:34 +08:00
ZiyaZhang c969d69f10 Merge latest master into PR branch 2026-08-10 02:10:57 -07:00
ZiyaZhang c950366bd9 fix(ci): bound native ACL coverage gate 2026-08-10 02:09:14 -07:00
Yichen Jiang f3a075434c Merge branch 'master' into worktree/fix-session-header-preset-order 2026-08-10 17:06:01 +08:00
Yichen Jiang 94f4183afd Merge remote-tracking branch 'origin/master' into worktree/web-theme-settings-integration-fde706 2026-08-10 17:05:18 +08:00
Yichen Jiang d2321d210a Merge pull request #2143 from deepseek-harness/fix/preset-host-plane-task-registry
fix(web-app,agent-presets): 让后台任务注册表回到宿主平面
2026-08-10 17:04:11 +08:00
Yichen Jiang cc527dfa9a fix(web): order preset before subagent list 2026-08-10 17:02:20 +08:00
Yichen Jiang 8ae1a9d6a8 Merge remote-tracking branch 'origin/master' into fix/preset-host-plane-task-registry 2026-08-10 16:53:03 +08:00
Turtle 09c3622697 Merge pull request #2103 from deepseek-harness/codex/concrete-technical-prose
docs: make technical prose concrete
2026-08-10 16:51:18 +08:00
Yichen Jiang be7bf24169 Merge remote-tracking branch 'origin/master' into fix/preset-host-plane-task-registry 2026-08-10 16:45:13 +08:00
Yichen Jiang 2e55964865 Merge remote-tracking branch 'origin/master' into worktree/web-theme-settings-integration-fde706 2026-08-10 16:37:14 +08:00
Yichen Jiang 76feeece55 test(web): pin the assembled snapshot lane's locale through the browser
The assembled Web snapshot lane selected its locale with a `dsh.locale`
localStorage key. That key stopped selecting anything once the locale
preference moved to the Host settings document, so the image-display
scenario's Chinese expectations met the English default and failed.

Pin the navigator languages the boot env already documents, and state the
image-display expectations in the lane's English copy — the fixture session
title stays Chinese because it is fixture data, not product copy.
2026-08-10 16:37:01 +08:00
Turtle 3c7e7262c1 Merge pull request #2147 from deepseek-harness/codex/ignore-archived-agent-notes-in-rg
chore: exclude archived Agent Notes from default rg search
2026-08-10 16:35:41 +08:00
Yichen Jiang cf5fbd02b8 fix(tasks-local): return the layer disposer directly and cover scoped teardown
`ScopedLayers.effect` already returns an exact `() => void`, so the inherited
`() => void dispose()` wrapper voided a void — two lint rules, four errors.

The scoped layer's own teardown had no test, which is the registry-contribution
disposal contract the testing policy requires and the only path that calls
`TaskLayer.isEmpty()`: `ScopedLayers` prunes a scope's layer when its last
contribution disposes. The new case mounts one plugin contributing both a
surface and a listener into one scope, then unloads it and observes that the
agents which joined that scope are refused again.

Refs #2141
2026-08-10 16:34:29 +08:00