Commit Graph

508 Commits

Author SHA1 Message Date
_Kerman df643627c9 Merge pull request #2423 from deepseek-harness/xtr/fix-web-ui-geometry-and-sidebar-motion
fix(web): align composer geometry and sidebar motion
2026-08-13 15:57:44 +08:00
_Kerman 598645f119 Merge pull request #2458 from deepseek-harness/xtr/fix-cold-session-list-metadata
fix(web): keep cold blank sessions out of recent lists
2026-08-13 15:34:14 +08:00
Huanqi Cao 314fedfc14 docs: record the junction-safe fixture teardown decision 2026-08-13 15:16:12 +08:00
Huanqi Cao c29246ae31 fix(pwsh): resolve Store app execution aliases 2026-08-13 15:16:12 +08:00
Huanqi Cao 9e9073da24 fix(boot): unlink stale profile fallback links instead of rmSync 2026-08-13 15:16:11 +08:00
_Kerman 378a662082 Merge remote-tracking branch 'origin/master' into dshw/pr-2458 2026-08-13 15:15:39 +08:00
_Kerman 2be3e12965 fix(apiproxy): harden cold session metadata probing 2026-08-13 15:09:21 +08:00
_Kerman 3c06c66ac4 fix(web): hide verified cold blank sessions 2026-08-13 14:04:16 +08:00
Turtle a312675d10 Merge pull request #2454 from deepseek-harness/codex/capitalize-service-provider
docs: capitalize Service Provider across repository
2026-08-13 14:03:57 +08:00
Turtle 1540e76598 docs: capitalize Service Provider across repository 2026-08-13 13:31:30 +08:00
Yichen Jiang a5a83bd1d9 fix(llm-pi-ai): withhold OAuth-only providers from the configurable directory
pi-ai resolves an OAuth provider from a stored OAuth credential alone, and
this adapter builds its Models collection with no credential store and runs
no login flow. `openai-codex` — the one installed provider declaring
`auth.oauth` with no `auth.apiKey` — was therefore offered on the Models page
with the keyless placeholder every pi-ai route carries, and every request on
it failed `Provider is not configured` before going out.

`catalogProviderTakesApiKey()` answers whether pi-ai's installed provider for
a route declares the one method this adapter can supply, and the directory
skips the catalog routes that fail it. Catalog membership is unchanged, so
`declared` still answers what pi-ai ships; the profile half of the union stays
unconditional, so a route a settings document already names keeps its entry
and can be edited or deleted.

Resolution is untouched: a profile naming `apiKeyEnv` on such a route still
builds a working provider.
2026-08-13 13:15:47 +08:00
Yichen Jiang 3bcc1a0bf7 Merge remote-tracking branch 'origin/master' into worktree/minimal-no-runtime-context
# Conflicts:
#	packages/core/system-prompt/README.i18n.yaml
#	packages/core/system-prompt/README.md
#	packages/core/system-prompt/README.zh.md
#	packages/examples/agent-spine-demo/README.i18n.yaml
#	packages/examples/agent-spine-demo/README.md
#	packages/examples/agent-spine-demo/README.zh.md
#	packages/self-modification/tool-cordis/src/api-catalog.ts
2026-08-13 10:24:29 +08:00
_Kerman 68e1d5a587 Merge remote-tracking branch 'origin/master' into dshw/pr-2423
# Conflicts:
#	packages/client/ui-sidebar/src/client/SidebarRoot.tsx
2026-08-13 04:32:57 +08:00
Tianyi Cui a2d0f7f411 refactor: apply repository naming contract
Apply the accepted pre-release package, service, type, directory, and role renames as one repository-wide change.
2026-08-13 00:54:38 +08:00
_Kerman 3ef05f8a85 review: address ds-review-bot findings on composer geometry
- Rewrite the 08-04 gutter-reservation note in place: the reservation is Chat's alone and the overlay branch points to the seat-width compensation note; the Testing section now describes the uncompensated control.
- Cross-reference the earlier rejection of the seat inset in the 08-12 note and record the engine-resolved-vs-fixed-8px drift as accepted residual cost instead of asserting Firefox resolves 8px.
- Pair --dsh-scrollbar-width with the mirrored ::-webkit-scrollbar rule and the compensation consumer in the scrollbar-styles gate; document the variable in the ui-theme README.
- Rename the e2e control to compareTabsWithoutCompensation and correct the vacuity-guard comment; rewrap the WorkspaceBrowser doc comment.
2026-08-12 23:51:46 +08:00
Yichen Jiang ece8645080 fix: suppress runtime context in minimal profiles 2026-08-12 23:28:15 +08:00
_Kerman 7c4c118456 fix(web): reclaim overlay scrollbar gutter 2026-08-12 22:56:36 +08:00
07akioni 62a437c082 review: address ds-review-bot findings on session-stats
- stateVersion starts at 1: the package is new, no persisted rows predate it
- pendingCalls pairs by own key so a provider callId naming a prototype
  property cannot fold toolMs to NaN on an unmatched crash-recovery result
- StatsLine folds the window fallback only when no sessionStats value is
  served, and gates the token group on actual token activity instead of
  steps, so failed-only sessions drop the zero-token group
- correct the crash-step counting semantics in the README and Agent Note:
  recovery closes interrupted steps with a synthetic step/end on reload
- reword the window-scoped alternative as a plain rejected option and name
  isTokenDelta's home beside the StreamChunk type
2026-08-12 21:43:35 +08:00
07akioni ae3f89e772 Merge remote-tracking branch 'origin/master' into fix/stats 2026-08-12 21:29:00 +08:00
07akioni efb1857853 Merge remote-tracking branch 'origin/master' into fix/stats 2026-08-12 21:22:05 +08:00
xjt 23e09ec08e Merge master into docs/post-v3-release-proofreading 2026-08-12 20:48:08 +08:00
07akioni dabe6207f5 fix: 分页问题 2026-08-12 20:26:47 +08:00
CreatixChu a995fc2706 Merge pull request #2346 from deepseek-harness/fix/web-max-tokens-turn-end-notice
fix(web): surface max-tokens turn ends as a localized truncation notice
2026-08-12 20:07:35 +08:00
xjt ce883ffea3 Merge remote-tracking branch 'origin/master' into docs/post-v3-release-proofreading
# 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.zh.md
#	README.i18n.yaml
#	README.zh.md
#	scripts/snapshots/translation-prompt-v4/request-response.expected.json
2026-08-12 16:45:48 +08:00
xjt 0a8c9fb1f9 docs(i18n): address final proofreading feedback 2026-08-12 16:43:38 +08:00
pku-xht 21b316de23 Merge origin/master into codex/bounded-background-tasks-v2 2026-08-12 15:54:49 +08:00
creatixchu e4ca03cb85 fix(web): surface max-tokens turn ends as a localized truncation notice
A turn the provider ends at its per-request output cap previously produced
no visible sign in the Web chat flow: only error-kind turn/end events built
a conversation node, so the truncated answer read as a normal completion.

Add a turn-max-tokens conversation node Definition over the durable
turn/end event, a warning-styled localized notice row distinct from
turn-error, a fixture max-tokens sample turn, and an assembled keyless
snapshot pinning the dot state, title, and hint.

Closes #1522
2026-08-12 15:36:27 +08:00
pku-xht b1c13b5ca3 Merge pull request #2254 from deepseek-harness/codex/subprocess-process-exit-cleanup-v2
fix(subprocess): clean managed processes on host exit
2026-08-12 15:27:03 +08:00
xjt 19c48b2ae3 Merge remote-tracking branch 'origin/master' into docs/post-v3-release-proofreading
# Conflicts:
#	packages/client/ui-models/README.i18n.yaml
#	packages/client/ui-models/README.zh.md
2026-08-12 14:28:09 +08:00
xjt ab140cd299 Merge remote-tracking branch 'origin/master' into docs/post-v3-release-proofreading
# Conflicts:
#	.agents/notes/implemented/feature/2026-07-20-dsh-cli-personal-config.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-20-dsh-cli-personal-config.zh.md
#	.agents/notes/implemented/feature/2026-07-25-session-list-browsing-and-manual-order.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-25-session-list-browsing-and-manual-order.zh.md
#	.agents/notes/implemented/feature/2026-07-25-workspace-ui-product-flow.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-25-workspace-ui-product-flow.zh.md
#	.agents/notes/implemented/feature/2026-07-26-code-dispatch-ui-foundation.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-26-code-dispatch-ui-foundation.zh.md
#	docs/user/develop/basic/index.i18n.yaml
#	docs/user/develop/basic/index.zh.md
#	docs/user/guide/config.i18n.yaml
#	docs/user/guide/config.zh.md
#	docs/user/guide/providers.i18n.yaml
#	docs/user/guide/providers.zh.md
#	packages/bundle/base/README.i18n.yaml
#	packages/bundle/base/README.zh.md
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/README.zh.md
2026-08-12 12:59:38 +08:00
Yichen Jiang d57463c2fb fix(web): end first-run onboarding on any usable provider
The step and the Models page both asked one question of a join that
describes every provider: is deepseek-official's credential stored? A user
who configured some other route was taken over on every blank session, and
the DeepSeek setup card opened over them on every visit to Models with a
Cancel that could not close it — while clearing the add card's draft,
because it shared the row-editor close handler.

providerUsable(row) now answers what both surfaces need: the route is
registered and whatever credential its profile names is stored. Readiness
(renamed onboardingReadiness) ends on any usable row, needsSetup takes the
same fact, and each card kind owns its own close handler.

Fixes #2325
2026-08-12 12:50:45 +08:00
xjt 4806d94715 docs(i18n): include complete proofreading corpus 2026-08-12 12:30:19 +08:00
Yichen Jiang dfa2d91dcb Merge master into worktree/preset-user-root-in-package
Overlaps master on the preset e2e, the web scaffold, and the generated
config-catalog triplet; all merged textually, so the catalog is regenerated and
its pairing hashes re-recorded rather than trusted.
2026-08-12 11:08:55 +08:00
xjt 7b450d121e docs(i18n): apply reviewed Chinese proofreading updates 2026-08-12 09:59:19 +08:00
imccyu d91180db9a docs: client spec 2026-08-12 02:16:39 +08:00
pku-xht 9e4d391477 Merge commit '1ba530868a928c4286c8097647a649843dfae2bc' into codex/bounded-background-tasks-v2 2026-08-11 23:27:26 +08:00
pku-xht 38922cbbb9 docs(tasks): clarify admission lifecycle 2026-08-11 23:13:35 +08:00
Yichen Jiang db4e3e39a5 docs: refresh generated source references after the collapse-section constants
Adding COLLAPSE_SECTION_ORDER and CODE_ONLY_INSTRUCTION shifted every
later line in packages/core/tools/src/index.ts by 14, and three generated
artifacts cite those lines: the subsystems cordis-surface region, the
event producer/consumer matrix, and the Agent Note pair record left
inconsistent by the cherry-pick resolution.
2026-08-11 23:11:12 +08:00
pku-xht 84b15efd85 test(subprocess): harden host-exit cleanup fixtures 2026-08-11 22:56:45 +08:00
Yichen Jiang 5d2c943d38 fix(tools): state the code-mode collapse in the prompt and the denial
The executor collapse landed without telling the model it exists. Every
tool contributes its own guidance section naming its tool, none of them
qualify how that tool is reached, and they all render before the SDK
(orders 100-199 against SDK_SECTION_ORDER 150), so the prompt said "Use
the read tool" eleven times and never said only run_code is callable.

A real session shows the consequence: the model emitted a native call,
read `unknown tool "read"` for a tool the same prompt declares, and
concluded the deployment was inconsistent rather than routing through
run_code.

The registry now contributes `tools:code-only` at order 99 -- ahead of
the guidance band -- stating the rule, registered wherever `tools:sdk`
is and rendering empty outside an effective `code`. `both` renders it
empty because its native calls do execute, which is also why
both-mode-turn no longer shares code-mode-turn's expected prompt. The
denial itself now names the route back, since a bare UNKNOWN_TOOL for a
declared tool is what misled the model.
2026-08-11 22:51:16 +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
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
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
Yichen Jiang adfd54dc5c Merge branch 'master' into worktree/minimal-profiles-bare-runtime 2026-08-11 21:11:32 +08:00
Yichen Jiang 5c7dd6f8eb feat(agent-presets): own the writable preset root instead of awaiting an app
`Config.roots` defaulted to `[]`, so a deployment that did not patch both roots
in got a roster with none — `dsh run` once booted exactly that and failed
resolving `standard`. The user root never needed an app: `<dshHome>/.agent-presets`
is the same place in every deployment, resolvable here the way
`dsh-skill-local` resolves `<dshHome>/skills`.

The roster now derives that root itself unless `includeUserRoot` is false, and
`apps/cli` supplies only the SHIPPED root, whose path an installed app alone
can resolve. The derived root is appended after every configured root, so a
shipped id still shadows a home directory claiming it and `writableRoot()`
still prefers an explicitly configured `user` root; the set is resolved once at
construction, because a root set that changed between a `list()` and the
`copy()` acting on its answer would author into a directory the caller never
saw.

Every test that pins an exact roster now says `includeUserRoot: false` — the
machine's real harness home must not decide what a golden or an assertion
counts.
2026-08-11 21:09:35 +08:00
Yichen Jiang 8a29248425 Merge pull request #2268 from deepseek-harness/worktree/preset-authoring-self-validation
修正创造模式 preset 组装指导中的 4 处事实错误与失效的校验建议
2026-08-11 20:18:34 +08:00
pku-xht fe09a45fca Merge commit 'f5a147f8da75e7bab0c617e0c7594c62db306e26' into codex/bounded-background-tasks-v2 2026-08-11 20:12:04 +08:00
Yichen Jiang 3fb325cfec fix(preset): state the user preset root plainly, resolve the acting path
The previous pass over-corrected: presenting both roots as unknowable made the
guidance vaguer without making it truer. Every `dsh` launcher puts authored
presets under `$DSH_HOME/.agent-presets`, so the skill and persona state that
as the answer to "where do my presets live" and reserve the read-back for the
path an agent actually opens or edits, which `copy()` already reports.
2026-08-11 20:04:32 +08:00
Yichen Jiang 782d670f24 fix(preset): stop presenting the preset roots as constants
Neither root is a property of the preset layer. `Config.roots` defaults to `[]`;
the two the shipped agent sees are patched in by the dsh CLI, whose user root is
`dshHomePath('.agent-presets')` and whose system root ships beside the install.
`writableRoot()` then takes the first `user` root from whatever configuration
supplied it.

The skill and the persona stated `${DSH_HOME:-$HOME/.dsh}/.agent-presets/<id>/`
as where authored presets live, which is only the default install's answer, and
no call reports either root: `authorable` says whether a writable one exists,
and `list()` cannot reveal a user root that is still empty. Both now keep that
path as what to tell a user asking where to look, and direct every path an agent
acts on to `list()` or `resolve()` — which is also what `copy()` already relies
on, since it chooses the writable root itself and reports the file it created.
2026-08-11 19:56:45 +08:00
Yichen Jiang 63b564bb4b fix(preset): cover both root-realm rejections and narrow the packaging claim
Review found two errors in the first pass.

The skill quoted `service "<name>" has been registered at <Owner>` as the
rejection for a service published into the root realm. That message only
appears when the loose name collides with one the host already supplies. A
preset publishing its OWN new service name reaches the root realm successfully
and is rejected by the mount audit instead, with `row(s) published
process-global service(s) [...]` — which is the shape a forgotten realm
actually takes. Both messages are now listed, verified by mounting one preset
of each kind.

The Agent Note claimed every harness package publishes exactly three file
patterns. 139 do; 28 also publish `lib/client.js`, 22 publish
`lib/types/**/*.js`, and `dsh-message-feedback` publishes `src`. The note now
states only the fact it needs: no package's `files` includes its README.

Also from review: the copy step no longer repeats the display name it already
set, the id rule spells out `[a-z0-9][a-z0-9-]*`, and the sandbox step says
reads need no escalation.
2026-08-11 19:49:47 +08:00