Compare commits

...
Author SHA1 Message Date
imccyu 0a53fb55be Merge pull request #3334 from deepseek-harness/release/dsh-0.1.2-alpha.2
release: [email protected]
2026-08-30 21:37:53 +08:00
imccyu 3f1b46a5db release(dsh): 0.1.2-alpha.2 2026-08-30 21:19:29 +08:00
imccyu 5761890711 Merge pull request #2988 from deepseek-harness/worktree-npmalpha
feat(release): add DSH alpha and canary channels
2026-08-30 20:26:17 +08:00
imccyu 45455aae77 feat(release): route dsh prerelease dist-tags 2026-08-30 19:50:51 +08:00
imccyu f46e4a8ada docs(release): define dsh prerelease channels 2026-08-30 19:50:51 +08:00
Tianyi Cui ed9fb840d6 Merge pull request #3325 from deepseek-harness/worktree/revert-pr-3087
revert(session): restore ignorable event compatibility
2026-08-30 15:34:41 +08:00
imccyu 9e1bdefc72 Merge pull request #3326 from deepseek-harness/worktree-rerevert2608
fix(web): restore localized permission labels
2026-08-30 14:55:28 +08:00
imccyu 8769d57c98 fix(web): localize permission preset labels 2026-08-30 14:24:23 +08:00
imccyu 5fae1d02f5 docs(web): describe localized permission labels 2026-08-30 14:24:23 +08:00
Tianyi Cui b7a77f4f08 Merge origin/master into worktree/revert-pr-3087 2026-08-30 14:18:37 +08:00
Tianyi Cui 089e044e5b docs(session): clarify external event compatibility 2026-08-30 14:17:44 +08:00
Yichen Jiang 8448c05277 Merge pull request #3316 from deepseek-harness/worktree/plugin-list-display-cbe885
feat(plugin-inventory): scope-grouped plugin list carrying agent preset compositions
2026-08-30 14:00:23 +08:00
Yichen Jiang cf50cfa8ac Merge pull request #3315 from deepseek-harness/worktree/issue-3310-verification-a39d1a
fix(web): publish the drill claim before the descent edit
2026-08-30 12:46:30 +08:00
Tianyi Cui b7bccd5897 fix(docs): repair reverted session note references 2026-08-30 12:35:11 +08:00
Tianyi Cui 29b65af60b docs(session): retain ignorable events for external plugins 2026-08-30 12:29:24 +08:00
Tianyi Cui 2c6ff296af Revert "Merge pull request #3087 from deepseek-harness/worktree/remove-ignorable-session-events"
This reverts commit 2123b2f418b1c8fbb86dc327b598fb11423da226, reversing
changes made to 3c0b5c68ce697537a21084f9135663017474a2e1.
2026-08-30 12:26:20 +08:00
Yichen Jiang 19c3a270fa test(agent-presets): key mounted-row assertions by entry id
The loader's entry store is a plain object, so an auto-generated all-digit
id is reordered ahead of its siblings by integer-key semantics and the
previous ordered assertion flipped on roughly one in fifteen runs. Row
ordering belongs to loader.entries(), not to this projection; the spec now
asserts each row by its id.
2026-08-30 12:08:52 +08:00
Yichen Jiang 6ff02e8a96 Merge remote-tracking branch 'origin/master' into worktree/plugin-list-display-cbe885
# Conflicts:
#	packages/client/tsdown.client.ts
2026-08-30 12:00:06 +08:00
imccyu a69941bf51 Merge pull request #3319 from deepseek-harness/worktree-runtime-dependency-decoupling
refactor: reduce internal peer dependency fan-out
2026-08-30 11:54:45 +08:00
Yichen Jiang c37a402dfb Merge remote-tracking branch 'origin/master' into worktree/plugin-list-display-cbe885
# Conflicts:
#	packages/client/tsdown.client.ts
2026-08-30 11:32:22 +08:00
Yichen Jiang 2f673e5aba fix(agent-presets): register the display subpath in tsconfig paths
CI's coverage lane runs on a clean tree where workspace imports resolve
through tsconfig paths to src; the value import of
@deepseek-ai/dsh-agent-presets/display therefore needs its own paths row
beside ./types. Locally the built lib masked the gap; reproduced by moving
lib aside, fixed, and re-run green under the same condition.
2026-08-30 11:32:07 +08:00
imccyu 739d9d594e Merge pull request #3318 from deepseek-harness/release/vendor-4.0.2
release(vendor): cordis 4.0.2, cosmokit 1.8.3, group 1.0.2, hmr 1.0.1…
2026-08-30 11:24:37 +08:00
imccyu 6af96785b5 release(vendor): cordis 4.0.2, cosmokit 1.8.3, group 1.0.2, hmr 1.0.17, include 1.0.7, loader 1.0.3, logger-console 1.0.2, schemastery 3.18.2, timer 1.1.4 2026-08-30 11:04:50 +08:00
imccyu b27c8fbc02 chore(deps): refresh package manifests 2026-08-30 02:29:53 +08:00
imccyu 795d8ec985 docs: describe runtime dependency ownership 2026-08-30 02:29:53 +08:00
imccyu 34bdc81b47 test(deps): enforce runtime dependency ownership 2026-08-30 02:29:52 +08:00
imccyu 9135a13a8b refactor(consumers): remove cross-package runtime relays 2026-08-30 02:29:52 +08:00
imccyu f4e49ccf8f refactor(services): move shared values behind service APIs 2026-08-30 02:29:51 +08:00
imccyu 6c53fe6e2a refactor(values): make shared primitives duplicate-install safe 2026-08-30 02:29:51 +08:00
Dudu-0223 0f2134d0d8 Merge pull request #3292 from deepseek-harness/perf/3270-linear-stream-queues
perf(api): make stream queue draining linear
2026-08-29 21:47:00 +08:00
Yichen Jiang 8349cc6c73 fix(agent-presets): live-mount-first inventory, per-runtime mounts, localized shipped preset names
Review round on #3316: the composition inventory answers from a standing
mount before the broken verdict (a file corrupted after mounting no longer
hides the running composition), livePresetMounts filters by the caller's
root fiber so a second Cordis runtime in one process never answers for it,
compositions carry trust and the plugin list resolves shipped preset names
through the shared dsh-agent-presets/display fold over ui-agent-preset's
dictionaries (INLINE_SAFE inline import; no cross-plugin runtime import),
the condition detail label reads Disabled when/禁用条件, and the stale
four-surfaces comment says three.
2026-08-29 20:41:01 +08:00
Dudu-0223 1e3ca1a4b3 test(ci): tolerate reaped timeout descendants 2026-08-29 20:19:38 +08:00
Yichen Jiang 235489f5a7 Merge remote-tracking branch 'origin/master' into worktree/plugin-list-display-cbe885 2026-08-29 19:41:46 +08:00
Yichen Jiang 09e4fa562f Merge branch 'master' into worktree/issue-3310-verification-a39d1a 2026-08-29 19:40:31 +08:00
Dudu-0223 112daedd54 Merge origin/master into perf/3270-linear-stream-queues 2026-08-29 18:59:23 +08:00
imccyu 910e178b08 Merge pull request #3311 from deepseek-harness/worktree-node24resolve
fix(loader): detect internal loader shape by API presence, not Node major
2026-08-29 18:19:39 +08:00
imccyu 675efe73f2 fix: node 24.9 internal issue 2026-08-29 17:37:50 +08:00
imccyu d5e2f22b08 Merge pull request #3313 from deepseek-harness/worktree-llme2e
test(e2e): use Flash for all live model coverage
2026-08-29 17:36:05 +08:00
Yichen Jiang cebd0a2031 refactor(plugin-inventory): match group title and switcher pill to the General-settings row idiom 2026-08-29 17:26:05 +08:00
Yichen Jiang 3b73a415c2 Merge origin/master: RemoteError wire vocabulary and ctx-based preset stores
Reconciled with the scope-grouped plugin list: compositionInventory keeps
its additive block over master's RemoteError refactor; the slimmed
settings-store keeps ctx-based signatures while staying a display-only
roster store (no describeFace, no select); dead transport-rejection tests
dropped with the wire that no longer rejects; module graph, catalogs, and
harnesses regenerated against the merged tree.
2026-08-29 17:13:45 +08:00
Yichen Jiang 0f06f973c4 refactor(plugin-inventory): settings-row style group headers
Both scope groups drop their boxed chrome for the General-settings row
idiom: a title row (session-plugins title with the right-aligned preset
selector pill; global-plugins title), a grey subtitle line carrying the
count, a hairline divider between groups, and the cards grid below.
Counts ride the subtitle as text while the data attributes keep the raw
numbers for tests.
2026-08-29 17:13:45 +08:00
Yichen Jiang 5eb7195f9d refactor(plugin-inventory): menu-pill preset switcher, collapsible groups, inline preset-provided rows
Review-driven refinements to the scope-grouped plugin list:

- The preset switcher becomes the General-settings selector pill over the
  shared Menu primitive instead of a native select, and the preset group
  is collapsible like the global one (search still forces both open).
- The session-plugins drawer is removed: rows the presets took over sit
  inline in the global list with the preset-provided tag and per-preset
  details, since the preset group above already shows those compositions.
- The status dot renders only for a live root fiber, so file-state rows
  of an unmounted preset carry their enablement tag alone instead of a
  column of grey dots.
- PresetTree reclaims the owning entry's subtree slot: EntryTree's
  constructor filed the standing mount under the roster's own Loader row,
  so after the first session composed a preset the whole composition
  leaked into root loader.entries() as host rows (each preset overwriting
  the last). A regression test holds the root entry list identical across
  a mount.
2026-08-29 17:13:45 +08:00
Yichen Jiang e5f36cc70f feat(plugin-inventory): carry every agent preset's composition and group the settings plugin list by scope
The settings plugin list projected ctx.loader.entries() alone, hiding the
plugins sessions actually run and rendering the web overlay's deliberate
disabled tombstones (tool-bash, tool-fs, ...) as two dozen plainly disabled
rows while the same modules ran in every standard-preset session.

- dsh-agent-presets: compositionInventory() answers flattened rows per
  preset — newest live standing generation when mounted, composition file
  otherwise with !!js disabled gates evaluated against the Loader context;
  reading never mounts (regression-tested), refusal stays 'conditional',
  raced files report broken with the reason.
- dsh-host-plugin-inventory: list() gains an optional agentPresets block,
  resolving the roster as an optional peer and mapping fiber states to the
  public phase vocabulary.
- ui-settings-plugin-inventory: preset group first behind a display-only
  switcher opening on the default preset; global group collapsed with
  failures floated; host-disabled modules enabled by >=1 preset fold into a
  session-plugins drawer naming providers; search spans scopes and points
  at matches in unselected presets.
- ui-agent-preset: the General-settings default-preset row is deleted — the
  roster section's make-default and the new-session chip keep the field —
  and the settings store slims to the display roster the header label reads.

Docs, catalogs, module graph, settings-chrome goldens, and the bilingual
Agent Note ride along.
2026-08-29 17:13:45 +08:00
imccyu 08bfeda7e8 test(e2e): use Flash for live adapter coverage 2026-08-29 17:08:44 +08:00
imccyu 4d92a61e00 test(e2e): reserve pro for adapter coverage 2026-08-29 17:08:44 +08:00
Yichen Jiang 1404ded8b1 Merge pull request #3303 from deepseek-harness/worktree/dsh-ci-test-reliability
docs(testing): add CI test reliability skill
2026-08-29 16:54:54 +08:00
Yichen Jiang d5a9e5b274 fix(web): publish the drill claim before the descent edit
A pointer drill in the @ menu left no breadcrumb and a crumb click dropped
the header, while the keyboard drill worked. InputTriggerController.settle
assigned `drilled` after execute() returned, but a pointer mousedown runs
outside any Lexical update, so the descent edit commits discretely and
re-enters track() during execute() — where refreshHeaders and
fetchCandidates both read the claim while it was still clear.

settle now claims the drill before dispatching the edit and withdraws it
only when the edit is refused, which mutates nothing and so drives no
re-entrant track().
2026-08-29 16:52:39 +08:00
Yichen Jiang cc5173f4cf docs(testing): state the concurrent execution model where tests are written
The skill carries the reliability rules, but nothing an agent loads by default
said that specs run concurrently at all. The testing policy described tiers and
evidence without ever stating how a spec is executed, and neither subtree
AGENTS.md mentioned it — including scripts/, where the two suites that recently
failed on unrelated branches live.

docs/testing.md gains the execution model as the one home for the fact: forked
workers, concurrent coverage partitions beside other gates, and self-hosted
runners sharing a host and volume, with the rule that a spec passing only when
run alone is a defect in the spec. It links the skill for the detailed rules.

packages/AGENTS.md and scripts/AGENTS.md carry the short actionable form and
link that section, so the rule is present in the context loaded while a test in
either subtree is being written.

Both ceilings are raised for the added words and the targets in docs/AGENTS.md
move with them: docs/testing.md 1150 to 1300 (now 1237) and packages/AGENTS.md
675 to 750 (now 712), each keeping the 5% headroom the standard requires.
2026-08-29 15:31:12 +08:00
imccyu 29f0017f51 Merge pull request #3165 from deepseek-harness/worktree-npmdepresolve
fix(npm): bound published peer dependency relays
2026-08-29 15:20:25 +08:00
Yichen Jiang 1d81fc7540 docs(testing): give the review checklist its own test-reliability entry
The 'Test strength' bullet carried assertion strength, external-state
verification, the reliability reference, and the coverage caveat at once.
Splitting the reference into an adjacent entry matches how the orientation
list above names the same skill, and restores 'Test strength' to one subject.

The new entry also names the platform and timeout-budget rules the skill now
carries, so the checklist covers what a reviewer is being pointed at.
2026-08-29 14:33:33 +08:00
imccyu a3207a758b chore: package.json update 2026-08-29 14:26:43 +08:00
imccyu 9162bc69bd fix(release): harden dependency verification 2026-08-29 14:26:42 +08:00
imccyu b46d36d3bf test(release): verify dual-version npm layout 2026-08-29 14:26:42 +08:00
imccyu 91b5a01980 fix: complete dependency policy generation 2026-08-29 14:26:42 +08:00
imccyu 943a544899 feat: classify Host dependency exports 2026-08-29 14:26:42 +08:00
imccyu c55beac34a feat: verify Host dependency export identity 2026-08-29 14:26:42 +08:00
imccyu e440634456 docs: define published dependency faces 2026-08-29 14:26:42 +08:00
imccyu de256e8bc1 feat: enforce published dependency policy 2026-08-29 14:26:42 +08:00
Yichen Jiang 596a13d1cb docs(testing): add platform-semantics and lane-budget rules to the skill
Two failure classes the repository paid for are not covered by the isolation,
synchronization, and teardown rules already in the skill.

A value the operating system owns is not guaranteed to return as written. A
test may write one back only where the assertion tolerates that write-back
failing; where the assertion depends on it, the expected value comes from a
fresh read. NTFS truncating a fractional-millisecond mtime and Windows folding
environment variable name case are the two instances seen so far.

A describe or case timeout overrides the runner's --testTimeout rather than
yielding to it, so a value below the lane budget lowers what CI granted, while
the same literal reads as a widening where the host default is smaller. The
hook budget travels with the test budget, and a case asserting a timeout keeps
its outer wait far larger than the timeout under test. Restoring a granted
budget, or sizing a bounded retry to measured contention, is named as distinct
from the masking fixes the skill rejects.

The diagnosis reference gains the platform differences under its platform
class, a classification path for self-hosted pools that expose no host metrics,
and the stopping rule for a signature no available host can reproduce.
2026-08-29 13:54:59 +08:00
Yichen Jiang ee309c0794 Merge pull request #3299 from deepseek-harness/worktree/fix-subagent-settings-label-color
fix(snapshot): bind fixture servers to OS-assigned ports
2026-08-29 13:17:27 +08:00
Yichen Jiang 3e56eaaa0f fix(atomic-write): retry transient Windows replacement 2026-08-29 13:04:06 +08:00
Yichen Jiang 1dd5476232 Merge pull request #3308 from deepseek-harness/worktree-windows-lane-hook-budget
test(ci): carry the hook budget and align the Lefthook suite with the lane
2026-08-29 12:06:59 +08:00
imccyu b56d4f4472 Merge pull request #3305 from deepseek-harness/worktree-connerr
feat(web): surface and recover connection failures
2026-08-29 12:03:33 +08:00
Yichen Jiang 7fbd33de00 fix(snapshot): keep fixture lifecycle tests source-clean 2026-08-29 11:50:13 +08:00
Yichen Jiang 1f8d7b73af fix(snapshot): own fixture listener lifecycle 2026-08-29 11:29:46 +08:00
imccyu 84c7ae3398 fix(web): align connection indicator labels 2026-08-29 11:18:58 +08:00
imccyu 18480ff902 test(connection): verify and document recovery behavior 2026-08-29 11:18:58 +08:00
imccyu 19b4d7f26c feat(web): add connection recovery indicator 2026-08-29 11:18:58 +08:00
imccyu ccfbbb443a refactor(connection): centralize websocket recovery 2026-08-29 11:18:58 +08:00
Yichen Jiang 90505636cd test(ci): carry the hook budget and raise the Lefthook suite to the lane value
The Windows coverage lane grants DSH_COVERAGE_TEST_TIMEOUT_MS=90000, but two
paths declined it.

scripts/install-lefthook.spec.ts took a describe-level 30_000, restated as a
per-case constant on five cases. Every case drives spawned Git and Node
subprocesses; the slowest costs 7.5 s on an idle host, so the ceiling carried
roughly fourfold headroom and fired on branches that did not touch the file.
The suite takes 90_000 and the redundant constant is removed.

coverageTestTimeoutArgs raised --testTimeout and --expect.poll.timeout but left
--hookTimeout at Vitest's separate 10 s default, which removeFixtureSafely's
documented 10-second Windows retry window meets exactly. Raising only the test
budget would move a contended suite's failure into its teardown.
2026-08-29 11:15:32 +08:00
imccyu f27021c9b6 Merge pull request #3293 from deepseek-harness/worktree-apiremote
refactor(api): converge the ctx.remote programming surface
2026-08-29 11:09:58 +08:00
Yichen Jiang 837cc95245 Merge pull request #3254 from deepseek-harness/test/translation-pairing-merge-budget
test(scripts): align the translation-pairing-merge budget with the coverage lane
2026-08-29 10:44:01 +08:00
imccyu 73a723f37f docs(api): correct the api-gateway reference codes and the failure-vocabulary note
- api-gateway reference (en/zh): gateway/lookup-unavailable and
  gateway/internal replace the pre-convergence codes, and the resolver
  paragraph states the RemoteError pass-through semantics.
- failure-vocabulary note (en/zh): the package is dsh-util-time, the
  marker is isDSHRemoteError, and discrimination requires no
  instanceof at all.
2026-08-29 03:12:46 +08:00
imccyu 674a1e95a3 fix(api): rename the failure marker, harden cross-realm discrimination, and mark the packed-record violation
- protocol: isDSHRemoteGatewayError -> isDSHRemoteError (the class is
  protocol-wide, not Gateway-specific); remoteErrorOf drops its
  instanceof Error precondition and tests the marker plus a string code
  structurally, so a marked failure from another realm no longer reads
  as a local defect.
- session-controller: the live-follow packed-record protocol violation
  now throws a marked RemoteError('gateway/internal'), landing the
  session in openState=error instead of an unhandled rejection;
  pinned at the transport and session levels.
- util-time: correct the invariant companion's @module name.
- regenerate the tool-cordis catalog for the marker rename.
2026-08-29 03:12:43 +08:00
imccyu 02a542f49f chore(docs): regenerate the slot catalog for the hostInfo hook rename 2026-08-28 23:37:26 +08:00
imccyu f9e8fc8f8a fix(api): identity-stable $host facts and a whole-record host info hook
- api/gateway: $host caches its RemoteHostFacts record and mints a new
  one only when home changes, so snapshot readers compare by reference;
  identity pinned in the client spec.
- client/ui-tool, client/ui-workspace: the hooks channel exposes the
  host facts record as hostInfo and components select the field they
  need (useHostInfo(info => info.home)); row-component contracts are
  unchanged.
2026-08-28 23:28:51 +08:00
imccyu a4f7193d24 docs: drop the Remote-failure bullet from packages/AGENTS.md
The rule text lives in the cookbook and the failure-vocabulary Agent
Note; the AGENTS.md roster and its 675-word budget stay as they were.
2026-08-28 23:01:54 +08:00
imccyu 39a5a1d7e4 chore(docs): regenerate catalogs, graphs, and the message-feedback golden
- gen-cordis-catalog / gen-cordis-inspect-catalog / gen-client-catalog /
  gen-config-catalog / gen-doc-graphs / gen-module-graph outputs pick up
  the converged Remote vocabulary (gateway/* codes, RemoteError JSDoc)
  and the dsh-util-time package; the zh sides of the three
  English-generated pages follow the same line-number shifts.
- the message-feedback protocol golden records the accepted wire
  change: a boundary-validation failure now reports
  gateway/input-invalid with structured details instead of a bare
  internal code.
2026-08-28 22:37:42 +08:00
imccyu 2b750cfb51 docs(api): document the converged ctx.remote programming surface
- new cookbook page adding-a-remote-api (en/zh): the five-step HOW-TO
  for declaring, failing, registering, consuming, and testing a Remote
  endpoint.
- new Agent Note ctx-remote-failure-vocabulary records this round's
  decisions and alternatives; the 2026-08-02 and 2026-08-10 notes are
  rewritten to the shipped facts (RemoteError vocabulary, $host, the
  retired ApiProxy statements).
- package READMEs pick up the new failure-face contracts
  (typert/protocol, api/gateway, api/remotes,
  test-support/client-runtime), dsh-util-time gains its README and
  registry entries, and stale connection/WorkspaceError/legacy-code
  statements are corrected (ui-settings, ui-settings-models,
  workspace-controller, docs/subsystems/typert incl. the
  TypertGatewayErrorCode type-equiv block).
- packages/AGENTS.md gains the Remote-failure rule bullet; its doc
  budget rises 675 -> 714: the bullet is the compressed remainder
  after relocating detail to the cookbook and the Agent Note.
2026-08-28 22:37:36 +08:00
imccyu 41cd24f3f6 test(api): cover the non-Error terminal escape in RemoteStream
The terminal fold's String(error) arm had no coverage; a generation
that rejects with a bare string now pins the marked gateway/internal
outcome.
2026-08-28 22:37:36 +08:00
imccyu 2f2e6d627b fix(api): resolve review findings on stream boundary, inject staleness, and ctx discipline
- api/gateway: mark terminal Remote-stream escapes (carrier retry
  exhaustion and pre-acceptance end classification) as
  RemoteError('gateway/internal') at the two escape points; marked
  failures pass through verbatim. The carrier class stays the
  retry-internal signal for carrierFailed and the ended(true) retry
  trigger. Regression coverage lands on the session and workspace
  stream consumers.
- client/ui-tool, client/ui-workspace: read $host.home through a hooks
  observable subscribed to connection/reset; the slot renderer memoizes
  inject results per entry, so the previous plain-value injection froze
  home at the first render.
- client/ui-settings-models: components no longer receive ctx; apply
  binds the credential and settings Remote operations into callbacks,
  and the settings/conflict code judgment stays in the apply world.
2026-08-28 22:37:36 +08:00
imccyu 5af9eec51c fix(api): address review findings on the gateway client failure face
- classify a carrier throw under a caller-aborted signal as
  gateway/cancelled instead of gateway/internal, matching the code the
  Host produces when the abort wins the wire round-trip.
- read $host facts from the construction-time Connection handle,
  matching $stream; the service cannot be replaced without restarting
  this plugin, so the live re-lookup was dead complexity.
- state rebuiltFailure's actual contract in its comment: codes pass
  through verbatim without runtime validation.
- correct the @module name in dsh-util-time.
2026-08-28 22:37:36 +08:00
imccyu d40d678b93 fix(api): repair runtime closure, gateway client bundle, and $host coverage
- python/sdk-runtime: add @deepseek-ai/dsh-util-time so the runtime
  dependency closure stays closed (dsh-subagent now depends on it).
- api/gateway: drop the dsh.client.external request for
  dsh-typert-protocol and admit the protocol package into INLINE_SAFE
  instead. The loader module table has no supplier for the protocol
  package, so the built client factory threw at require time; the
  protocol layer is duplication-safe by design (string marker,
  code-based discrimination), which is the inline-safe admission
  criterion.
- api/gateway tests: cover the $host getter (live service read,
  pre-ready home, and the construction-time fallback after the
  Connection service is withdrawn).
2026-08-28 22:37:36 +08:00
imccyu 804b1ffbfc refactor(api): converge the Remote failure vocabulary and client surface
Single RemoteError with a merge-extensible, domain-prefixed code map;
owners throw at the failure point; streams surface marked failures;
clients consume ctx.remote directly with isRemoteFailure as the only
discrimination point and construct no failure instances.
2026-08-28 22:37:36 +08:00
Yichen Jiang 94c714d813 docs(testing): add CI test reliability skill 2026-08-28 22:01:40 +08:00
Yichen Jiang 9055a8af3a fix(snapshot): bind fixture servers to OS-assigned ports 2026-08-28 21:37:38 +08:00
Yifffan 12d7b4ed0c Merge pull request #3262 from deepseek-harness/feat/session-turn-stats-display
feat(web): turn-tail usage and time stat pills with anchored dialogs
2026-08-28 13:52:02 +02:00
Yifffan 031bec12eb Merge pull request #3263 from deepseek-harness/hero-fish-hover-swim
feat(web): hero fish hover swim morph
2026-08-28 13:51:49 +02:00
Yif d07108f9a0 Merge remote-tracking branch 'origin/master' into hero-fish-hover-swim
# Conflicts:
#	packages/client/ui-conversation/src/client/skeleton/EmptyHero.tsx
2026-08-28 19:35:56 +08:00
Yif ececf8c170 fix(web): address hero fish hover review feedback
Move hover enter/leave from the svg element to the stationary fishHitbox
span so the CSS sway and SMIL morph share the same trigger surface and the
animation cannot flicker when sway displaces the svg from the pointer.
Gate the morph with (hover: hover) to match the CSS and prevent tap-sticky
loops on touch devices.

Remove residual headline changes unrelated to this PR: white-space: pre on
.headlineText, data-testid="hero-headline", and corresponding getByTestId
test assertions — these belong to #2397.

Fix Agent Note coverage claim (was "asserting render states", now accurately
"slot contract") and compress blowhole paragraph to current-state fact.
2026-08-28 19:29:31 +08:00
Yifffan 15f66b9c3c Merge pull request #3265 from deepseek-harness/fix/web-ui-polish
fix(client): Web 会话与输入 UI 细节修复
2026-08-28 13:20:23 +02:00
Yichen Jiang a0aff5fe53 Merge pull request #3296 from deepseek-harness/worktree/fix-subagent-settings-label-color
fix(web): use primary color for Subagent setting label
2026-08-28 19:02:12 +08:00
Dudu-0223 143748bae9 test(deque): pin storage release behavior 2026-08-28 18:02:11 +08:00
Yichen Jiang 84df0f11ae fix(web): use primary color for subagent setting label 2026-08-28 17:53:18 +08:00
Yifffan 5e610e1a74 Merge branch 'master' into hero-fish-hover-swim 2026-08-28 11:51:06 +02:00
Yifffan 8f4fcdd792 Merge branch 'master' into feat/session-turn-stats-display 2026-08-28 11:50:42 +02:00
Yifffan 8a8db06d06 Merge branch 'master' into fix/web-ui-polish 2026-08-28 11:50:38 +02:00
Dudu-0223 51a6eabb27 perf(api): replace shift-backed stream queues 2026-08-28 17:37:03 +08:00
Yichen Jiang 375af94454 Merge pull request #1756 from deepseek-harness/worktree/fix-settings-focus
fix(web): restore focus after closing settings
2026-08-28 17:25:40 +08:00
Yichen Jiang 9cd2cb8f03 Merge pull request #3279 from deepseek-harness/perf/session-lookup-windows-only-stat
perf(session): stat the probe parent only on Windows
2026-08-28 17:21:49 +08:00
Yichen Jiang f2b9875c47 test(session): await projection cache write-back 2026-08-28 17:07:33 +08:00
Yif a0a350f640 Merge remote-tracking branch 'origin/master' into fix/web-ui-polish 2026-08-28 16:25:42 +08:00
Yif 6daed7c5aa fix(client): make trigger-menu Enter an explicit no-op while refinement pends
Retained rows made arbitrate('enter') claim 'pick-highlighted' while
pick() silently declined the pending group, so the key vanished by
coincidence. Check the highlighted group's readiness like Tab does and
return 'consumed' deliberately; record the stale-while-revalidate menu
decision in an Agent Note.
2026-08-28 16:24:07 +08:00
Yif a666f86129 Merge remote-tracking branch 'origin/master' into hero-fish-hover-swim 2026-08-28 16:07:28 +08:00
Yif 3a0dd5d38b Merge remote-tracking branch 'origin/master' into feat/session-turn-stats-display
# Conflicts:
#	packages/client/ui-primitives/tests/icons.client.spec.tsx
2026-08-28 16:04:13 +08:00
Yichen Jiang c2a582057c Merge remote-tracking branch 'origin/master' into worktree/fix-settings-focus 2026-08-28 15:58:35 +08:00
Yichen Jiang a12e9de5f7 perf(session): stat the probe parent only on Windows
`JsonlSessionPersistence.exists` treats ENOENT as absence and stats the
path's parent first, so a session directory blocked by a regular file
stays a storage fault. Only Windows needs that: it reports ENOENT rather
than ENOTDIR for `regular-file/child`, while POSIX open reports ENOTDIR
before the branch is reached.

The stat ran on every platform and every absent probe. findLog issues
four probes per project directory and the coordinator resolves an id
twice per inspect, so nearly every probe paid it. Counting fs calls
against a five-project store, loading an existing session drops from
40 open + 41 stat to 40 open + 3 stat.
2026-08-28 15:40:34 +08:00
pku-xht 28e8e86bc3 Merge pull request #3065 from deepseek-harness/schedule-web-catalog
feat(web): surface active schedules in session views
2026-08-28 15:20:36 +08:00
CreatixChu 0fba5d1406 Merge pull request #3238 from deepseek-harness/fix/web-search-config-guidance
fix(web-search): guide endpoint recovery after failures
2026-08-28 15:09:46 +08:00
Yif 21d039be1b fix(web): label the Turn-time TTFT row as first-token latency, not an average
The Turn fold publishes the first step's TTFT (contract/turn-metrics.ts
firstStepTtftMs), never an average; only the Session StatsLine averages
across steps. Rename the dialog row in both locales and align the Agent
Note with what actually ships.
2026-08-28 15:03:47 +08:00
pku-xht 6c5bb90b48 Merge remote-tracking branch 'origin/master' into schedule-web-catalog 2026-08-28 14:45:30 +08:00
Yif 5156226cb9 docs(notes): record the hero glow removal, consolidating the one-axis-scroll note
The 2026-08-04 bug-fix note owned the overflow-x clip that existed only
for the glow's bleed; with the glow, the clip, and its test all gone the
note is fully superseded. The new note preserves its rationale and the
reintroduction condition for future bleeding chrome.
2026-08-28 14:12:33 +08:00
Yif 08f770275c Merge remote-tracking branch 'origin/master' into hero-fish-hover-swim
# Conflicts:
#	packages/client/ui-brand-official/package.json
2026-08-28 14:08:24 +08:00
_Kerman 6d38ba8656 Merge pull request #2774 from deepseek-harness/xtr/session-projection-required-form
refactor(projections): use the required registry directly
2026-08-28 13:11:11 +08:00
Chinesezjc 8a25a876fc Merge pull request #3150 from deepseek-harness/feat/weighted-coverage-shard
perf(ci): assign coverage partitions by recorded file duration
2026-08-28 13:00:47 +08:00
_Kerman d25ace0f22 refactor(api): require the session projection registry 2026-08-28 12:50:51 +08:00
Yif d461922627 Merge remote-tracking branch 'origin/master' into fix/web-ui-polish 2026-08-28 12:50:49 +08:00
Yif 66d0bbd5b5 test(web): align e2e suite with the hero-glow removal and menu retention
conversation-column-overflow existed solely to verify the glow bleed was
clipped; delete it with its golden. The geometry golden picks up the
scroll body losing overflow-x: hidden. reference-composer now waits for
the stale '@' rows to settle before clicking: the menu keeps the
previous query's rows while the next loads, and index-keyed rows swap
content in place.
2026-08-28 12:50:25 +08:00
Yif 1278877d91 fix(client): dismiss stat dialogs through the shared outside-pointer hook
The turn-stat dialogs copied ContextMeter's document-listener effect, which
the duplication gate flags; useDismissOnOutsidePointer gains an optional
portal ref so the portaled dialog counts as inside, and TurnUsagePanel keeps
only the Escape listener. The icon-count test also learns the two pill
glyphs the branch added.
2026-08-28 12:47:15 +08:00
Turtle 626f21dabd Merge pull request #2735 from deepseek-harness/codex/remove-knip
Remove Knip from repository tooling
2026-08-28 12:38:41 +08:00
Chinesezjc 46a8e83094 ci: refresh checks before merge 2026-08-28 12:37:24 +08:00
_Kerman 8645053ca0 refactor(goal, permission, plan): require the projection registry 2026-08-28 12:37:17 +08:00
_Kerman a40a776c95 Merge pull request #2742 from deepseek-harness/xtr/session-projection-migrations
refactor(session): migrate host state reads to projections
2026-08-28 12:37:14 +08:00
Chinesezjc ab0f942dd7 Merge remote-tracking branch 'origin/master' into feat/weighted-coverage-shard 2026-08-28 12:18:14 +08:00
Turtle 7e92ed8213 Merge origin/master into codex/remove-knip 2026-08-28 12:07:36 +08:00
_Kerman f6d4f2149d fix(webworker-runtime): restore v1 title cache fixture 2026-08-28 11:53:17 +08:00
creatixchu aa70a737ae fix(web-search): guide users to endpoint settings 2026-08-28 11:45:27 +08:00
_Kerman 5c9ca1f25b fix(session-title): preserve v1 title cache schema 2026-08-28 11:22:52 +08:00
Yif d6b30db252 Merge remote-tracking branch 'origin/master' into feat/session-turn-stats-display 2026-08-28 11:19:23 +08:00
Yif d576865f76 fix(client): remove the hero glow under the new-session input
The blurred blue ellipse (HeroGlow) below the homepage input card reads as
stray tint rather than intentional chrome; drop the component and its
positioning/overflow scaffolding.
2026-08-28 11:16:01 +08:00
Yif 452013effa fix(client): web session and input UI polish
Batch of visually verified Web UI fixes: trigger-menu z-index over the
resize handle (#3228, #3229), input scrollbar offset, tool-row file
links and diff stats (#3230), @ menu crumb alignment, light-mode
divider, and @ menu flicker while typing (#3234) via
stale-while-revalidate — a refinement hit keeps the previous items and
highlight on screen until the new generation settles, so neither the
skeleton nor the first-row focus blinks per keystroke.
2026-08-28 11:16:00 +08:00
creatixchu f55c676485 fix(web-search): clarify endpoint recovery guidance 2026-08-28 11:00:50 +08:00
_Kerman 25b0c943ce Merge remote-tracking branch 'github/master' into xtr/session-projection-migrations
# Conflicts:
#	.agents/notes/implemented/architecture/2026-08-04-draft-provider-endpoint-interrogation.i18n.yaml
#	.agents/notes/implemented/architecture/2026-08-04-draft-provider-endpoint-interrogation.md
#	.agents/notes/implemented/architecture/2026-08-04-draft-provider-endpoint-interrogation.zh.md
#	.agents/notes/implemented/feature/2026-08-06-continuable-subagent-interrupt.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-06-continuable-subagent-interrupt.md
#	.agents/notes/implemented/feature/2026-08-06-continuable-subagent-interrupt.zh.md
#	.agents/notes/implemented/process/2026-07-20-gui-testing-system.i18n.yaml
#	.agents/notes/implemented/process/2026-07-20-gui-testing-system.md
#	.agents/notes/implemented/process/2026-07-20-gui-testing-system.zh.md
2026-08-28 10:59:30 +08:00
creatixchu c904169915 Merge remote-tracking branch 'origin/master' into fix/web-search-config-guidance 2026-08-28 10:55:59 +08:00
Chinesezjc 00f2a701bd test(scripts): align the translation-pairing-merge budget with the coverage lane
Every case in the suite drives real git invocations against a scratch
repository, so it is bound by process creation rather than by its assertions.
The describe-level 15 s capped all 23 cases below the 90 s the Windows coverage
lane passes as --testTimeout, and the suite has been observed timing out at
15000ms on a branch that did not touch the file.

Refs #2677.
2026-08-28 10:21:45 +08:00
pku-xht 5a8ef5f3f5 fix(web): tighten schedule catalog evidence 2026-08-28 09:28:33 +08:00
pku-xht 19b215f426 fix(ui-schedule): scope Escape dismissal to catalog 2026-08-28 08:39:31 +08:00
pku-xht 1a5d004524 Merge commit 'bc954280ae67e349291e51e5787c6987e767fa40' into schedule-web-catalog
# Conflicts:
#	packages/client/ui-workspace/src/client/rows/Rows.tsx
#	tsconfig.base.json
2026-08-28 07:24:24 +08:00
Yif f14f50416e docs(notes): record the turn-tail stat pill decision 2026-08-28 02:22:47 +08:00
Yif 6f16d5868c refactor(ui-chat): drop the flat usage-variant debug switch and square narrow pills
The A/B test settled on the twin-pill layout, so the TEMPORARY
?usage-variant=flat trigger, its locale keys, and its tests leave with it.
Below 480px the stat pills now take the sibling action-button geometry so
their bare icons keep the row's rhythm instead of drifting on the wider
label padding and the -6px pair rebate.
2026-08-28 02:14:37 +08:00
Yif 9effa0c6b3 feat(ui-chat): split turn stats into usage and time pills with dialogs
The turn tail's exposed meta line collapses into two icon pills — Usage
(database glyph, turn total) and Ran-for (clock glyph, wall time) — each
click-opening a details dialog; the calendar clock trails as plain text.
Cache hit, TPS, and TTFT move dialog-only, and narrow viewports collapse
the pills to bare icons. The TEMPORARY flat variant keeps the whole-line
trigger for the A/B test.
2026-08-28 01:34:18 +08:00
imccyu cd5ef81481 Merge pull request #3248 from deepseek-harness/release/dsh-0.1.2-alpha.1
release: [email protected]
2026-08-28 00:57:43 +08:00
imccyu 6c705be1ce release(dsh): 0.1.2-alpha.1 2026-08-28 00:50:12 +08:00
Tianyi Cui 8437bfb9e4 Merge pull request #3074 from deepseek-harness/worktree/ptc-rename-base
Rename code-mode to ptc (PTC mode), except session-persistent vocabulary
2026-08-28 00:49:44 +08:00
Yif 5ba375fd88 feat(client): hover swim morph for the hero fish 2026-08-28 00:37:46 +08:00
Tianyi Cui 188d77ed4b docs: sync remaining code mode-value prose to ptc in notes and spill README
Review bot findings: DSH_TOOLS_MODE values, the wire-replacement
wording, 'code-only' mode references, and the spill README's
dispatch-log waterfall name all still named the removed 'code' value.
2026-08-28 00:24:05 +08:00
Tianyi Cui b7c71d805a docs(zh): sync remaining code mode-value prose to ptc
The review bot found stale 'code' configuration values in the zh tools
and agent-tool-presentation READMEs and the zh tool catalog, which the
runtime schema already rejects in favor of 'ptc'.
2026-08-28 00:16:29 +08:00
Tianyi Cui 84dd2447f3 docs: point note references at the surviving RPC test homes
Master removed the ApiProxy package; its former test paths now live in
the client connection, API gateway, and settings controller test
directories. Update the three notes' references so verify-package-paths
resolves.
2026-08-27 23:22:02 +08:00
_Kerman 13c1541c63 Merge remote-tracking branch 'github/master' into xtr/session-projection-migrations
# Conflicts:
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	pnpm-lock.yaml
2026-08-27 23:18:55 +08:00
Tianyi Cui 558b6d9193 fix(notices): restore the SDK 0.3.241 platform payload rows
The rename commit regenerated the notices file against a stale local
install (0.3.220); the lockfile and CI install resolve 0.3.241.
2026-08-27 23:14:33 +08:00
Tianyi Cui cf12723ba8 docs: re-record pairing hashes after the master rebase merge
The rebase merged master's SDK-example and telemetry prose with the
ptc renames in the tools and CLI reference READMEs and the executor
collapse note; re-record their pair hashes.
2026-08-27 23:14:33 +08:00
Tianyi Cui c3904faee0 test(snapshot): restore canonical packed fixture layout
The DSH_SNAPSHOT refresh recorded the internal seq-range form; the
canonical fixture layout expands those ranges. Apply the mechanical
migration instead.
2026-08-27 23:14:33 +08:00
Tianyi Cui ee42efbccd test(snapshot): re-record cordis-inspect-jsdoc after the seq-range projection
Master's session persistence projection now writes sourceEventSeqs as
compressed ranges; the recorded replay fixture must match the new output.
2026-08-27 23:14:33 +08:00
Tianyi Cui 70af4edf3e fix: point the rename note at the fail-closed session-event vocabulary note
Master replaced the session-log-version-mechanism note with the
fail-closed-session-event-vocabulary note; update the rename note's links
(en/zh) so cross-links resolve.
2026-08-27 23:14:33 +08:00
Tianyi Cui 215e90dfb2 fix: rename the remaining code mode-value prose found in review
The subagent review found stale code mode-value prose the mechanical pass
missed: tools and agent-tool-presentation READMEs (en/zh), the CLI reference
page (DSH_TOOLS_MODE and the preset roster), the zh tool catalog, the
execute JSDoc and collapse comments in dsh-tools, the codeModeHarness
helper in agent-loop tests, and stale code-mode titles in ptc.spec.
2026-08-27 23:14:33 +08:00
Tianyi Cui 409f9ee304 fix: repair merged README remnants and note links after the master rebase
Apply the rename pass to READMEs and docs the master sweep rewrote, fix
PTC mode anchors and the renamed-note links in the spill READMEs, and
regenerate the doc graphs.
2026-08-27 23:14:33 +08:00
Tianyi Cui 45c514a42b fix: align mode-value prose and stale persistent mentions with the split
The split kept the session-persistent vocabulary (tool/code-dispatch*,
tools-code-mode, :code:) on this PR, but several prose surfaces still named
the new values: the zh persistence/tool catalogs, the renamed Agent Notes'
event mentions, spill-policy comments, and a garbled 're-enPTC mode'
replacement. Also rename the mode value to ptc in the places the rename
missed (tools and agent-tool-presentation READMEs, the Config JSDoc, note
mode unions) and the codeModeHarness* e2e helpers.
2026-08-27 23:14:32 +08:00
Tianyi Cui 3ca9c7d489 rename code-mode to ptc (PTC mode), except session-persistent vocabulary
Rename the tool-presentation transport from code-mode to ptc everywhere
that is not written into session logs: the mode config value becomes 'ptc',
the preset directory/id becomes ptc, the demo becomes demo:ptc, the
dispatch waterfall becomes tools/ptc-dispatch-log (types PtcDispatch*), the
prompt rule becomes tools:ptc-only, source/test files become ptc.ts etc.,
and prose says PTC mode / PTC 模式. The session-persistent vocabulary
(durable events tool/code-dispatch*, logged plugin name tools-code-mode,
sub-call id segment :code:) intentionally stays and moves in the stacked
persistence PR, which is blocked until the SESSION_FORMAT_VERSION v0→v1
migration lands with it. run_code, its code parameter, CodeSdkLanguage,
CodeRunFailedError, the dsh-code-runtime family, third-party codex names,
and frozen archived notes keep their names.
2026-08-27 23:14:31 +08:00
Yif f15078532f feat(ui-chat): reshape the usage trigger as an icon-row pill
The whole-line meta trigger read as plain text and hid what was clickable.
The Turn-usage trigger is now a data-icon pill (Usage {total} · Cache hit
{percent}%) seated right of the branch action with the action buttons'
hover chrome, so the one interactive element in the tail is visibly a
button; the timing facts (clock, run time, speed, TTFT) return to plain
non-clickable text behind a dot separator. The details dialog keeps the
Turn-usage title and full token buckets, gains a permanent cache-hit row,
and breathes with wider vertical padding. Narrow columns trim the pill
label to an ellipsis instead of widening the chat column. User rows and
turn tails share the recency gate: only the latest row of each kind keeps
its actions visible without hover.
2026-08-27 23:14:08 +08:00
_Kerman 2bcd4cc552 fix(agent-presets): treat absent turn boundary as blank 2026-08-27 23:12:22 +08:00
imccyu 57aba7695b Merge pull request #3235 from deepseek-harness/worktree-apire-f
refactor(api): remove ApiProxy transport
2026-08-27 23:10:56 +08:00
imccyu 9fa87800a2 fix(api): keep file-reference output in its project 2026-08-27 22:58:43 +08:00
Chinesezjc bb7a640237 Merge pull request #3236 from deepseek-harness/fix/file-search-unreadable-subtree-test
test(file-reference-local): pin the unreadable-subtree test to POSIX non-root
2026-08-27 22:48:31 +08:00
imccyu b0c44e54ba fix: build 2026-08-27 22:48:16 +08:00
imccyu 26f1eda42a test(connection): allow non-Error rejection fixture 2026-08-27 22:29:47 +08:00
imccyu e57e7c3f25 docs(api): describe Connection-owned transport 2026-08-27 22:26:30 +08:00
imccyu 4f00a8b82a refactor(api): remove ApiProxy package 2026-08-27 22:26:29 +08:00
imccyu e14d354e83 refactor(connection): own RPC transport contracts 2026-08-27 22:26:29 +08:00
imccyu 3b40a14555 test(session-export): assign Host compiler face 2026-08-27 22:26:29 +08:00
imccyu 40929d6e1a refactor(client): replace host description consumers 2026-08-27 22:26:28 +08:00
imccyu e036aae7c0 refactor(connection): carry Host facts with generations 2026-08-27 22:26:28 +08:00
imccyu 17c03bbbcc feat(session-export): own the download route 2026-08-27 22:26:28 +08:00
imccyu e5e4b02742 feat(connection): register exact Fetch routes 2026-08-27 22:26:27 +08:00
imccyu 5ba36aa350 Merge pull request #3217 from deepseek-harness/worktree-apire-remaining
refactor(api): migrate remaining API proxy endpoints
2026-08-27 22:22:33 +08:00
imccyu ea07f465ac docs: refresh module graph 2026-08-27 22:00:58 +08:00
imccyu 2ff3a0c09f fix(file-reference): remove unused zod dependency 2026-08-27 21:57:58 +08:00
imccyu 18ae39a665 fix(api): preserve native path opening behavior 2026-08-27 21:57:58 +08:00
imccyu 72cf4fae83 fix(settings): preserve config catalog source anchor 2026-08-27 21:57:57 +08:00
imccyu 89ee54ebb7 test(api): align migrated client contracts 2026-08-27 21:57:57 +08:00
imccyu 5f6293e67a test(client): update remote session fixtures 2026-08-27 21:57:57 +08:00
imccyu 812556040d fix(api): restore migrated remote coverage 2026-08-27 21:57:57 +08:00
imccyu 88f2f0aaec test(api): complete migrated Remote coverage 2026-08-27 21:57:57 +08:00
imccyu 674301721c fix(build): correct workspace dependency declarations 2026-08-27 21:57:57 +08:00
imccyu 160706be60 test(api): refresh Remote migration artifacts 2026-08-27 21:57:56 +08:00
imccyu ce3391e280 refactor(apiproxy): retire migrated unary routes 2026-08-27 21:57:56 +08:00
imccyu 5b2f679e4a refactor(client): consume migrated Remote namespaces 2026-08-27 21:57:56 +08:00
imccyu 2d4393d842 refactor(api): expose remaining domain remotes 2026-08-27 21:57:55 +08:00
creatixchu e719eee47f fix(web): guide search endpoint recovery 2026-08-27 21:21:10 +08:00
Chinesezjc 6ac1b82939 test(file-reference-local): pin the unreadable-subtree test to POSIX non-root
chmod 0 can only deny directory reads on POSIX to a non-root owner:
Windows exposes no directory permission bits for readdir, and root
bypasses them. Where the fixture stays readable the sealed candidate is
indexed, so the unreadable-branch behavior is pinned on POSIX non-root.
An injected readdir failure keeps that branch covered on every platform.
2026-08-27 21:12:14 +08:00
Chinesezjc 10b31043ab feat(ci): assign coverage partitions by recorded file duration
Replace Vitest's hash-based --shard with a coordinator-side
longest-processing-time assignment. The coordinator collects the
instrumented inventory from a vitest list run (dropping the exempt
heavy suites that list does not exclude), reads per-file durations from
the Vitest results cache, and seeds heavy subprocess-bound suites into
different partitions. A weight-aware test fails when assignment ignores
recorded weights, verified by injecting a file-count-only rule.

Windows coverage measured partition spread of 442s (275-717s) under
hash sharding; a simulation with the same file durations and the new
assignment balances partitions to within 21s, cutting the critical
partition to roughly half.
2026-08-27 21:04:15 +08:00
Chinesezjc 12efd638d4 Merge pull request #3202 from deepseek-harness/fix/windows-directory-picker-loader-composition
test(host): drain Include write queue in directory-picker composition spec
2026-08-27 20:37:23 +08:00
imccyu 07cb5934af Merge pull request #3227 from deepseek-harness/fix/inspector-client-bootstrap
fix(inspector): stabilize client bootstrap identity
2026-08-27 20:33:08 +08:00
Yichen Jiang b2442d00f9 Merge pull request #3219 from deepseek-harness/perf/tsconfig-paths-flatten
perf(infra): map each workspace package to an explicit path alias
2026-08-27 20:16:56 +08:00
imccyu b46953f3cc test(client-modules): type loader resolver stubs 2026-08-27 20:16:51 +08:00
imccyu 827acd07b1 docs(client-modules): align resolver contract 2026-08-27 20:10:20 +08:00
imccyu dc1be1334f fix(inspector): address bootstrap review findings 2026-08-27 20:03:17 +08:00
Yichen Jiang 71b3c50261 refactor(infra): share one workspace walk between the alias collectors
collectPackageNames repeated collectPackageAliases' directory walk
verbatim, which jscpd reported as a 7-line clone and which failed the
lint-and-duplication gate on both the Linux and Windows lanes. Both now
read one workspacePackages() iterator: the alias collector keeps only
packages named after their directory, and the coverage collector keeps
every one of them.
2026-08-27 20:02:10 +08:00
Yichen Jiang c4c3c32931 fix(infra): assert alias coverage and harden the generator entry guard
Review found the CLI entry guard compared import.meta.url against a
concatenated file:// URL. That fails whenever import.meta.url encodes
something process.argv[1] does not — a repository path containing a
space, or any Windows drive path — and it fails silently: the script
exits 0 having done nothing, so verify-tsconfig-paths would pass
without checking exactly where it is needed. Running a copy from a
directory whose name contains a space reproduces it. The guard now uses
the comparison the repository's seven other generators already use.

Deleting the group wildcards also removed the fallback that resolved a
package nobody had aliased, so the generator now asserts coverage:
every workspace package with a src directory must be mapped, and
--check names any that is not. That assertion immediately found four
packages named dsh-<group>-<directory> whose siblings carry hand-written
aliases while they did not, so they reached built lib/ output through
the workspace symlink. They now carry aliases too, which takes the
resolution differences in this branch from seven to eleven.

Two comments in tsconfig.base.json still pointed at the deleted
wildcards; they now state why those aliases stay hand-written. The
package-inventory proposal recorded the wildcard collapse as current,
so both notes are cross-linked as partial supersession.
2026-08-27 19:39:21 +08:00
imccyu ac13b16c0c fix(inspector): stabilize client bootstrap identity 2026-08-27 19:35:34 +08:00
Yif bc88e152c5 test(ui-chat): restore turn-tail assertions lost in the rebase merge
The rebase onto master's turn-process folding kept master's makeHarness
rework, which dropped the turnUsages passthrough and the single-trigger
footer assertions; re-merge both sides.
2026-08-27 18:35:09 +08:00
Yif bb1df10c69 feat(ui-chat): collapse the turn tail into one clickable meta line
Replace the two-row footer (TurnUsageDisclosure + icon-row clock chrome)
with a single whole-line trigger (clock · run time · turn usage · cache
hit · speed · TTFT) that opens a per-Turn usage dialog. The latest turn
keeps its tail always visible; older turns reveal the whole row on
hover/focus. Turns without usage data keep the plain clock line with
identical spacing.
2026-08-27 18:27:02 +08:00
lsdsjyandYif 8b09a0be52 feat(ui-conversation): fold turn process before final answer (#2547)
* feat(ui-conversation): fold turn process before final answer

* fix(ui-chat): polish turn-process control row from review

* test(web): drive preset slash catalog with gestures

* fix(ui-chat): keep turn process order stable

* fix(ui-chat): preserve prompt order after pagination

Co-authored-by: Yif <[email protected]>
2026-08-27 10:12:39 +00:00
07akioni 2c9c871eff Merge pull request #3213 from deepseek-harness/docs/cordis-paper-arxiv
docs: link Cordis paper on arXiv
2026-08-27 18:07:01 +08:00
07akioni 35ac64c209 docs: link Cordis paper on arXiv 2026-08-27 17:45:31 +08:00
Wenlu Wang 6720bff936 Merge pull request #1372 from deepseek-harness/style/cjk-latin-autospace
Add global CJK/Latin auto-spacing via text-autospace
2026-08-27 17:37:08 +08:00
_Kerman 3a34b7870e test(agent-team): cover failed projection reads 2026-08-27 17:27:31 +08:00
Yichen Jiang 12c161e1a7 perf(infra): map each workspace package to an explicit path alias
tsconfig.base.json resolved @deepseek-ai/dsh-* through 49 candidate
globs and @deepseek-ai/dsh-*/invariant through 45, one per package
group. Resolution tries candidates in order, so a package late in the
list paid for every earlier miss — and under the dsh source launch each
miss is an ERR_MODULE_NOT_FOUND that Node decorates with a full
CommonJS resolution walk. A boot profile attributed 934.6 ms, 35% of
startup, to that decoration path across 60,942 failed resolutions. The
cost landed hardest on packages/util/*, which sits at position 44 of 49
and holds the leaf utilities nearly every plugin imports.

gen-tsconfig-paths writes one explicit alias per package into a marked
region and both group wildcards are gone; verify-tsconfig-paths reports
drift and runs in the ci-static lane. Booting the headless profile from
source drops from ~2,157 ms to ~1,055 ms with --help output unchanged.

All 1,022 dsh specifiers in repository sources resolve to the same
target as before, except seven /invariant specifiers in the lsp,
terminal, and runtime-diagnostics groups that the deleted wildcard
never listed: those reached built lib/types instead of src, against the
rule that static gates resolve through paths to src on a clean tree.
2026-08-27 17:26:52 +08:00
fz 1c808341ec Add global CJK/Latin auto-spacing via text-autospace
Progressive enhancement on body in the shell base sheet so mixed
Chinese/English copy gets consistent spacing without content edits;
engines without support ignore the property.
2026-08-27 17:21:40 +08:00
_Kerman 4b48b2b439 Merge remote-tracking branch 'github/master' into xtr/session-projection-migrations 2026-08-27 17:18:58 +08:00
_Kerman 6717cb8d19 refactor(session): trim projection migration diff 2026-08-27 17:18:51 +08:00
imccyu 631135cc06 Merge pull request #3012 from deepseek-harness/worktree-inspectorcordis
feat(inspector): add cross-realm CDP inspection
2026-08-27 17:10:55 +08:00
imccyu 90cae21deb fix: ci 2026-08-27 16:52:40 +08:00
_Kerman d9c0aa1cd0 Merge remote-tracking branch 'github/master' into xtr/session-projection-migrations
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	packages/context/session-reference/package.json
#	packages/context/session-reference/tests/session-reference.spec.ts
#	packages/subagent/tool-subagent/src/index.ts
#	packages/subagent/tool-subagent/src/invariant.ts
#	packages/subagent/tool-subagent/src/model-selection-state.ts
#	packages/subagent/tool-subagent/tests/harness.ts
#	packages/subagent/tool-subagent/tests/list-models.spec.ts
#	packages/subagent/tool-subagent/tests/model-selection-settings.spec.ts
#	packages/subagent/tool-subagent/tests/tool-subagent.spec.ts
#	pnpm-lock.yaml
2026-08-27 16:38:06 +08:00
imccyu 3f4a6a2698 docs: align the module graph translation pair 2026-08-27 16:28:26 +08:00
_Kerman 1c2acd9157 refactor(permission): project the seed boundary 2026-08-27 16:25:43 +08:00
_Kerman 42e0781cda refactor(agent-team): name the Team projection explicitly 2026-08-27 16:25:33 +08:00
_Kerman 722d9f016b perf(goal): avoid copying open-turn event suffix 2026-08-27 16:25:29 +08:00
_Kerman ba4bd08bc3 perf(llm-retry): reset state without scanning keys 2026-08-27 16:25:25 +08:00
_Kerman 85bf796a95 refactor(subagent): retain identity projection state 2026-08-27 16:25:20 +08:00
_Kerman 9e184cde37 test(python): restore strict live response smoke 2026-08-27 16:25:12 +08:00
imccyu 1c1c0adf6e fix(inspector): classify the demo launcher and refresh the module graph 2026-08-27 16:23:21 +08:00
imccyu 15572ddb22 feat(inspector): add the development mount overlay and demo script 2026-08-27 16:16:28 +08:00
imccyu ef712e3006 fix(inspector): serve Cordis DOM levels on demand 2026-08-27 16:16:28 +08:00
imccyu a031b95fdb fix(inspector): preserve responses after caller abort 2026-08-27 16:16:28 +08:00
imccyu 777489dfc5 fix(inspector): print the startup URL 2026-08-27 16:16:28 +08:00
imccyu d6245fc254 fix(inspector): update Cordis DOM incrementally 2026-08-27 16:16:28 +08:00
imccyu c5f34e8ada fix(inspector): preserve event stream replay order 2026-08-27 16:16:27 +08:00
imccyu 5a5d5de948 fix(inspector): address protocol review findings 2026-08-27 16:16:27 +08:00
imccyu 0954bad2bb fix(inspector): render captured event streams 2026-08-27 16:16:27 +08:00
imccyu b1748f0c55 fix(inspector): satisfy CI checks 2026-08-27 16:16:27 +08:00
imccyu daf3858759 fix(inspector): restore client console and response bodies 2026-08-27 16:16:27 +08:00
imccyu 008ae0c01e docs(inspector): record cross-realm architecture 2026-08-27 16:16:24 +08:00
imccyu 6822ad3afc test(inspector): enforce execution-plane boundaries 2026-08-27 16:15:18 +08:00
imccyu 28cc3e930b feat(inspector): expose Cordis trees through CDP DOM 2026-08-27 16:15:18 +08:00
imccyu 7ecd7004eb feat(inspector): project Host fetches through CDP Network 2026-08-27 16:15:18 +08:00
imccyu bcee99e39d feat(inspector): serve Runtime through a CDP Worker 2026-08-27 16:15:18 +08:00
imccyu 19f0076668 feat(inspector): connect Host and Client producers 2026-08-27 16:15:18 +08:00
imccyu 189fb34797 feat(inspector): define shared protocol foundation 2026-08-27 16:15:17 +08:00
CreatixChu c6e1914f2d Merge pull request #3207 from deepseek-harness/fix-3204-ptc-run-code-prompt
fix(tools): keep PTC SDK calls inside run_code
2026-08-27 16:13:22 +08:00
Yichen Jiang efd816c0dd Merge pull request #3182 from deepseek-harness/worktree/web-mention-ux-polish-1bf698
feat(web): trim @ mention rows and cut their discovery cost
2026-08-27 16:12:02 +08:00
creatixchu 520bc3ce75 fix(tools): scope bash SDK example to its schema 2026-08-27 15:54:20 +08:00
Yichen Jiang 317ab06b24 Merge pull request #3176 from deepseek-harness/worktree/web-readable-ask-question-cards
fix(web): render readable ask-user transcripts
2026-08-27 15:45:58 +08:00
Yichen Jiang adca6a8cc3 Merge pull request #3193 from deepseek-harness/perf/process-table-snapshot
fix(subprocess): read the process table once per terminal poll
2026-08-27 15:36:17 +08:00
Yichen Jiang 093048d256 Merge remote-tracking branch 'origin/master' into worktree/web-mention-ux-polish-1bf698 2026-08-27 15:35:28 +08:00
CreatixChu c10be57913 Merge pull request #3111 from deepseek-harness/worktree/3003-instant-pending-submit
feat(web): 图片询问点击发送即回显,压缩与传输转入后台
2026-08-27 15:31:01 +08:00
Yichen Jiang 8e9da9debf refactor(session-reference): label discovery from projections alone
A title now comes from an attached session's live projection cut or a cold
one's durable checkpoint, and from nothing else. Attachment is decided by the
session store at read time, so a session that attached after the listing is no
longer answered from a checkpoint its log has moved past — the stale-title case
`api-session.list` already handles this way.

The log fold and its per-log memo are gone. Folding one title costs a whole
log, and this call sits under every keystroke; a session no projection answers
for is labeled by its id and regains its title the first time it is opened.

`lib` leaves the default exclusions: Ruby gems and many npm packages keep
sources there, and the miss would be silent and total. A traversal whose root
is unreadable now rejects instead of publishing an empty index over entries
that are still good, which is what the stale-while-revalidate path claimed but
could not do while every readdir error was swallowed. A drill marks the menu
drilled only when its edit actually reached the draft.

Refs #3154
Refs #3180
2026-08-27 15:21:08 +08:00
creatixchu f9770e34af fix(tools): keep PTC SDK calls inside run_code 2026-08-27 15:20:03 +08:00
Yichen Jiang 9757224349 fix(subprocess): fence each signal against current process state
Review found the shared observation defeated the very fence it fed:
it carries the original PID-to-start-time pairing forward, so a
recycled PID still matches it and takes a signal meant for the process
that exited. Capturing it outside the per-member try also let one
failed read abort a whole teardown round, breaking the synchronous
host-exit contract, and an empty round paid a read for no members.

signalProcess now reads ProcessInspector.isAlive immediately before
delivering, from the narrowest per-identity source each platform
offers; signalMembers and waitForMembers return before capturing when
a round has no members. snapshot() keeps serving the readiness poll,
whose per-poll table read stays at one.

Windows enumerates Toolhelp32 lazily on the first tree question, so a
snapshot asked only for liveness — the 25 ms teardown poll — performs
no table walk at all.
2026-08-27 15:19:43 +08:00
Yichen Jiang 94d06e23d2 fix(web): preserve mixed ask-user results 2026-08-27 15:11:55 +08:00
Chinesezjc 397fb929de test(host): drain Include write queue in picker composition spec
Replace the debounce-timer polling with Include.stop(), which flushes the
file-backed write queue deterministically. This avoids Windows coverage
flakes where the self-dispose write could land after the expect.poll
timeout.
2026-08-27 15:10:06 +08:00
lsdsjy ed6ac33a88 Merge pull request #3148 from deepseek-harness/fix/websocket-heartbeat
fix(api-gateway): keep idle websocket alive
2026-08-27 15:07:11 +08:00
lsdsjy af562d3649 fix(api-gateway): keep idle websocket alive 2026-08-27 14:48:13 +08:00
Chinesezjc fb07d6db54 Merge pull request #2887 from deepseek-harness/fix/windows-pnpm-setup-isolation
ci: isolate pnpm setup destination per GitHub run
2026-08-27 14:30:00 +08:00
Dudu-0223 0615d17a82 Merge pull request #3020 from deepseek-harness/fix/subagent-model-switch-plugins
feat(subagent): authorize selectable child models
2026-08-27 14:12:24 +08:00
pku-xht b36f3d323a docs(session): align projection hint ordering 2026-08-27 13:40:09 +08:00
Yichen Jiang 72f1e19184 Merge pull request #3194 from deepseek-harness/perf/turn-navigator-memo
fix(client): stop rebuilding the turn rail on every chat render
2026-08-27 13:29:22 +08:00
Dudu-0223 2722c202ad fix(subagent): tolerate policy-only preset states 2026-08-27 13:25:51 +08:00
Yichen Jiang 49753b33fa fix(web): keep question card props data-only 2026-08-27 13:21:22 +08:00
Dudu-0223 a7b054b8f6 docs: refresh module dependency graph 2026-08-27 13:09:08 +08:00
Yichen Jiang c873fc9d2e fix(client): stop rebuilding the turn rail on every chat render
TurnNavigator was an unmemoized component rendering one div and one
button per loaded Turn, so every ChatView render rebuilt the whole rail:
143 button rebuilds per commit in a 300-Turn session against 8.4 in a
4-Turn one, while a streaming answer commits dozens of times.

memo alone would not have helped, because navigateToTurn was rebuilt on
every render and broke prop identity, so it moves into useCallback.
2026-08-27 13:08:17 +08:00
Yichen Jiang 32ddfcd89c fix(subprocess): read the process table once per terminal poll
MacProcessInspector answered the descendant tree and every member's
liveness with its own `/bin/ps` fork, so one readiness poll cost N+1
full table reads for N tracked descendants. With execFileSync on that
path and a 50 ms poll interval, any command spawning two or more
children saturated the host event loop until it exited.

ProcessInspector.snapshot() now returns one ProcessSnapshot that
answers tree, session, and alive from a single observation, and
signalProcess takes the caller's observation so its PID-reuse fence
does not re-read the table per member.
2026-08-27 13:06:12 +08:00
Dudu-0223 e49e7202c1 fix: align model selection with current settings remotes 2026-08-27 12:18:05 +08:00
Yichen Jiang db14361372 test(web): scope the aria age normalizer to the region that needs it
Collapsing every relative-time bucket to `{{age}}` reached the session-tree
goldens, where a literal age is the assertion: a fresh row reads `now` and an
older one does not. Six e2e files failed, two of them by aborting mid-scenario
and leaving their replay fixtures half-consumed.

`captureStableAria` now takes the rule as an opt-in, and only the reference
menu — whose rows are dated from the live Host list — asks for it.

Refs #3154
2026-08-27 12:10:52 +08:00
_Kerman eeb4ca2b87 Merge remote-tracking branch 'origin/master' into xtr/session-projection-migrations 2026-08-27 12:03:10 +08:00
Dudu-0223 aad90d5cf3 fix(ui-settings-plugins): preserve model selection drafts 2026-08-27 12:00:02 +08:00
Dudu-0223 cbacceca4b fix(ui-settings-plugins): place Subagent after Agent loop 2026-08-27 12:00:02 +08:00
Dudu-0223 d5787b1847 test(web): expect plugin cards to collapse after save 2026-08-27 12:00:02 +08:00
Dudu-0223 4cc1f5e0ff fix(ui-settings-plugins): relax Subagent card layout 2026-08-27 12:00:02 +08:00
Dudu-0223 a7614f971e fix(subagent): omit undefined scoped fixture options 2026-08-27 12:00:02 +08:00
Dudu-0223 1c0e46870c test(subagent): keep scoped fixture config explicit 2026-08-27 12:00:02 +08:00
Dudu-0223 bf7020ade2 test(subagent): migrate model selection fixtures 2026-08-27 12:00:02 +08:00
Dudu-0223 a5cc8a2186 fix(notices): resolve current installed dependency versions 2026-08-27 12:00:02 +08:00
Dudu-0223 5a5e1b7373 test(ui-settings-plugins): cover provider model grouping 2026-08-27 12:00:02 +08:00
Dudu-0223 0b2f476071 fix(ui-settings-plugins): align Subagent configuration card 2026-08-27 12:00:02 +08:00
Dudu-0223 a130273434 test(subagent): type provider route defaults fixture 2026-08-27 12:00:02 +08:00
Dudu-0223 3a146064a4 fix: address subagent model selection review 2026-08-27 12:00:02 +08:00
Dudu-0223 9fae988691 test(sdk): expect model discovery off by default 2026-08-27 12:00:02 +08:00
Dudu-0223 f2bb5cef05 fix(snapshot): stabilize workflow prompt order 2026-08-27 12:00:02 +08:00
Dudu-0223 1ea72339fd fix(web): close model switch review gaps 2026-08-27 12:00:02 +08:00
Dudu-0223 7c626fb5d2 fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
Dudu-0223 ebe8d4db1c test(web): configure subagent model allowlist 2026-08-27 12:00:01 +08:00
Dudu-0223 aefc083be7 feat(subagent): authorize selectable child models 2026-08-27 12:00:01 +08:00
Dudu-0223 f887a8f907 fix(web): move subagent model switch to Plugins 2026-08-27 12:00:01 +08:00
Yichen Jiang c8e8f8249f fix(web): date @ session rows by last activity, not creation
The Host session list already carries each session's `updatedAt`, which is
the number its own rows show; reading it there keeps the two surfaces from
disagreeing and avoids making a context capability depend on the BFF
assembly that owns the `sessionListMetadata` projection. A session the list
does not carry falls back to the candidate's creation time.

Refs #3154
2026-08-27 11:50:52 +08:00
CreatixChu f1344a4077 Merge pull request #3045 from deepseek-harness/worktree/feedback-otel-enable
feat(bundle): default session telemetry to feedback-gated sharing
2026-08-27 11:47:02 +08:00
Yichen Jiang 97e0299f74 feat(web): trim @ mention rows and cut their discovery cost
Session candidates labelled from projection checkpoints instead of a full
log fold per keystroke, with the uncheckpointed remainder folded once and
memoized while its log stays cold. The file index keeps answering while an
invalidated traversal rebuilds behind the caret, and its default exclusions
now cover build outputs so deep sources stay reachable.

Rows carry only what distinguishes them: a file names its parent directory,
a session names its workspace only when that workspace is not the current
one, and a drilled listing names none because its new breadcrumb does.

Resolves #3180
Related to #3154
2026-08-27 11:42:06 +08:00
pku-xht b2071a50b9 test(api): complete session manager coverage 2026-08-27 11:34:01 +08:00
Chinesezjc 2413eab847 ci: isolate non-Windows pnpm setup per run attempt
Stacked on #3115: keep its windows-* setup-pnpm-js-<run_id>-<run_attempt>-<job>
destination, and extend the same isolation to non-Windows jobs in ci.yml
and ci-master.yml with setup-pnpm-<run_id>-<run_attempt>. This prevents
sequential self-hosted Windows jobs from tripping over a stale locked
pnpm.exe/reflink native module.
2026-08-27 11:33:27 +08:00
creatixchu 6107e10c25 test(web): refresh feedback release golden 2026-08-27 11:32:23 +08:00
Yichen Jiang 94db8e881b fix(web): render readable ask-user transcripts 2026-08-27 11:28:59 +08:00
creatixchu 25ae5ae6e0 Merge remote-tracking branch 'origin/master' into worktree/feedback-otel-enable 2026-08-27 11:19:57 +08:00
Chinesezjc 4ed5303f41 Merge pull request #3115 from deepseek-harness/fix/remove-transform-corpus
fix(ci): Windows pnpm setup isolation and spawn budget alignment
2026-08-27 11:14:03 +08:00
pku-xht 8c67d49ca5 fix(api): simplify projection reconciliation 2026-08-27 11:02:06 +08:00
creatixchu 16a7ead9ab Merge remote-tracking branch 'origin/master' into codex/pr-3111-review
# Conflicts:
#	scripts/ci-workflow.spec.ts
2026-08-27 10:57:27 +08:00
pku-xht c3b694312f fix(web): harden schedule catalog state handling 2026-08-27 10:24:36 +08:00
Yichen Jiang a24c71127f Merge pull request #3155 from deepseek-harness/feat/web-input-trigger-menu-polish
feat(web): 输入触发菜单(/ 与 @)呈现打磨
2026-08-27 10:12:39 +08:00
pku-xht beaa5638b4 fix(session): centralize projection baseline precedence 2026-08-27 08:55:32 +08:00
pku-xht dfb9b9475f test(web): close schedule catalog review gaps 2026-08-27 06:46:00 +08:00
pku-xht 86fa9f512b Merge origin/master into schedule-web-catalog 2026-08-27 05:26:09 +08:00
pku-xht 57d8a79bfe fix(session): validate seeded projection boundary 2026-08-27 05:21:41 +08:00
imccyu e290fb1dc7 Merge pull request #3085 from deepseek-harness/worktree-apire-c
refactor(apiproxy): credentials and settings to Remote
2026-08-27 04:16:33 +08:00
imccyu f3e16c9bcc docs(api): refresh configuration type records 2026-08-27 03:28:30 +08:00
pku-xht a5330ecf99 Merge commit 'e25ae41263f1ce4066aa8352f76d3d6d077b7959' into schedule-web-catalog
# Conflicts:
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/client/ui-workspace/package.json
2026-08-27 03:13:03 +08:00
imccyu 08176e6626 test(api): type heterogeneous provider calls 2026-08-27 03:12:36 +08:00
imccyu f19c25123d style(apiproxy): remove stale spacing 2026-08-27 03:08:53 +08:00
imccyu 9fdbec00ee fix(web): reuse the preview Remote helper 2026-08-27 03:06:59 +08:00
imccyu fcba3bbacb test(api): avoid mixed Remote result inference 2026-08-27 03:06:58 +08:00
imccyu fd7f2065b2 refactor(apiproxy)!: remove settings and credentials RPCs 2026-08-27 03:01:29 +08:00
imccyu 5918dd205e refactor(client): use settings Remote namespaces 2026-08-27 03:01:02 +08:00
imccyu dd70c0c88d feat(api): serve settings through Remote controllers 2026-08-27 03:00:49 +08:00
imccyu 0a9a9ee686 docs(api): record settings Remote migration 2026-08-27 03:00:25 +08:00
pku-xht 68c48109e3 docs(session): align projection replay criteria 2026-08-27 02:51:36 +08:00
imccyu fc5224b389 Merge pull request #3086 from deepseek-harness/worktree-apire-d2
refactor(apiproxy): directory-picker to Remote
2026-08-27 02:42:12 +08:00
imccyu 54d77eff00 docs(directory-picker): record the Remote transport 2026-08-27 02:20:40 +08:00
imccyu 6e4087626d refactor(apiproxy)!: remove directory-picker RPCs 2026-08-27 02:20:39 +08:00
imccyu 011d53862d refactor(client): use directory-picker Remote 2026-08-27 02:20:38 +08:00
imccyu 76dedd4862 feat(workspace-controller): expose directory picking through Remote 2026-08-27 02:20:38 +08:00
pku-xht 11a5bc5083 fix(api): preserve projection baseline precedence 2026-08-27 02:18:51 +08:00
imccyu 3007864cfe refactor(directory-picker): expose client-safe listing types 2026-08-27 01:44:15 +08:00
pku-xht 8042ac94a3 test(web): make schedule locale assertion deterministic 2026-08-27 00:56:48 +08:00
pku-xht 650e96cb4d docs(session-projection): correct initialization contract 2026-08-27 00:03:57 +08:00
pku-xht dd3e1c8490 fix(session): replay projection baselines in order 2026-08-26 23:11:22 +08:00
Chinesezjc d77b64e7cf test: derive the plugin add/remove budget and note the exe build
The anchors-a-relative-add-spec case serializes two subprocesses (plugin
add + remove) under a hardcoded 90s budget, which the 2x60s worst case
exhausts; derive it from SPAWN_TIMEOUT_MS * 2 + 30s like the other
dual-call cases. The pnpm setup isolation note now also records the python
SDK exe build's suffixed destination and its regression-test coverage.
2026-08-26 22:42:55 +08:00
Yif 36dd657c7e test(ui-input-trigger): cover the onHover slot wiring; restore master's notices
The merge resolution had reverted THIRD_PARTY_NOTICES.md to the SDK 0.3.220
rows; the lockfile pins 0.3.241, so CI regenerated a mismatch. The apply spec
now drives the injected onHover face, closing the per-file coverage gap on
src/client/index.ts.
2026-08-26 22:10:58 +08:00
Chinesezjc 075cfc3b4d test: give the dual-call built-bin cases a 150s outer budget
The plugin add and dump-default-config cases serialize two runBuiltBin
calls, each with a 60s execa cap; the 90s outer budget could be exhausted
before the second call. Raise them to SPAWN_TIMEOUT_MS * 2 + 30s, matching
the multi-call treatment.
2026-08-26 21:52:44 +08:00
Yif 9ec543c943 Merge remote-tracking branch 'origin/master' into feat/web-input-trigger-menu-polish
# Conflicts:
#	apps/web/tests/agent-preset-selection.e2e.ts
2026-08-26 21:35:21 +08:00
pku-xht 9e17966e05 Merge commit '9acb9c5ac5de67a511afedbb30e74edbdbc4d57e' into schedule-web-catalog
# Conflicts:
#	apps/web/tests/schedule-after.e2e.ts
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/api/session-controller/tests/manager.client.spec.ts
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
2026-08-26 21:27:19 +08:00
Yif 0114dc1f81 feat(web): polish the input trigger menu presentation
Candidate rows lead with domain icons instead of localized text
prefixes; pointer and keyboard share one reducer-owned highlight (last
input wins); drillable folder rows reveal a localized Browse-folder +
Tab keycap hint with the library chevron; pending sources render
skeleton bars; the menu spans the composer card. The editable @dir/
text decorates color-only — the domain icon now belongs exclusively to
the settled reference chip. Composer placeholders advertise / and @,
and the zh copy for commands is unified to 指令.
2026-08-26 21:17:46 +08:00
ihsiang bc1f515b04 Merge pull request #3145 from deepseek-harness/ihsiangzhang/secondary-font-tier
feat(ui): unify the flow-row secondary font tier and scale tables
2026-08-26 20:50:23 +08:00
pku-xht 48f79a52d8 test(session-query): model non-error rejection 2026-08-26 20:08:54 +08:00
pku-xht 5fe390dc8b chore: keep generated notices current 2026-08-26 20:08:06 +08:00
_Kerman 14bdba0924 fix(notices): refresh Claude SDK payload versions 2026-08-26 20:07:07 +08:00
pku-xht e841fb6049 feat(web): surface active schedules in session views 2026-08-26 20:03:19 +08:00
_Kerman bd6f72cbbb Merge remote-tracking branch 'origin/master' into xtr/session-projection-migrations 2026-08-26 19:59:02 +08:00
yx.zhang 9e33469913 fix(review): correct the secondary-tier floor claim and pin engine-resolved sizes
The Agent Note (both languages), the PR prose, and the commit message
claimed a 13px floor for the table variants; the formula has none —
max(13px, setting − 2px) selects the −1 branch at low settings rather
than clamping the result, so the tier bottoms out at 11px at the 12px
setting, matching think text. Rewrite the claim, say so in the axis
comment, and split the README sentence that lumped body-pair and
secondary-pair consumers together.

Assert the engine-resolved secondary size in the settings-chrome e2e
(13px at the default, 13px at the 15px boundary, 14px at 16px,
unchanged across reload), sync the StatsLine and workflow-panel spec
headers with the tier they now pin, and note why memberLabel stays at
the body size.
2026-08-26 19:28:04 +08:00
yx.zhang a77e23a975 feat(ui): unify the flow-row secondary font tier and scale tables
Derive --dsh-content-font-size-secondary (setting -1 at <=14, setting -2
above; 13px at the default) with --dsh-content-font-delta-secondary in
gradient-shadow-text.css, and move every one-step-under-the-body text
onto it: think text and reasoning summaries, the shared DisclosureRow
title, ToolRow and bash-row summaries and file links, compaction/
context/command/retry/error rows, StatsLine, the workflow-run panel
tiers, reference summaries, the turn-status clock, and the feedback
note trigger. The markdown table variants join the same tier instead of
staying fixed; its 13px floor keeps them legible at the 12px setting.

At the default setting the flow-row titles and summaries render at 13px
(previously 14px) so they match think text at every setting instead of
sitting 2px above it.
2026-08-26 19:28:04 +08:00
Chinesezjc 6cbd3dda21 test: give the multi-call built-bin cases a 210s outer budget
The requires-profile and routes-help cases serialize 4-6 runBuiltBin calls,
each with a 60s execa cap; under the loaded pool the 90s outer budget was
exhausted before the last call and vitest truncated the run without the
execa diagnostics. Raise both to SPAWN_TIMEOUT_MS * 3 + 30s.
2026-08-26 18:20:43 +08:00
Yichen Jiang b7ac86a4e0 Merge branch 'master' into worktree/fix-settings-focus 2026-08-26 18:02:00 +08:00
Chinesezjc 91379e8de6 ci(build-exe): drop pull_request label trigger to avoid skipped checks (#3049)
* ci(build-exe): drop pull_request label trigger to avoid skipped checks

* docs(build-exe): sync agent note and pin event set in workflow spec

* test(ci): type-safe event key assertion for build-exe workflow

* ci(build-exe): use present-tense trigger comment and drop label-run note
2026-08-26 17:52:34 +08:00
Chinesezjc b648ed75c9 test: unify the last Windows spawn budgets to the 90s pattern
The built-bin help/usage case still used a win32-conditional 60/30s outer
budget while serializing six runBuiltBin calls, and startProfileLifecycle
lacked the execa timeout/killSignal the sibling helper has; the tool-ralph
cases pinned 20-30s explicit timeouts that the 90s lane default cannot
override. Align all of them to the SPAWN_TIMEOUT_MS + 30s (or 90s) pattern.
2026-08-26 17:43:57 +08:00
Yichen Jiang 4ecebeb54f Merge pull request #3138 from deepseek-harness/feat/models-provider-card-slots
feat(ui-settings-models): open provider-card and footer extension slots
2026-08-26 17:25:48 +08:00
Chinesezjc 84692044af test: raise the contended Windows spawn budgets to 90s
The per-case 15-30s budgets on the Windows native and coverage lanes fire
before oxlint, workflow-worker-thread, and other subprocess-spawning cases
finish under the loaded self-hosted pool; the failures rotate across cases
as load shifts, so per-case widening only moved the flake. Raise the lane
defaults (DSH_COVERAGE_TEST_TIMEOUT_MS and the native --testTimeout) to 90s,
align the oxlint and workflow-worker-thread case budgets, and keep the
built-bin SPAWN_TIMEOUT_MS at 60s under a 90s outer budget.
2026-08-26 17:17:47 +08:00
Yichen Jiang bf0db65bb0 fix(ui-settings-models): address review — derived key fact, required render seat, spec sync
The provider-card seat's keyConfigured now derives from the reference the
page would use — the profile's apiKeyEnv, or the page's derived
<ROUTE>_API_KEY while the profile names none — so the add-provider draft
agrees with its own editor about an existing conventional credential (the
store joins the derived describe in the same batched call, as
ProviderRow.derivedCredential). ModelsSectionProps makes the renderSlot seat
required so a direct render that forgets it fails to compile; the one such
render in provider-form.client.spec regained a real mount and the test
boilerplate collapsed to renderSlot={() => null}. The extension-slots Agent
Note now states the keyed cell's real override rule (same priority throws,
a different priority shadows), and docs/subsystems/slots.md carries the two
new seats in its hierarchy, both languages.
2026-08-26 17:12:58 +08:00
Yichen Jiang 21a2a38a2f Merge pull request #3125 from deepseek-harness/worktree/composer-editable-gate
test(web): gate composer gestures on the editable attribute
2026-08-26 16:54:37 +08:00
_Kerman 96c1c762d5 fix(session-projection): preserve optional registrations 2026-08-26 16:51:36 +08:00
Chinesezjc 43b5b473bf ci: drop the stale pnpm setup cleanup steps
The windows-* jobs now install pnpm under a run/attempt/job-suffixed
destination, so the pre-install step that cleared the old fixed
setup-pnpm-js path no longer touches the actual destination and its
comment claims stale state. The suffix already gives every job a fresh
directory, so remove the four cleanup steps.
2026-08-26 16:39:30 +08:00
Chinesezjc c20cfe77c6 test: align built-bin spawn budget with its outer case budgets
The execa timeout was widened to 60s but the outer vitest case budgets stayed
at 30s, so a cold-starting built bin would trip the vitest budget first and
the execa SIGKILL cleanup could not run inside it. Extract SPAWN_TIMEOUT_MS,
share it across the execa deadline, its error text, waitForFile, and the
outer case budgets (60s spawn + 30s headroom), so the widening is coherent.
2026-08-26 16:39:30 +08:00
Chinesezjc e9cb003e9e test: widen oxlint contract and built-bin spawn budgets
Both suites spawn real subprocesses (oxlint probes; the dsh built bin) that
cold-start slowly on the contended self-hosted Windows pool, so their 20-25s
timeouts fire before the child finishes. Raise the oxlint contract case
timeouts to 60s and the built-bin execa timeouts to 60s, matching the
tool-ralph budget treatment.
2026-08-26 16:39:30 +08:00
Chinesezjc e87a47692d ci: isolate the Windows pnpm setup destination per job
The windows-* jobs keep a separate standalone pnpm executable under
runner.temp/setup-pnpm-js. A previous job on the same self-hosted runner
can leave a locked @reflink native module there, so the next job's
pnpm/action-setup fails with EPERM during unlink before any test runs.
Suffix the destination with run_id, run_attempt, and job so every job
gets a fresh directory even when sequential jobs land on the same
runner; apply the same to the python SDK exe build. Update the pnpm
setup isolation note to record the Windows-specific destination.
2026-08-26 16:39:30 +08:00
Yichen Jiang b5c3cc897c fix(llm-pi-ai): store the JSON image of a grant payload
pi-ai credentials carry optional members as explicit undefined (a github.com
Copilot grant holds enterpriseUrl: undefined), and the store bridge committed
the object verbatim, so the credential store's strict validator refused the
write and sign-in failed after the provider had already authorized it.
toRecord now drops explicitly-undefined members and renders undefined array
entries null, exactly as JSON.stringify would; everything else passes through
untouched so genuinely unstorable values still fail loud at the store.
2026-08-26 16:37:49 +08:00
Yichen Jiang 21e5ee9071 test(web): derive the editable gate from the gesture target
Review follow-ups: wait on the caller's own locator instead of assuming
it is the page's first composer, describe the actual read-only window
(submit adjudication and locked states — a running turn stays editable
for queueing), drop the pre-Lexical narration from the JSDoc, and record
the gesture-semantics trap as an Agent Note.
2026-08-26 16:35:49 +08:00
Yichen Jiang 10d1c603be Merge remote-tracking branch 'origin/master' into worktree/composer-editable-gate
# Conflicts:
#	apps/web/tests/permission-policy-context.e2e.ts
2026-08-26 16:11:32 +08:00
Yichen Jiang 5661b7a972 Merge pull request #3110 from deepseek-harness/worktree/fix-question-drafts-session-switch
fix(web): preserve ask_user_question drafts across Sessions
2026-08-26 16:10:37 +08:00
Magolor df76bc695b feat(session): reduce persistence storage size (#3048) 2026-08-26 08:01:07 +00:00
Yichen Jiang e5d39b6076 Merge origin/master into worktree/fix-question-drafts-session-switch 2026-08-26 15:51:15 +08:00
creatixchu 3031cb0e33 Merge remote-tracking branch 'origin/master' into codex/pr-3111-review
# Conflicts:
#	packages/api/session-controller/src/client/contract/snapshot.ts
#	packages/test-support/client-runtime/src/sessions.ts
2026-08-26 15:34:18 +08:00
imccyu 1e2d2b7b47 Merge pull request #3107 from deepseek-harness/worktree-workerfix3
fix(webworker): retain createRequire dependencies in preview images
2026-08-26 15:28:44 +08:00
_Kerman f3d6433d9d test(agent-presets): mount projection seam in baseless harness 2026-08-26 15:22:21 +08:00
_Kerman 81e07e3935 Merge remote-tracking branch 'origin/master' into xtr/session-projection-migrations 2026-08-26 15:15:04 +08:00
_Kerman c3468623ea test(python-sdk): accept explanatory live responses 2026-08-26 15:14:49 +08:00
_Kerman 4d34d59733 test(webworker-runtime): refresh title projection fixture 2026-08-26 15:14:34 +08:00
_Kerman cd18de61d8 fix(session-projection): close migration coverage gaps 2026-08-26 15:14:14 +08:00
_Kerman e296e79b18 fix(session-projection): complete mandatory compositions 2026-08-26 15:13:51 +08:00
ChinesezjcandCodesmith ac36c6b975 test(web): drain trajectory scroll timer before teardown
Co-authored-by: Codesmith <[email protected]>
2026-08-26 15:09:49 +08:00
imccyu b72f5879c8 fix(webworker): scope createRequire dependency discovery 2026-08-26 15:09:49 +08:00
imccyu 437ab3cefe docs(webworker): define createRequire reachability limits 2026-08-26 15:09:48 +08:00
imccyu f2cc573eb3 test(webworker): keep dependency coverage generic 2026-08-26 15:09:48 +08:00
imccyu 1429737a52 perf(hmr): poll client bundles only 2026-08-26 15:09:48 +08:00
imccyu 8f88a6f207 fix(webworker): expose Node process identity 2026-08-26 15:09:48 +08:00
imccyu ba54d722a1 docs(web): clarify worker globals and HMR polling 2026-08-26 15:09:48 +08:00
imccyu d54c2795cc fix(webworker): retain createRequire dependencies 2026-08-26 15:09:48 +08:00
imccyu b588cdc478 docs(webworker): define createRequire reachability 2026-08-26 15:09:48 +08:00
Yichen Jiang 855461c2e8 feat(ui-settings-models): open provider-card and footer extension slots
The Models section now declares two SlotMap seats for out-of-tree plugins:
settings.models.provider-card (keyed by the row's settingsNs, dispatched on
saved cards, the first-run setup posture, and the add-provider draft, with
the row view, configured join, and confirmed api-key state as owner props)
and settings.models.footer (ordered list after the rows and add controls).
Without registrants both seats render nothing. First consumer: the
llm-pi-ai-oauth companion plugin's sign-in surface.
2026-08-26 15:09:30 +08:00
imccyu 5dba32bb48 Merge pull request #3083 from deepseek-harness/worktree-apire-b
refactor(apiproxy): subagent control to Remote
2026-08-26 15:08:59 +08:00
Chinesezjc 41591aa57f Merge branch 'master' into worktree/composer-editable-gate 2026-08-26 15:00:57 +08:00
Yichen Jiang 74fa4a00d7 Merge pull request #3123 from deepseek-harness/worktree/wizardly-maxwell-194a2a
fix(agent-presets): report unresolvable rows and refused switches
2026-08-26 14:57:09 +08:00
Yichen Jiang 605e33a2f5 fix(web): address question draft review feedback 2026-08-26 14:53:37 +08:00
imccyu 00c37f4ead test(web): drive preset slash catalog with gestures 2026-08-26 14:52:54 +08:00
imccyu 459919d21d test(session-projection-cache): drive interval deterministically 2026-08-26 14:52:54 +08:00
imccyu b8360cac53 test(web): wait for editable permission composer 2026-08-26 14:52:53 +08:00
imccyu 64575de655 docs(subagent): regenerate Remote references 2026-08-26 14:52:53 +08:00
imccyu 91fea67745 test(subagent): cover Remote control migration 2026-08-26 14:52:53 +08:00
imccyu cbe5d76e5c refactor(api-session-controller): route subagent calls through Remote 2026-08-26 14:52:53 +08:00
imccyu 377f3b4f1d feat(subagent): migrate browser control to Remote 2026-08-26 14:52:53 +08:00
creatixchu dc82511497 ci(windows): restore complete coverage sharding 2026-08-26 14:49:29 +08:00
Yichen Jiang 1d00f5b4c0 Merge pull request #3117 from deepseek-harness/worktree/3116-docs-mpa-idempotence
fix(docs): make site builds idempotent
2026-08-26 14:49:11 +08:00
Yichen Jiang 23044ea774 Merge remote-tracking branch 'origin/worktree/wizardly-maxwell-194a2a' into worktree/wizardly-maxwell-194a2a 2026-08-26 14:43:22 +08:00
Yichen Jiang 56d3e8f82a fix(agent-presets): answer health from the walk alone, and keep the reason reachable
`import.meta.resolve`'s `parentURL` argument takes effect only under
`--experimental-import-meta-resolve`, which no launch passes, so the
fallback resolved from this module rather than from the harness — the one
question it existed to answer. The disk walk is the whole answer now, and
the refusal memo it needed goes with it. A `file:` URL joins the file
branch rather than the package one, where a resolver would only normalize
it and report a missing target as present, and a row is skipped on the
Loader's own `Boolean(disabled)` so `disabled: 0` is checked like the
Loader checks it.

A broken card says so through `aria-disabled` rather than `disabled`, and
refuses the pick in its own handler. `disabled` took it out of the tab
order, which with the reason moved onto the badge left it unreachable
without a pointer — reachable before this change, so hiding it was a
regression rather than a path that never existed.

Both notes this decision partly supersedes are updated in place and
cross-linked, one README pair loses an editing residue that repeated a
sentence, and the single-row diagnostic no longer reads "row row 1".
2026-08-26 14:42:39 +08:00
pku-xht 9cd9c7f634 test(web): complete schedule catalog validation 2026-08-26 14:40:12 +08:00
Yichen Jiang f95cbca9ce test(web): target the editable command composer 2026-08-26 14:39:58 +08:00
creatixchu 116cd2332e Merge remote-tracking branch 'origin/master' into worktree/feedback-otel-enable 2026-08-26 14:35:49 +08:00
Yichen Jiang 308d1b21cb Merge remote-tracking branch 'origin/master' into worktree/3116-docs-mpa-idempotence 2026-08-26 14:33:23 +08:00
Yichen Jiang 1d09a4c877 fix(docs): harden build output cleanup 2026-08-26 14:33:17 +08:00
Yichen Jiang 2831054b97 test(web): await editable composer between turns 2026-08-26 14:30:56 +08:00
Yichen Jiang 4e1c87b1a2 fix(ci): bound Windows process contention 2026-08-26 14:24:24 +08:00
creatixchu fab41be07e Merge remote-tracking branch 'origin/master' into codex/pr-3111-review 2026-08-26 14:21:56 +08:00
_Kerman a6c7c70d4f fix(session-projection): close review findings from the fold migration
- permission-presets: register the permissions unit synchronously before the
  existing-session sweep, so a remount reads folded knob state instead of
  treating every session as fresh; add a regression test for that path
- sandbox-policy/terminal-bash: mount the projection registry in the 5 pwsh
  terminal tests, the sdk-minimal bundle, and the e2b fixture composition;
  declare the new package dependency in both manifests
- plan-mode: restore .strict() on the plan unit state schema and drop the
  deleted foldPlanMode from the bilingual READMEs
- session-title/session-projection: sync bilingual READMEs to the mandatory
  projection seam and re-record translation pairing
- docs: turnBoundary reader contract, subagent schema comment, token-meter
  import comment, sandbox-policy module docstring
2026-08-26 14:13:42 +08:00
creatixchu 7817ed3d82 docs: refresh Claude SDK notices 2026-08-26 14:09:31 +08:00
_Kerman df0e0960c2 Merge remote-tracking branch 'origin/master' into xtr/session-projection-migrations 2026-08-26 13:51:57 +08:00
_Kerman ef4dde9fe2 docs: reconcile projection catalogs after master merge 2026-08-26 13:51:32 +08:00
_Kerman e6bf040dc3 fix(session-query): use renamed tool call id 2026-08-26 13:51:24 +08:00
creatixchu 2dd59b2ca1 test(client): cover instant image echo branches 2026-08-26 13:49:20 +08:00
Yichen Jiang 2cb1a323b7 Merge remote-tracking branch 'origin/master' into worktree/fix-question-drafts-session-switch 2026-08-26 13:44:45 +08:00
Yichen Jiang 94e3bfd5d1 test(web): gate composer gestures on the editable attribute
A running turn disables the composer by flipping contenteditable to
false on the same element. fill() throws there immediately — a disabled
textarea used to hold it back through actionability — and isEnabled()
reports true for a div regardless, so the permission-policy scenario's
post-settle wait never waited and its next gesture raced the re-enable
render. The window is a few frames wide; #3083's Remote-routed subagent
control stretches settle enough to hit it on CI.

writeComposerDraft now waits for contenteditable="true" before acting,
and the permission-policy scenario drives all four sends through it with
the settle wait pinned to the attribute.
2026-08-26 13:44:32 +08:00
Yichen Jiang f87b6c35df Merge branch 'master' into worktree/wizardly-maxwell-194a2a 2026-08-26 13:42:28 +08:00
Yichen Jiang 002af9f20b fix(ui-agent-preset): read a refusal's cause by its detail, not its code 2026-08-26 13:41:20 +08:00
imccyu 6770f76fda Merge pull request #3063 from deepseek-harness/fix/window0825
perf(ci): optimize coverage / snapshot parameter
2026-08-26 13:40:33 +08:00
Yichen Jiang cd3401a39a Merge remote-tracking branch 'origin/master' into worktree/wizardly-maxwell-194a2a
# Conflicts:
#	packages/client/ui-agent-preset/src/client/seat-store.ts
2026-08-26 13:37:53 +08:00
_Kerman 737691054a Merge remote-tracking branch 'origin/master' into xtr/session-projection-migrations
# Conflicts:
#	packages/core/agent-loop/tests/agent-initiator.spec.ts
#	packages/core/tools/tests/tools.spec.ts
#	packages/fs/tool-fs/tests/tools.spec.ts
#	packages/schedule/schedule/tests/plugin.spec.ts
#	packages/session/session-checkpoint-policy/tests/fixtures/crash-child.ts
2026-08-26 13:36:05 +08:00
Yichen Jiang f7890f591a fix(agent-presets): make a preset's failures legible where they happen
Discovery proved only that a composition parsed, so a preset naming a
package a later rename took away kept a healthy card and its place in
every picker until a person switched to it. It now resolves each row it
can prove will start, reading the package off disk and falling back to
the resolver only for names that look absent — the resolver costs a
synchronous hooks-thread round-trip under the source launch's tsx hook,
which the walk avoids for every row it clears.

The mount diagnostic followed `AggregateError.errors` but never a cause,
so a group that failed on two rows named neither. It now follows a cause
that carries more than its own message.

A refused switch left the chip's label snapping back with no account of
why, which is the only account there can be for a preset that resolves
and then refuses. It announces through the shared Toast, which gained a
caller-set hold for a cause that names packages and rows.
2026-08-26 13:31:08 +08:00
creatixchu 5f3112d6ce Merge remote-tracking branch 'origin/master' into worktree/feedback-otel-enable
# Conflicts:
#	apps/web/tsconfig.json
2026-08-26 13:30:52 +08:00
imccyu 2a1a2605dc test(workflow-worker-thread): budget startup waits for the contended Windows pool 2026-08-26 13:28:44 +08:00
imccyu b342b09401 chore(release): drop the unused synchronous runner 2026-08-26 13:23:41 +08:00
_Kerman 212df86cf8 refactor(session): migrate simple folds to projections 2026-08-26 13:23:01 +08:00
creatixchu b22cc3e95b Merge master and address submission echo review 2026-08-26 13:20:24 +08:00
Yichen Jiang d6a1031cfa Merge remote-tracking branch 'origin/master' into worktree/3116-docs-mpa-idempotence 2026-08-26 13:10:09 +08:00
Yichen Jiang 3275365489 fix(docs): make site builds idempotent 2026-08-26 13:09:53 +08:00
imccyu f18ab429e4 ci(release): pack rehearsal tarballs concurrently 2026-08-26 12:46:17 +08:00
imccyu e1c49dab59 ci(windows): clear stale pnpm setup state before install 2026-08-26 12:35:05 +08:00
imccyu 2d89a76b94 test(webworker-runtime): restore the transform semantic spec 2026-08-26 12:35:05 +08:00
imccyu 8793cd477b test(webworker-runtime): keep the corpus gate as a Node import sweep 2026-08-26 12:35:05 +08:00
imccyu 6d9cc6ab96 test(webworker-runtime): drop coverage requirement and compile transform suites 2026-08-26 12:35:04 +08:00
imccyu 54ef0f315a perf(typert): skip re-verified diagnostics and share analyzer caches in the tsdown plugin 2026-08-26 12:35:04 +08:00
imccyu 75428c7f47 perf(ci) 2026-08-26 12:35:04 +08:00
_Kerman 2efaacd807 Merge pull request #2731 from deepseek-harness/xtr/message-tool-call-id
refactor(llm): rename CallId to ToolCallId
2026-08-26 12:32:08 +08:00
creatixchu c01cf6e549 test: exactOptionalPropertyTypes 下的 onRetire 捕获类型 2026-08-26 12:12:59 +08:00
creatixchu f1606e31d2 test(web): 提交回显的组装路径 e2e 与不可见标记
PendingSubmissionBubble 携带 data-submission-echo 标记(渲染不变,仅供检测),
新增 keyless 组装 e2e:发送按键当下回显即在流中、composer 已清空可编辑,
durable 节点到达后原位替换且只剩一条气泡。
2026-08-26 12:12:08 +08:00
creatixchu 1da466a0a6 test+docs: 回显生命周期、去重与预览移交的覆盖,README 与 Agent Note
新增 sendSession 回显编排、ChatView 回显渲染与 rpcId 去重、control 队列 rpcId
投影、HistoricalImageCache.seed、MessageImage 预览 arm 的测试;四个包 README
双语更新;Agent Note 记录 rpcId 关联与延帧退休决策。
2026-08-26 12:01:27 +08:00
_Kerman 3759ea5dfe fix(agent-team): keep projection through runtime disposal 2026-08-26 12:00:02 +08:00
_Kerman c7abeb23bf refactor(session): keep approval outside projection migration 2026-08-26 11:59:28 +08:00
creatixchu 5657066b1d test: 修复回显契约扩散到的类型化 fake 与断言 2026-08-26 11:51:35 +08:00
creatixchu cf47b7e059 feat(web): 提交回显在 Chat 流尾即时渲染
ChatView 渲染 pendingSubmissions 为用户气泡,按 rpcId 对正式节点与队列行做
渲染期去重,替换原子无闪烁;新增回显跟随滚动;MessageImage/ImageGallery 增加
本地预览 arm,回显图片直接显示 object URL。
2026-08-26 11:49:56 +08:00
creatixchu 390dad6138 feat(ui-conversation): 默认发送改为乐观提交并接入提交回显
enter 即清空草稿并解冻输入框,默认发送作为 detached attempt 并发运行;
sink-settled 失败时仅还原未被覆盖的空草稿与图片;sendSession 在序列化前注册
提交回显并在绘制让步后再编码(FileReader 原生 base64);观察退休时把预览 URL
移交 HistoricalImageCache,正式消息节点零往返显示。
2026-08-26 11:49:16 +08:00
_Kerman 4325672ad6 Merge origin/master into xtr/session-projection-migrations 2026-08-26 11:48:52 +08:00
creatixchu 98da332260 feat(session-controller): 客户端本地提交回显与 rpcId 关联
beginSubmission 在 prompt 之前同步把本地提交回显写入 SessionSnapshot.pendingSubmissions;
durable user/message(source.rpcId)或队列投影(SessionQueuedItem.rpcId)到达后延迟一帧退休,
prompt 失败与放弃立即退休并回调 onRetire。fixture 的 prompt 同步回显 requestId。
2026-08-26 11:48:33 +08:00
Yichen Jiang 2c90710383 fix(web): preserve question drafts across Session switches 2026-08-26 11:42:52 +08:00
_Kerman bf83f0889b Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2731 2026-08-26 11:40:56 +08:00
imccyu a3c852b497 Merge pull request #3082 from deepseek-harness/worktree-apire-a2
refactor(apiproxy): move the agent-preset to Remote
2026-08-26 11:37:08 +08:00
_Kerman 3d05fdfbfb refactor(session): keep instruction and skill scans on event log 2026-08-26 11:32:38 +08:00
_Kerman cf06f10229 test(session-controller): cover cold host-only projection cache 2026-08-26 11:32:19 +08:00
Yichen Jiang d2a4a95a85 Merge pull request #2852 from deepseek-harness/worktree/web-textarea-refactor-991614
refactor(web): rebuild the composer on Lexical with atomic reference chips
2026-08-26 11:24:22 +08:00
imccyu 5752b1dc3c docs(agent-presets): refresh @Remote migration references 2026-08-26 11:18:36 +08:00
imccyu c5be99838c test(agent-presets): cover the Remote migration 2026-08-26 11:18:28 +08:00
imccyu ef1c812d93 refactor(ui-agent-preset): consume the preset Remote 2026-08-26 11:18:28 +08:00
imccyu 306419cc84 refactor(agent-presets): expose browser operations through Remote 2026-08-26 11:18:28 +08:00
_Kerman 6a311f0638 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2731 2026-08-26 11:17:50 +08:00
Dudu-0223 5e52e7eaef Merge pull request #2555 from deepseek-harness/codex/agentteams-web
feat(team): add experimental Agent Teams Web profile
2026-08-26 11:15:48 +08:00
_Kerman e8c2423f5b chore: regenerate third-party notices for claude-agent-sdk 0.3.241 2026-08-26 11:12:37 +08:00
fengsy d0eb02c206 docs(team): adopt package README standard 2026-08-26 10:56:57 +08:00
fengsy 194facabdb fix(team): authenticate browser panel snapshot 2026-08-26 10:56:57 +08:00
fengsy eadd5df82b fix(team): preserve current Client architecture after rebase 2026-08-26 10:56:57 +08:00
Dudu-0223 8852161662 docs(team): link deferred Web preset work 2026-08-26 10:56:57 +08:00
Dudu-0223 80e033efe5 fix(team): address Agent Teams Web review 2026-08-26 10:56:57 +08:00
Dudu-0223 c6cab2aada fix(agent-team): isolate generated Remote browser entry 2026-08-26 10:56:57 +08:00
Dudu-0223 61dea35bd2 refactor: let Team own browser remotes 2026-08-26 10:56:57 +08:00
Dudu-0223 36588ade22 fix(team): isolate browser remote adapter 2026-08-26 10:56:57 +08:00
Dudu-0223 806642b064 feat(team): add experimental Agent Teams Web profile 2026-08-26 10:56:57 +08:00
_Kerman 5521b98143 fix(session-projection): isolate host state from wire snapshots 2026-08-26 10:52:27 +08:00
creatixchu 307bd73cc9 Merge remote-tracking branch 'origin/master' into worktree/feedback-otel-enable 2026-08-26 10:43:48 +08:00
imccyu 8a4fc10f36 Merge pull request #3050 from deepseek-harness/worktree/session-turn-nav-styling-7715ae
feat(web): navigate loaded Chat Turns from a compact rail
2026-08-26 10:40:34 +08:00
_Kerman d3dd816d67 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2731
# Conflicts:
#	packages/util/brand/README.i18n.yaml
#	packages/util/brand/README.md
#	packages/util/brand/README.zh.md
2026-08-26 10:35:38 +08:00
Yichen Jiang f20f0161ab fix(notices): restore the SDK 0.3.241 platform payload rows
The tenth master merge staged the correct 0.3.241 notices, but the
pre-commit regenerator ran against a local pnpm store that still held a
stale 0.3.220 SDK directory alphabetically ahead of it and silently
committed the old payload table. Regenerated after removing the stale
store entries; the lexical rows this branch adds stay.
2026-08-26 10:27:58 +08:00
Yichen Jiang 87ac9f5bea fix(notices): restore the SDK version the lockfile installs
The generator names the first matching virtual-store directory, so a local
store still holding an older SDK payload alongside the locked one renders
that older version into the notices.
2026-08-26 10:21:49 +08:00
creatixchu 66f2938b63 fix(web): adopt authenticated scaffold URL and post-merge golden in feedback-release lane 2026-08-26 10:14:20 +08:00
Yichen Jiang 2f157dbd76 Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614
# Conflicts:
#	packages/client/ui-chat/src/client/chat/MessageItem.module.css
#	packages/client/ui-conversation/package.json
#	packages/client/ui-input-trigger/README.i18n.yaml
#	packages/client/ui-input-trigger/README.md
#	packages/client/ui-input-trigger/README.zh.md
#	packages/client/ui-reference/README.i18n.yaml
#	packages/client/ui-reference/README.md
#	packages/client/ui-reference/README.zh.md
#	pnpm-lock.yaml
2026-08-26 10:10:09 +08:00
creatixchu 9c37f7a553 Merge remote-tracking branch 'origin/master' into worktree/feedback-otel-enable
# Conflicts:
#	apps/cli/reference/README.i18n.yaml
#	apps/cli/reference/README.md
#	apps/cli/reference/README.zh.md
#	packages/bundle/base/cordis.patch.yml
2026-08-26 10:06:55 +08:00
Yichen Jiang f47b18d2f6 Merge remote-tracking branch 'origin/master' into worktree/session-turn-nav-styling-7715ae
# Conflicts:
#	packages/client/ui-chat/README.i18n.yaml
#	packages/client/ui-chat/README.md
#	packages/client/ui-chat/README.zh.md
2026-08-26 10:05:44 +08:00
creatixchu ac4a2f9792 fix(feedback): address review — accurate release wording, current-state notes, default-mode snapshot lane 2026-08-26 10:05:31 +08:00
Tianyi Cui d233300d55 Merge pull request #3087 from deepseek-harness/worktree/remove-ignorable-session-events
refactor(session): require known event types on read
2026-08-26 02:57:19 +08:00
Tianyi Cui 035ac85f42 Merge branch 'master' into worktree/remove-ignorable-session-events 2026-08-26 02:44:26 +08:00
Dudu-0223 0eccabd5c3 Merge pull request #2556 from deepseek-harness/codex/agentteams-cli
feat(team): add experimental Agent Teams CLI profile
2026-08-26 02:34:32 +08:00
Tianyi Cui 0d551b9f5c docs(session): align SQLite schema evidence 2026-08-26 01:39:53 +08:00
fengsy a28f543ae4 docs(agent-team-profile): adopt package README standard 2026-08-26 00:53:57 +08:00
pku-xht 673aeb65af Merge commit 'a75a281deadcd90a3841bdd2efebbbbfd68696fc' into schedule-web-catalog
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/subsystems/session-projection.i18n.yaml
#	docs/subsystems/session-projection.md
#	docs/subsystems/session-projection.zh.md
#	packages/client/README.i18n.yaml
#	packages/client/README.md
#	packages/client/README.zh.md
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/schedule/README.i18n.yaml
#	packages/schedule/README.md
#	packages/schedule/README.zh.md
#	packages/schedule/schedule/README.i18n.yaml
#	packages/schedule/schedule/README.md
#	packages/schedule/schedule/README.zh.md
#	packages/session/session-projection-cache/README.i18n.yaml
#	packages/session/session-projection-cache/README.md
#	packages/session/session-projection-cache/README.zh.md
#	packages/session/session-projection-cache/src/index.ts
#	packages/session/session-projection-cache/src/spec.ts
#	packages/session/session-projection-cache/tests/cache.spec.ts
#	packages/session/session-projection/README.i18n.yaml
#	packages/session/session-projection/README.md
#	packages/session/session-projection/README.zh.md
2026-08-26 00:51:57 +08:00
Tianyi Cui e7522ad39b test(persistence): retain primitive log-only coverage 2026-08-26 00:44:31 +08:00
Tianyi Cui 42dc2a46c2 refactor(session): require known event types on read 2026-08-26 00:22:31 +08:00
fengsy d97868b943 test(subagent-acp): exempt Windows-inaccessible branches 2026-08-26 00:15:18 +08:00
fengsy 42378a987e fix(profile): deduplicate fallback manifest traversal 2026-08-26 00:15:18 +08:00
fengsy 1477d5b9ef fix(profile): preserve current fallback architecture after rebase 2026-08-26 00:15:18 +08:00
Dudu-0223 2c16c20d2a fix(profile): address Agent Teams CLI review 2026-08-26 00:13:36 +08:00
Dudu-0223 6e4fabdc1f fix(boot): stabilize profile module fallbacks 2026-08-26 00:13:36 +08:00
Dudu-0223 fd53e479b4 fix(profile): isolate bundle module fallbacks 2026-08-26 00:13:35 +08:00
Dudu-0223 a6c274e250 feat(team): add experimental Agent Teams CLI profile 2026-08-26 00:13:35 +08:00
imccyu f18f2215b6 Merge pull request #3073 from deepseek-harness/worktree-apire-a
refactor(apiproxy): delete the goal unary domain
2026-08-25 23:54:01 +08:00
Magolor 0b5eba0c8d docs: rebuild the documentation skill and standards (#2983) 2026-08-25 23:47:20 +08:00
pku-xht cdba045dfc fix(session): trust authoritative projection frames 2026-08-25 23:18:46 +08:00
Tianyi Cui f4d1d3fb25 Merge pull request #3058 from deepseek-harness/fix/pwsh-local-dispose-status
fix(ci): consolidate windows/snapshot/e2e CI blocker fixes
2026-08-25 22:36:54 +08:00
pku-xht 5fe7dc333f fix(session): reconcile cached projection hints 2026-08-25 22:17:55 +08:00
Chinesezjc 9bf6f4b43c perf(ci): move the transform corpus out of coverage partitions
The full-corpus transform gate spawns one child that transforms and imports
every built bundle, so it runs for 8-25 minutes as a single case and
dominates one native Windows coverage partition, blowing its 900s budget
under load. Move it to the coverage-exempt heavy gate, which runs it with
its own worker budget instead of competing with the instrumented
partitions. The package's src is threshold-excluded in vitest.config.ts, so
the exemption carries no coverage; the exempt-heavy roster note records the
entry.
2026-08-25 22:11:11 +08:00
Chinesezjc a404edf3b1 test: widen windows-hosted subprocess budgets in two web-stack specs
The self-hosted Windows coverage pool (16 shards x 12 workers on 192
threads) pushes real subprocess boots past their vitest deadlines: the
tool-pwsh Loader smoke reaches ~40s against a 30s process cap, and the
tool-ralph worker-thread cases exceed the 5s default. Give the pwsh
smoke a 90s process deadline (the subprocess keeps the assembled boot,
the vitest deadline stays at 120s), and give the two un-budgeted ralph
cases 30s each, matching the existing 20s quiescence case.
2026-08-25 22:11:11 +08:00
Chinesezjc 553b8c35da test(pwsh-local): accept graceful SIGTERM exit as service-disposal death
On Linux, pwsh may trap SIGTERM and exit cleanly when the subprocess service
is disposed, so the handle status is 'completed' rather than 'killed'. The
test already proved the process tree is gone via kill(pid,0); both statuses
satisfy the contract.
2026-08-25 22:10:31 +08:00
Yichen Jiang e601f813a4 Merge pull request #3079 from deepseek-harness/worktree/3077-model-selector-names-only
fix(web): hide model selector descriptions
2026-08-25 22:02:18 +08:00
07akioni 79fd46b98e Merge pull request #3025 from deepseek-harness/ihsiangzhang/content-width-font-size
feat(ui): adaptive content width and settings font-size control
2026-08-25 21:54:15 +08:00
_Kerman 248d22f2c6 Merge remote-tracking branch 'origin/master' into xtr/message-tool-call-id 2026-08-25 21:44:26 +08:00
_Kerman 4e6a1f8d21 Merge origin/xtr/projection-per-session-cache into xtr/session-projection-migrations 2026-08-25 21:42:06 +08:00
_Kerman 53c8f64eed Merge pull request #2781 from deepseek-harness/xtr/projection-per-session-cache
feat(session-projection-cache): per-session checkpoint documents on a per-record storage layout
2026-08-25 21:37:09 +08:00
ihsiang be994a9270 Merge branch 'master' into ihsiangzhang/content-width-font-size 2026-08-25 21:27:28 +08:00
_Kerman cef391487a Merge remote-tracking branch 'origin/master' into xtr/projection-per-session-cache 2026-08-25 21:23:28 +08:00
imccyu 97405878c0 chore(tool-cordis): regenerate the Cordis catalog after the goal unary deletion 2026-08-25 21:23:24 +08:00
Yichen Jiang 7cc5a053fb Merge pull request #3071 from deepseek-harness/worktree/3070-minimal-bash-card-expand
fix(web): expand persistent Bash result cards
2026-08-25 21:22:18 +08:00
Yichen Jiang b6c5aa7516 fix(web): hide model selector descriptions
Refs #3077
2026-08-25 21:19:21 +08:00
pku-xht a47535ceab Merge pull request #2871 from deepseek-harness/codex/dsh-sdk-minimal-diagnostics
fix(subagent): preserve actionable DSH SDK failure facts
2026-08-25 21:16:02 +08:00
Yichen Jiang a91fa3ddbc test(web): stabilize minimal Bash card snapshot 2026-08-25 21:05:01 +08:00
Yichen Jiang 9b6729d505 fix(web): expand persistent Bash result cards 2026-08-25 21:05:01 +08:00
_Kerman 380334436e fix(storage-json): preserve legacy cache after bootstrap 2026-08-25 21:02:39 +08:00
imccyu 09e2440b80 Merge pull request #2966 from deepseek-harness/worktree-locale2
feat(locale): allow external language registration
2026-08-25 21:01:36 +08:00
pku-xht 446a632c58 Merge commit '882fb242ad930f15617e95cfb04e5c2225d70772' into codex/dsh-sdk-minimal-diagnostics 2026-08-25 20:57:46 +08:00
imccyu f04e2fe44a build(apiproxy): drop the now-unused goal dependency
Nothing under packages/host/apiproxy imports @deepseek-ai/dsh-goal after the
unary domain deletion, so the dependency and its project reference go too.
2026-08-25 20:55:03 +08:00
_Kerman 741083f03b Merge remote-tracking branch 'origin/master' into xtr/projection-per-session-cache 2026-08-25 20:54:08 +08:00
pku-xht abebdb1eaa Merge origin/master into schedule-web-catalog 2026-08-25 20:52:51 +08:00
imccyu 243f6629ef refactor(apiproxy): delete the goal unary domain
The goal domain has been served by GoalService's @Remote namespace since it
shipped; the API Proxy copy was a second implementation of the same six
mutations. Remove the goals contract, schemas, route rows, IApiClient stub,
host implementation, and the fixture's compatibility face, leaving
ctx.remote.goals as the only path.

The fixture's goal fold keeps its coverage through the Goal Remotes: its
lifecycle case moves out of the unary-dispatch test, which no longer has
goal rows to cover.
2026-08-25 20:52:46 +08:00
_Kerman 83459fa476 perf(storage-json): load record files concurrently 2026-08-25 20:50:54 +08:00
pku-xht 36a047d436 Merge commit '788bc260f98e31801feccde77efdc985c780065a' into codex/dsh-sdk-minimal-diagnostics
# Conflicts:
#	.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md
#	.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/sdk/client/README.i18n.yaml
#	packages/sdk/client/README.md
#	packages/sdk/client/README.zh.md
#	packages/sdk/client/tests/sdk-client.spec.ts
#	packages/subagent/subagent-dsh-sdk/README.i18n.yaml
#	packages/subagent/subagent-dsh-sdk/README.md
#	packages/subagent/subagent-dsh-sdk/README.zh.md
#	packages/subagent/subagent-dsh-sdk/src/index.ts
#	packages/subagent/subagent-dsh-sdk/src/run.ts
#	packages/subagent/subagent-dsh-sdk/tests/fixtures/loader/child-mock-llm.ts
#	packages/subagent/subagent-dsh-sdk/tests/loader-composition.e2e.ts
#	packages/subagent/subagent-dsh-sdk/tests/subagent-dsh-sdk.spec.ts
#	snapshots/sdk/sdk.snapshot.ts
2026-08-25 20:50:41 +08:00
pku-xht 907457580f Merge origin/master into schedule-web-catalog 2026-08-25 20:46:07 +08:00
yx.zhang 5720917ea7 polish(ui): trim the width handle and describe the font-size scope
Drop the width handle's double-click reset and tooltip — the handle is now
drag-only and a stored preference is only replaced by another drag — and
add a tertiary description line under the Settings font-size title stating
the size only affects conversation content. Update both Agent Notes and
the settings dialog goldens.
2026-08-25 20:44:07 +08:00
yx.zhang 9ecd18e986 feat(ui): extend the content font-size axis to flow chrome
Adopt --dsh-content-font-size / --dsh-content-font-delta across the flow
rows around the transcript body: DisclosureRow header (row height, title,
leading box, and registered glyphs, with StateDot exempt), ToolRow and
bash-row summaries and file links, think text, compaction/context/retry/
error rows, message clock and icon actions, the workflow-run panel, and
the workspace browser. Update the font-size Agent Note and add CSS-text
specs for the new adoptions.
2026-08-25 20:44:07 +08:00
pku-xht be7e746bb7 Merge pull request #2873 from deepseek-harness/codex/product-subagent-runtime-refresh-codex
feat(subagent): configure Codex provider models
2026-08-25 20:43:31 +08:00
ihsiang 6d6f8f044c feat(ui): adaptive content width and font-size control
Add conversation adaptive content width and a Settings font-size control,
with theme presenter, font-size row, snapshots, tests, and agent notes.
2026-08-25 20:42:03 +08:00
imccyu 45b9f2db44 fix(locale): validate contributed language tags 2026-08-25 20:40:26 +08:00
imccyu bbe00b0db2 feat(locale): allow external language registration 2026-08-25 20:40:26 +08:00
imccyu 9d61ab6756 docs(locale): define extensible language fallbacks 2026-08-25 20:40:25 +08:00
imccyu c4e0b3b1e7 Merge pull request #2587 from deepseek-harness/codex/history-packed-transport
perf(history): carry packed assistant chunks
2026-08-25 20:39:45 +08:00
imccyu 27b8d6fe97 fix(chat): exclude packed deltas from token fold 2026-08-25 20:25:23 +08:00
_Kerman f436c888aa Merge remote-tracking branch 'origin/master' into xtr/message-tool-call-id 2026-08-25 20:24:54 +08:00
_Kerman d79ff0b589 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2781 2026-08-25 20:15:26 +08:00
imccyu d3efd9c35d fix(conversation): restore merge-map lint scope 2026-08-25 20:15:07 +08:00
imccyu adddc4dea6 test(history): cover packed record branches 2026-08-25 20:15:07 +08:00
imccyu f37bb35a97 perf(conversation): fold packed assistant history 2026-08-25 20:15:06 +08:00
imccyu 1ec75c9082 perf(history): retain packed records in client 2026-08-25 20:13:54 +08:00
pku-xht ea3284b1af Merge commit '0c177e17a23692d018a79bae59ac9a2db6eba59c' into codex/product-subagent-runtime-refresh-codex 2026-08-25 20:11:56 +08:00
imccyu 20d55b2c41 feat(gateway): support ranged journal entries 2026-08-25 20:10:50 +08:00
kingwl 4f02717ebc fix(e2e): decode packed history records 2026-08-25 20:10:50 +08:00
kingwl 04c0758fe9 fix(history): adapt packed pages to session journal 2026-08-25 20:10:43 +08:00
kingwl 055c505c6d test(history): measure complete response parsing 2026-08-25 20:10:43 +08:00
kingwl 86e79b5886 test(history): label synthetic timing totals 2026-08-25 20:10:43 +08:00
kingwl 5171e107e0 test(history): measure end-to-end timing stages 2026-08-25 20:10:43 +08:00
kingwl a47e80678e fix(history): preserve per-delta replay 2026-08-25 20:10:43 +08:00
kingwl 3511796fa6 test(web): await completed turn footers 2026-08-25 20:10:43 +08:00
kingwl ea282f5710 test(history): measure packed heap usage 2026-08-25 20:10:43 +08:00
kingwl dec9732d1f test(history): add packed transport benchmark 2026-08-25 20:10:43 +08:00
kingwl f2ca913756 perf(history): carry packed assistant chunks 2026-08-25 20:10:42 +08:00
CreatixChu e2a10b141e Merge pull request #3014 from deepseek-harness/worktree/2848-image-token-pressure
feat(llm): 在 compaction 中按路由为图片请求压力计价
2026-08-25 20:10:28 +08:00
_Kerman 3f34c026e3 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2781 2026-08-25 20:04:32 +08:00
creatixchu e497ea69b1 Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 19:56:17 +08:00
Yichen Jiang effbffbff1 test(web): drive the streaming-fence prompt through the composer surface
The scenario landed on master with a textarea locator; the composer is a
Lexical contenteditable surface here, so the fill waited 30s for a node
that never exists. Use the shared per-key draft helper against
[data-composer-input] like the other composer scenarios.
2026-08-25 19:55:45 +08:00
pku-xht b4b18715ad Merge pull request #2868 from deepseek-harness/codex/dsh-sdk-dynamic-subagent-routing
feat(subagent): carry model routing through DSH SDK
2026-08-25 19:54:24 +08:00
pku-xht ddbe5abac8 Merge commit '80d68a54120fc87e6b354e41562a9fbfd6874e48' into codex/dsh-sdk-minimal-diagnostics 2026-08-25 19:52:38 +08:00
pku-xht d149e6f222 Merge commit '80d68a54120fc87e6b354e41562a9fbfd6874e48' into codex/product-subagent-runtime-refresh-codex
# Conflicts:
#	examples/acp-agent/tests/snapshots/product-subagent-result-diagnostic/stdout.expected.jsonl
#	snapshots/session/product-subagent-result-diagnostic/session.jsonl
2026-08-25 19:42:47 +08:00
pku-xht 170c640bdf Merge commit '80d68a54120fc87e6b354e41562a9fbfd6874e48' into codex/dsh-sdk-dynamic-subagent-routing 2026-08-25 19:38:11 +08:00
pku-xht 4d54bfdff3 test(snapshot): refresh DSH SDK route schemas 2026-08-25 19:36:55 +08:00
Yichen Jiang e177571236 Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614
# Conflicts:
#	.agents/notes/archived/manifest.json
#	apps/web/tests/reference-composer.e2e.ts
#	pnpm-lock.yaml
2026-08-25 19:35:55 +08:00
pku-xht b57d378e7d Merge commit '74a6e1e5cf520cdde8bf461d9051c81142fd6afe' into codex/dsh-sdk-minimal-diagnostics 2026-08-25 19:33:48 +08:00
pku-xht 24e7d55ec6 Merge pull request #2869 from deepseek-harness/codex/product-subagent-runtime-refresh-claude-code
feat(subagent): configure Claude Code provider models
2026-08-25 19:33:08 +08:00
Yichen Jiang 47067a8ad2 Merge remote-tracking branch 'origin/master' into worktree/session-turn-nav-styling-7715ae
# Conflicts:
#	packages/client/ui-chat/README.i18n.yaml
#	packages/client/ui-chat/README.md
#	packages/client/ui-chat/README.zh.md
#	snapshots/web/cordis-tool-round/ui.expected.md
#	snapshots/web/message-actions/ui.expected.md
#	snapshots/web/seeded-history/command-row.expected.md
#	snapshots/web/seeded-history/feedback-row.expected.md
#	snapshots/web/seeded-history/ui.expected.md
#	snapshots/web/subagent-conversation/ui.expected.md
2026-08-25 19:32:16 +08:00
pku-xht 08aed20139 test(ci): stabilize cross-platform consumer gates 2026-08-25 19:27:34 +08:00
pku-xht d372dceee1 Merge commit '74a6e1e5cf520cdde8bf461d9051c81142fd6afe' into codex/dsh-sdk-dynamic-subagent-routing 2026-08-25 19:25:22 +08:00
pku-xht 88f518097b Merge commit '74a6e1e5cf520cdde8bf461d9051c81142fd6afe' into codex/product-subagent-runtime-refresh-claude-code 2026-08-25 19:15:55 +08:00
pku-xht f217795644 Merge commit 'a0e4561b88e76172dd779bef4b5e8c454550c3e9' into codex/dsh-sdk-minimal-diagnostics 2026-08-25 19:10:14 +08:00
lsdsjy ad1156eb0b Merge pull request #2904 from deepseek-harness/feat/headless-reasoning-progress
feat(headless): stream reasoning progress to stderr
2026-08-25 19:09:47 +08:00
ZiyaandZiyaZhang b565df3442 feat(web): show exact per-turn token usage (#3005)
* feat(web): show exact per-turn token usage

* test(runtime): refresh exact token usage snapshots

* refactor(token-meter): own per-turn usage folding

* perf(ui-chat): bound paging anchor layout reads

* test(web): align usage golden with system prompt row

* fix(test): resolve token-meter client from source

* test(token-meter): cover retry without usage

---------

Co-authored-by: ZiyaZhang <[email protected]>
2026-08-25 19:05:52 +08:00
lsdsjy 7c7e4aada8 fix(snapshot): project headless reasoning stderr 2026-08-25 18:51:37 +08:00
lsdsjy 3a9820c8cb fix(headless): make stream chunk handling exhaustive 2026-08-25 18:51:37 +08:00
lsdsjy 2813ef2a95 fix(headless): preserve reasoning block continuity 2026-08-25 18:51:37 +08:00
lsdsjy 937d2b3513 feat(headless): stream reasoning progress to stderr 2026-08-25 18:51:37 +08:00
pku-xht 2a9b940ef5 feat(web): list active reminders in the session header 2026-08-25 18:50:50 +08:00
lsdsjy 4f3f716de7 Merge pull request #2765 from deepseek-harness/fix/str-replace-null-insert-line
fix(fs): tolerate null editor placeholders
2026-08-25 18:47:34 +08:00
pku-xht 847c13a117 test(cli): allow Windows help smoke startup budget 2026-08-25 18:46:42 +08:00
pku-xht b274f5e606 test: refresh dynamic route prompts after master 2026-08-25 18:39:26 +08:00
pku-xht 09fcf48ad8 test(snapshot): refresh DSH diagnostic prompt 2026-08-25 18:32:13 +08:00
pku-xht 311d565ace Merge commit '8385aeecf95a4b842e8c317ab75ce26cafe8ba90' into codex/dsh-sdk-dynamic-subagent-routing 2026-08-25 18:31:27 +08:00
pku-xht b9cd0d0c93 test: declare loader fixture skill dependency 2026-08-25 18:29:13 +08:00
pku-xht e52b940781 Merge master into codex/dsh-sdk-minimal-diagnostics 2026-08-25 18:28:47 +08:00
lsdsjy 5c98d5ece8 fix(fs): tolerate null editor placeholders 2026-08-25 18:28:09 +08:00
pku-xht 7e234bb5b9 test(ci): stabilize required snapshot and Windows lanes 2026-08-25 18:27:06 +08:00
Dudu-0223 ee57508c26 Merge pull request #2985 from deepseek-harness/fix/web-fetch-ssrf
feat(web): enable public WebFetch by default
2026-08-25 18:25:58 +08:00
pku-xht c97f985caa test: stabilize post-merge integration fixtures 2026-08-25 18:22:42 +08:00
Dudu-0223 560729be76 ci(windows): serialize native test files 2026-08-25 18:12:03 +08:00
pku-xht c2fb21d13a Merge commit 'ead58a4a476200de2a2f2549ef6a02e73752b618' into codex/dsh-sdk-dynamic-subagent-routing
# Conflicts:
#	.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md
#	.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md
#	examples/python-sdk-agent/tests/sdk.snapshot.ts
#	packages/sdk/client/README.i18n.yaml
#	packages/sdk/client/README.md
#	packages/sdk/client/README.zh.md
#	packages/sdk/client/src/types.ts
#	packages/sdk/protocol/README.i18n.yaml
#	packages/sdk/protocol/README.md
#	packages/sdk/protocol/README.zh.md
#	packages/sdk/server/src/server.ts
#	packages/subagent/subagent-dsh-sdk/tests/fixtures/loader/snapshot.cordis.yml
#	packages/subagent/subagent-dsh-sdk/tests/fixtures/loader/snapshot.replay.cordis.yml
2026-08-25 18:01:08 +08:00
pku-xht 19fe4ffb1b Merge commit 'ead58a4a476200de2a2f2549ef6a02e73752b618' into codex/product-subagent-runtime-refresh-claude-code
# Conflicts:
#	examples/acp-agent/tests/snapshots/product-subagent-result-diagnostic/stdout.expected.jsonl
#	snapshots/session/product-subagent-result-diagnostic/session.jsonl
2026-08-25 17:54:09 +08:00
creatixchu a6f2149472 Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure
# Conflicts:
#	packages/subagent/subagent-acp/tests/subagent-acp.spec.ts
2026-08-25 17:51:27 +08:00
pku-xht c386957475 Merge commit 'ead58a4a476200de2a2f2549ef6a02e73752b618' into codex/dsh-sdk-minimal-diagnostics 2026-08-25 17:22:27 +08:00
Dudu-0223 aeb83639c4 Merge remote-tracking branch 'origin/master' into fix/web-fetch-ssrf
# Conflicts:
#	packages/subagent/subagent-acp/tests/subagent-acp.spec.ts
2026-08-25 17:20:48 +08:00
Dudu-0223 b68f36a1ca test(web): authenticate folding snapshot 2026-08-25 17:20:06 +08:00
Chinesezjc 9bb3a5e262 Merge pull request #3059 from deepseek-harness/fix/subagent-acp-skip-ts
fix(subagent-acp): correct it.skipIf call arity
2026-08-25 17:19:53 +08:00
Chinesezjc c26a3351c4 fix(subagent-acp): correct it.skipIf call arity
it.skipIf takes only the condition; passing a reason string as a second
argument breaks tsc and fails every build. Move the explanation to a comment.
2026-08-25 17:19:32 +08:00
creatixchu 1ca08183a6 test(web): authenticate folding snapshot page 2026-08-25 17:14:23 +08:00
Dudu-0223 637e029365 fix(subagent-acp): use supported skipIf signature 2026-08-25 17:10:03 +08:00
Dudu-0223 2abd486f8f Merge remote-tracking branch 'origin/master' into fix/web-fetch-ssrf 2026-08-25 17:07:57 +08:00
Dudu-0223 f858caa9c2 test(subagent-acp): skip half-close cases on Windows 2026-08-25 17:07:31 +08:00
creatixchu 89b50d3f1c test(subagent): exercise proxy EOF on Windows 2026-08-25 17:04:35 +08:00
creatixchu 771311eb6f Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 17:03:42 +08:00
creatixchu 903d9732aa test(subagent): close ACP protocol portably 2026-08-25 17:02:50 +08:00
Chinesezjc af4e529149 Merge pull request #3055 from deepseek-harness/fix/windows-coverage-timeout-60s
test(subagent-acp): skip stdout half-close tests on Windows
2026-08-25 17:02:43 +08:00
Chinesezjc ac2f00070e ci(windows): make windows-coverage temporarily non-blocking
Other PRs are blocked by Windows ACP half-close tests timing out. Keep the
coverage job running for signal, but remove it from all-checks-passed.needs
until the Windows skip fix is validated.
2026-08-25 17:02:16 +08:00
lsdsjy fd0ed9fed4 Merge pull request #2845 from deepseek-harness/fix/workspace-new-session-fold-quota
fix(ui-workspace): keep blank new sessions outside the fold quota
2026-08-25 16:57:41 +08:00
Chinesezjc eea3c132ff test(subagent-acp): skip stdout half-close tests on Windows
Windows anonymous pipes do not surface a child stdout EOF while the child
process stays alive. The three tests that simulate 'child closes protocol but
stays alive' therefore cannot be reproduced on Windows and hang until the
test timeout. Skip them on win32.
2026-08-25 16:36:28 +08:00
pku-xht 12dadc1f24 Merge commit '562d15dbb637e5eb15ddafd9167a21ee75b14d91' into codex/dsh-sdk-minimal-diagnostics
# Conflicts:
#	.github/workflows/ci.yml
#	scripts/ci-workflow.spec.ts
2026-08-25 16:33:17 +08:00
creatixchu 4dca5359a2 test(subagent): make ACP coverage platform-independent 2026-08-25 16:29:36 +08:00
pku-xht 0e632c82d0 Merge master into codex/dsh-sdk-minimal-diagnostics 2026-08-25 16:18:27 +08:00
Chinesezjc 5e7c567dc8 test(subagent-acp): double the per-test timeout relative to default
These tests spawn real ACP child subprocesses. On contended self-hosted
Windows runners the default 30s budget times out. Instead of raising the
global coverage timeout, give this file 2x the configured default
(DSH_COVERAGE_TEST_TIMEOUT_MS) so it follows future default changes.
2026-08-25 16:07:38 +08:00
Dudu-0223 6199f477de test(snapshot): sync web search trust prompt 2026-08-25 16:04:38 +08:00
creatixchu 1f288ede79 test(snapshot): refresh image request header 2026-08-25 15:59:44 +08:00
Chinesezjc 3073107ec4 ci(windows): raise coverage test timeout to 60s
After the 4-partition split, other PRs' windows coverage now fails on
process-bound subagent-acp tests timing out at 30s under self-hosted
concurrency. Give the coverage lane the same 60s per-test budget that the
earlier failover profile used.
2026-08-25 15:56:32 +08:00
Dudu-0223 44468d4583 Merge remote-tracking branch 'origin/master' into fix/web-fetch-ssrf 2026-08-25 15:53:46 +08:00
creatixchu eea65e5275 Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 15:52:17 +08:00
creatixchu 68be3e2270 test(subagent): stabilize ACP process coverage 2026-08-25 15:51:54 +08:00
imccyu a1781cc4a8 Merge pull request #3054 from deepseek-harness/worktree-revert2698
revert(session): remove streaming format migration pipeline
2026-08-25 15:47:19 +08:00
07akioni e5dbb368cd Merge pull request #2631 from deepseek-harness/worktree/fix-web-chat-system-prompt
fix(web): show system prompts in chat
2026-08-25 15:41:43 +08:00
imccyu 211e6939e3 Revert "Merge pull request #2698 from deepseek-harness/xtr/session-format-migration"
This reverts commit 4b592eb90df20dc53dd12215921d5a9137214777, reversing
changes made to d15d3275d905e4d21229cd70a074388a428189d1.
2026-08-25 15:30:10 +08:00
creatixchu bb03d8e305 Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 15:24:43 +08:00
Dudu-0223 6625c94449 Merge branch 'master' into fix/web-fetch-ssrf 2026-08-25 15:24:04 +08:00
Chinesezjc 5e3c04276e Merge pull request #3042 from deepseek-harness/test/windows-coverage-4-partitions
test(windows): lower coverage partitions 8->4 to reduce worker startup pressure
2026-08-25 15:22:39 +08:00
creatixchu b2701b4ef9 Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 15:20:59 +08:00
Dudu-0223 8da063441b Merge remote-tracking branch 'origin/master' into fix/web-fetch-ssrf 2026-08-25 15:17:09 +08:00
pku-xht 79fcf8481b Merge pull request #2870 from deepseek-harness/codex/acp-minimal-diagnostics
fix(subagent): preserve actionable ACP failure facts
2026-08-25 15:16:26 +08:00
_Kerman 96db1c8c81 fix(snapshot): canonicalize cache-split chunk runs 2026-08-25 15:10:26 +08:00
creatixchu d978d6f90c Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 15:04:56 +08:00
pku-xht 13f373f0ce Merge master into codex/acp-minimal-diagnostics 2026-08-25 14:49:59 +08:00
Yichen Jiang 1272c7d0df perf(web): accumulate the Turn rail instead of scanning the loaded window
The rail's items now ride the Chat snapshot: a structural upsert re-derives
the loaded Turn set, a content-only upsert re-derives only the Turns whose
nodes changed, and each preview is capped so navigation state never holds a
copy of the transcript. The published array keeps its identity until an item
changes, so ChatView selects it as both data and change signal — and a
streaming reply's preview follows the in-place node update instead of the
last structural publication.

A scroll frame resolves the active mark with one hit test at the reading
line, falling back to a single row scan, rather than a DOM query per mark.
Flow-height changes resync through the existing column observer, navigating
during a pending page keeps the paging anchor, and the rail height no longer
holds a floor taller than the band it centers in.
2026-08-25 14:46:38 +08:00
Dudu-0223 8e681a66b9 Merge origin/master into fix/web-fetch-ssrf 2026-08-25 14:46:26 +08:00
_Kerman 38355623a2 Merge remote-tracking branch 'origin/master' into xtr/projection-per-session-cache
# Conflicts:
#	packages/bundle/web-app/README.i18n.yaml
#	packages/bundle/web-app/README.md
#	packages/bundle/web-app/README.zh.md
2026-08-25 14:45:03 +08:00
07akioni 61b65d3147 fix(web): show system prompts in chat
Render reconstructable system prompts at each request-series boundary, preserve series declarations through pre-step wrappers, and keep the presentation and replay snapshots aligned across clients.
2026-08-25 14:44:08 +08:00
_Kerman 804db36546 Merge remote-tracking branch 'origin/master' into xtr/message-tool-call-id 2026-08-25 14:42:35 +08:00
Tianyi Cui 5e868ef2c6 Merge pull request #3033 from deepseek-harness/worktree/fix-2090-web-auth
fix(web): authenticate the browser Host API
2026-08-25 14:40:58 +08:00
Dudu-0223 aaf0924b48 Merge origin/master into fix/web-fetch-ssrf 2026-08-25 14:40:51 +08:00
_Kerman b588675ccf Merge remote-tracking branch 'origin/master' into xtr/projection-per-session-cache
# Conflicts:
#	pnpm-lock.yaml
2026-08-25 14:40:22 +08:00
_Kerman f34c5f9838 Merge remote-tracking branch 'origin/master' into xtr/message-tool-call-id 2026-08-25 14:38:20 +08:00
creatixchu a235f48c69 Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 14:37:52 +08:00
_Kerman 9365ef496d Merge remote-tracking branch 'origin/master' into xtr/message-tool-call-id
# Conflicts:
#	packages/acp/acp/tests/approval.spec.ts
#	packages/acp/acp/tests/edges.spec.ts
#	packages/api/session-controller/tests/event-script.client.ts
#	packages/client/connection/src/client/fixture.ts
#	packages/client/ui-conversation/src/client/contract/slots.ts
#	packages/client/ui-conversation/src/client/contract/views.ts
#	packages/client/ui-conversation/src/client/index.ts
#	packages/client/ui-conversation/src/client/stores.ts
#	packages/core/agent-loop/tests/loop.spec.ts
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/events.ts
#	packages/host/apiproxy/tests/api-proxy-view.spec.ts
#	packages/interaction/user-approval/src/index.ts
#	packages/llm/llm-deepseek/tests/adapter.e2e.ts
#	packages/llm/llm-pi-ai/src/context.ts
#	packages/llm/llm-pi-ai/tests/context.spec.ts
#	packages/llm/llm/tests/content.spec.ts
#	packages/subagent/subagent/tests/continuation.spec.ts
#	packages/subagent/tool-subagent/tests/tool-subagent.spec.ts
#	packages/test-support/llm-replay/tests/llm-replay.spec.ts
#	packages/todo/tool-todo/tests/tool-todo.spec.ts
#	scripts/gen-persistence-catalog.ts
2026-08-25 14:37:44 +08:00
lsdsjy 9d25fbf218 fix(ui-workspace): keep blank new sessions outside the fold quota
Keep five non-blank rows stable while the selected blank New Session is provisional, and derive the overflow count from the rows still hidden.

Fixes #2841
2026-08-25 14:36:56 +08:00
Yichen Jiang c612f2071d Merge pull request #3046 from deepseek-harness/worktree/fix-persistent-bash-pipeline-readiness
fix(pty): distinguish pipeline reads from terminal input
2026-08-25 14:33:37 +08:00
_Kerman 2c17b3048e fix(bundle): enable projection cache in base-backed profiles 2026-08-25 14:33:05 +08:00
pku-xht 8bab9d1731 Merge commit '7ef7175ff0c16623ab4e43187d1ecc29820b3909' into codex/acp-minimal-diagnostics 2026-08-25 14:31:14 +08:00
pku-xht f7a885a522 Merge commit '4b592eb90df20dc53dd12215921d5a9137214777' into codex/acp-minimal-diagnostics
# Conflicts:
#	apps/cli/tests/profiles/acp/tests/snapshots/subagent-acp-diagnostic/input.json
#	apps/cli/tests/profiles/acp/tests/snapshots/subagent-acp-diagnostic/replay.override.json
#	apps/cli/tests/profiles/acp/tests/snapshots/subagent-acp-diagnostic/session.jsonl
#	apps/cli/tests/profiles/acp/tests/snapshots/subagent-acp-diagnostic/stdout.expected.jsonl
#	apps/cli/tests/profiles/acp/tests/snapshots/subagent-acp-diagnostic/tool-schemas.expected.json
#	examples/acp-agent/tests/acp.snapshot.ts
#	packages/subagent/subagent-acp/src/run.ts
#	packages/subagent/subagent-acp/tests/mock-acp-server.ts
2026-08-25 14:28:36 +08:00
Yichen Jiang ba84299c98 test(web): record the Turn rail in every affected aria golden
The rail is a landmark on every Chat wide enough to show it, so each
recorded conversation with at least two loaded Turns now carries the
navigation node and its marks.
2026-08-25 14:26:10 +08:00
Dudu-0223 797c711e11 refactor(web): remove fetch approval policy 2026-08-25 14:25:12 +08:00
Tianyi Cui 4de11c0229 test(web): authenticate streaming fence scaffold 2026-08-25 14:23:47 +08:00
Tianyi Cui b43d0934f7 test(web): keep credential fixtures package-local 2026-08-25 14:23:47 +08:00
Tianyi Cui 9c964848cd fix(web): keep browser authentication synchronous 2026-08-25 14:23:47 +08:00
Tianyi Cui 5595d593d1 docs(web): state authentication contracts directly 2026-08-25 14:23:47 +08:00
Tianyi Cui 3b3b493a96 fix(web): retain launch token across reloads 2026-08-25 14:23:46 +08:00
Tianyi Cui ce031ddd16 fix(web): cover authenticated host runtimes 2026-08-25 14:23:46 +08:00
Tianyi Cui 3e24087bfa fix(web): authenticate the browser Host API 2026-08-25 14:23:45 +08:00
Yichen Jiang a3f67137bc test(pty): cover restricted proc syscall access 2026-08-25 14:19:56 +08:00
creatixchu 718dd4d1b4 Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 14:19:37 +08:00
Yichen Jiang 19c772f46c Merge pull request #3036 from deepseek-harness/worktree/system-prompt-order-bands
fix(system-prompt): centralize sparse section orders
2026-08-25 14:16:26 +08:00
_Kerman ee2ee398ce test(credentials-local): seed fixtures atomically to close a boot-read race
The concurrent-migrator test wrote the winner document with a plain
writeFile, whose truncate-then-write window lets the boot's unlocked
initial read observe an empty file and boot an empty store under load.
Seed fixtures through writeFileAtomic instead, matching how the provider
itself persists, so a reader sees either the old or the new complete
document.
2026-08-25 14:13:06 +08:00
Yichen Jiang 133ed2d0f0 test(pty): report proc state on readiness failure 2026-08-25 14:08:30 +08:00
creatixchu 0d9bdccb7b Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 14:03:24 +08:00
Yichen Jiang d38ff54150 feat(web): navigate loaded Chat Turns from a compact rail
ChatView derives one navigation mark per currently loaded Turn, keyed by
Turn number and anchored on that Turn's first loaded user node. The rail
sits against the scrollport's right edge, centered in the band the sticky
composer leaves visible; hover and keyboard focus preview the Turn's
prompt and response, and activating a mark moves the shared scrollport
and records the resulting restoration anchor.

ConversationRoot publishes --dsh-conversation-viewport-height beside the
composer height it already measures on the scrollport, so floating View
chrome can center in that band without assuming a Session header height.
2026-08-25 14:02:57 +08:00
creatixchu 4309dab24b fix(snapshot): honor ACP-local sidecar sources 2026-08-25 14:02:12 +08:00
Yichen Jiang 2338f4ad14 fix(pty): detect emulated kernel syscall ABI 2026-08-25 14:01:04 +08:00
07akioni 1ddee605dc Merge pull request #2857 from deepseek-harness/fix/streaming-fence-highlight
feat(web): keep code-fence syntax highlighting while streaming
2026-08-25 14:00:45 +08:00
Yichen Jiang 152d949f3e Merge remote-tracking branch 'origin/master' into worktree/system-prompt-order-bands 2026-08-25 13:53:44 +08:00
_Kerman 3fefcdbe3f Merge pull request #2698 from deepseek-harness/xtr/session-format-migration
feat(session): add streaming format migration pipeline
2026-08-25 13:47:43 +08:00
creatixchu bcdbd85d15 Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure 2026-08-25 13:43:45 +08:00
Yichen Jiang 5467685bc1 fix(pty): identify waiting thread terminals 2026-08-25 13:35:53 +08:00
Chinesezjc bea14f9fcd docs(i18n): re-record translation pairing sidecars after partition update 2026-08-25 13:32:23 +08:00
Chinesezjc 16dbf73348 docs(windows): sync native CI note to 4 coverage partitions 2026-08-25 13:23:22 +08:00
Chinesezjc a813b487ab docs(coverage): update Agent Note for Windows 4-partition alignment
The PR changes native Windows coverage partitions from 8 to 4 to reduce
vitest worker startup pressure under high self-hosted concurrency. Sync the
implemented Agent Note (EN/ZH) so the decision record no longer says Windows
is fixed at 8, and revise the same-partition-count alternative accordingly.
2026-08-25 13:17:22 +08:00
_Kerman 2664200844 Merge remote-tracking branch 'github/master' into xtr/session-format-migration 2026-08-25 13:04:23 +08:00
_Kerman e5a41d164b Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2781 2026-08-25 13:04:04 +08:00
07akioni 1825cb4657 feat(client): highlight streaming fences incrementally
Keep recognized code fences syntax-highlighted while assistant text streams. Preserve completed Shiki token lines across chunks, mirror token styles and CRLF handling, and retain plain rendering for unsupported or math-like fences.

Add unit, DOM-parity, and keyless assembled-Web coverage for the streaming-to-settled transition.

Closes #1499
2026-08-25 12:59:21 +08:00
Yichen Jiang 9a12505f86 fix(pty): distinguish pipeline reads from terminal input 2026-08-25 12:54:55 +08:00
Tianyi Cui 78b9b9d499 Merge pull request #3032 from deepseek-harness/worktree/post-2958-simplifications-20260824
refactor: remove post-#2958 redundancy
2026-08-25 12:51:51 +08:00
_Kerman e62d6d3d15 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2781 2026-08-25 12:49:32 +08:00
Chinesezjc 58cc29b4f1 test(windows): split native job into build/coverage/native-tests/observational
Keep the 4-partition coverage profile, split the monolithic windows-native
job into smaller required jobs (build, coverage, native-tests) plus a
non-blocking observational job. Update ci-workflow.spec for the new topology.
2026-08-25 12:45:47 +08:00
_Kerman d385dfb3e3 Merge remote-tracking branch 'github/master' into xtr/session-format-migration
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/session/session-persistence-jsonl/src/index.ts
#	packages/session/session-persistence/src/coordinator.ts
#	packages/session/session-persistence/src/index.ts
2026-08-25 12:41:23 +08:00
Tianyi Cui 7e6193acca refactor(cli): keep config dumps out of runtime healing 2026-08-25 12:21:51 +08:00
Tianyi Cui 8146557ef5 refactor(python): keep launch override on client 2026-08-25 12:21:51 +08:00
Tianyi Cui aa801a418a test(python): share advanced runtime profile patch 2026-08-25 12:21:51 +08:00
Tianyi Cui d0e8f5f9c4 test(sdk): leave model surface to packaged snapshot 2026-08-25 12:21:50 +08:00
Tianyi Cui 43f0f07f9b refactor(prompt): remove unused complete-persona config 2026-08-25 12:21:50 +08:00
Tianyi Cui d35459e3c1 refactor(sdk): remove unused root tool filter 2026-08-25 12:21:50 +08:00
Yichen Jiang 145e060992 Merge remote-tracking branch 'origin/master' into worktree/system-prompt-order-bands 2026-08-25 12:07:56 +08:00
Yichen Jiang 8020f6386d docs(system-prompt): sync first-party order references 2026-08-25 12:05:38 +08:00
Chinesezjc 55ef5aad06 test(windows): try 4 coverage partitions instead of 8
Under high self-hosted concurrency, 8 partitions per Windows native job
triggered vitest fork worker startup timeouts. This branch lowers Windows
coverage to the same 4 partitions Linux uses, trading some single-job
coverage wall time for lower process-creation pressure.
2026-08-25 12:02:21 +08:00
creatixchu 106e5ce0bc feat(bundle): default session telemetry to feedback-gated sharing 2026-08-25 12:00:24 +08:00
CreatixChu 09eda93884 Merge pull request #3009 from deepseek-harness/worktree/2986-trajectory-image-attachments
feat(web): 在 Trajectory 中展示图片附件
2026-08-25 12:00:24 +08:00
Yichen Jiang 07319c011d test(web): share the per-key composer draft helper
CI hit the same dropped-fill race in lifecycle-chrome's slash-menu
sequence that the folder scenario hit: fill()'s single-task select-all +
edit lands on a Lexical selection that has not absorbed the DOM
selection after a trigger-menu interaction, so the previous draft
survives and poisons the next test. Promote the per-key gesture to
support.ts and use it at both proven-fragile sites.
2026-08-25 11:52:10 +08:00
_Kerman ce65310183 fix(ci): keep the base projection cache out of listing-less profiles
The base-mounted projection cache's write-behind forces session-log flushes
at cache-chosen times, splitting packed chunk rows and changing the durable
JSONL batching the keyless headless and sdk replay fixtures pin. Neither
profile exposes a session-listing surface — the one-shot runner and the SDK
protocol — so both bundles disable the base row, restoring the pre-base
behavior the fixtures were recorded against (the same pattern acp-app uses).
2026-08-25 11:48:12 +08:00
Dudu-0223 04e946ed8b test(web): refresh fetch and trust snapshots 2026-08-25 11:37:22 +08:00
Yichen Jiang 0f7b28ad31 test(snapshot): refresh web prompt pins 2026-08-25 11:33:21 +08:00
Yichen Jiang 4d859cc062 test(web): align system-prompt pins with the reference guidance
The pinned prompts were recorded on master before this branch's
file-reference guidance rewrite; refresh them so the pin carries the
directory-aware wording the assembly now produces.
2026-08-25 11:27:30 +08:00
Yichen Jiang 5b3bfbed42 test(snapshot): refresh prompt order pins 2026-08-25 11:24:25 +08:00
Dudu-0223 433aab2724 test(web): refresh fetch tool schema snapshots 2026-08-25 11:22:42 +08:00
Dudu-0223 1af98028fa test(web): refresh external content prompt snapshots 2026-08-25 11:17:25 +08:00
creatixchu 1c065f3cd4 Merge remote-tracking branch 'origin/master' into worktree/2848-image-token-pressure
# Conflicts:
#	apps/cli/tests/profiles/acp/image-compaction.cordis.snapshot.yml
#	apps/cli/tests/profiles/acp/image-compaction.cordis.yml
#	apps/cli/tests/profiles/acp/tests/snapshots/image-compaction/input.json
#	apps/cli/tests/profiles/acp/tests/snapshots/image-compaction/session.jsonl
#	apps/cli/tests/profiles/acp/tests/snapshots/image-compaction/stdout.expected.jsonl
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	examples/acp-agent/tests/acp.snapshot.ts
#	packages/llm/token-meter/README.i18n.yaml
#	packages/llm/token-meter/README.md
#	packages/llm/token-meter/README.zh.md
#	packages/llm/token-meter/src/index.ts
#	packages/llm/token-meter/src/surface-fold.ts
2026-08-25 11:15:35 +08:00
Yichen Jiang 55eeaf6565 docs: refresh module graph 2026-08-25 11:12:21 +08:00
creatixchu 9c931ef5a8 fix: 修正轨迹图片测试归属 2026-08-25 11:06:17 +08:00
Yichen Jiang 43ac97b554 fix(system-prompt): centralize sparse section orders 2026-08-25 11:06:01 +08:00
_Kerman 3c8b5a26a4 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2781
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/subsystems/session-projection.i18n.yaml
#	docs/subsystems/session-projection.md
#	docs/subsystems/session-projection.zh.md
#	packages/api/session-controller/src/history.ts
#	packages/api/session-controller/tests/session-cold.host.spec.ts
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/session/session-projection-cache/src/index.ts
#	packages/session/session-projection-cache/tests/cache.spec.ts
#	packages/session/session-projection/src/index.ts
#	scripts/run-gates.ts
2026-08-25 10:52:45 +08:00
creatixchu dde6c8d7fc Merge remote-tracking branch 'origin/master' into worktree/2986-trajectory-image-attachments 2026-08-25 10:50:06 +08:00
Yichen Jiang e71688c1fe test(web): write folder queries with per-key gestures
Directly after a chip deletion, fill()'s single-task select-all +
insertText lands on a Lexical selection that has not absorbed the DOM
selection yet and is dropped, leaving the previous draft in place. Real
keystrokes leave room for selectionchange between keys, matching what a
user's typing does.
2026-08-25 10:42:40 +08:00
Yichen Jiang 0a247137f0 Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614
# Conflicts:
#	apps/web/tests/composer-draft-scroll.e2e.ts
#	apps/web/tests/expected/reference-composer/caret-edits.expected.md
#	apps/web/tests/startup-auto-selection.e2e.ts
#	pnpm-lock.yaml
2026-08-25 10:42:32 +08:00
hypatiamay 0c5aa8110f Merge pull request #2999 from deepseek-harness/perf/token-meter-surface-fold-plan-commit
perf(token-meter): commit the surface fold in place through a plan/commit pair
2026-08-25 10:28:11 +08:00
Dudu-0223 8bf8e42b63 Merge remote-tracking branch 'origin/master' into fix/web-fetch-ssrf 2026-08-25 09:38:28 +08:00
Dudu-0223 070a180a10 Merge remote-tracking branch 'origin/master' into fix/web-fetch-ssrf
# Conflicts:
#	examples/acp-agent/tests/acp.snapshot.ts
#	examples/acp-agent/tests/snapshots/web-fetch/input.json
#	examples/acp-agent/tests/snapshots/web-fetch/stdout.expected.jsonl
#	knip.json
#	packages/test-support/session-snapshot/tests/fixtures/web-fetch-network.ts
#	snapshots/sdk/subagent-mixed/session.1.jsonl
#	snapshots/sdk/subagent-mixed/session.2.jsonl
#	snapshots/session/advanced-toolchain-runtime/session.1.jsonl
#	snapshots/session/advanced-toolchain-runtime/session.2.jsonl
#	snapshots/session/subagent-depth-two-rejection/session.1.jsonl
#	snapshots/session/subagent-depth-two-rejection/session.2.jsonl
#	snapshots/session/subagent-multi/session.1.jsonl
#	snapshots/session/subagent-multi/session.2.jsonl
#	snapshots/session/subagent-parallel/session.1.jsonl
#	snapshots/session/subagent-parallel/session.2.jsonl
#	snapshots/session/web-fetch/session.jsonl
#	snapshots/session/web-fetch/web-fetch-fixture-server.mjs
2026-08-25 09:14:36 +08:00
imccyu 8bb358d935 Merge pull request #2674 from deepseek-harness/feat/http-gzip
为 Web 静态资源与 API 响应增加 gzip 协商压缩
2026-08-25 06:58:58 +08:00
imccyu 78184a6ee1 fix(webworker): inline combo source maps 2026-08-25 06:43:25 +08:00
imccyu 60089680f9 test(webworker): keep bundle transport on host face 2026-08-25 06:43:25 +08:00
imccyu 075a46cdec fix(client): preserve combo source identities 2026-08-25 06:43:25 +08:00
imccyu b3081bb4be fix(webworker): retain third-party runtime sources 2026-08-25 06:43:25 +08:00
imccyu 83463aa896 feat(client): use bounded plugin combo URLs 2026-08-25 06:43:24 +08:00
imccyu 08ed5a54a8 refactor(webserver): minimize HTTP gzip integration 2026-08-25 06:43:24 +08:00
imccyu fc4c0a02eb Merge pull request #3029 from deepseek-harness/worktree-perfproj
perf(session): centralize cold observation and snapshot-first opening
2026-08-25 06:42:56 +08:00
imccyu 2b60227d08 docs(session): record observation and projection ownership 2026-08-25 06:23:10 +08:00
imccyu 059598de59 fix: c i 2026-08-25 06:19:23 +08:00
imccyu 1229292497 docs(session): refresh architecture and generated contracts 2026-08-25 06:10:25 +08:00
imccyu d2904a6c06 fixup! refactor(session): open journal streams from snapshots 2026-08-25 06:09:25 +08:00
imccyu f5f0448bee refactor(subagent): consume shared session observations 2026-08-25 06:09:25 +08:00
imccyu b8dfa8b892 fix(agent-presets): project selection and refresh client catalogs 2026-08-25 06:07:58 +08:00
imccyu 822d735356 feat(session): persist model selection and share its catalog 2026-08-25 06:07:42 +08:00
imccyu 69fad4b8db perf(session-controller): serve cache-first session state 2026-08-25 06:07:26 +08:00
imccyu e7952d82ed refactor(session): open journal streams from snapshots 2026-08-25 06:07:11 +08:00
imccyu 7fb2ca07e4 feat(session-query): add shared projected observations 2026-08-25 06:06:03 +08:00
imccyu 7f4cdc809c refactor(session-persistence): add borrowable prepared sessions 2026-08-25 06:05:50 +08:00
Dudu-0223 77e0b121df test(web): exercise fetch snapshot across build faces 2026-08-25 03:35:09 +08:00
Tianyi Cui f8b0ca046f Merge pull request #3028 from deepseek-harness/worktree/fix-windows-coverage-worker-exit
fix(ci): order native Windows coverage after build
2026-08-24 23:35:24 +08:00
Tianyi Cui aec6e4371a docs(ci): align Windows coverage capacity model 2026-08-24 23:33:18 +08:00
Tianyi Cui 10ba26dcf7 test(sqlite): decouple retry pacing from setup time 2026-08-24 23:06:05 +08:00
Tianyi Cui 97f9e2e402 fix(ci): serialize native Windows coverage after build 2026-08-24 22:36:02 +08:00
Tianyi Cui 084a1ac5f6 Merge pull request #2977 from deepseek-harness/worktree/remove-examples
refactor(repo): retire top-level examples
2026-08-24 14:17:05 +00:00
Tianyi Cui e73c8a9fce fix(repo): close examples migration review gaps 2026-08-24 22:02:44 +08:00
Tianyi Cui 3b090c3c1b fix(test): declare Loader fixture dependencies 2026-08-24 22:02:44 +08:00
Tianyi Cui 4125514a08 refactor(repo): retire top-level examples 2026-08-24 22:02:44 +08:00
Tianyi Cui e25463bc0a test(snapshot): cover Windows workspace symlinks 2026-08-24 22:02:38 +08:00
Tianyi Cui 59b156cb6c fix(test): refresh inherited session pins 2026-08-24 21:48:06 +08:00
Dudu-0223 2ac9072996 test(web): register snapshot network fixture 2026-08-24 21:47:19 +08:00
Dudu-0223 3b6cb9e83d Merge remote-tracking branch 'origin/master' into fix/web-fetch-ssrf
# Conflicts:
#	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/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-mixed/session.1.jsonl
#	examples/acp-agent/tests/snapshots/subagent-mixed/session.2.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-parallel/session.1.jsonl
#	examples/acp-agent/tests/snapshots/subagent-parallel/session.2.jsonl
2026-08-24 21:42:27 +08:00
Dudu-0223 709e5edaba fix(web): enforce approval before DNS resolution 2026-08-24 21:39:24 +08:00
pku-xht 0aafe0f8f8 test(subagent): align DSH SDK route evidence with profiles 2026-08-24 21:38:28 +08:00
pku-xht 9a6c94cb2f fix(sdk): gate prompts on route initialization 2026-08-24 21:38:28 +08:00
pku-xht 57eba4341c fix(subagent): narrow provider route defaults 2026-08-24 21:38:28 +08:00
pku-xht 096ae14db2 fix(subagent): bind preflight to provider route defaults 2026-08-24 21:38:28 +08:00
pku-xht 3c79979d1d fix(subagent): resolve DSH defaults before preflight 2026-08-24 21:38:28 +08:00
pku-xht 54e908df52 test: simplify DSH SDK route evidence 2026-08-24 21:38:28 +08:00
pku-xht 40f6205cdf test(snapshot): stabilize DSH SDK route usage 2026-08-24 21:38:28 +08:00
pku-xht 1044db218d feat(subagent): carry model routing through DSH SDK 2026-08-24 21:38:28 +08:00
Tianyi Cui 1232e61138 fix(test): align snapshots with merged tool routing 2026-08-24 21:37:58 +08:00
Tianyi Cui 6a74eec7a3 fix(test): reconcile snapshot corpus with merged parent 2026-08-24 21:37:58 +08:00
Tianyi Cui 920fe95be7 fix(test): refresh Goal UI from complete build 2026-08-24 21:37:58 +08:00
Tianyi Cui 8e23adcd28 fix(test): align snapshots with latest base 2026-08-24 21:37:58 +08:00
Tianyi Cui 84d172de3d fix(test): make Goal replay host-independent 2026-08-24 21:37:58 +08:00
Tianyi Cui 61cfe86f6e fix(test): stabilize rebased web fixtures 2026-08-24 21:37:58 +08:00
Tianyi Cui 6ea8a52e22 fix(test): harden snapshot corpus invariants 2026-08-24 21:37:57 +08:00
Tianyi Cui d1e8f4672e fix(test): make session replay portable in CI 2026-08-24 21:37:14 +08:00
Tianyi Cui e4a3918e87 docs: refresh module dependency graph 2026-08-24 21:37:14 +08:00
Tianyi Cui caf386f59c fix(test): use expected-output naming 2026-08-24 21:37:14 +08:00
Tianyi Cui 1cfe0f9942 refactor(test): reserve snapshots for session recordings 2026-08-24 21:37:14 +08:00
Tianyi Cui d4e81b6af7 test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
Tianyi Cui 6ca682733f refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
Tianyi Cui 4790f23fea test(snapshot): drive ordinary turns through headless dsh 2026-08-24 21:36:32 +08:00
Tianyi Cui 6189e4a374 test(web): separate session snapshots from goldens 2026-08-24 21:36:31 +08:00
Tianyi Cui 33faf7f35f test(snapshot): separate headless sessions from goldens 2026-08-24 21:36:31 +08:00
Tianyi Cui da1cb2c06e test(snapshot): centralize SDK session corpus 2026-08-24 21:36:31 +08:00
Tianyi Cui 84d6482a95 test(snapshot): declare recorded session ownership 2026-08-24 21:36:31 +08:00
Tianyi Cui 5c67cf898c test(snapshot): centralize ACP session corpus 2026-08-24 21:36:31 +08:00
Tianyi Cui 30762b63c9 refactor(test): make session snapshots transport neutral 2026-08-24 21:36:31 +08:00
Dudu-0223 b44a139ab7 Merge pull request #365 from deepseek-harness/pr-186
feat(spill-local): one-shot startup cleanup for local spill files
2026-08-24 21:31:37 +08:00
Yichen Jiang 91aa211d0d Merge pull request #2997 from deepseek-harness/worktree/fix-system-prompt-order
fix(system-prompt): stabilize workflow section order
2026-08-24 21:21:08 +08:00
Dudu-0223 d6f9931c4b test(spill-local): exclude POSIX identity branches on Windows 2026-08-24 21:20:23 +08:00
Dudu-0223 357d9749d1 Merge remote-tracking branch 'origin/master' into fix/web-fetch-ssrf
# Conflicts:
#	apps/web/tests/preview-boot.e2e.ts
2026-08-24 21:13:00 +08:00
Yichen Jiang 7e95ac012e Merge branch 'master' into worktree/fix-system-prompt-order 2026-08-24 21:08:27 +08:00
Dudu-0223 ca0e6f9707 Merge remote-tracking branch 'origin/master' into codex/pr-365-fixes 2026-08-24 21:07:22 +08:00
Dudu-0223 97693bbc85 test(spill-local): cover platform-specific cleanup paths 2026-08-24 21:07:12 +08:00
imccyu 2db3f8d4b0 Merge pull request #2710 from deepseek-harness/perf/client-plugin-batches
perf(client-modules): batch startup plugin scripts
2026-08-24 21:06:22 +08:00
Yichen Jiang c697f260a4 Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614
# Conflicts:
#	packages/client/ui-conversation/tests/input-bar.client.spec.tsx
2026-08-24 20:56:17 +08:00
Dudu-0223 202a2fe60f Merge remote-tracking branch 'origin/master' into codex/pr-365-fixes 2026-08-24 20:53:45 +08:00
Dudu-0223 9f9cc130e2 test(spill-local): normalize Windows realpaths consistently 2026-08-24 20:53:40 +08:00
Yichen Jiang 76a03e104e Merge remote-tracking branch 'origin/master' into worktree/fix-system-prompt-order 2026-08-24 20:53:09 +08:00
Yichen Jiang adb133e303 Merge remote-tracking branch 'origin/master' into worktree/fix-system-prompt-order
# Conflicts:
#	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/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-mixed/session.1.jsonl
#	examples/acp-agent/tests/snapshots/subagent-mixed/session.2.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-parallel/session.1.jsonl
#	examples/acp-agent/tests/snapshots/subagent-parallel/session.2.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/compaction-recovery/session.jsonl
#	examples/headless-agent/tests/snapshots/pty-tools/session.jsonl
2026-08-24 20:52:52 +08:00
lsdsjy 838006d960 docs(client-modules,client-hmr): align bootstrap and rebuild semantics 2026-08-24 20:49:13 +08:00
imccyu 9c3a0893f6 perf(client-modules): defer per-plugin revision hashing
Preserve sourcemaps through the production Client build and verify batched loading across Host, HMR, and Web Worker paths.
2026-08-24 20:49:13 +08:00
lsdsjy 47bf44a5bb fix(client-modules,webserver,webworker-runtime): preserve batched boot across transports 2026-08-24 20:49:12 +08:00
lsdsjy 445de0ab3e fix(client-modules): tolerate incomplete source maps 2026-08-24 20:48:13 +08:00
lsdsjy 9ee9a3270c test(web): hold application batch during boot theme check 2026-08-24 20:48:12 +08:00
lsdsjy 5bbaf168d9 perf(client-modules): batch startup plugin scripts 2026-08-24 20:48:12 +08:00
imccyu 82aa8906e5 Merge pull request #2905 from deepseek-harness/turtle/local-build-banner-version
Show build version in local Web banner
2026-08-24 20:46:43 +08:00
Tianyi Cui eeae6ba96a Merge pull request #2961 from deepseek-harness/worktree/python-sdk-windows-x64
feat(python): publish the Windows x64 dsh runtime
2026-08-24 20:43:37 +08:00
creatixchu c2ce4a1405 Merge remote-tracking branch 'origin/master' into worktree/2986-trajectory-image-attachments 2026-08-24 20:32:07 +08:00
Dudu-0223 a0c1f7a6a7 Merge remote-tracking branch 'origin/master' into codex/pr-365-fixes 2026-08-24 20:31:27 +08:00
creatixchu 9f2ba9f5aa Merge origin/master (regenerate config catalog) 2026-08-24 19:51:16 +08:00
creatixchu 5183bc2b65 fix(compaction): 摘要收缩改按路由价并补齐定价访问路径
ds-review-bot 首轮意见修复:

- 摘要收缩比较改用所选节点的路由价 shadowedRouteTokenCount,修复图片消息启发式价低于带框摘要时压缩被误拒;日志影子价仍为启发式
- DeepSeek 定价经序列化器同一套 access 解析构建句柄与占位文本,消除逐图数十 token 的低估;uncatalogued 分支 JSDoc 指明复现 projectImagesForTextModel 替换
- llm-replay 在加载时拒绝纯文本模型上的 imageRequestTokens 声明
- contextBreakdown 的 README 与 JSDoc 改为等于 heuristicTokens 之和,不再声称等于路由价 surfaceTokens
2026-08-24 19:48:52 +08:00
lsdsjy bf432bd0c8 Merge pull request #2854 from deepseek-harness/fix/web-running-draft-send-button
fix(web): switch running drafts to Send
2026-08-24 19:29:15 +08:00
creatixchu 42164508c8 feat(llm): 在 compaction 中按路由为图片请求压力计价
Closes #2848.

- dsh-llm 新增 LlmAdapter.imageRequestPricing 同步钩子与 LlmImageRequestPricing/LlmImageRequestPrice 词汇,ctx.llm 按路由解析
- llm-deepseek 用官方公布的 v4 视觉计算器逐句移植(14px patch、3:1 降采样、384 上限、最坏对齐 pad)实现该钩子,复现请求投影的最旧优先 offload 与像素预算缩放;纯几何 requestImageDimensions 上移到 dsh-attachment
- token-meter 表层 fold 存储与路由无关的节点事实,measure() 按生效 envelope 的路由为图片出现处定价;锚点存快照并按同一路由重定价;TokenSurfaceNode 同时携带路由价 tokens 与固定启发式 heuristicTokens
- compaction 触发、保留与选段读取同一套路由价,记录的 shadowedTokenCount 保持启发式以维持 O(1) 投影 fold 一致
- llm-replay 支持按模型的 imageRequestTokens 声明;新增 keyless 的 image-compaction ACP 快照场景端到端验证装配应用
2026-08-24 19:15:30 +08:00
creatixchu 00d3c82563 Merge remote-tracking branch 'origin/master' into worktree/2986-trajectory-image-attachments 2026-08-24 19:12:37 +08:00
creatixchu 15d53e228a docs: 同步模块依赖关系图 2026-08-24 19:10:18 +08:00
Tianyi Cui dff3e18afd fix(python): budget cold profile initialization
The Windows x64 installed-wheel job timed out while waiting for initialize even though the same head passed on rerun. Exact packaged-runtime VM evidence showed a 6.47-second first cold handshake and 2.69-2.94-second warm fresh-home handshakes, leaving too little variance below the public 10-second default.\n\nRaise the independent initialize default to 30 seconds in both Python SDK configuration layers. Ordinary turn and shutdown timeouts remain unchanged, callers retain an explicit override, and tests plus paired documentation pin the public behavior.
2026-08-24 19:09:40 +08:00
Tianyi Cui 8101a0d097 fix(python): make Windows release paths native
Run the GitHub Windows runtime leg under the runner’s native PowerShell instead of inheriting the POSIX Bash body. POSIX and Windows now own explicit output resolution, virtual-environment setup, environment scrubbing, and keyless/live black-box commands, while portable build commands continue to use each runner’s default shell.

Put the pinned uv installation on the GitLab Windows job PATH before either the smoke or release builder invokes it. Reject a runtime executable whose basename does not match the selected platform manifest, and reject Intel macOS at platform selection instead of reporting a misleading missing artifact.

Add a complete PowerShell path to the published Python tutorial and record the three-phase shutdown-time bound in the Windows runtime decision. Workflow, Python, and bilingual documentation tests pin the resulting behavior.
2026-08-24 19:09:40 +08:00
Tianyi Cui d4a63abe85 docs(python): define the Windows x64 runtime contract
Record win-x64 as the sole Windows Python carrier: node24-win-x64 builds a py3-none-win_amd64 wheel with dsh.exe, rg.exe, and both ConPTY addons; Windows arm64 remains explicitly unsupported. The note also pins native build ownership, shell-free pnpm launch, installed-wheel keyless/live gates, and the PowerShell-specific minimal snapshot.

Update the active SEA, sole-launcher, profile-runtime, installed-wheel, and publication decisions from three runtime wheels to four, preserving their existing rationale while linking the Windows extension. Contributor and runtime references now state the exact target, filenames, sidecars, snapshot ownership, and five-wheel release set in both languages.
2026-08-24 19:09:40 +08:00
Tianyi Cui 28442337cf feat(python-example): select the persistent shell by platform
Make the checked-in minimal SDK overlay disable both one-shot shell rows and mount exactly one persistent PTY stack: Bash on Linux/macOS and PowerShell on Windows. The SDK server, explicit dsh home, persistence, editor, timeout, and reduced tool catalog remain unchanged.

Update the runnable example and tutorial to list Windows x64 as supported, describe the platform-selected shell, and remove the obsolete POSIX-only restriction. This keeps the documented first Python task executable through the packaged Windows dsh profile instead of advertising a Linux-only overlay on a Windows-capable SDK.
2026-08-24 19:09:40 +08:00
Tianyi Cui 026a37fc07 ci(python): gate the Windows x64 installed wheel
Add node24-win-x64 to the required pull-request and public-release matrices on a native windows-2025 runner, and publish the same win_amd64 artifact from the GitLab tag pipeline. GitHub uses Git Bash for the shared release script while selecting the Windows venv's Scripts/python.exe explicitly; the Linux and macOS legs retain their existing commands and native checks.

Run the complete installed-wheel keyless suite and the trusted two-turn DeepSeek smoke on Windows exactly as on the existing targets. Make the minimal blackbox choose persistent PowerShell on Windows, keep advanced and restart snapshots platform-stable by disabling both one-shot shell variants, locate the generated dsh.exe console command, and validate text lines without assuming POSIX newlines.

Workflow tests pin the four-target matrix, Windows runner and wheel tag, cross-platform venv selection, GitLab publication dependency, and full blackbox invocation. The existing POSIX minimal snapshot changes only its platform-neutral prompt wording; Windows owns a separate model-visible snapshot.
2026-08-24 19:09:40 +08:00
Tianyi Cui ca0b21661e feat(python-runtime): package the Windows x64 dsh executable
Add node24-win-x64 as the only supported Windows runtime target and publish it as a py3-none-win_amd64 wheel containing the conventional dsh and ripgrep .exe payload names. Keep Windows ARM64 rejected explicitly so Python cannot claim a carrier that CI and release automation do not build.

Teach the pkg builder to require a native x64 Windows host, validate both node-pty ConPTY addons, copy @vscode's win32 ripgrep executable, and recognize pkg's .exe output. Extend runtime resolution, wheel staging, payload validation, and the preset closure check so the Windows-specific PowerShell plugins and sidecars fail loud when omitted.

The sidecar resolver now maps a packaged main.exe to main-rg.exe; focused TypeScript and Python tests cover that name, the win_amd64 manifest, x64-only host selection, complete wheel payload, ConPTY inventory, and platform-conditioned plugin closure.
2026-08-24 19:09:40 +08:00
creatixchu d420292400 fix(web): 处理评审发现的图片记录边界情况
- 图片错误结果在 Result 页签保留错误名称与代码
- 空文本块加图片的记录按纯图片标注,不再空行
- sourceBlock 的持久化图片守卫检查 attachmentId 字段
- 移除 ui-chat 对 util/crypto 的过期 tsconfig 引用
- 同步 slots.md 层级图与 2026-08-20 所有权 Note
2026-08-24 18:58:25 +08:00
pku-xht 55a8c2e9f2 chore(subagent): refresh Codex runtime 2026-08-24 18:31:03 +08:00
pku-xht 97e3a175ff docs(subagent): include product policy diagnostics 2026-08-24 18:31:02 +08:00
pku-xht d495089ff7 review fix: align Codex policy evidence 2026-08-24 18:31:02 +08:00
pku-xht bd6577072f docs(subagent): align Codex permission evidence 2026-08-24 18:31:02 +08:00
pku-xht 7c62fa127b docs(subagent): describe Host-only stderr flow 2026-08-24 18:31:02 +08:00
pku-xht e2315e3b14 review fix: tighten Codex failure ownership 2026-08-24 18:31:02 +08:00
pku-xht fe8a961348 feat(subagent): configure Codex provider models 2026-08-24 18:31:02 +08:00
pku-xht 56067f9972 docs(subagent): refresh Claude runtime notices 2026-08-24 18:30:50 +08:00
pku-xht 6a02e2c4a9 chore(subagent): refresh Claude Code runtime 2026-08-24 18:30:50 +08:00
pku-xht f76cce2fc2 test(subagent): cover Claude limit subtypes 2026-08-24 18:30:49 +08:00
pku-xht 7d30a39619 review fix: simplify Claude diagnostic evidence 2026-08-24 18:30:49 +08:00
pku-xht a043395c2d feat(subagent): configure Claude Code provider models 2026-08-24 18:30:49 +08:00
Dudu-0223 f76a225a7d Merge pull request #2663 from deepseek-harness/feat/subagent-provider
让 subagent 按需发现并选择子 Agent 模型
2026-08-24 18:23:42 +08:00
creatixchu c27de594fd feat(web): 在 Trajectory 中展示图片附件
Trajectory 现在通过共享的 ui-attachment 画廊渲染会话日志中的持久化图片引用:ui-conversation 拥有按会话的图片 URL 缓存(ctx.uiConversation.imageUrl),ui-trajectory 声明 conversation.trajectory.images 子槽位,纯图片记录行以图片数量标注,内联 imageSrc 嗅探作为死代码删除。

Closes #2986
2026-08-24 17:59:02 +08:00
Tianyi Cui de6d83a0fa Merge pull request #2958 from deepseek-harness/worktree/python-sdk-dsh-cli
feat(python): launch the SDK through packaged dsh profiles
2026-08-24 17:48:24 +08:00
Tianyi Cui 4719bef932 test(python): exercise the shipped SDK profile directly
The keyless max-token smoke carried a disable overlay that reproduced the removed private carrier's reduced tool roster. That legacy roster is now owned by the standalone sdk-minimal profile, so mutating the full sdk profile hides the application the SDK actually ships.\n\nLaunch sdk without a patch for both the successful and invalid-config paths. The separate sdk-minimal process test continues to pin its exact platform-selected two-tool request.
2026-08-24 17:28:29 +08:00
Tianyi Cui 104fe9b9e7 test(sdk-app): cover default profile configuration
The startup test helper always constructed an explicit sdk profile, so coverage never exercised apply's supported default-config path even though runtime behavior depended on it.\n\nPass Config objects through the helper and default them to an empty config. The existing startup and help tests now prove sdk defaulting, while the explicit sdk-minimal case remains covered.
2026-08-24 17:28:29 +08:00
Tianyi Cui e2920f0109 fix(sdk-minimal): make the SDK model argument authoritative
Stop narrowing the standalone DeepSeek adapter to a DSH_MODEL-derived one-entry catalog. The direct adapter already accepts model ids outside its advisory catalog, so retain only the DSH_CONTEXT_WINDOW fallback and let the JSON-RPC initialize model be the single runtime selection.

Remove model mirroring from minimal.py and the packaged smoke. The keyless process now initializes deepseek-v4-pro without DSH_MODEL, while the packaged scenario continues to use its unlisted smoke-model; together they prove both cataloged and arbitrary SDK model arguments reach the adapter directly.

Update the bundle, tutorial, SDK/example references, and owning Agent Notes to keep DSH_MODEL only as minimal.py's optional default input, never as a second value callers must synchronize.
2026-08-24 17:28:29 +08:00
Tianyi Cui 7a11f5fde3 docs(python): define the standalone minimal profile
Record sdk-minimal as the narrow repository-owned exception to base-first profile composition: callers still launch only dsh and cannot provide an arbitrary Cordis tree, while the shipped bundle may own a complete explicit roster. Cross-link the launcher, profile-bundle, Python-runtime, minimal-agent, snapshot, and telemetry decisions; the supersession audit keeps each older note active because its remaining rationale is independent.

Update the CLI, architecture, Python tutorial/reference, example, runtime-wheel reference, and bundle documentation. The docs distinguish the full sdk profile from sdk-minimal, explain explicit-home/plugin/patch customization, state the minimal permission and persistence choices, and retain the separately packaged web profile and frontend assets for direct dsh use.

Correct dsh-base descriptions to cover base-backed profiles, make SDK startup configuration visible in the generated config catalog, add sdk-minimal to the module graph, and regenerate the base-composition graph. English and Chinese pairs are re-recorded at the exact reviewed contents.
2026-08-24 17:28:29 +08:00
Tianyi Cui 79a8f667f7 refactor(python): launch the minimal example through sdk-minimal
Make minimal.py select the shipped sdk-minimal profile directly and pass its selected model into the profile-owned adapter catalog. The Python SDK still starts only the bundled dsh CLI with an explicit Harness home; it no longer supplies an invocation overlay for this mode.

Drive both the source keyless process test and installed-wheel smoke through the same named profile. The keyless test pins the generated profile manifest and exact two-tool model request, while the packaged smoke keeps the persistent-shell, editor, session-log, and model-visible snapshot evidence.

Delete minimal.patch.yml and the unused complete-config/replay fixtures. Their composition now has one owner in @deepseek-ai/dsh-sdk-minimal, so the example and tests cannot drift into separate launch trees.
2026-08-24 17:28:28 +08:00
Tianyi Cui 8dc3b0380e feat(bundle): ship the standalone sdk-minimal profile
Add a startup-only sdk-minimal template whose sole bundle inserts the complete JSON-RPC agent tree over the empty profile root. The roster is an explicit composition allowlist: it contains one DeepSeek adapter, the minimal agent spine, persistent Bash, the string-replace editor, local execution, and JSONL persistence, while dsh-base and Web remain absent.

Reuse the SDK app startup provider so the new profile retains help, stdin EOF, and bounded launcher shutdown semantics. Make that provider render its configured profile name, which keeps both sdk and sdk-minimal help truthful without duplicating process lifecycle code.

Register the package in the CLI closure, TypeScript graph, lockfile, Knip policy, and bilingual bundle references. Exact manifest, row-roster, profile-template, config-dump, and HMR tests make later additions visible instead of relying on a blacklist.
2026-08-24 17:28:28 +08:00
Tianyi Cui ab4e65ba82 perf(app-boot): avoid fallback locks for complete profiles
Resolve the installation fallback generation before locking and return immediately when every required symlink or packaged proxy is complete. Parallel SDK rollouts sharing an initialized DSH_HOME therefore do not queue on profiles/node_modules.lock.

Missing or stale entries still acquire the cross-process writer lock, recheck the generation, and repair under exclusive ownership. Tests hold the lock to prove the steady-state bypass and verify that a partial repair retains already-correct siblings.
2026-08-24 17:28:28 +08:00
Tianyi Cui c2ad69344f fix(python-sdk): make the minimal profile an explicit allowlist
Give the SDK JSON-RPC server a per-root tool filter and let deployments mark the configured persona as the complete system prompt. The checked-in minimal overlay now names only bash and str_replace_editor, so later global tools and unrelated guidance from dsh-base cannot appear implicitly.

Keep the shared SDK host services and packaged Web capability intact. Only workspace instructions, compaction, and the conflicting one-shot Bash row remain disabled. Unit coverage pins the configuration paths, and a real dsh profile smoke proves the assembled prompt and exact two-tool request.
2026-08-24 17:28:28 +08:00
Tianyi Cui d801f262d8 fix(python-sdk): resolve packaged proxies from real module entries
The packaged dsh launcher must expose installation modules to profile-local plugins without writing symlinks into pkg's virtual filesystem. The first review fix selected ESM exports correctly in ordinary Node, but real carrier execution exposed package metadata and VFS behavior that a synthetic tree did not cover: executable and declaration packages have no import entry, legacy main fields rely on Node probing, and pkg's Windows VFS prevents filesystem package-scope resolution from seeing exports such as zod/mini and @google/genai/web.

Resolve explicit exports directly from each installed manifest with the maintained resolve.exports package under Node import conditions. Publish only package-local candidate files that exist, reject escaping or malformed targets, preserve the package installation URL without realpath, and keep Node's legacy resolver only for exports-less packages. This avoids pkg filesystem package lookup entirely while retaining fail-loud behavior for broken runtime entries.

Add regression coverage for import-only, nested, symlinked, zod-style, and genai-style condition maps; unavailable and types-only entries; invalid and escaping targets; executable/declaration packages; extensionless main; and legacy index fallback. profile.ts remains at 100% statements, branches, functions, and lines. Update the bilingual package and Agent Note contracts, replace the runtime dependency and generated notice, and regenerate the lockfile through pnpm.
2026-08-24 17:28:27 +08:00
Tianyi Cui 9edf1b9f10 fix(python-sdk): harden profile runtime startup
Resolve packaged profile proxies with Node ESM import conditions from each package installation, and fail loud when an explicit runtime export or legacy main entry is missing. Serialize the shared profile fallback under the existing cross-process writer lock so concurrent dsh processes cannot observe partial proxies; either carrier now replaces the other carrier’s managed entry without manual cleanup.

Give Python initialize its own 10-second default bound and name the selected profile in timeout diagnostics, while leaving ordinary agent turns unbounded by default. Package the dynamically resolved web frontend and skill-badge assets so the runtime wheel’s normal dsh profiles do not depend on pkg static-discovery accidents.

Rewrite the root launch rule and every active stale SDK-runtime note to the shipped dsh profile architecture in both languages. Focused tests prove import-only and transitive package exports, lock contention, cross-carrier transitions, missing-entry failures, asset inventory, and bounded initialization.
2026-08-24 17:28:27 +08:00
Tianyi Cui f0f9b294dd docs(python): make the dsh profile runtime current
Document dsh as the only application launcher across architecture, CLI, SDK, app-boot, Python package, contributor, tutorial, and example references. Explain explicit home selection, profile and patch precedence, persistent external plugin installation, the Node-free runtime path, and the absence of complete-config or ~/.dsh fallbacks.

Record the Python profile-runtime decision and update the active naming, installed-wheel, and SEA packaging notes with precise supersession. Regenerate the configuration catalog and module graph after deleting the carrier, update both reviewed languages and pairing records, and classify the retained standalone Cordis files as lower-level test fixtures rather than launch interfaces.
2026-08-24 17:28:27 +08:00
Tianyi Cui 01da043737 test(python): prove installed dsh profile customization
Migrate the packaged-runtime smoke inventory from complete Cordis trees to the sdk profile plus ordered patches. Preserve the focused minimal and advanced behaviors, update the generated durable snapshots for explicit permission events and the smaller RunResult, and keep worker, MCP, ripgrep, PTY/editor, direct JSON-RPC, and real-provider coverage.

Add an installed-only external bundle scenario that invokes the wheel's dsh plugin command with a local file package, verifies profile manifest reconciliation, imports @deepseek-ai/cordis as a peer, asserts the packaged proxy returns the exact host Context instance, and proves its system-prompt contribution reaches the model. Migrate the repository source e2e and runnable minimal example to the same profile grammar.
2026-08-24 17:28:26 +08:00
Tianyi Cui 56e038b2e3 feat(python-sdk): launch dsh profiles from explicit homes
Replace complete-config, session_root, runtime-bin, bridge-bin, and public argv override options with dsh_bin, profile, ordered patches, and dsh_home. Resolve executable/home/patch/cwd paths before spawn, select the sdk profile by default, and fail before launch unless dsh_home or non-empty DSH_HOME is explicit; Python never inherits ~/.dsh silently.

Remove Python-owned DSH_CORDIS_CONFIG, DSH_SESSION_ROOT, and DSH_CWD injection and drop session_root from RunResult. Keep arbitrary argv only as an underscore-prefixed fake-runtime adapter, retain provider/model/token and process controls, and append subprocess stderr to initialization JSON-RPC errors so profile boot failures name their actual plugin cause. Unit and carrier tests cover both exe and Node modes.
2026-08-24 17:28:26 +08:00
Tianyi Cui be7b064504 feat(python-runtime): package the dsh CLI and profile assets
Make the zero-code dsh-python-runtime-closure depend on the real @deepseek-ai/dsh application and every required profile peer, then package apps/cli's built bin instead of the deleted Python carrier. Rename executables to deepseek-harness-sdk-runtime-<platform>-<arch>, update wheel/platform/build workflow discovery, and install a Python dsh console command that requires explicit DSH_HOME before exec.

Include profile, bundle, preset, native addon, and shared-library assets needed by the full CLI. Remove the checked-in default cordis.yml and preserve the existing wheel distribution names, Python module names, sidecar validation, and wire identity. Runtime resolution and release tests pin the new artifacts and dev Node carrier.
2026-08-24 17:28:26 +08:00
Tianyi Cui 809a4c5bad fix(app-boot): preserve profile modules inside pkg executables
Teach the profile installation fallback to use normal symlinks under Node and real ESM proxy packages under pkg. Each proxy records the source package version, mirrors its explicit runtime subpath exports, and re-exports the virtual /snapshot URLs, so built-in Loader rows and external plugin peers resolve one shared Cordis/module instance from an on-disk profile.

Keep proxy healing idempotent, reject foreign real directories, cover root and subpath imports in packaged mode, and expand AggregateError startup diagnostics so concurrent Loader failures retain their individual import causes. This is the reusable packaged-profile mechanism; Python-specific artifact wiring remains in the next commit.
2026-08-24 17:28:26 +08:00
Tianyi Cui 1d4dcf3b57 refactor(python): remove the private direct-config carrier
Delete @deepseek-ai/dsh-sdk-python-runtime and its packaged-bin entry now that Python uses the repository's dsh application launcher. Remove the package's project reference, Knip entry, workspace-policy exception, executable allowlist entry, and README-model classification together so no tooling preserves the old exception.

This commit is deliberately mechanical: it removes the obsolete package and gate accommodations without introducing the replacement launch behavior. The following commits add the packaged dsh runtime and Python profile API, keeping the architecture change separate from deletion noise.
2026-08-24 17:28:26 +08:00
CreatixChu 8122bec7cc Merge pull request #2989 from deepseek-harness/worktree/2885-image-compression
修正图片 master 压缩的编码路由并降低压缩耗时
2026-08-24 17:26:34 +08:00
creatixchu cfacca1b07 test(attachment): pin the assembled image re-encoding path in a keyless snapshot
The read-image-reencode lane feeds a 16-bit gradient PNG through the
shipped app: pass-through is impossible, the master converts down the
opaque JPEG ladder, and the 640,000-pixel request budget re-encodes a
downscaled request version — the projection the byte-identical tiny
fixtures never exercised.
2026-08-24 17:15:59 +08:00
creatixchu 30704dc1df fix(attachment): budget master pixels and share the encoding ladder
Master dimensions move from a 2048 long-edge rule to a total-pixel
budget (normalizedImageMaxPixels, default 2048x2048) with an 8192
long-edge cap, so extreme aspect ratios keep short-edge resolution.
The shared quality ladder and lazy execution move to encoding.ts,
review-round doc fixes land across attachment and llm packages, and
the superseded facts in the unified-image-pipeline note now describe
the shipped routing.
2026-08-24 17:10:59 +08:00
Yichen Jiang 70d6e7abd6 fix(file-reference): teach the @-mention guidance directories and the workspace root
Field test: the model received a bare '@niulai/' and guessed a user
mention — the guidance section was present but said only that @-prefixed
paths are files, never covering the trailing-slash directory form, the
workspace-relative root, or the quoted spelling. Rewrite the section to
name all three; the section's presence conditions and every consumer
pin the constant, so nothing else moves.
2026-08-24 17:05:34 +08:00
Yichen Jiang 4036db4450 test(web): create reference fixtures before the workspace connects
CI's snapshots lane timed out waiting for the folderx candidate: the
fixture directory was created after connectFreshWorkspace, racing the
Host's file index on a loaded runner. Land every fixture (and the
workspace directory itself) before the connect, and give the first
folder query a cold-start allowance.
2026-08-24 16:57:38 +08:00
Yichen Jiang dad39c8c18 feat(web): settle folder references on pick and move descent to a drill verb
A directory row in the @ menu had one verb doing two jobs: picking it
inserted literal @dir/ text and kept the menu open, so a user wanting
the folder itself never got a settled entity — the token kept its
trigger character and stayed editable, nothing like a file's atomic
chip.

Split the intents on the same row, mapped to shell-completion instincts:
row click / Enter settles the directory as an atomic folder chip (the
file chip's exact language; canonical @dir/ mention as its serialized
form — the { insert } arm the folder path never took), while Tab or the
row's trailing chevron drills: literal editable text, menu open on the
children. One new dimension carries it: candidate.drill advertises the
verb, InputTriggerPick.action reports it, ArbitrateKey gains 'tab', and
the keymap intercepts Tab only while a drill row is highlighted.

Covered by controller arbitration, MenuView chevron routing, the
ui-reference verb split, a keymap Tab-passthrough spec, and a real-
browser e2e driving all three gestures; menu golden refreshed for the
chevron and the fixture directory.
2026-08-24 16:45:34 +08:00
Dudu-0223 32d7092c84 Merge remote-tracking branch 'origin/master' into codex/pr-365-fixes 2026-08-24 16:33:31 +08:00
Dudu-0223 a268aada8c fix(spill-local): harden startup cleanup 2026-08-24 16:33:15 +08:00
Hypatia May 4db19c352e docs(token-meter): distinguish projection and measurement folds 2026-08-24 16:24:13 +08:00
Hypatia May 58a0e450b3 perf(token-meter): commit the surface fold in place through a plan/commit pair
foldSurfaceTokens rebuilt the priced surface on every surface event: an
append allocated [...nodes, node] and a replacement copied the whole
array before splicing, charging every well-formed event O(surface) for
an atomicity property only malformed events need. Benchmarks put the
copy at ~99.9% of an append's cost (100µs at a 50k-node surface vs
0.1µs for pricing) with O(S²) accumulation over a session, inside the
synchronous session/event publication path.

Split the fold into the session core's planSurfaceEvent/applySurfacePlan
shape: planSurfaceTokens performs every fallible step against the
read-only surface, commitSurfaceTokens applies the plan in place and is
infallible by construction. _foldEvent plans first, runs the remaining
fallible anchor validation, and only then commits, so retry identity is
preserved by ordering instead of by allocation. Appends drop to
amortized O(1) (100.3µs -> 1.9µs at 50k nodes); replacements keep their
O(surface) findIndex but stop paying the extra full copy (21µs -> 4.2µs).

A new regression test pins the one hazard this introduces: an event
whose surface plan is valid but whose later anchor validation throws
must leave the priced surface and running total uncommitted across
repeated failures.
2026-08-24 16:24:12 +08:00
creatixchu ebb8010b56 Merge remote-tracking branch 'origin/master' into worktree/2885-image-compression
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/llm/llm-deepseek/README.i18n.yaml
#	packages/llm/llm-deepseek/README.md
#	packages/llm/llm-deepseek/README.zh.md
#	packages/llm/llm-deepseek/src/adapter.ts
2026-08-24 16:23:34 +08:00
_Kerman 5fe36b513e fix(ci): restore acp snapshot transcripts and windows coverage gate ordering
- The base-mounted projection cache's write-behind forces session-log
  flushes at cache-chosen times, splitting packed chunk rows and collapsing
  the persistence window the keyless acp transcripts pin. ACP exposes no
  session-listing surface, so the automation profile disables the base row,
  restoring the pre-base behavior the fixtures were recorded against.
- The windows coverage lane runs suites that read built lib/ output (the
  webworker-packer image tests) and raced the build gate's tsdown writes
  against a partial tree; every coverage gate now waits for the build gate.
2026-08-24 16:17:19 +08:00
CreatixChu 6ac321d990 Merge pull request #2990 from deepseek-harness/worktree/model-readable-image-paths
feat(attachment): expose model-readable image paths
2026-08-24 16:14:55 +08:00
creatixchu 4863890535 fix(attachment): route image encoding by alpha over shared quality ladders
Delete the 5-bit colour-count classifier and palette PNG branch that
misrouted high-frequency photographic JPEGs (issue #2885 images 23/24)
into an encoder 100x slower with 4x larger output. Both normalization
and request-image encoding now route by the decoded alpha fact alone:
opaque sources down a JPEG ladder and alpha sources down a WebP
effort-0 ladder, each at qualities 85/75/60. Byte budgets become ladder
targets: the downscale retry loop is gone and a ladder-exhausted encode
keeps its smallest output, while provider byte caps stay enforced at
the transmitting route. Request transforms move to request-image-v5.
2026-08-24 16:14:32 +08:00
Yichen Jiang 836be779e9 Merge pull request #3004 from deepseek-harness/worktree/3002-restore-deep-diving-copy
fix(client): restore branded running copy
2026-08-24 16:14:10 +08:00
Yichen Jiang d61ba08685 fix(client): restore branded running copy 2026-08-24 16:04:17 +08:00
creatixchu 7bad88206b test(llm): 覆盖执行环境图片路径解析 2026-08-24 16:01:49 +08:00
creatixchu 5c799a9520 fix(attachment): 修正 Windows 只读发布顺序 2026-08-24 15:44:42 +08:00
Dudu-0223 545d177911 fix(spill-local): make startup cleanup race-safe 2026-08-24 15:36:51 +08:00
Dudu-0223 dbb3bcca8e test(spill-local): v8-ignore the two race-only sweep catch branches
The exact-shape fix added two filesystem-failure catch branches that only
fire on a race/permission fault the caller already guards against (the
session-dir readdir after an isDirectory() check, and the discovered-root
rmdir after the root was observed empty). Neither is deterministically
reproducible in-process, so tag both with the same reasoned v8 ignore the
sibling catch blocks already use, restoring per-file 100% coverage and the
symmetry between the parallel rmdir handlers.
2026-08-24 15:36:51 +08:00
Dudu-0223 c6a4de6207 fix(spill-local): exact-shape root/session matching and prune discovered roots
Tighten the startup sweep to backend-generated name shapes and fix the tests
that had drifted from the SweepRoot-based API:

- Match roots by the exact `dsh-spill-<6>` mkdtemp shape and session dirs by
  `session-<12 hex>` (DEFAULT_ROOT_RE / SESSION_DIR_RE), replacing loose
  startsWith checks so foreign or fixture-shaped directories are never swept.
- Carry `SweepRoot { path, pruneWhenEmpty }` through SweepOptions so a discovered
  prior-default root is removed once emptied while the active root is never
  pruned; lstat each session entry so a symlinked session dir is not followed.
- Fix the tests to the SweepRoot API: import SweepRoot, correct the gatherRoots
  override return shapes, build discovery fixtures with the real mkdtemp shape,
  and route the warn-wiring test through a deterministic failure path.
2026-08-24 15:36:51 +08:00
Dudu-0223 2f430f2fbd feat(spill-local): one-shot startup cleanup for local spill files
The local spill backend never reclaimed its files, so configured roots
grew without bound and default per-process dsh-spill-* temp roots piled
up across runs. Immediate deletion is unsafe because persisted, resumed,
and forked sessions may still reference an older locator.

Add a fiber-owned, best-effort sweep that runs once after activation
(never delaying availability, awaited on disposal): it deletes regular
files older than cleanupPeriodDays (default 30; 0 disables) across the
configured root and prior default temp roots, prunes emptied dirs, and
skips symlinks/unknown entries. Every filesystem failure is contained
and logged, so the sweep cannot fail activation or a concurrent write.
2026-08-24 15:36:51 +08:00
imccyu 15ddb2edc4 test(web): wait for stable preview onboarding 2026-08-24 15:28:14 +08:00
_Kerman 334dd53c92 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2781
# Conflicts:
#	.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.i18n.yaml
#	.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.md
#	.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.zh.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/api/session-controller/tests/session-cold.host.spec.ts
#	packages/bundle/web-app/package.json
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/session/session-projection-cache/package.json
2026-08-24 15:13:10 +08:00
imccyu 1a36d5c6f5 style(client): stack local build metadata 2026-08-24 15:08:14 +08:00
Turtle 720c5c247c fix(client): localize local build banner 2026-08-24 15:04:01 +08:00
Turtle 17bde3f5be feat: label local build banner 2026-08-24 15:04:01 +08:00
Turtle 749c4ef93e fix: sample dev web metadata at startup 2026-08-24 15:04:01 +08:00
Turtle b636b01092 test: update client build fixtures 2026-08-24 15:04:01 +08:00
Turtle 65a8d6be1b feat(client): show build version in local banner 2026-08-24 15:04:00 +08:00
creatixchu b5182e2ac2 Merge remote-tracking branch 'origin/master' into worktree/model-readable-image-paths 2026-08-24 14:57:00 +08:00
Yichen Jiang 9a6845828a Merge remote-tracking branch 'origin/master' into worktree/fix-system-prompt-order 2026-08-24 14:54:55 +08:00
creatixchu 558f08780c refactor(attachment): 分离宿主位置与模型访问路径 2026-08-24 14:51:03 +08:00
Chinesezjc e0249fba1c Merge pull request #3000 from deepseek-harness/revert-2926-worktree/optimize-windows-ci-20260822
Revert "perf(ci): shorten native Windows coverage critical path"
2026-08-24 14:40:33 +08:00
Chinesezjc cd6941d5d7 Revert "perf(ci): shorten native Windows coverage critical path" 2026-08-24 14:39:56 +08:00
Dudu-0223 470af0a404 fix(web): preserve preview fetch composition 2026-08-24 14:18:15 +08:00
Yichen Jiang 25428f8e08 fix(system-prompt): preserve downstream section order 2026-08-24 14:12:36 +08:00
Dudu-0223 14e4d3f078 docs(web): document shipped fetch policy 2026-08-24 13:40:08 +08:00
Yichen Jiang fdf60301f2 fix(system-prompt): stabilize workflow section order 2026-08-24 13:38:34 +08:00
Dudu-0223 9fbcea099b feat(web): require one-shot fetch approval 2026-08-24 13:38:06 +08:00
creatixchu 7f4cf99eeb 修正图片路径访问与只读存储 2026-08-24 13:11:04 +08:00
Dudu-0223 2fbe199a1c test(web): permit loopback spill fixture 2026-08-24 12:35:32 +08:00
creatixchu bd4e4173e7 feat(attachment): expose model-readable image paths 2026-08-24 12:08:26 +08:00
Yichen Jiang 6f17d10102 test(web): finish the textarea-locator sweep after the architecture merge
preview-boot's hero wait was master's new textarea:enabled locator (the
conv refactor predates the Lexical composer); migrate it to the
data-composer-input surface like every other lane. Drop the unnecessary
DOMRect assertion oxlint flagged on the new Range stub.
2026-08-24 12:06:48 +08:00
Dudu-0223 c406560452 test(web): permit loopback integration fixture 2026-08-24 12:05:17 +08:00
creatixchu 6434b894c2 chore(attachment): start issue-2885 image codec work 2026-08-24 12:02:38 +08:00
Dudu-0223 9d5fa7a593 test(web): snapshot blocked loopback fetch 2026-08-24 11:57:27 +08:00
Dudu-0223 b2219bba63 fix(web): block non-public fetch destinations 2026-08-24 11:47:08 +08:00
Yichen Jiang 04caa1248d test(client): close the merged-architecture coverage and jsdom gaps
- user-text.tsx enters ui-primitives' per-file 100% gate: replace three
  regex-guaranteed impossible ?? fallbacks with asserted captures, make
  the precedence sort a branch-free rank comparator, and pin the nested
  recall-label ordering and the no-basename quoted-path fallback with
  tests (100% statements/branches/functions locally).
- assembled-boot stubs Range.prototype.getBoundingClientRect: jsdom has
  no Range geometry, and Lexical's selection reveal now reaches it in the
  built-graph lane after the architecture merge (the unhandled TypeError
  behind command-image-envelope and preview-boot).
2026-08-24 11:39:34 +08:00
lsdsjy e06625d202 fix(web): switch running drafts to Send 2026-08-24 11:37:48 +08:00
Yichen Jiang 5f94875a3d Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614 2026-08-24 11:28:59 +08:00
Turtle 528815dd1e Merge pull request #2860 from deepseek-harness/turtle/warn-torn-jsonl-recovery
fix(jsonl): warn when repairing torn tails
2026-08-24 11:15:05 +08:00
Yichen Jiang f26936d695 Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614
# Conflicts:
#	.agents/notes/archived/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.i18n.yaml
#	apps/web/tests/composer-draft-scroll.e2e.ts
#	packages/client/ui-chat/src/client/chat/MessageItem.tsx
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.md
#	packages/client/ui-conversation/README.zh.md
#	packages/client/ui-conversation/package.json
#	packages/client/ui-conversation/src/client/contract/input.ts
#	packages/client/ui-conversation/src/client/contract/slots.ts
#	packages/client/ui-conversation/src/client/input/facade.ts
#	packages/client/ui-conversation/src/client/input/machine.ts
#	packages/client/ui-conversation/src/client/skeleton/InputBar.tsx
#	packages/client/ui-conversation/src/client/skeleton/decorations.ts
#	packages/client/ui-conversation/tests/input-bar.client.spec.tsx
#	packages/client/ui-conversation/tests/input-machine.client.spec.ts
#	packages/client/ui-conversation/tests/input-reference-submit.client.spec.ts
#	packages/client/ui-conversation/tests/skeleton.client.spec.tsx
#	packages/client/ui-primitives/src/user-text.module.css
#	packages/client/ui-primitives/src/user-text.tsx
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
#	pnpm-lock.yaml
2026-08-24 11:04:58 +08:00
Yichen Jiang 02d6af9d05 Merge pull request #2864 from deepseek-harness/fix/derive-shipped-preset-root-per-composition
fix(cli): derive the shipped agent-preset root per composition
2026-08-24 10:54:29 +08:00
imccyu 559ac1bfb7 Merge pull request #2967 from deepseek-harness/worktree-webhostfix
feat(webworker): support filesystem watches and confinement
2026-08-24 10:51:44 +08:00
imccyu ab0f7937ca perf(webworker): index VFS hard links 2026-08-24 10:37:06 +08:00
imccyu 92cac5d291 fix(webworker): close Node compatibility gaps 2026-08-24 10:37:06 +08:00
imccyu ce1247d953 docs(client): sync injected module graph contract 2026-08-24 10:37:06 +08:00
imccyu 5549b9add5 fix(client): preload injected module factories 2026-08-24 10:37:06 +08:00
imccyu 91b545daf5 fix(webworker): support package inventory resolution 2026-08-24 10:37:05 +08:00
imccyu 8aa222a40d test(web): await subagent history before snapshot 2026-08-24 10:37:05 +08:00
imccyu be852d4e9b fix(webworker): scope Linux-only CI checks 2026-08-24 10:37:05 +08:00
imccyu 5ad9b128f9 fix(webworker): align filesystem semantics with Node 2026-08-24 10:37:05 +08:00
imccyu 4f80422595 fix(webworker): preserve preview loading sequence 2026-08-24 10:37:05 +08:00
imccyu 14bd300880 fix(webworker): match preview chooser styling 2026-08-24 10:37:05 +08:00
imccyu e883dc2354 feat(webworker): add selectable preview fixtures 2026-08-24 10:37:04 +08:00
imccyu 181a0e18ef docs(webworker): define the preview example seed 2026-08-24 10:37:04 +08:00
imccyu 8fe9af8db9 feat(webworker): support fs watches and confinement 2026-08-24 10:37:04 +08:00
Yichen Jiang 925eac4b2e Merge remote-tracking branch 'origin/master' into fix/derive-shipped-preset-root-per-composition 2026-08-24 10:36:24 +08:00
imccyu 5f7150b69f Merge pull request #2968 from deepseek-harness/client-tool-view-rendering
refactor: derive Web tool presentation from raw events
2026-08-24 10:33:49 +08:00
_Kerman 04abeddd3e Merge origin/master into xtr/session-format-migration 2026-08-24 10:31:05 +08:00
Yichen Jiang 34a3097317 fix(preview): point the config-tree declaration at the plugin-bundled presets
The worker-preview pack landed on master declaring dsh.configTrees
against apps/cli/config/agent-presets, which this branch moved into
packages/preset/agent-presets/presets. The VFS mount and the worker-side
roster patch keep their paths; only the source directory follows the
move.
2026-08-24 10:29:18 +08:00
imccyu 8fbd1650a3 docs(session): record cold projection composition rule 2026-08-24 10:24:18 +08:00
imccyu 1dd6bf1973 fix(client): localize terminal send presentation 2026-08-24 10:24:18 +08:00
imccyu bfc145cc7c docs(tools): link terminal presentation markers 2026-08-24 10:24:18 +08:00
imccyu d9a071340f fix(client): preserve editor running diffs 2026-08-24 10:24:18 +08:00
imccyu a99516c330 refactor(client): derive deliverables from mutation calls 2026-08-24 10:24:17 +08:00
imccyu a4c296f9fe refactor(client): derive tool cards from raw events 2026-08-24 10:24:17 +08:00
imccyu a42c0b523a refactor(session): stream raw tool events 2026-08-24 10:24:17 +08:00
imccyu 64c9e4a22c docs: define client-derived tool presentation 2026-08-24 10:24:16 +08:00
Yichen Jiang 05daf25e10 test(llm): pin includeShippedRoot off in the inventory roster
The spec landed on master before the roster gained the plugin-bundled
shipped root; its empty-roots harness now opts out explicitly, matching
every other exact-roster suite.
2026-08-24 10:17:11 +08:00
Yichen Jiang 91e30d6f82 Merge remote-tracking branch 'origin/master' into fix/derive-shipped-preset-root-per-composition
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-10-single-file-executable-sdk-runtime-distribution.i18n.yaml
#	.agents/notes/implemented/architecture/2026-07-10-single-file-executable-sdk-runtime-distribution.md
#	.agents/notes/implemented/architecture/2026-07-10-single-file-executable-sdk-runtime-distribution.zh.md
#	scripts/check-workspace-constraints.ts
#	scripts/rescope-vendor.ts
2026-08-24 10:11:11 +08:00
Magolor 4b7b039129 Merge pull request #2777 from deepseek-harness/fix/minimal-disable-goal-plugin
fix: 在 Minimal preset 中禁用 /goal
2026-08-24 09:18:48 +08:00
Tianyi Cui 51f274d7a4 Merge pull request #2972 from deepseek-harness/worktree/upgrade-pi-ai-0.84.2
chore(llm): bump pi-ai to 0.84.2
2026-08-24 02:22:50 +08:00
Tianyi Cui c4f10577b5 test(llm): cover pi-ai upgrade compatibility 2026-08-24 01:57:18 +08:00
Tianyi Cui 76c3bf5f6f Merge origin/master into worktree/upgrade-pi-ai-0.84.2 2026-08-24 01:38:25 +08:00
Tianyi Cui 114846b4ca test(web): refresh pi-ai provider catalog snapshots 2026-08-24 01:37:51 +08:00
imccyu 0b11356d05 Merge pull request #2970 from deepseek-harness/worktree-convrefactor
refactor(client): remove cross-package value dependencies
2026-08-24 01:36:01 +08:00
imccyu 3e942e5e21 docs(client): document web architecture 2026-08-24 01:27:48 +08:00
Tianyi Cui 44bd9182ff chore(llm): bump pi-ai to 0.84.2 2026-08-24 01:19:01 +08:00
imccyu 78b8cc731e docs(client): preserve opaque context fallback 2026-08-24 00:54:24 +08:00
imccyu e5395b36af refactor(client): remove directory error re-export 2026-08-24 00:54:17 +08:00
imccyu 2a597bea80 test(pwsh): allow Windows shell restart latency 2026-08-23 23:58:42 +08:00
imccyu d7db423d5b docs(client): restore boundary rationale 2026-08-23 23:54:06 +08:00
imccyu b19752fda4 fix(client): validate exact external specifiers 2026-08-23 23:54:03 +08:00
imccyu cad09dbcb7 test(ci): include inspect catalog in gate order 2026-08-23 23:37:49 +08:00
imccyu efda53c189 test(client): update bundle purity expectation 2026-08-23 23:37:45 +08:00
imccyu 177142aa4a test(cordis): refresh inspect catalog snapshot 2026-08-23 23:29:54 +08:00
imccyu 39ebc860df docs: refresh module dependency graph 2026-08-23 23:29:50 +08:00
imccyu 3e9c5d1bc9 refactor(util): remove unreachable path fallback 2026-08-23 23:29:46 +08:00
imccyu e791147203 test(client): cover malformed browse errors 2026-08-23 23:29:42 +08:00
imccyu e47c897f5f refactor(session): localize token delta detection 2026-08-23 23:29:38 +08:00
imccyu a050b3d4f1 fix(client): gate the inspect catalog 2026-08-23 23:06:39 +08:00
imccyu d80419f4ea chore(client): enforce value dependency policy 2026-08-23 23:06:39 +08:00
imccyu 81c922c7be chore(client): remove feature module externals 2026-08-23 23:06:38 +08:00
imccyu 997ad27a60 refactor(client): remove compatibility imports 2026-08-23 23:06:38 +08:00
imccyu 3d1c0af60b refactor(client): keep feature helpers with consumers 2026-08-23 23:06:38 +08:00
imccyu 9f2f498e7c refactor(client): localize conversation projections 2026-08-23 23:05:31 +08:00
imccyu 85427aea9e refactor(client): move shared primitives to static packages 2026-08-23 23:02:33 +08:00
imccyu 64bb0427f9 feat(util): add workspace path helpers 2026-08-23 23:01:48 +08:00
Tianyi Cui 11b69490bf Merge pull request #2964 from deepseek-harness/worktree/localize-ui-strings-gate
fix(client): localize UI copy and gate regressions
2026-08-23 22:56:29 +08:00
Tianyi Cui 2a72de67d1 fix(ci): preserve cross-platform lint suppressions 2026-08-23 21:48:32 +08:00
Tianyi Cui ac4ade3aaa fix(client): address localization review findings 2026-08-23 21:22:41 +08:00
Tianyi Cui 174c672f45 Merge remote-tracking branch 'origin/master' into worktree/localize-ui-strings-gate 2026-08-23 20:15:02 +08:00
Tianyi Cui e1a5942c9a fix(client): satisfy UI localization CI gates 2026-08-23 20:14:53 +08:00
Tianyi Cui c9b1c1b0b0 Merge pull request #2960 from deepseek-harness/worktree/fix-master-sandbox-ci-20260823
fix(ci): restore Sandbox master checks
2026-08-23 19:50:25 +08:00
Tianyi Cui b6b08beb0d test(sandbox): derive packed workspace closure
The Landlock packed-install rehearsal packed a hand-maintained list of
workspace tarballs. When dsh-llm gained the dsh-util-crypto runtime
dependency, the list stayed stale and npm tried to fetch the unpublished
release candidate from the public registry, failing both Linux master jobs
with E404 before confinement ran.

Read the current pnpm workspace inventory and traverse dependencies,
optionalDependencies, and required peerDependencies from the packed test
roots. Verify package identities, fail loudly on unresolved workspace names,
sort the closure deterministically, and leave native-family packages to the
existing mode-preserving native packer.

Cover runtime traversal, optional-peer exclusion, native filtering, and
invalid workspace metadata. Remove the obsolete vendoring exact edit for the
deleted manual list so future runtime workspace additions are included by
their manifests instead of becoming post-merge CI failures.
2026-08-23 19:24:50 +08:00
Tianyi Cui 4f3a47d792 fix(terminal-bash): handle terminal protocol replies
Unix PowerShell emits cursor-position requests while PSReadLine starts and
redraws prompts. The subprocess PTY is only a transport, so those requests
went unanswered. Startup could then accept the dsh> literal echoed from its
setup source as a rendered prompt, and later sends were lost or clipped.

Feed raw PTY output into a zero-scrollback @xterm/headless state machine and
write generated replies through the provider-owned terminal handle. Drain
replies before caller input, repeat foreground inspection when terminal
activity races the sample, and retain send ownership until parser and reply
work quiesce. Coalesce raw chunks behind one active parser write so large
Windows output cannot create thousands of queued parse callbacks.

Publish pwsh only from backend stdin_read evidence and start one timeoutMs
deadline before the complete startup retry loop, so inferred-idle follow-ups
cannot reset the bound. Dispose the emulator when the
terminal or cleanup fails. Document the fail-loud ConstrainedLanguage path
and add focused coverage for split queries, reply ordering, foreground
resampling, failure containment, batching, timeout, and disposal.
2026-08-23 19:24:50 +08:00
Tianyi Cui 9ebda8755e Merge remote-tracking branch 'origin/master' into worktree/localize-ui-strings-gate
# Conflicts:
#	packages/client/ui-chat/src/client/chat/AssistantMarkdown.tsx
#	packages/client/ui-chat/src/client/chat/CompactionItem.tsx
#	packages/client/ui-conversation/src/client/locales.ts
#	packages/client/ui-renderer/src/client/app.tsx
#	packages/client/ui-renderer/src/client/index.ts
#	packages/client/ui-renderer/tests/ui-renderer.client.spec.tsx
#	packages/client/ui-tool/src/client/tool/models/tool-call-model.ts
#	packages/client/ui-trajectory/src/client/trajectory-record.ts
#	packages/client/ui-trajectory/src/client/trajectory-snapshot-builder.ts
#	packages/client/ui-trajectory/tests/views.client.spec.tsx
#	packages/client/ui-workspace/src/client/tree.ts
2026-08-23 18:34:42 +08:00
Tianyi Cui 3c10f5d2d3 fix(client): route UI copy through locale 2026-08-23 17:31:37 +08:00
Tianyi Cui 3c1c6a89b1 test(python): gate installed runtime wheels across release targets (#2953)
* test(python): exercise installed wheels as black boxes

Add an installed-wheel mode that refuses source/editable imports, repository working directories, mismatched SDK/runtime versions, unpinned runtime dependencies, and executables outside the installed runtime distribution. The mode resolves the wheel-owned executable itself, so callers cannot accidentally prove an explicit checkout artifact.

Add a real-API scenario that drives two tool-using turns through the public synchronous SDK, verifies the file bytes outside the agent, checks completed turn/tool events and persistence, and projects provider failures without retaining credential-bearing error text. The existing deterministic scenario set remains the keyless behavior oracle.

Refs #2952.

* ci(python): require installed-wheel checks on every release target

Move the complete deterministic runtime scenarios behind construction and clean installation of the SDK and matching runtime wheels. Each native leg runs outside the checkout with source-resolution environment variables removed; Linux manylinux smokes assert the same installed provenance.

Expand the required pull-request call from Linux x64 to Linux x64, Linux arm64, and macOS arm64. Trusted heads receive only DEEPSEEK_API_KEY_EXTERNAL for a fail-loud live two-turn smoke on each carrier, while fork and Dependabot heads retain the full keyless path without exposing secrets.

Pin the reusable secret declaration, matrix call, aggregate dependency, untrusted-head condition, and live/keyless commands in the workflow contract test.

Refs #2952.

* docs(testing): make installed wheels the Python CI authority

Record the clean-wheel provenance boundary, complete keyless scenario set, trusted real-API contract, secret handling, and three-target required topology in a new implemented testing decision. Update the SEA distribution and portable-CI authorities plus the Python contributor reference to describe the same current state.

Archive the fully superseded Linux-x64-only decision after consolidating its rationale and alternatives into the new owner. Preserve its bilingual triplet as a sealed historical snapshot and redirect every active current-state reference.

Refs #2952.
2026-08-23 16:53:55 +08:00
imccyu 9f9f160854 Merge pull request #2911 from deepseek-harness/client-session-conversation-chat
refactor(client): split Session Conversation and Chat ownership
2026-08-23 16:36:08 +08:00
imccyu e4fb885f3e chore(client): mark mirrored interaction lifecycle 2026-08-23 16:28:20 +08:00
imccyu 7402ce3fc7 fix(client): settle interactions during plugin teardown 2026-08-23 16:28:20 +08:00
imccyu 61ee176973 docs(client): align split ownership contracts 2026-08-23 16:28:20 +08:00
imccyu 689644463d fix(client): keep conversation updates incremental 2026-08-23 16:28:20 +08:00
imccyu a40f30a4a2 fix(client): preserve scoped UI lifecycles 2026-08-23 16:28:20 +08:00
imccyu 956a72ffe0 fix(client): restore injected workspace dependencies 2026-08-23 16:28:19 +08:00
imccyu 7ddccac0d4 fix(client): remove unused workspace dev dependencies 2026-08-23 16:28:19 +08:00
imccyu 0b6269b50c fixup! refactor(interaction): move Approval and Question into UI owners 2026-08-23 16:28:19 +08:00
imccyu 828cd3f7b1 fix(client): avoid cyclic UI service type imports 2026-08-23 16:28:19 +08:00
imccyu dc92793f10 fix(client): align domain split with repository gates 2026-08-23 16:28:19 +08:00
imccyu f5767ba15e fixup! docs(client): document split ownership 2026-08-23 16:28:18 +08:00
imccyu 55dd6320d2 fixup! refactor(interaction): move Approval and Question into UI owners 2026-08-23 16:28:18 +08:00
imccyu f13fb4daeb docs(client): document split ownership 2026-08-23 16:28:18 +08:00
imccyu 3a23185edb chore(client): align split package graph 2026-08-23 16:28:18 +08:00
imccyu be531688f3 refactor(client): migrate consumers and remove Runtime 2026-08-23 16:28:18 +08:00
imccyu 049170c6d0 refactor(interaction): move Approval and Question into UI owners 2026-08-23 16:28:17 +08:00
imccyu c7d8e32aec refactor(conversation): separate Conversation, Chat, and Trajectory owners 2026-08-23 16:28:17 +08:00
imccyu d231c8777a refactor(ui): add Session and Workspace React adapters 2026-08-23 16:28:16 +08:00
imccyu 1b535f611c refactor(client): extract Store and renderer Slot infrastructure 2026-08-23 16:28:16 +08:00
imccyu 0ea9a456c0 refactor(workspace): move Client ownership into Workspace Controller 2026-08-23 16:28:16 +08:00
imccyu 956730a5fb refactor(session): move Client ownership into Session Controller 2026-08-23 16:28:16 +08:00
imccyu 291a43819a test(web): tolerate responsive transcript reflow 2026-08-23 16:27:09 +08:00
imccyu 8f919cb9ac test: ignore defensive Remote branches 2026-08-23 16:16:06 +08:00
imccyu c5efa5ce9c docs(typert): sync Gateway type excerpt 2026-08-23 16:16:06 +08:00
imccyu d020f60911 docs(typert): refresh Remote output contract 2026-08-23 16:16:06 +08:00
imccyu 2d974b187e perf(api-gateway): skip Remote output decoding 2026-08-23 16:16:06 +08:00
imccyu 4326dd4bca fix(api-session): preserve presenter fast path 2026-08-23 16:16:06 +08:00
imccyu d34be03f7b fix: skip get proxy 2026-08-23 16:16:05 +08:00
imccyu 08d6a215c9 perf(api-session): reuse live tool call arguments 2026-08-23 16:16:05 +08:00
imccyu 4ebd9fad79 test(web): avoid unstable subagent hover 2026-08-23 16:16:05 +08:00
imccyu 24a610db74 fix(api): preserve migrated transport semantics 2026-08-23 16:16:05 +08:00
imccyu 3728c0b13e test(client): cover reconnect and question scope paths 2026-08-23 16:16:05 +08:00
imccyu 18cf84d133 fix(client): materialize Agent scopes before list baseline 2026-08-23 16:16:05 +08:00
imccyu d319a0773b docs: refresh module graph after rebase 2026-08-23 16:16:05 +08:00
imccyu ddcab34c0e test(api): close stream transport coverage gaps 2026-08-23 16:16:05 +08:00
imccyu 6a3f35e248 docs: refresh generated client metadata 2026-08-23 16:16:04 +08:00
imccyu f494caca45 refactor(client): move pending interactions out of Session state 2026-08-23 16:16:04 +08:00
imccyu 003fc024c2 docs: refresh module graph 2026-08-23 16:16:04 +08:00
imccyu 30f43b9870 test(api-session): bind history probes to follow cursors 2026-08-23 16:16:04 +08:00
imccyu 7d21611391 test(api-gateway): cover clientless Remote event replay 2026-08-23 16:16:04 +08:00
imccyu a49b265f88 docs: synchronize controller transport documentation 2026-08-23 16:16:04 +08:00
imccyu e38982adc8 fix(client): satisfy stream lifecycle contracts 2026-08-23 16:16:04 +08:00
imccyu 9eb3747ffc fix(user-questions): bridge scoped request events 2026-08-23 16:16:03 +08:00
imccyu 016be7d533 fix(interaction): type Agent-scoped request events 2026-08-23 16:16:03 +08:00
imccyu 9ff067dfbd fix(client-runtime): close journals with session scopes 2026-08-23 16:16:03 +08:00
imccyu 2b2a45f30c fix(client-connection): release stream ownership on unload 2026-08-23 16:16:03 +08:00
imccyu 5d17b6798d fix(api-gateway): retry journal pages after reconnect 2026-08-23 16:16:03 +08:00
imccyu 1e0e827425 refactor(client-runtime): remove Session interaction consumers 2026-08-23 16:16:03 +08:00
imccyu 7f908c1bb4 fix(user-questions): normalize in-flight aborts 2026-08-23 16:16:03 +08:00
imccyu 639dcef5d8 refactor(api-session): remove interaction transport 2026-08-23 16:16:03 +08:00
imccyu e8ede58603 fix(api-session): bind history pages to follow cursor 2026-08-23 16:16:03 +08:00
imccyu 9b1069c234 docs: document controller Remote transport 2026-08-23 16:16:03 +08:00
imccyu 54d739cf53 chore(api): align controller assembly and package graph 2026-08-23 16:16:02 +08:00
imccyu dcddaa1a6e refactor(client): replace legacy Host event carriers 2026-08-23 16:16:02 +08:00
imccyu ae25df3ac6 refactor(workspace): move APIs into Workspace Controller 2026-08-23 16:16:02 +08:00
imccyu d26acfa2e3 refactor(session): move APIs into Session Controller 2026-08-23 16:16:02 +08:00
imccyu 3d6d595d79 feat(api-gateway): unify Remote streams and events 2026-08-23 16:16:01 +08:00
Tianyi Cui 4ba47e665b Merge pull request #2119 from deepseek-harness/worktree/gate-package-subsystem-pages
Require package groups to declare subsystem documentation
2026-08-23 16:14:47 +08:00
Tianyi Cui 5e0fd757e1 Merge pull request #2460 from deepseek-harness/test/translation-prompt-snapshot-fixtures
test: decouple the translation prompt snapshot from live documents
2026-08-23 16:13:58 +08:00
Tianyi Cui 1d46946963 test(docs): use a block cleanup callback 2026-08-23 16:02:32 +08:00
Tianyi Cui 97938582e5 test(docs): avoid duplicate fixture cleanup 2026-08-23 15:55:46 +08:00
Tianyi Cui 4bc6f4bdf7 Merge origin/master into worktree/gate-package-subsystem-pages 2026-08-23 15:47:32 +08:00
Tianyi Cui ce2de363dd Merge latest master into test/translation-prompt-snapshot-fixtures 2026-08-23 15:41:54 +08:00
Tianyi Cui 947205fb80 Merge pull request #2956 from deepseek-harness/worktree/win32-utf16-nul-truncation-20260823
fix(directory-picker-native): stop truncating Win32 UTF-16 paths at U+XX00
2026-08-23 14:28:53 +08:00
Tianyi Cui 56f0297321 docs(agent-notes): record the Win32 UTF-16 NUL-scan fix 2026-08-23 14:22:03 +08:00
ericcaiwx-star 9a2217b74a test(directory-picker-win32): use a synthetic path in the UTF-16 fixture
The U+5F00 case only needs that code unit in the buffer. A real-looking user desktop path does not belong in a public fixture.
2026-08-23 14:08:39 +08:00
ericcaiwx-star 51c242749a fix(directory-picker-native): stop truncating Win32 UTF-16 paths at U+XX00
readUtf16 treated any zero low byte as NUL, so BMP characters such as 开 (U+5F00) cut the folder-picker path in half.
2026-08-23 13:56:48 +08:00
Tianyi Cui b7e16fdaeb Merge pull request #2954 from deepseek-harness/worktree/remove-openai-yml
chore: remove openai.yaml files
2026-08-23 13:22:09 +08:00
Tianyi Cui 8c420de301 chore: remove OpenAI skill metadata 2026-08-23 13:14:41 +08:00
Turtle cc8ea70dc0 Merge pull request #2560 from deepseek-harness/codex/add-security-policy
docs: add bilingual experimental safety notice
2026-08-23 11:10:52 +08:00
Tianyi Cui 92f8fb6c4a Merge pull request #2948 from deepseek-harness/worktree/unify-dsh-launch-profiles-reviewable-20260823
feat: unify application launch under dsh profiles
2026-08-23 11:10:27 +08:00
Tianyi Cui fd814589fb refactor(profiles): make module HMR opt-in
Move the shared module-reload policy into dsh-base by inserting its HMR row disabled, then remove the redundant disabled overrides from Web, headless, SDK, and ACP. No shipped profile enables server module reload; live profile patch watching continues through the launcher-owned config-only fallback, and browser client HMR remains a separate mechanism.

A later profile layer can opt into source-module reload explicitly with disabled: false while retaining the base root configuration. Composition tests cover every shipped mode and the explicit enable path, and the bundle references plus launcher Agent Notes document the resulting ownership and safety rationale.
2026-08-23 10:59:01 +08:00
Tianyi Cui 2eea02dae3 ci: bound profile e2e subprocess fan-out
Set DSH_E2E_MAX_WORKERS=4 for the credentialed e2e workflow and pin that environment contract in the workflow test. Profile-launched SDK and ACP scenarios each boot a complete subprocess tree, so the previous file-level fan-out could multiply process and provider pressure far beyond the runner's useful concurrency.

The bound changes scheduling only: every e2e file still runs, the Vitest configuration retains its explicit override knob, and local callers can choose a different positive worker count when their resources allow it.
2026-08-23 10:59:01 +08:00
Tianyi Cui fdac6cffcb test: refresh profile migration catalogs and built smokes
Regenerate the configuration catalog and module graph after replacing standalone application packages with dsh profile bundles and renaming the private Python carrier. Update built-bin coverage to launch the shipped sdk and acp profiles, assert retired bins stay absent, and keep the Web golden text aligned with the same assembled runtime.

Clarify that headless is a startup profile whose patches freeze after boot. This commit is projection and verification work: it contains no application implementation, and every generated document is produced from source committed earlier in the series.
2026-08-23 10:59:01 +08:00
Tianyi Cui 32c32932f9 chore(repo): wire profile apps and the renamed runtime through builds
Update workspace manifests, the lockfile, Host project references, Knip inputs, package constraints, vendoring rewrites, and Python runtime build/smoke scripts for sdk-app, acp-app, and @deepseek-ai/dsh-sdk-python-runtime. Add the ACP hook packages to the dsh dependency closure so installed profile materialization resolves the same plugins as source workspaces.

Keep Python distribution outputs deliberately unchanged: the wheel modules, executable names, and smoke targets retain their public identities even though their private npm carrier moved. Constraint fixtures pin the new package locations and catch missing application dependencies on every platform.
2026-08-23 10:59:01 +08:00
Tianyi Cui 3b33ca058f chore(repo): enforce dsh as the only Node application launcher
Add verify-application-entrypoints to the top-level gate graph. It inventories executable sources and package bins across apps, packages, and examples; rejects unclassified launchers including root-level js/mjs/cjs/ts files; and permits only the dsh CLI plus the explicitly private Python runtime carrier exception.

Update repository, architecture, CLI, and naming records to state the same rule: Node consumers select a dsh profile instead of invoking application-package bins, and no compatibility aliases remain. Fixtures prove both allowed classifications and representative escape attempts, making the architectural rule mechanically enforceable.
2026-08-23 10:59:01 +08:00
Tianyi Cui a6447db01c refactor(sdk): name the private Python runtime carrier explicitly
Rename the relocated npm workspace to @deepseek-ai/dsh-sdk-python-runtime and the runnable example to python-sdk-agent, then update every owning English/Chinese document, test, and packaged-runtime reference. Remove the obsolete standalone bin while retaining the carrier entrypoints used to assemble the wheel runtime.

This is intentionally a naming and ownership change, not a Python SDK migration. The public deepseek_harness_sdk and deepseek_harness_runtime module, wheel, executable, environment, and wire behavior remain unchanged. Documentation records that this private carrier is the temporary sole non-dsh application exception and will move to profile launch later.
2026-08-23 10:59:01 +08:00
Tianyi Cui 189e7b84e8 test(sdk): refresh dsh-profile SDK transcripts
Regenerate the four TypeScript SDK replay scenarios after switching their subprocess to dsh --profile sdk. The fixtures now project profile-owned runtime context, tool composition, nested-child persistence, and the opt-in DeepSeek session-log acceptance event while preserving each scenario's final response and file assertions.

This commit contains only committed snapshot outputs. Separating them from the SDK implementation keeps protocol/API review focused and makes the model-visible consequences auditable as generated evidence.
2026-08-23 10:59:00 +08:00
Tianyi Cui 3368ddc0ab feat(sdk): launch TypeScript clients through dsh profiles
Replace the TypeScript SDK's public arbitrary command/argv launch surface with the same-version dsh CLI, a named profile, ordered per-launch patches, optional process cwd, and explicit Harness home selection. Installed consumers use the built CLI; clean source checkouts use the package's src/bin.ts through an absolute tsx/esm loader and a source-only patch that omits build-generated Typert loading.

Materialize explicit or inherited environments at spawn time, keep profile-internal patches below caller patches, and resolve every caller-relative path before the child starts. The SDK subagent provider validates its optional CLI and patch files at plugin load and requires an isolated absolute child home.

Treat JSON-RPC initialize as the Loader-owned readiness point: Loader settlement joins entry imports, fiber lifecycle work, and synchronous effect registration, so the server needs no scheduler tick. A delayed profile entry registers a private adapter before initialize resolves, proving caller-supplied plugin routes are visible without fallback.

Update sdk-app ownership, server diagnostics, TypeScript SDK examples, nested-loader coverage, and session-upload replay layering together. The following commit contains only the regenerated SDK transcripts, keeping this API and lifecycle change directly reviewable.
2026-08-23 10:59:00 +08:00
Tianyi Cui f3402eff58 refactor(sdk): relocate JSON-RPC example and runtime without edits
Move examples/jsonrpc-agent to examples/python-sdk-agent and packages/examples/jsonrpc-demo to packages/sdk/python-runtime while preserving every file byte-for-byte. The directory placement now reflects the example's Python-distribution role and the private runtime carrier's SDK ownership.

This commit deliberately keeps the old package names, commands, configuration, and snapshots inside their new directories. All 42 files are 100% renames; API/profile migration and naming changes follow separately so reviewers do not have to disentangle behavior from filesystem movement.
2026-08-23 10:59:00 +08:00
Tianyi Cui d52f2900d6 test(acp): refresh profile-launched application transcripts
Regenerate the ACP composition graph and committed replay outputs from the assembled dsh base plus acp-app profile. The updated logs, system prompts, tool schemas, and stdout projections capture the same scenarios after shared plugins move out of the retired demo package and into profile-owned composition.

There is no runtime source in this commit. Keeping generator-owned artifacts separate lets reviewers validate the behavioral migration first, then inspect expected wire/model-visible consequences as a mechanical projection update.
2026-08-23 10:59:00 +08:00
Tianyi Cui d8dbb8235c refactor(acp): launch automation through the dsh acp profile
Replace the standalone @deepseek-ai/dsh-acp-demo application with dsh --profile acp plus ordered example patches. The shipped acp-app bundle owns only the protocol bridge; every example overlay now targets shared dsh-base rows instead of copying a complete application tree.

Move launcher responsibilities into the ACP snapshot harness: it materializes profile patches, links required packages, reserves stdout for JSON-RPC, observes spawn and drain failures, and escalates process teardown deterministically. The relocated control-surface fixture and the ACP/subagent integration tests now exercise the real CLI/profile path.

This commit contains authored runtime, configuration, and test changes only. Generated transcript and projection churn is deliberately left for the next commit so reviewers can inspect the migration logic without hundreds of expected-output edits.
2026-08-23 10:59:00 +08:00
Tianyi Cui 713b41a946 refactor(acp): relocate control-surface fixtures without edits
Move the ACP control-surface e2e, scripted LLM, and Cordis fixture out of the application package that later commits retire and into the runnable examples/acp-agent test tree. This gives the assembled dsh profile example ownership of its integration fixture.

This commit is intentionally mechanical: all three files retain their exact blobs and appear as 100% renames. Imports and launch behavior are updated only in the subsequent ACP migration commit, keeping reviewer-visible code changes separate from file movement.
2026-08-23 10:59:00 +08:00
Tianyi Cui 47a46e4cca feat(profiles): add the ACP application bundle
Introduce @deepseek-ai/dsh-acp-app as the thin application layer for the built-in acp profile. It contributes only the ACP protocol bridge and profile metadata; dsh-base remains the single owner of shared agent composition, providers, persistence, permissions, and tools.

Wire the bundle into CLI resolution, catalogs, workspace configuration, and built-bin coverage. The focused bundle and startup tests prove that base plus acp-app exposes automation sessions while keeping stdout reserved for ACP JSON-RPC.
2026-08-23 10:59:00 +08:00
Tianyi Cui a16822944b feat(profiles): add the SDK application bundle
Introduce @deepseek-ai/dsh-sdk-app as the thin application layer for the built-in sdk profile. The bundle contributes the JSON-RPC server and startup-only profile metadata, while dsh-base continues to own the shared agent, provider, persistence, and tool composition.

Publish ctx.appReady from the launcher only after the Loader tree and launcher-owned setup succeed. The stdio lifetime binding leaves stdin unread until the protocol transport claims it and defers EOF exit 0 until readiness commits, so early protocol frames remain buffered and a racing startup failure remains the nonzero process outcome. Fiber disposal cancels both pending lifecycle listeners.

Register the bundle in the CLI resolver closure, generated configuration catalog, workspace graph, and built-bin smoke. Startup tests prove that base plus sdk-app exposes the SDK server without taking ownership of shared runtime plugins; focused and built-bin regressions cover early input, EOF readiness, and startup-error precedence.
2026-08-23 10:59:00 +08:00
Tianyi Cui 2c9da6eb5b feat(cli): make profile patch reload policy explicit
Add a patchReload field to built-in profile metadata and carry it through CLI profile resolution into app boot. Live profiles install the existing patch watcher; startup profiles freeze every layer after boot and apply later edits only on the next launch. Missing or invalid metadata fails before the plugin tree starts.

The implementation keeps reload policy with the profile that owns it instead of inferring behavior from an entrypoint. Unit tests cover metadata validation and both lifecycle modes, while the CLI and app-boot references document which built-ins are live versus startup.
2026-08-23 10:59:00 +08:00
Tianyi Cui 3fa19b3b30 docs: define dsh as the sole Node application launcher
Record the final architecture before any runtime or file-layout changes. The decision makes named dsh profiles the only supported Node application launch path, gives TypeScript SDK callers ordered profile patches for per-launch customization, and retains the packaged Python runtime as an explicitly temporary exception with a later migration obligation.

Keeping this decision in a documentation-only commit gives every following commit one stable naming, lifecycle, and compatibility reference. The English and Chinese notes and their pairing record enter together.
2026-08-23 10:58:59 +08:00
Tianyi Cui ca53c90a74 Merge pull request #2875 from deepseek-harness/ci/python-release-gray
ci(python): drop PR labeled trigger for python-release dry-run
2026-08-23 10:34:15 +08:00
Tianyi Cui e73c78fc20 Merge pull request #2946 from deepseek-harness/worktree/webhook-real-e2e
test(webhook): exercise real CLI and model flow
2026-08-23 09:34:53 +08:00
Tianyi Cui c5311d665d test(webhook): preserve real e2e environment 2026-08-23 01:56:42 +08:00
Tianyi Cui 65509a225b test(webhook): resolve the real CLI rule from examples 2026-08-23 01:48:55 +08:00
Tianyi Cui 3bf5edb5d5 test(webhook): exercise the real CLI and model flow 2026-08-23 01:48:55 +08:00
Tianyi Cui 76a450529d docs(app-boot): clarify patch path anchoring 2026-08-23 01:48:36 +08:00
Tianyi Cui 2b2a8e8240 test(webhook-github): verify chunked overflow response 2026-08-23 01:48:36 +08:00
Tianyi Cui 2f56345439 fix(webhook-github): export provider event types 2026-08-23 01:48:36 +08:00
Tianyi Cui bf23f59979 fix(webhook): quiet expected disposal cancellation 2026-08-23 01:48:35 +08:00
Tianyi Cui ea3d0ffcee fix(webhook): preserve the initial model selection 2026-08-23 01:48:35 +08:00
Tianyi Cui d06f544d8c fix(ci): give Wine Host compiler sufficient heap 2026-08-23 01:48:35 +08:00
Tianyi Cui 9cd383059f fix(build): raise host compiler heap ceiling 2026-08-23 01:48:35 +08:00
Tianyi Cui 01258a6bca fix(webhook): retain checked invariant installer 2026-08-23 01:48:35 +08:00
Tianyi Cui a1455edeb8 fix(webhook): align patch-relative fixtures and invariants 2026-08-23 01:48:35 +08:00
Tianyi Cui 5f60e50d71 feat(webhook): create workspace sessions from GitHub events 2026-08-23 01:48:35 +08:00
Tianyi Cui c6c9426efb Merge pull request #2917 from deepseek-harness/worktree/deepseek-session-log-upload
feat(deepseek): upload incremental session logs
2026-08-23 01:23:59 +08:00
Tianyi Cui 9c7e142f79 refactor(session): send canonical events directly 2026-08-23 00:22:41 +08:00
Tianyi Cui 3c0da7bef7 refactor(session): name delivery acceptance event 2026-08-22 23:18:13 +08:00
Tianyi Cui e0a8050aea docs(deepseek): merge todo event graph updates 2026-08-22 22:55:02 +08:00
Tianyi Cui 8ac8245d39 docs(deepseek): specify session log wire format 2026-08-22 22:55:02 +08:00
Tianyi Cui 1c7af99c80 feat(deepseek): apply session upload review feedback 2026-08-22 22:55:02 +08:00
Tianyi Cui fe72ab42d1 feat(deepseek): upload incremental session logs 2026-08-22 22:55:02 +08:00
Tianyi Cui df6e581f58 Merge pull request #2934 from deepseek-harness/worktree/todo-event-ownership-v2-20260822
refactor(todo): move todo event vocabulary to its producer
2026-08-22 22:37:23 +08:00
Tianyi Cui 851eab756e docs(todo): add the owning subsystem reference 2026-08-22 22:22:43 +08:00
Tianyi Cui b7dca9eb7e fix(todo): validate announced session histories 2026-08-22 22:22:27 +08:00
_Kerman 65295d5b68 docs(session): refresh persistence pairing record 2026-08-22 21:51:49 +08:00
_Kerman 2ba721f799 Merge github/master into xtr/session-format-migration 2026-08-22 21:51:30 +08:00
Tianyi Cui c41c5f3959 Merge origin/master into todo-event-ownership-v2 2026-08-22 21:12:36 +08:00
Tianyi Cui 59e49458e5 docs(todo): record event ownership 2026-08-22 21:10:02 +08:00
Tianyi Cui a2b415096d refactor(todo): own todo event vocabulary 2026-08-22 21:10:02 +08:00
Tianyi Cui d16ab1ac9a Merge pull request #2914 from deepseek-harness/worktree/trim-cot-leakage-20260821
docs: trim CoT leakage from post-purge prose
2026-08-22 20:54:12 +08:00
Tianyi Cui f964f4078c docs: remove rebase residue and hedge parser-swap regression
- drop the commit-message suffix left at the end of the ui-workspace zh README
- state parser-swap regressions as possible, not guaranteed
2026-08-22 20:35:11 +08:00
Tianyi Cui 750c7f7535 docs: address CoT review findings
- stop attributing the 45-case helper/Node divergence to the path port spec,
  which pins only the Node-facing port to Node
- keep the divergence measurement as provenance, without a dead owner
- fix the path corpus comment so it does not claim divergence from the spec
  that asserts equality
- drop the v2 generation stamp from the cordis mount fallback test
- restate the watcher refusal rationale in current-state terms
- re-record the ui-workspace bilingual pair after rebase
2026-08-22 20:35:11 +08:00
Tianyi Cui 17f85bdbcd docs: trim CoT leakage from post-purge prose
Remove dead design-session citations, change narration, indexical
stamps, and review-adjacent justification found by the
dsh-trim-cot-leakage recall batteries in prose that landed after the
last purge. Bilingual README pairs are re-recorded.
2026-08-22 20:35:11 +08:00
Tianyi Cui efdafb8610 Merge pull request #2926 from deepseek-harness/worktree/optimize-windows-ci-20260822
perf(ci): shorten native Windows coverage critical path
2026-08-22 20:21:00 +08:00
Tianyi Cui f39af7bae9 feat(acp): complete standard v1 automation controls (#2928)
* feat(acp): complete standard v1 automation controls

* docs: refresh ACP module graph

* docs: synchronize module graph pair

* docs(acp): explain empty-session durability

* test(acp): align assembled automation coverage

* fix(acp): address lifecycle review findings
2026-08-22 20:19:21 +08:00
Tianyi Cui 35f26699be fix(test): publish lint probes atomically 2026-08-22 20:10:55 +08:00
Tianyi Cui 811788e57a fix(ci): harden optimized Windows gate fixtures 2026-08-22 20:10:55 +08:00
Tianyi Cui c92c86492d ci: require native Windows aggregate verdict 2026-08-22 20:10:55 +08:00
Tianyi Cui c8cecd6079 perf(ci): raise isolated Windows coverage fan-out 2026-08-22 20:10:55 +08:00
Tianyi Cui d39b6c638b perf(test): widen transform corpus sharding 2026-08-22 20:10:55 +08:00
Tianyi Cui d27a5f2967 perf(test): shard the transform corpus checker 2026-08-22 20:10:55 +08:00
Tianyi Cui 12ad38b234 perf(ci): phase native Windows coverage work 2026-08-22 20:10:55 +08:00
Tianyi Cui 4edf6400ff perf(ci): isolate the transform corpus from coverage 2026-08-22 20:10:54 +08:00
Tianyi Cui cd6197b428 Merge origin/master into worktree/acp-v1-control 2026-08-22 20:05:11 +08:00
Tianyi Cui ea6f61f144 feat(deepseek): upload plugin package metadata (#2916)
* feat(deepseek): upload plugin package metadata

* feat(deepseek): apply metadata review feedback

* docs(deepseek): specify request wire extensions

* docs(notes): record inventory cache benchmark

* docs(site): keep DeepSeek wire spec repository-only
2026-08-22 20:03:23 +08:00
Tianyi Cui 52bd3e1805 fix(acp): address lifecycle review findings 2026-08-22 19:44:00 +08:00
Tianyi Cui e37985f5d5 test(acp): align assembled automation coverage 2026-08-22 19:32:27 +08:00
Tianyi Cui e0a700baf9 docs(acp): explain empty-session durability 2026-08-22 19:17:06 +08:00
Tianyi Cui 696ec4880e docs: synchronize module graph pair 2026-08-22 19:11:28 +08:00
Tianyi Cui 28c93d8224 docs: refresh ACP module graph 2026-08-22 19:06:37 +08:00
Tianyi Cui c1764157e7 Merge origin/master into worktree/acp-v1-control 2026-08-22 18:52:58 +08:00
Tianyi Cui 511181684c feat(acp): complete standard v1 automation controls 2026-08-22 18:52:27 +08:00
_Kerman d375d58889 Merge remote-tracking branch 'origin/xtr/session-format-migration' into xtr/message-tool-call-id 2026-08-22 16:26:47 +08:00
_Kerman 3d660d2db2 ci: raise host TypeScript heap budget 2026-08-22 16:26:31 +08:00
_Kerman 3cd80a6f3f Merge remote-tracking branch 'origin/xtr/session-format-migration' into xtr/message-tool-call-id
# Conflicts:
#	.agents/notes/implemented/architecture/2026-06-20-branded-ids.i18n.yaml
#	.agents/notes/implemented/architecture/2026-06-20-branded-ids.md
#	.agents/notes/implemented/architecture/2026-06-20-branded-ids.zh.md
#	packages/fs/tool-fs/tests/read-image.spec.ts
#	packages/llm/llm-deepseek/tests/adapter.e2e.ts
#	packages/llm/llm-deepseek/tests/serialize.spec.ts
#	packages/llm/llm-pi-ai/src/context.ts
#	packages/llm/llm-pi-ai/tests/context.spec.ts
#	packages/llm/llm-pi-ai/tests/convert.spec.ts
#	packages/llm/llm/src/message.ts
#	packages/llm/llm/tests/content.spec.ts
2026-08-22 16:03:48 +08:00
_Kerman 421a577b1c Merge remote-tracking branch 'origin/master' into xtr/session-format-migration
# Conflicts:
#	.agents/notes/implemented/architecture/2026-08-10-session-log-version-mechanism.i18n.yaml
#	.agents/notes/implemented/architecture/2026-08-10-session-log-version-mechanism.md
#	.agents/notes/implemented/architecture/2026-08-10-session-log-version-mechanism.zh.md
#	docs/subsystems/persistence.i18n.yaml
#	docs/subsystems/persistence.md
#	docs/subsystems/persistence.zh.md
#	packages/session/session-persistence-jsonl/src/format.ts
#	packages/session/session-persistence/src/coordinator.ts
2026-08-22 16:01:15 +08:00
Tianyi Cui e184d26380 Merge pull request #2923 from deepseek-harness/worktree/archive-agent-notes-20260822
docs(notes): archive low-future-value records
2026-08-22 15:45:31 +08:00
Tianyi Cui 198c6c595c docs(notes): archive low-value records 2026-08-22 15:15:08 +08:00
Tianyi Cui 7476b0495d Merge pull request #2922 from deepseek-harness/worktree/trim-cot-skill-followup-20260822
docs: harden chain-of-thought leakage audits
2026-08-22 14:43:09 +08:00
Tianyi Cui 7f93f65ca9 docs: address leakage audit review 2026-08-22 14:34:28 +08:00
Tianyi Cui d72ff1f49a docs: harden chain-of-thought leakage audits 2026-08-22 13:39:00 +08:00
Tianyi Cui 43c30bf063 Merge pull request #2921 from deepseek-harness/worktree/trim-cot-leakage-20260822
docs: purge residual chain-of-thought leakage
2026-08-22 13:22:50 +08:00
Tianyi Cui 934976732d docs: purge residual chain-of-thought leakage 2026-08-22 13:10:23 +08:00
Tianyi Cui 72d3a80c23 Merge pull request #2915 from deepseek-harness/worktree/deepseek-ci-stability
test(ci): stabilize cross-platform gate baselines
2026-08-22 11:00:26 +08:00
Tianyi Cui 1d6f84ff42 test(ci): apply review feedback 2026-08-22 02:31:11 +08:00
Tianyi Cui b9869d1e97 test(ci): stabilize cross-platform gate baselines 2026-08-22 01:47:43 +08:00
Turtle de727c4a1b Merge pull request #2773 from deepseek-harness/codex/simplify-comments-and-docs
docs: remove implementation narration from prose
2026-08-21 22:51:38 +08:00
Turtle 51684bd6be Merge pull request #2901 from deepseek-harness/turtle/add-docs-link
docs: add documentation website link
2026-08-21 22:38:37 +08:00
Turtle 6b3e971805 docs: remove implementation narration from prose 2026-08-21 22:22:23 +08:00
_Kerman 95ed302c9c fix(session): remove unreachable listing branch 2026-08-21 22:08:53 +08:00
pku-xht d04adbc73c Merge pull request #2714 from deepseek-harness/codex/subprocess-win32-process-primitives
refactor(win32-process): share native process primitives
2026-08-21 21:53:42 +08:00
pku-xht e6818bd697 Merge commit '4913489a6184d124900273e3a76d595e25d76099' into codex/subprocess-win32-process-primitives
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
2026-08-21 21:42:39 +08:00
imccyu 060070203f Merge pull request #2712 from deepseek-harness/worktree-webworker
Web Worker host runtime with packed VFS image and static preview
2026-08-21 21:14:24 +08:00
imccyu 311aaed2e5 fix(release): align new package versions with the 0.1.1-rc.2 root 2026-08-21 20:35:48 +08:00
imccyu 4e6937064c fix(util): mint the pinned uuid bytes without dead fallback branches 2026-08-21 20:35:35 +08:00
imccyu f910e4f84f test: follow the uuid mint to its new entropy seam 2026-08-21 20:35:34 +08:00
imccyu 86357f5f01 fix(lint): clear contracts-ready findings in the mode-model batch 2026-08-21 20:35:34 +08:00
imccyu 6811e44308 test(webworker): narrow the stat shape in the mode round-trip spec 2026-08-21 20:35:34 +08:00
imccyu 54b05a8dcb ci: put the preview-comment marker on its own line 2026-08-21 20:35:34 +08:00
imccyu c2a30af92d fix(webworker): store and honour VFS permission bits 2026-08-21 20:35:34 +08:00
imccyu 8081620a35 fix: loopback 2026-08-21 20:35:34 +08:00
imccyu 0bee546177 feat(util): mint UUIDs without crypto.randomUUID in every context 2026-08-21 20:35:34 +08:00
imccyu 99db143e37 feat(webworker): name packed modules and client bundles for the debugger 2026-08-21 20:35:33 +08:00
imccyu 304b4b8424 docs: localize a cross-note link in the composer edit-range note 2026-08-21 20:35:33 +08:00
imccyu 3a47674798 ci: add build-preview workflow 2026-08-21 20:35:33 +08:00
imccyu 3cc90952cc chore(gates): regenerate catalogs and keep repository gates green
Config catalog, module graph, event producer-consumer tables, and
third-party notices regenerate over the webworker surface; the oxlint
rule fingerprint and the ui-renderer NodeNext import face follow.
2026-08-21 20:35:33 +08:00
imccyu 50bfb00985 feat(web): single-build preview page and its acceptance e2e
One Vite build emits dist/index.html and dist/preview.html sharing every
chunk; the only difference is one prepended bootstrap entry whose module
connects the worker host, so the page from the stock entry onward is the
served startup chain verbatim. The dist moves to a relative base so the
preview mounts under any static directory, and the served form anchors
deep SPA-fallback paths with a rendered <base href="/">. The preview-boot
e2e serves the real built pages, packs the VFS image when absent, and
holds the boot line's lowering contract, the interactive hero, and a
clean page-error channel in headless Chromium.
2026-08-21 20:35:33 +08:00
imccyu fd3112a23f feat(web): unify served and preview startup behind a boot-ready seam
The webserver renders a boot-readiness tail after the injection rows and
AppWebEntry.run awaits the __DSH_BOOT_READY__ deferred before reading any
injected state. Whichever bootstrap applies the injection table settles
the deferred - the served renderer resolves it inline, an asynchronous
bootstrap installs it ahead of the entry module and settles it with the
handshake - so both deployments run one startup chain and a failed
handshake surfaces on the boot page instead of proceeding on missing
globals.
2026-08-21 20:35:32 +08:00
imccyu 4779ec9af9 feat(webworker): model-executed shell over nested worker processes
Buy the grammar, own the execution: @yarnpkg/parsers parses the command
line - aliased at bundle time to its shell entry so the root barrel's
syml/js-yaml closure stays out of the worker - and a VFS-backed evaluator
with a coreutils command table runs it inside the worker host. Each shell
process is a real child WebWorker spawned from the same bundle (the first
frame decides the role), so the TERM-then-KILL ladder is real - TERM
requests, KILL terminates the worker - and the file face stays
asynchronous end to end, since the deployment target serves no COOP/COEP
headers and SharedArrayBuffer never exists there. node:child_process
reports through the ChildProcess surface the subprocess service consumes;
execSync, execFileSync and fork refuse, and node-pty stays stubbed.
2026-08-21 20:35:32 +08:00
imccyu f47b1ecac2 feat(webworker): browser worker host runtime and the vfs image packer
Two private experimental packages run the whole harness tree inside one
dedicated Web Worker. dsh-experimental-webworker-runtime owns the in-memory
VFS (BigInt stats with per-path identity and strictly increasing mtimes),
the CommonJS wrapper loader over a lazily-evaluated builtin table whose
shims typecheck against Node's own module types, the postMessage tunnel
speaking plain HTTP, the AsyncLocalStorage runtime, and the worker
assembly. dsh-experimental-webworker-packer lowers every module body at
pack time against the shared wrapper contract, sweeps the profile closure
by static reachability, and writes a deterministically gzip-compressed tar
the worker inflates through the browser's native DecompressionStream while
it downloads.
2026-08-21 20:35:32 +08:00
imccyu b150a551b8 Merge pull request #2908 from deepseek-harness/release/dsh-0.1.1-rc.2
release: [email protected]
2026-08-21 20:03:37 +08:00
imccyu aa6c361a97 release(dsh): 0.1.1-rc.2 2026-08-21 19:48:58 +08:00
CreatixChu 272ffffddd Merge pull request #2676 from deepseek-harness/worktree/image-management-strategy
feat(attachment): add normalized image and Files API pipeline
2026-08-21 19:40:51 +08:00
creatixchu d618bfebb4 fix(deepseek): decouple files and stream timeouts 2026-08-21 18:34:16 +08:00
creatixchu 1b389798dc fix(llm-deepseek): fall back when Files resolution fails 2026-08-21 18:14:46 +08:00
_Kerman 73a1dae665 docs(session-projection): sync generated catalog translations 2026-08-21 17:53:58 +08:00
_Kerman 54d5d92c08 docs(session-projection): refresh generated catalogs 2026-08-21 17:52:31 +08:00
_Kerman 7e3d5332dc fix(session): address migration review feedback 2026-08-21 17:48:45 +08:00
creatixchu e30d92a03e fix(attachment): accept opaque WebP alpha omission 2026-08-21 17:27:08 +08:00
_Kerman 82c34463fc fix(tests): complete ToolCallId rename 2026-08-21 17:11:33 +08:00
Yichen Jiang e08be4df6f Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614 2026-08-21 17:10:03 +08:00
Yichen Jiang 73792a81b1 fix(ui-conversation): restore the folder glyph on composer folder references
The old backdrop overpainted a folder reference's trigger character with
IconFolderClose16; the Lexical rewrite kept the data-ref-appearance
attribute but nothing consumed it, so the composer showed a bare blue
token while the sent bubble carried the icon. A Lexical text node cannot
split out its trigger character for overpainting, so the glyph renders
as an icon prefix instead: a currentcolor mask of the same asset before
the intact literal token. The Lexical note's behavior line follows.
2026-08-21 17:09:07 +08:00
_Kerman 9ce7ef3e23 Merge remote-tracking branch 'origin/xtr/session-format-migration' into xtr/message-tool-call-id 2026-08-21 17:05:09 +08:00
_Kerman 9ab59b8001 Merge remote-tracking branch 'origin/master' into xtr/session-format-migration 2026-08-21 17:01:51 +08:00
creatixchu d4b24b5148 Merge remote-tracking branch 'origin/master' into worktree/image-management-strategy 2026-08-21 16:55:00 +08:00
imccyu 577bb71418 Merge pull request #2903 from deepseek-harness/worktree-revert-2608
revert: undo #2608 permission labels and blank defaults
2026-08-21 16:53:49 +08:00
imccyu 32f3c09c26 test: sync reverted permission snapshot 2026-08-21 16:41:11 +08:00
_Kerman 6c4bbf7300 perf(goal): read durable state from session projection 2026-08-21 16:29:36 +08:00
imccyu 7ce85283b5 Revert "Merge pull request #2608 from deepseek-harness/fix/permission-copy-and-default"
This reverts commit d51f4106a2b0669d33e0f5dc1d5dcf21a764d313, reversing
changes made to 69ace51625b6ac665b2f2ec1e81005d5b055f152.
2026-08-21 16:21:13 +08:00
_Kerman 6def839f56 perf(team): project durable state incrementally 2026-08-21 16:12:59 +08:00
_Kerman aa5bc532d3 docs(notes): rename CallId to ToolCallId in agent notes
Keep the active implemented and proposed Agent Notes current with the
renamed ToolCallId brand: branded-ids, content-block-vocabulary,
approval-seam, tool-output-spill-files, and task-surface, in both
languages, with re-recorded .i18n.yaml pairing records.
2026-08-21 16:10:46 +08:00
_Kerman a789637db6 refactor(llm): rename CallId to ToolCallId 2026-08-21 16:10:24 +08:00
_Kerman 8cf2445f11 Merge remote-tracking branch 'origin/master' into xtr/session-format-migration
# Conflicts:
#	.agents/notes/implemented/architecture/2026-06-14-session-persistence.i18n.yaml
#	.agents/notes/implemented/architecture/2026-06-14-session-persistence.zh.md
#	docs/config-catalog.i18n.yaml
#	docs/subsystems/persistence.i18n.yaml
#	docs/subsystems/persistence.md
#	docs/subsystems/persistence.zh.md
#	packages/session/session-persistence-jsonl/README.i18n.yaml
#	packages/session/session-persistence/README.i18n.yaml
#	packages/session/session-persistence/README.zh.md
2026-08-21 15:55:20 +08:00
_Kerman 2da00047f3 refactor(session-persistence): make format migrations one-to-one 2026-08-21 15:50:30 +08:00
Turtle 6ef68c3b96 docs: add documentation website link 2026-08-21 15:33:48 +08:00
creatixchu 6816cc0b04 test(snapshot): stabilize persisted-turn coverage 2026-08-21 15:25:27 +08:00
creatixchu 6a27286e44 docs(i18n): fix rebased image note links 2026-08-21 15:09:14 +08:00
creatixchu cbc830aded test(composition): remove retired image-region tool 2026-08-21 15:06:24 +08:00
creatixchu 2491e12fd8 refactor(attachment): normalize image storage API 2026-08-21 15:06:24 +08:00
creatixchu 724783b024 refactor(image): remove region reads 2026-08-21 15:06:24 +08:00
creatixchu 0c9a664223 test(deepseek): print vision failure facts 2026-08-21 15:06:11 +08:00
creatixchu 703ce4a3d6 test(deepseek): expose Files API e2e failures 2026-08-21 15:06:11 +08:00
creatixchu d65e2a9e8a test(images): close unified pipeline coverage gaps 2026-08-21 15:06:11 +08:00
creatixchu 72b204afa1 feat(images): expand source upload envelope 2026-08-21 15:06:11 +08:00
creatixchu 657ec56fbf test(images): cover attachment projection edges 2026-08-21 15:06:10 +08:00
creatixchu 48a58b9090 fix(images): address unified pipeline review 2026-08-21 15:06:10 +08:00
creatixchu de8ea5d715 docs: refresh image pipeline module graph 2026-08-21 15:05:55 +08:00
creatixchu c09a42ccb5 fix(images): parse listed missing Files ids 2026-08-21 15:05:55 +08:00
creatixchu c0dd8ec820 chore(images): align merged runtime closure 2026-08-21 15:05:54 +08:00
creatixchu d29855f97c feat(images): unify master and Files request pipeline 2026-08-21 15:05:54 +08:00
creatixchu c1bdac6939 docs: propose attachment read quarantine 2026-08-21 15:02:10 +08:00
creatixchu 118f244420 fix(attachment-local): exclude metadata carriers and animation from passthrough; validate the canonical budget up front
Review-round hardening of canonical admission:
- passthrough now requires a single-frame source free of EXIF/XMP/IPTC
  metadata, so location/device metadata never enters durable storage and
  stored dimensions always describe the perceived pixels; animated WebP joins
  GIF on the always-re-encode path (first frame only)
- SourceImageInfo records orientation-applied dimensions, keeping source and
  stored raster on shared axes for coordinate mapping
- validateImage runs a canonical-encoding dry run, so a validated batch can no
  longer be refused mid-write by the byte target (no partial writes)
- read_image names per-axis multipliers when rounding splits the two ratios
  and maps IMAGE_TOO_LARGE to actionable downscale guidance
2026-08-21 15:02:10 +08:00
creatixchu c90a944abd docs: bring the zh config catalog along; pin read_image source fields in the code-mode prompt sidecar 2026-08-21 15:02:10 +08:00
creatixchu 867dc44697 docs(notes): record the canonical image admission decision 2026-08-21 15:02:10 +08:00
creatixchu fec8aa62df docs(attachment): document canonical admission; pin wide-image acceptance snapshot
READMEs (both languages) describe the wide source envelope, the canonical
encoding and its fixed encoder parameters, and read_image's downscale
envelope; tool/config catalogs regenerate for the new schema and Config
fields. The read-image-dimension scenario now pins the acceptance the old
2000px admission cap refused: the 2001x1 source is admitted and stored
byte-identically, so the fixture stays platform-independent.
2026-08-21 15:02:10 +08:00
creatixchu c6fa512e15 fix(attachment-local): keep reference field order stable for logged fixtures
The canonical ref serializes mediaType, width, height, bytes in the order the
pre-canonicalization store used, so existing session-log fixtures and logged
histories keep byte-identical reference JSON.
2026-08-21 15:01:45 +08:00
creatixchu 6e17c20804 feat(tool-fs): read_image reports downscaled dimensions and coordinate scale
When the attachment store's canonical encoding shrinks the file on disk, the
read_image envelope names the original dimensions and the multiplier that
maps coordinates measured on the attached image back onto the file, and the
output schema carries sourceWidth/sourceHeight for programmatic callers.
2026-08-21 15:01:45 +08:00
creatixchu 83a526eea1 feat(attachment-local): store a deterministic canonical image encoding
Admission now validates a wide source envelope (32MiB, 100MP, 16384px per
side) and persists a canonical encoding instead of refusing large sources:
EXIF orientation baked in, metadata stripped, long edge downscaled to the
configured canonical target (default 2048px), PNG palette for alpha/PNG/GIF
sources and a fixed JPEG quality ladder (85/75/60/45) until the canonical
byte target holds (default 1MiB). In-budget PNG/JPEG/WebP passes through
byte-identically so equal sources keep deduplicating to the same content
address; GIF always re-encodes to the PNG of its first frame, pinning the
first-frame meaning providers apply. Encoder parameters are fixed by design;
only the canonical budget is deployment configuration.
2026-08-21 15:01:45 +08:00
creatixchu 8f83853b60 refactor(attachment): saveImage returns the canonical ref beside source facts
AttachmentStore.saveImage now resolves SavedImageAttachment: the durable
reference paired with the submitted raster's intrinsic facts, so a store may
persist a canonical re-encoding while callers keep the source dimensions for
coordinate mapping. saveImages keeps returning refs; every fake store and the
cordis API catalog follow the new signature.
2026-08-21 15:01:45 +08:00
creatixchu 92a9741050 docs(llm): anchor unified request-image management design PR 2026-08-21 15:01:07 +08:00
_Kerman 265f02fbf5 perf(session-projection): index contiguous restore tails 2026-08-21 14:24:28 +08:00
Yichen Jiang 339a12030d fix(web): project sent user text inline and fold wire references in queue rows
The user-bubble decorator rendered every plain run through the
block-level MessageText div, so a decorated single-line message broke
into one line per run and the space between two tokens rendered as a
blank line. The queue dock's read-only row printed row.preview verbatim,
showing the wire session form (@[label](dsh-session:...)) instead of a
readable label. Both predate the Lexical composer; the logged model text
was correct in both cases.

One shared inline projection (reference/user-text.tsx) now owns sent
user text for the bubble and the queue row: plain runs are spans with
white-space policy left to the consumer (bubble pre-wrap, queue nowrap),
and a highest-precedence rule folds the wire session form to its label
chip, shielding the URI from the bare-token scan. The queue edit field
keeps the literal sent text. user-text.client.spec pins the inline
guarantee and every fold rule; queue-actions.e2e locators move to
row-container matching (the projection adds one span layer).
2026-08-21 14:23:01 +08:00
imccyu 528c682e06 Merge pull request #2890 from deepseek-harness/release/dsh-0.1.1-rc.1
release: [email protected]
2026-08-21 14:21:44 +08:00
imccyu 3ec5e8f8c4 release(dsh): 0.1.1-rc.1 2026-08-21 14:11:09 +08:00
imccyu 60e44b2d78 fix: ci
fix: ci

fix: ci
2026-08-21 14:11:06 +08:00
_Kerman 89b5bc276f perf(session-projection): skip history reads for in-order events 2026-08-21 14:09:39 +08:00
_Kerman a216756222 perf(session-projection): avoid restore tail copies 2026-08-21 14:09:33 +08:00
Yichen Jiang f4b080ffe0 Merge pull request #2889 from deepseek-harness/worktree/docs-ci-release-control-66e8d2
ci(docs): 文档站改为从发布 tag 发布
2026-08-21 13:58:57 +08:00
Turtle d97e398383 fix(jsonl): warn when repairing torn tails 2026-08-21 13:44:35 +08:00
Yichen Jiang c365daa53c chore(rescope): realign two manifest anchors, allowlist the preset-id spec
Exposed by this branch touching rescope-vendor.ts, which runs the full
rescope check: the knip-logger-console exact edit targeted the
packages/util/home knip section that #2758 deleted (drop the edit), the
zh vendoring-cookbook anchor predates the rescope.zh.md link
localization (follow it), and the new shipped-root.spec.ts joins the
files whose bare 'cordis' tokens are preset ids.
2026-08-21 13:42:24 +08:00
Yichen Jiang d858832bbb chore(constraints): register the preset-root files policy
The files constraint tables gained per-package expectations on master
while this branch changed two files lists: apps/cli no longer ships
config/, and dsh-agent-presets ships presets/ (ordered where the
expected-files derivation places extras).
2026-08-21 13:42:23 +08:00
Yichen Jiang 548b9f07d4 Merge remote-tracking branch 'origin/master' into fix/derive-shipped-preset-root-per-composition 2026-08-21 13:19:58 +08:00
Yichen Jiang fa3e37982b ci(docs): publish the documentation site from a release tag
The documentation site deployed on every master push, with no reviewer and
no version check, while npm, PyPI, and the public source repository all
advance only at a release tag. The Pages site is reachable without
authentication, so a merge published documentation ahead of every artifact
readers could obtain.

docs-pages.yml now declares workflow_dispatch alone and verifies the ref
through the gate npm publication already runs, so the site and the npm
sequence share one definition of a released version.
2026-08-21 13:17:06 +08:00
_Kerman a693e0764b docs: revert spurious BRAND-GUIDELINES.md change from master merge 2026-08-21 13:09:33 +08:00
Chinesezjc b7135e6206 Merge pull request #2760 from deepseek-harness/fix/continuation-cleanup-temp-handles
test(subagent): close persistence handle before deleting temp root
2026-08-21 12:59:07 +08:00
Yichen Jiang f94495e527 refactor(preset): bundle the shipped presets inside dsh-agent-presets
Review asked why the launcher special-cases one plugin's row. It no
longer does: the four shipped compositions move into the package
(presets/, in files), dsh-agent-presets resolves its own shipped root
and prepends it before configured roots (includeShippedRoot, default
true, opt-out for bare-machinery embedders), and the per-composition
derived patch, its spec, and the dump layer are deleted — profile-boot
and dump-config return to plain layer stacking. The always-load
guarantee now rides the schema default instead of patch ordering, so a
whole-config replacement keeps the shipped set and the squash, reload
freeze, and dump divergence stop being possible.

Gate globs, the web scaffold, and both preset browser lanes drop their
hand-fed shipped roots; the roster e2e keeps asserting configured roots
beside the shipped four against the built lib.

Fixes #2863.
2026-08-21 12:37:57 +08:00
_Kerman b70f27f764 Merge pull request #2739 from deepseek-harness/xtr/speed-up-doc-sync
perf(infra): shorten doc-sync critical path
2026-08-21 12:36:36 +08:00
_Kerman d72713c1b3 Merge pull request #2702 from deepseek-harness/xtr/2701-stable-session-snapshots
test: omit persistence envelopes from session snapshots
2026-08-21 12:35:16 +08:00
Yichen Jiang a760c0b0f6 Merge pull request #2847 from deepseek-harness/feat/2846-doc-site-md-projection
docs(website): serve every page as raw Markdown with an llms.txt index
2026-08-21 12:27:51 +08:00
_Kerman 36a10618df Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2739
# Conflicts:
#	scripts/run-gates.spec.ts
2026-08-21 12:01:02 +08:00
Chinesezjc a633c19b02 ci(windows): raise native coverage test timeout to 60s
The Windows native coverage lane was hitting Vitest's 30s per-test
ceiling on slow subprocess/ACP fixtures. Doubling the per-test budget
absorbs cold-start and process-teardown jitter without changing the
assertions or the job-level 120-minute cap.
2026-08-21 11:57:42 +08:00
Chinesezjc 7214d0d958 refactor(python): drop now-always-true build.if
python-release.yml only triggers on workflow_dispatch, so build.if:
github.event_name == 'workflow_dispatch' is always true and redundant; remove it
(the exact event set is already pinned in the spec). Update the spec assertion
accordingly.
2026-08-21 11:55:57 +08:00
Chinesezjc ae193bfc07 fix(cic): narrow workflow.on before Object.keys in python-release assertion
Guard workflow.on with isRecord before Object.keys to satisfy TS2769.
2026-08-21 11:54:36 +08:00
Chinesezjc 374f3cdb07 fix(cic): re-record development pair and tighten python-release spec assertion
Address PR #2875 review:

- Re-record python/development.i18n.yaml (corpus verify-translation-pairing was
  out of sync after editing development.md/zh.md) and the 2026-08-11
  python-publication-workflow pair after the dry-run wording tweak.
- Tighten the python-release spec assertion to the exact event set
  (['workflow_dispatch']) instead of not.toHaveProperty('pull_request').
- Fix the 'dry-run run' wording in development.md and the note.

Corpus-wide verify-translation-pairing (1001 pairs) and note-format (594) pass;
ci-workflow.spec.ts 14/14.
2026-08-21 11:53:50 +08:00
_Kerman 0ee3d664ba Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2702 2026-08-21 11:53:00 +08:00
Chinesezjc cb5b762922 fix(docs): correct zh locale link in composer-edit-range note
The static gate (translation pairing) failed on a pre-existing master note:
2026-08-20-composer-edit-range-from-selection.zh.md:17 linked the zh target with
the en .md path. Point it at the .zh.md target and re-record the i18n hash. This
unblocks the required node 24 / static gate (it is not part of the python-release
gray-check change but sits on the same PR's CI path).
2026-08-21 11:51:50 +08:00
_Kerman bb3105d7b5 refactor(apiproxy): restore the single-line listProjectionsFor signature
An intermediate cache iteration made cachedSnapshot async, which forced
listProjectionsFor onto a multi-line async signature; the final design
kept the sync read but the formatting residue stayed. No behavior
change.
2026-08-21 11:49:52 +08:00
imccyu d508a09952 Merge pull request #2878 from deepseek-harness/worktree-fixpnpmwin
fix(build): support standalone pnpm entrypoints
2026-08-21 11:48:18 +08:00
_Kerman 6fb8e9a4b9 Merge remote-tracking branch 'origin/master' into xtr/2701-stable-session-snapshots 2026-08-21 11:43:58 +08:00
Yichen Jiang e637bcfb98 Merge pull request #2726 from deepseek-harness/worktree/deepseek-vision-model-catalog
feat(llm-deepseek): publish the vision model
2026-08-21 11:41:34 +08:00
imccyu 4b086d0a4a test(ci): deduplicate coverage command setup 2026-08-21 11:36:57 +08:00
_Kerman d0d5b00095 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2739
# Conflicts:
#	.agents/notes/implemented/process/2026-07-06-parallel-pre-push-gates.i18n.yaml
#	.agents/notes/implemented/process/2026-07-13-documentation-site-projection.i18n.yaml
2026-08-21 11:35:58 +08:00
_Kerman 87c01d9966 test(storage-json): reach the unreadable-record branch on every platform
The per-record contract test forced readFile to fail via chmod 0o000,
which is a no-op on win32, so the readRecord catch stayed uncovered on
the windows native coverage gate. Route record documents without an
isFile pre-filter: a directory where the document should be throws
EISDIR on every platform, and readRecord's existing contract already
reads an unreadable document as absent. Drop the win32 skip.
2026-08-21 11:34:22 +08:00
Yichen Jiang f9c4309c60 Merge remote-tracking branch 'origin/master' into fix/derive-shipped-preset-root-per-composition 2026-08-21 11:32:04 +08:00
Yichen Jiang 25058f2658 docs(cli): sync the derived preset-root layer into launcher docs
Review follow-ups: enumerate the derived shipped agent-preset root in
apps/cli README/reference dumps and the profile-boot module JSDoc
(bilingual pairs re-recorded), correct the stale AppCLIEntry/distIndex
analogy in the web scaffold and the shipped-root cross-reference in the
web preset e2e, drop the write-only ComposedProfile.rows field, and make
the Agent Note describe the dump path as sharing the derivation rather
than the builder.
2026-08-21 11:32:02 +08:00
Yichen Jiang 708a25a8a9 fix(llm-deepseek): address vision catalog review 2026-08-21 11:28:14 +08:00
imccyu 4f2868409d test(ci): exercise standalone pnpm on Windows 2026-08-21 11:24:03 +08:00
Yichen Jiang df0fbbb091 test(web): migrate the retry-exhaustion composer wait off the textarea locator
Master's #2844 asserted composer recovery through a textarea locator the
Lexical composer no longer renders; the merge carried it in silently and
the CI web-snapshot lane timed out waiting for it. Use the same
data-composer-input wait the file's other cases already migrated to.
2026-08-21 11:19:57 +08:00
Yichen Jiang ae01b19bd3 Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614
# Conflicts:
#	.agents/notes/archived/bug-fix/2026-08-20-composer-edit-range-from-selection.i18n.yaml
2026-08-21 11:19:14 +08:00
_Kerman 4760c40e84 docs(session-projection): apply master's locale link fixes after merge
The master merge brought the doc-sync regenerations (locale-specific
paired document paths). Re-apply the zh-side link fixes to the agent
note and the session-projection intro, re-record translation pairing,
and keep the e2e event arrays as asserted literals like master.
2026-08-21 11:14:07 +08:00
imccyu 89674edc93 fix(build): support standalone pnpm entrypoints 2026-08-21 11:09:25 +08:00
_Kerman ff9735cb8c Merge origin/master into xtr/projection-per-session-cache 2026-08-21 11:07:27 +08:00
_Kerman 8baa987387 test(storage): harden windows-native teardown and chmod probe
The per-record rm in the cache spec hits an EPERM flake on windows
native (directory still draining); retry the recursive rm like the
subagent spec does. The unreadable-record probe is meaningless on
windows, where chmod 0o000 is a no-op; skip it there.
2026-08-21 10:46:21 +08:00
_Kerman 1134c2a98e test(web): seed cold subagent fixtures through the per-record cache
The reworked cache moved from the awaited coldSnapshot(id) to a sync
coldSnapshot(meta, events) whose write-back is fire-and-forget, and the
e2e fixture dropped the seeding call with it. The web bundle mounts the
cache again, so list rows read projection columns from stored rows only;
the one-shot and grandchild fixtures therefore lost their projections
column and the tree golden drifted. Re-seed both through the new API and
poll for the write-back to land.
2026-08-21 10:46:17 +08:00
Yichen Jiang cc95d93d60 Merge remote-tracking branch 'origin/master' into worktree/deepseek-vision-model-catalog 2026-08-21 10:42:26 +08:00
Turtle 0e40664c67 Merge pull request #2862 from deepseek-harness/turtle/fix-translation-link-locale
docs: fix Chinese Agent Note link locale
2026-08-21 10:38:14 +08:00
Yichen Jiang 246caaba77 Merge remote-tracking branch 'origin/master' into worktree/deepseek-vision-model-catalog
# Conflicts:
#	.agents/notes/implemented/feature/2026-07-22-web-multimodal-image-input-and-durable-attachments.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-19-direct-deepseek-vision-input.i18n.yaml
#	docs/config-catalog.i18n.yaml
#	packages/llm/llm-deepseek/README.i18n.yaml
2026-08-21 10:34:51 +08:00
Chinesezjc 499c1262a2 ci(python): drop PR labeled trigger for python-release dry-run
Remove the pull_request:[labeled] trigger from python-release.yml so the
workflow no longer fires (and shows a gray skipped check) when a PR gets any
non-dry-run label. The credential-free dry-run validation is now manual-only
(workflow_dispatch with publish=false), preserving the validation capability
without a PR gray segment.

- python-release.yml: on is workflow_dispatch only; build.if is
  github.event_name == 'workflow_dispatch'.
- ci-workflow.spec.ts: assert python-release has no pull_request event and the
  simplified build.if.
- python/development.(md,zh.md) and 2026-08-11-python-publication-workflow note
  (en/zh/i18n): describe the manual dispatch-only dry-run path.

Verification: ci-workflow.spec.ts 14/14, typecheck clean, note-format 585,
verify-translation-pairing consistent.
2026-08-21 08:56:32 +08:00
pku-xht b9cbcf8e2b docs(subagent): clarify diagnostic-bearing results 2026-08-21 08:52:19 +08:00
pku-xht d5fe4e9307 Merge ACP direct-outcome simplification into DSH SDK layer 2026-08-21 08:06:43 +08:00
pku-xht 8dc7852881 refactor(subagent): observe ACP direct process outcome 2026-08-21 08:06:10 +08:00
pku-xht 4f196f41d4 Merge ACP quiescence wording into DSH SDK layer 2026-08-21 07:58:14 +08:00
pku-xht aaa85cce01 docs(subagent): name SDK quiescence precisely 2026-08-21 07:57:43 +08:00
pku-xht 9a6f5cf7ff docs(subagent): name ACP quiescence precisely 2026-08-21 07:57:32 +08:00
pku-xht f2615dc114 Merge ACP cancellation wording into DSH SDK layer 2026-08-21 07:50:41 +08:00
pku-xht 30cd11e698 docs(subagent): distinguish cancelled SDK cleanup 2026-08-21 07:50:13 +08:00
pku-xht 3900de296d docs(subagent): distinguish cancelled cleanup failure 2026-08-21 07:50:00 +08:00
pku-xht d9ad13c5b7 Merge ACP cleanup contract into DSH SDK layer 2026-08-21 07:39:26 +08:00
pku-xht d90003b4e0 docs(subagent): qualify ACP cleanup failure 2026-08-21 07:38:48 +08:00
pku-xht 1653143ca5 Merge ACP config catalog refresh into DSH SDK layer 2026-08-21 07:34:28 +08:00
pku-xht 075108dc08 docs(config): refresh ACP process grace catalog 2026-08-21 07:34:00 +08:00
pku-xht 75b8eb08ba docs(subagent): qualify startup cleanup outcomes 2026-08-21 07:29:12 +08:00
pku-xht ca7ccac27f Merge ACP observation fixes into DSH SDK layer 2026-08-21 07:24:15 +08:00
pku-xht ba0d7dfdca fix(sdk): validate closed turn cancellation facts 2026-08-21 07:23:43 +08:00
pku-xht 2a060adfa8 fix(subagent): keep ACP failure observation cancellable 2026-08-21 07:23:14 +08:00
pku-xht fe88976b6a Merge ACP cancellation simplification into DSH SDK layer 2026-08-21 07:10:24 +08:00
pku-xht 0dcb514fc6 refactor(subagent): drop unused ACP cancel classification 2026-08-21 07:09:42 +08:00
pku-xht 1c5305ca22 test(subagent): type blocked SDK outcomes precisely 2026-08-21 06:56:31 +08:00
pku-xht 12c7e968a0 Merge ACP diagnostic lifecycle fixes into DSH SDK layer 2026-08-21 06:54:24 +08:00
pku-xht bbf1c6e842 fix(subagent): close DSH SDK diagnostic review gaps 2026-08-21 06:53:28 +08:00
pku-xht 67e038ab3a fix(subagent): align ACP diagnostic lifecycle facts 2026-08-21 06:53:00 +08:00
pku-xht 1af22c23b4 Merge minimal ACP permission diagnostics into DSH SDK layer 2026-08-21 06:06:10 +08:00
pku-xht 659749dc09 fix(subagent): align DSH SDK diagnostics with reachable facts 2026-08-21 06:05:51 +08:00
pku-xht 5e1494ff17 refactor(subagent): keep ACP permission diagnostics minimal 2026-08-21 05:58:43 +08:00
pku-xht ee50ee088d test(subagent): stabilize DSH SDK background snapshot 2026-08-21 05:24:13 +08:00
pku-xht 569bf3e5e0 docs: refresh DSH SDK config catalog pair 2026-08-21 04:57:44 +08:00
pku-xht f72ef36331 Merge latest ACP review fixes into DSH SDK layer 2026-08-21 04:54:26 +08:00
pku-xht d6de6bb0cb test(subagent): align ACP permission snapshot 2026-08-21 04:52:40 +08:00
pku-xht 34c7feef83 Merge parent ACP diagnostics into DSH SDK layer 2026-08-21 04:48:57 +08:00
pku-xht b88a35d506 fix(subagent): preserve actionable DSH SDK failure facts 2026-08-21 04:48:40 +08:00
pku-xht dfb36080d8 fix(subagent): close ACP diagnostic review gaps 2026-08-21 04:41:21 +08:00
pku-xht 5c27df5ed7 fix(subagent): preserve actionable ACP failure facts 2026-08-21 04:00:40 +08:00
Yichen Jiang b010c20703 Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614
# Conflicts:
#	packages/client/ui-conversation/src/client/skeleton/InputBar.tsx
#	packages/client/ui-conversation/tests/input-bar.client.spec.tsx
2026-08-20 23:27:33 +08:00
Yichen Jiang 9820b6a1e9 fix(cli): derive the shipped agent-preset root per composition
The boot-time agent-presets overlay replaced the composed roots with the
shipped root alone, so roots configured in a profile's cordis.patch.yml
vanished from the roster (externally reported in
deepseek-ai/deepseek-harness#3636). The overlay also froze the row's
boot-time config above every live reload and never reached the config
dump, which therefore showed roots the boot dropped.

Derive the roster patch from the current layers instead: prepend the
shipped root (system trust, wins duplicate ids) to configured roots,
share one builder across boot, live user-layer reloads, and
--dump-config, and fail loud on a roots value the launcher cannot
statically rewrite.

Fixes #2863.
2026-08-20 22:57:58 +08:00
Yichen Jiang c8b4ec73a0 fix(ui-conversation): step across chips without a keyboard-selected state
isKeyboardSelectable() defaulted to true, so an arrow key at a chip edge
created a NodeSelection whose DOM projection collapses to an element
point; the plain-text binding's arrow/delete/insert handlers all bail on
non-Range selections, deadlocking arrows, typing, and Backspace at the
chip until a pointer click. False restores the placeholder semantics:
arrows cross the chip in one move and Backspace/Delete remove it whole.
Reproduced and verified with real-key Playwright probes (CDP raw
keydowns carry no engine default and cannot reproduce it); the
reference-composer e2e pins the gesture in the browser lane.
2026-08-20 22:48:56 +08:00
Yichen Jiang 68d24f3237 docs(notes): localize zh note links and widen the closure walk timeout
The localized-link pairing rule that landed on master requires Chinese
notes to link Chinese counterparts; fix this PR's note and the
composer-edit-range note the rule landed after, so the merge ref
passes the gate. The full-manifest closure walk gets an explicit
timeout: coverage instrumentation on a loaded runner pushes it past
vitest's 5s default. Refs #2846.
2026-08-20 22:29:32 +08:00
Turtle d229df59dc docs: fix Chinese Agent Note link locale 2026-08-20 22:24:16 +08:00
Yichen Jiang 315fc9b16e fix(ui-conversation): address composer review findings
- drop the space-key debug probe from the production keymap
- give pastes their own undo boundary (PASTE_TAG via $addUpdateTag on the
  nested dispatch path), with an input-bar regression test
- claim decoration outranks text-ref entities on the leading-token seat:
  the entity transform skips the active claim token, restoring the warn
  color for lexicon-listed command names (probe-confirmed regression test)
- caret-only commits no longer advance draftRev or re-publish InputState;
  content changes still do (snapshot-built CAS spans stay valid)
- retire stale JSDoc/contract wording (paste-upgrade, set-invalid; the
  invalid bit only promises the render treatment)
- rename the keydown probe spec to keymap-routing and drop test dead code
- reference-composer e2e gains the #2813 type-ahead-of-chip gesture
- archive three superseded composer notes (Safari soft-wrap, text layers,
  decoration keys), rewrite the input-machine note's superseded half in
  place, and record the new behavior decisions in the Lexical note
2026-08-20 22:20:31 +08:00
Yichen Jiang 17c85209a0 docs(website): serve index routes at their clean-URL .md addresses
Each index route also emits a parent-level alias twin, projected over
the alias route so its relative links stay correct; llms.txt and the
docs now state the drop-trailing-slash convention exactly. Frontmatter
failures name their page, the twin pass refuses to overwrite existing
build files, the dev middleware documents the deliberate in-page
fetch() divergence, and the per-locale collection order moves to one
shared export. Refs #2846.
2026-08-20 22:10:35 +08:00
Yichen Jiang f3ce8218cc docs(website): serve every page as raw Markdown with an llms.txt index
Append .md to any published route for the page as plain Markdown: the
build emits a raw-Markdown twin of every route (frontmatter dropped,
home bodies kept, images beside pages) plus a manifest-generated
llms.txt, the dev server serves both per request, and the post-build
gate fails when either is missing. Fixes #2846.
2026-08-20 22:10:15 +08:00
Yichen Jiang a67b9a4d31 Merge pull request #2814 from deepseek-harness/fix/composer-edit-range-attribution
fix(web): carry the composer edit range from the pre-edit selection
2026-08-20 22:02:10 +08:00
Yichen Jiang 5951d19f58 Merge pull request #2844 from deepseek-harness/fix/turn-error-survives-retry-exhaustion
fix(web): render the terminal turn error after same-turn retries exhaust
2026-08-20 22:01:43 +08:00
Yichen Jiang 8905b0a195 test(ui-conversation): drop an unnecessary type assertion in the chip DOM spec 2026-08-20 21:51:24 +08:00
Yichen Jiang c3e35cbe95 docs(client): align turn-error prose with exhausted-retry rendering
Review follow-up: the consumer-facing contract still described the removed
suppression. TurnErrorNode's JSDoc, the client-runtime retry-projection
README section, and the ui-conversation chat-flow section (both languages)
now state that a terminal turn/end error always projects the node, beside
the settled retry chain when retries exhausted, and that only intermediate
failures that scheduled another retry stay retry-notice-only. The recovery
note sheds its remaining cross-turn wording (closed-step boundary, retry
turns, closed failed step/turn) for the same-turn reality.
2026-08-20 21:48:36 +08:00
Yichen Jiang 672cdf9ba1 Merge remote-tracking branch 'origin/master' into fix/turn-error-survives-retry-exhaustion
# Conflicts:
#	.agents/notes/implemented/architecture/2026-06-21-bounded-llm-request-recovery.i18n.yaml
#	.agents/notes/implemented/architecture/2026-06-21-bounded-llm-request-recovery.zh.md
#	.agents/notes/implemented/architecture/2026-08-09-client-conversation-node-assembly.i18n.yaml
2026-08-20 21:40:44 +08:00
Yichen Jiang 4fe0db5031 Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.md
#	packages/client/ui-conversation/README.zh.md
#	packages/client/ui-conversation/tests/skeleton.client.spec.tsx
2026-08-20 21:39:48 +08:00
ihsiang 0864878cd0 Merge pull request #2856 from deepseek-harness/ihsiang/subagent-header-switcher
feat(web): refine nested subagent header navigation
2026-08-20 21:31:41 +08:00
yx.zhang 5f7ac9183e fix(web): address subagent header review findings 2026-08-20 21:12:07 +08:00
pku-xht 8a99ff7a29 Merge commit '80d7e34e6acd5babf2f1e3e91b8d4534ddc78657' into codex/subprocess-win32-process-primitives 2026-08-20 20:37:37 +08:00
yx.zhang de572dd910 feat(web): refine subagent header switcher 2026-08-20 20:18:55 +08:00
lsdsjy c71ff384cc Merge pull request #2808 from deepseek-harness/fix/frontend-static-miss-404
fix(frontend-static): return 404 for missing paths
2026-08-20 20:13:23 +08:00
pku-xht 85b8484a95 test(sandbox): remove stale export assertion 2026-08-20 20:13:01 +08:00
lsdsjy 600f3a3110 fix(frontend-static): return 404 for a missing index 2026-08-20 20:03:18 +08:00
lsdsjy 92723cafeb fix(frontend-static): return 404 for missing paths 2026-08-20 20:02:11 +08:00
Turtle ed3ef7acee Merge pull request #1373 from deepseek-harness/codex/remove-cordis-catalog-line-numbers
docs: remove line numbers from subsystem catalog links
2026-08-20 19:57:50 +08:00
Yichen Jiang f908cf434b docs: zh-locale links for the composer note after the master merge 2026-08-20 19:56:19 +08:00
pku-xht a5368680ae docs(win32-process): keep localized header link valid 2026-08-20 19:53:56 +08:00
Yichen Jiang 0cdb569cf8 Merge remote-tracking branch 'origin/master' into worktree/web-textarea-refactor-991614
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.zh.md
2026-08-20 19:53:44 +08:00
pku-xht 6db3ed93bf Merge origin/master into codex/subprocess-win32-process-primitives 2026-08-20 19:49:34 +08:00
Turtle 93a1b569ac Merge remote-tracking branch 'origin/master' into codex/remove-cordis-catalog-line-numbers
# Conflicts:
#	docs/subsystems/agent-team.i18n.yaml
#	docs/subsystems/approval.i18n.yaml
#	docs/subsystems/client-modules.i18n.yaml
#	docs/subsystems/client-modules.md
#	docs/subsystems/client-modules.zh.md
#	docs/subsystems/code-runtime.i18n.yaml
#	docs/subsystems/commands.i18n.yaml
#	docs/subsystems/commands.md
#	docs/subsystems/commands.zh.md
#	docs/subsystems/compaction.i18n.yaml
#	docs/subsystems/compaction.md
#	docs/subsystems/compaction.zh.md
#	docs/subsystems/core.i18n.yaml
#	docs/subsystems/core.md
#	docs/subsystems/core.zh.md
#	docs/subsystems/credentials.i18n.yaml
#	docs/subsystems/credentials.md
#	docs/subsystems/credentials.zh.md
#	docs/subsystems/feedback.i18n.yaml
#	docs/subsystems/filesystem.i18n.yaml
#	docs/subsystems/goal.i18n.yaml
#	docs/subsystems/http-server.md
#	docs/subsystems/http-server.zh.md
#	docs/subsystems/invariants.i18n.yaml
#	docs/subsystems/invariants.md
#	docs/subsystems/invariants.zh.md
#	docs/subsystems/jobs.i18n.yaml
#	docs/subsystems/llm-streaming.i18n.yaml
#	docs/subsystems/llm-streaming.md
#	docs/subsystems/llm-streaming.zh.md
#	docs/subsystems/permission-presets.md
#	docs/subsystems/permission-presets.zh.md
#	docs/subsystems/persistence.i18n.yaml
#	docs/subsystems/persistence.md
#	docs/subsystems/persistence.zh.md
#	docs/subsystems/plan.i18n.yaml
#	docs/subsystems/plan.md
#	docs/subsystems/plan.zh.md
#	docs/subsystems/sandbox.i18n.yaml
#	docs/subsystems/sandbox.md
#	docs/subsystems/sandbox.zh.md
#	docs/subsystems/schedule.i18n.yaml
#	docs/subsystems/session-projection.i18n.yaml
#	docs/subsystems/session-projection.md
#	docs/subsystems/session-projection.zh.md
#	docs/subsystems/session-query.i18n.yaml
#	docs/subsystems/session-reference.i18n.yaml
#	docs/subsystems/session-reference.md
#	docs/subsystems/session-reference.zh.md
#	docs/subsystems/session-telemetry.md
#	docs/subsystems/session-telemetry.zh.md
#	docs/subsystems/session-title.i18n.yaml
#	docs/subsystems/session.i18n.yaml
#	docs/subsystems/session.md
#	docs/subsystems/session.zh.md
#	docs/subsystems/settings.i18n.yaml
#	docs/subsystems/settings.md
#	docs/subsystems/settings.zh.md
#	docs/subsystems/shell.i18n.yaml
#	docs/subsystems/shell.md
#	docs/subsystems/shell.zh.md
#	docs/subsystems/skills.i18n.yaml
#	docs/subsystems/skills.md
#	docs/subsystems/skills.zh.md
#	docs/subsystems/spill.i18n.yaml
#	docs/subsystems/storage.i18n.yaml
#	docs/subsystems/subagent.i18n.yaml
#	docs/subsystems/subagent.md
#	docs/subsystems/subagent.zh.md
#	docs/subsystems/subprocess.i18n.yaml
#	docs/subsystems/system-prompt.i18n.yaml
#	docs/subsystems/system-prompt.md
#	docs/subsystems/system-prompt.zh.md
#	docs/subsystems/tasks.md
#	docs/subsystems/tasks.zh.md
#	docs/subsystems/terminal.md
#	docs/subsystems/terminal.zh.md
#	docs/subsystems/token-meter.i18n.yaml
#	docs/subsystems/tools.i18n.yaml
#	docs/subsystems/tools.md
#	docs/subsystems/tools.zh.md
#	docs/subsystems/typert.i18n.yaml
#	docs/subsystems/typert.md
#	docs/subsystems/typert.zh.md
#	docs/subsystems/user-interaction.i18n.yaml
#	docs/subsystems/user-questions.i18n.yaml
#	docs/subsystems/user-questions.md
#	docs/subsystems/user-questions.zh.md
#	docs/subsystems/web.i18n.yaml
#	docs/subsystems/workflow.i18n.yaml
#	docs/subsystems/workflow.md
#	docs/subsystems/workflow.zh.md
#	docs/subsystems/workspace.i18n.yaml
#	docs/subsystems/workspace.md
#	docs/subsystems/workspace.zh.md
#	packages/typert/generator/tests/cordis-catalog.spec.ts
2026-08-20 19:48:43 +08:00
pku-xht 458ba49815 docs(win32-process): narrow ABI verification claims 2026-08-20 19:28:05 +08:00
pku-xht e3248cc893 Merge pull request #2708 from deepseek-harness/codex/localized-chinese-doc-links
docs(i18n): localize links and fix capability-page targets
2026-08-20 19:28:01 +08:00
pku-xht ff7a5a042c docs(win32-process): point ABI verification to its owner 2026-08-20 19:17:03 +08:00
pku-xht 84cbec28e9 Merge remote-tracking branch 'origin/master' into codex/localized-chinese-doc-links
# Conflicts:
#	.agents/notes/implemented/architecture/2026-06-11-content-block-vocabulary.i18n.yaml
#	.agents/notes/implemented/architecture/2026-06-11-content-block-vocabulary.zh.md
#	.agents/notes/implemented/architecture/2026-06-18-shared-persistence-write-coordinator.i18n.yaml
#	.agents/notes/implemented/architecture/2026-07-10-single-file-executable-sdk-runtime-distribution.i18n.yaml
#	.agents/notes/implemented/architecture/2026-07-10-single-file-executable-sdk-runtime-distribution.zh.md
#	.agents/notes/implemented/bug-fix/2026-07-29-pnpm-setup-runner-isolation.i18n.yaml
#	.agents/notes/implemented/bug-fix/2026-07-29-pnpm-setup-runner-isolation.zh.md
#	.agents/notes/implemented/bug-fix/2026-08-18-request-image-payload-bound.i18n.yaml
#	.agents/notes/implemented/bug-fix/2026-08-18-request-image-payload-bound.zh.md
#	.agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-06-sandbox.zh.md
#	.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.zh.md
#	.agents/notes/implemented/feature/2026-07-22-web-multimodal-image-input-and-durable-attachments.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-22-web-multimodal-image-input-and-durable-attachments.zh.md
#	.agents/notes/implemented/feature/2026-07-27-web-subagent-conversations.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-31-permission-default-for-new-sessions.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-03-web-search-source-scroll.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-03-web-search-source-scroll.zh.md
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md
#	.agents/notes/implemented/feature/2026-08-05-agent-teams.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-05-agent-teams.zh.md
#	.agents/notes/implemented/feature/2026-08-11-workspace-sidebar-order-and-folding.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-15-product-subagent-noninteractive-permissions.i18n.yaml
#	.agents/notes/implemented/process/2026-07-21-serial-cross-platform-ci-reference.i18n.yaml
#	.agents/notes/implemented/process/2026-07-21-serial-cross-platform-ci-reference.zh.md
#	.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml
#	.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md
#	.agents/notes/implemented/process/2026-07-23-portable-required-pull-request-ci.i18n.yaml
#	.agents/notes/implemented/process/2026-07-23-portable-required-pull-request-ci.zh.md
#	.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.i18n.yaml
#	.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.zh.md
#	.agents/notes/implemented/testing/2026-07-30-web-browser-snapshot-ci-gate.i18n.yaml
#	.agents/notes/implemented/testing/2026-07-30-web-browser-snapshot-ci-gate.zh.md
#	.agents/notes/proposed/architecture/2026-07-27-session-projection-and-command-log.i18n.yaml
#	README.i18n.yaml
#	README.zh.md
#	docs/architecture.i18n.yaml
#	docs/architecture.zh.md
#	docs/development.i18n.yaml
#	docs/development.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.zh.md
#	docs/subsystems/README.i18n.yaml
#	docs/subsystems/README.zh.md
#	docs/subsystems/agent-team.i18n.yaml
#	docs/subsystems/agent-team.zh.md
#	docs/subsystems/client-modules.i18n.yaml
#	docs/subsystems/client-modules.zh.md
#	docs/subsystems/commands.i18n.yaml
#	docs/subsystems/commands.zh.md
#	docs/subsystems/persistence.i18n.yaml
#	docs/subsystems/persistence.zh.md
#	docs/subsystems/session-reference.i18n.yaml
#	docs/tool-catalog.i18n.yaml
#	docs/tool-catalog.zh.md
#	docs/user/guide/providers.i18n.yaml
#	docs/user/guide/providers.zh.md
#	packages/README.i18n.yaml
#	packages/README.zh.md
#	packages/bundle/web-app/README.i18n.yaml
#	packages/bundle/web-app/README.zh.md
#	packages/client/README.i18n.yaml
#	packages/client/README.zh.md
#	packages/client/connection/README.i18n.yaml
#	packages/client/connection/README.zh.md
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.zh.md
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-primitives/README.zh.md
#	packages/client/ui-sidebar/README.i18n.yaml
#	packages/client/ui-sidebar/README.zh.md
#	packages/client/ui-workspace/README.i18n.yaml
#	packages/client/ui-workspace/README.zh.md
#	packages/context/README.i18n.yaml
#	packages/context/README.zh.md
#	packages/core/agent-loop/README.i18n.yaml
#	packages/credentials/README.i18n.yaml
#	packages/credentials/README.zh.md
#	packages/experimental/agent-team/README.i18n.yaml
#	packages/experimental/agent-team/README.zh.md
#	packages/experimental/tool-agent-team/README.i18n.yaml
#	packages/experimental/tool-agent-team/README.zh.md
#	packages/host/frontend-static/README.i18n.yaml
#	packages/host/frontend-static/README.zh.md
#	packages/host/webserver/README.i18n.yaml
#	packages/host/webserver/README.zh.md
#	packages/interaction/commands/README.i18n.yaml
#	packages/interaction/commands/README.zh.md
#	packages/plan/plan-mode/README.i18n.yaml
#	packages/plan/plan-mode/README.zh.md
#	packages/sandbox/sandbox-local/README.i18n.yaml
#	packages/sandbox/sandbox-local/README.zh.md
#	packages/session/README.i18n.yaml
#	packages/session/README.zh.md
#	packages/session/session-persistence-sqlite/README.i18n.yaml
#	packages/session/session-persistence-sqlite/README.zh.md
#	packages/session/session-projection-cache/README.i18n.yaml
#	packages/session/session-projection-cache/README.zh.md
#	packages/shell/tool-pwsh/README.i18n.yaml
#	packages/shell/tool-pwsh/README.zh.md
#	packages/subagent/subagent-codex/README.i18n.yaml
#	packages/subagent/subagent-codex/README.zh.md
#	packages/subagent/subagent/README.i18n.yaml
#	packages/subagent/subagent/README.zh.md
#	packages/web/tool-web/README.i18n.yaml
#	packages/web/tool-web/README.zh.md
#	scripts/snapshots/translation-prompt-v4/request-response.expected.json
2026-08-20 19:15:33 +08:00
Yichen Jiang 9b64106e9e test(web): settle the remaining e2e drive gaps
Every consecutive composer send waits out the submit round-trip's
read-only span; the end-of-document caret gesture becomes select-all +
ArrowRight (Cmd/Ctrl+End moves no caret in mac contenteditable), which
lets Lexical's own ancestor scroll walk prove the typing reveal.
2026-08-20 19:05:26 +08:00
Yichen Jiang 504a1c6f4b test(web): null-tolerant textContent length in the perf lane 2026-08-20 18:55:26 +08:00
Yichen Jiang 4f808771ce test(web): finish the e2e migration to the composer surface
textContent/data-placeholder probes replace inputValue/placeholder reads,
evaluate-string selectors move to the composer anchor, queued fills wait
out the submit round-trip's read-only span, and the refreshed aria goldens
drop the hover tooltip the old interaction order happened to capture.
2026-08-20 18:50:59 +08:00
pku-xht 6d9bc90532 Merge origin/master into codex/subprocess-win32-process-primitives 2026-08-20 18:38:46 +08:00
Yichen Jiang e920185700 test(web): drive the built-graph snapshot lanes through the editor surface
Paste-command text entry (awaiting its microtask commit), data-placeholder
lookup, a scrollIntoView stub for the menu the settled-caret re-track now
opens, and a trailing separator on the bare /plan paste so Enter submits
instead of picking from that menu.
2026-08-20 18:32:44 +08:00
Yichen Jiang f6fb66a318 docs+build(ui-conversation): lexical composer collateral
The client-bundle preset pins the production/development exports condition
(lexical's node-condition file selects its flavor with a top-level await a
CJS bundle cannot carry); the composer carries an explicit aria-label (a
div's data-placeholder does not name it the way a textarea placeholder
did); READMEs, the composer.bar slot doc, and the Agent Note record the
editor architecture; web e2e drives the contenteditable surface.
2026-08-20 18:27:55 +08:00
Yichen Jiang daaede29a5 fix(ui-conversation): render the terminal turn error after same-turn retries exhaust
The turn-error Definition suppressed its node permanently once the owning
turn carried any llm/retry event — a rule from the retired model where a
retry opened a new numbered turn. Retries now run inside the failing turn,
so the suppression hid exactly the exhausted terminal failure it existed
to defer to: spending every transient retry left the conversation with a
neutral collapsed retry row and no error row at all.

Delete the suppression: turn-error matches only turn/start and error-reason
turn/end, and renders whenever its turn recorded a terminal error; the
settled retry chain renders beside it through the separate model-retry
node. The Definition suite now asserts the exhausted-retry error node in
full history, tail-only windows, and after prepending the chain, and a new
keyless live e2e scenario exhausts a scenario-owned two-retry policy and
pins the terminal error row beside the settled retry row (the scaffold
gains replayRetryPolicy so exhaustion runs in milliseconds).

Both stale notes are corrected to the same-turn retry reality, and the new
bug-fix note owns the removal rationale.
2026-08-20 18:19:30 +08:00
Yichen Jiang aef4e1c9b7 Merge pull request #2509 from deepseek-harness/feat/pi-ai-auth-alignment
feat(credentials): abstract credentials service and support OAuth login
2026-08-20 18:08:15 +08:00
Yichen Jiang 7222b066d5 test(ui-conversation): align suites with the editor composer
Drive keyboard gestures as real KeyboardEvents at the contenteditable
(Lexical routes them through the command layer), write drafts through the
shell, and probe decorations at their new DOM (chip decorators, styled
claim leaf, hint CSS variable, text-ref entity nodes). jsdom lacks
Selection.modify, so the Backspace-deletes-chip gesture moves to the
browser lane.
2026-08-20 18:06:58 +08:00
Yichen Jiang b519cb87b0 feat(ui-conversation): lexical composer replaces the textarea stack
The editor (shell-owned, per-session) is the draft + chip truth; the
machine slims to the submit plane. Chips are atomic decorator nodes with
NodeKey identity; TokenSpan coordinates ride the detect projection (chip =
one U+FFFC), persistence and InputState.draft ride the clipboard
projection. The mirror/backdrop layers, Safari soft-wrap repair, manual
undo log, boundary occurrence deletion, and clipboard expansion all
retire; the producerless paste-attempt and set-invalid planes go with
them.
2026-08-20 17:58:52 +08:00
Yichen Jiang 30289d6320 chore(release): carry dsh-authorization to the rc.8 family version 2026-08-20 17:58:39 +08:00
Yichen Jiang 564e4d1610 chore(sync): regenerate the module graph after the projection merges 2026-08-20 17:58:39 +08:00
Yichen Jiang 933d1f2ab2 feat(credentials): upgrade the pre-release flat document at boot
Internal builds before the versioned layout wrote .credentials.yaml as a flat
mapping; refusing it outright would strand every key stored through the Models
page and fail the next model request. Boot now recognizes exactly that layout
- addressable names over non-empty string scalars, no directives - and
rewrites it under the writer lock, nesting the original lines verbatim under
refs: with the values byte for byte unchanged. Everything the recognizer
declines keeps the loud by-name refusal, a live reload still never migrates,
and the parser continues to read exactly one layout. The migration step
retires with the pre-release stance at the first tagged release.
2026-08-20 17:58:39 +08:00
Yichen Jiang 7d04a0235c chore(sync): regenerate the event matrix after the command-envelope merge 2026-08-20 17:58:39 +08:00
Yichen Jiang 120097e266 chore(sync): restore the image-budget README merge on llm-pi-ai 2026-08-20 17:58:39 +08:00
Yichen Jiang fecfabcac4 fix(credentials): name reference update event explicitly 2026-08-20 17:58:39 +08:00
Yichen Jiang a190ef580c chore(release): carry dsh-authorization to the rc.7 family version 2026-08-20 17:58:38 +08:00
Yichen Jiang 29a82543ed chore(sync): re-record the packages README pairing after the cascade 2026-08-20 17:58:38 +08:00
Yichen Jiang 0b2bc3d651 fix(llm-pi-ai): stub both home spellings in the tilde-expansion test
os.homedir() reads HOME on POSIX and USERPROFILE on Windows; stubbing
only HOME left the Windows lane expanding ~ into the real profile
directory and failing the fileExists assertions.
2026-08-20 17:58:38 +08:00
Yichen Jiang 6428b844ef fix(ci): catch the branch up with the static and smoke gates
- dsh-authorization's manifest becomes a release member on current
  master's terms: version matches the root 0.1.0-rc.6 and
  publishConfig.access is public, which the constraints gate and the
  tarball pack's version verify both enforce after the master merge.
- Regenerate docs/module-graph (zh mirror included) for the
  authorization package and the llm-pi-ai -> authorization edge; the
  graph gate lives outside doc-sync and was never regenerated when the
  package was added.
- The built-bin smoke seeds the versioned credentials document; this
  branch's provider refuses the pre-release flat layout by design, and
  the master-side test still wrote the old shape.
2026-08-20 17:58:38 +08:00
Yichen Jiang 9eaaeaeb96 fix(credentials,authorization,llm-pi-ai): harden the auth seams per review
Review findings on #2509, all confirmed:

- Every writer of .credentials.yaml now waits out the record-mutation
  lock (DOCUMENT_LOCK_WAIT_MS): refs and records share one file and one
  lock, so a reference write or record delete contending with an OAuth
  refresh must not fail at the 2s file-work default.
- api-key records are admitted before they are rendered: an empty key,
  a non-POSIX env name, or an empty env value is refused at the write
  instead of persisting a document the next boot rejects wholesale.
- llm-pi-ai no longer lets the credential-key grammar reject legal
  route ids: reads answer "nothing stored" via isCredentialKeySegment
  (new dsh-credentials export), deletes have nothing to remove, and only
  a write refuses, as LlmError UNSTORABLE_PROVIDER_ID; flow registration
  skips a future catalog id outside the grammar instead of failing the
  mount.
- authorization/settled fans out with contained listener failures on
  the credentials seam's terms (INVARIANT still rethrows), so a broken
  watcher can never turn a finished attempt into a failure.
- notify() is fire-and-forget at the seam: a surface that cannot render
  a notice loses the notice, never the attempt.
- A declined prompt is an outcome: interactions reject with the new
  AuthorizationDeclinedError and the attempt settles cancelled instead
  of failed.
- NOT_COMMITTED now confirms a commit observed during the attempt
  (credentials/record-updated for the flow's key), so a re-auth cannot
  pass a stale record off as fresh; a flow that deletes its record is
  refused on the same code.

READMEs, the subsystem/event/config catalogs, and the Agent Note follow
the shipped behavior; memory.ts carries the dedup TODO.
2026-08-20 17:58:38 +08:00
Yichen Jiang 21ea0ed9e6 docs(authorization): record the credential-record and flow decisions
Why the record union is one step more abstract than pi-ai's credential
in exactly two places, why a record key names the owning plugin rather
than the provider, why the flow owns the write, and why the interaction
travels with the request instead of a registry. Cross-links the release
fix it supersedes, and states what is still missing: the wire contract
and the Models-page control that would let a human start a login.

The two web e2e goldens regain exactly the openai-codex option line
they lost when the provider was withheld.
2026-08-20 17:58:38 +08:00
Yichen Jiang 57c5f017ac feat(llm-pi-ai): sign in to a provider instead of withholding it
pi-ai's auth model reaches this adapter through three translations, all
of which live here: a CredentialStore over the harness credential
records, an AuthContext over the credential plane and the host
filesystem, and one authorization flow per installed provider that
ships a login. The seams they consume name nothing from pi-ai, so a
second adapter family can arrive with a different auth model and share
them.

Every collection is now built with the store and the context rather
than with nothing, which is what makes a signed-in provider stay signed
in across the collection rebuild a configuration change causes. With a
posture that works, the configurable-provider directory no longer
withholds OAuth-only routes and `openai-codex` is offered again; the
predicate that withheld it is gone.

The credential plane stays optional. Reads answer "nothing stored"
without a credentials service because such a composition genuinely
holds no credential, while writes refuse by name — a login whose grant
evaporated would report success and then fail every request. Flow
registration is scoped to the authorization seam, so a headless or ACP
composition mounts with no sign-in and everything else unchanged.

Two fixes found while wiring this up: pre-release credential fixtures
in the llm suites still used the flat document the record work
replaced, and a flow that ignores its cancellation signal would have
held its key for the life of the process — withdrawal now settles the
attempt either way.
2026-08-20 17:58:38 +08:00
Yichen Jiang 732a7361f5 feat(authorization): obtain a credential by asking the human
Some credentials cannot be configured, only obtained: getting one means
a conversation — open this page, paste that code, pick an account. The
new seam owns that conversation and the one-attempt-per-key lifecycle,
and never the protocol, so a second authorization protocol arrives as
another flow rather than as another seam.

A flow is registered under the CredentialKey it writes, which is also
how the seam knows which plugin answers for the format inside that
record. The flow owns the write: run() resolving means the record is
already committed through ctx.credentials, and the seam confirms it.
That keeps a library persisting through its own store adapter the
single writer instead of being copied back out and written twice.

The interaction travels with the request rather than a registry,
because whoever starts an authorization is the one who can talk to the
human about it. A request already withdrawn never claims the key and
never starts the flow — relying on each flow to check its signal before
the first await would let one that does not hang holding the key.
2026-08-20 17:58:38 +08:00
Yichen Jiang 86a9f8c862 feat(credentials): store durable credential records beside references
The seam answered one question — what is behind this environment-variable
name — and that shape cannot hold what an authorization grant is: a
multi-field, rotating value keyed by a provider id rather than by a POSIX
identifier. The Models page already works around the gap by inventing a
synthetic environment name (`MINIMAX_CN_API_KEY`) for a route the user added
by hand, because the store's key must look like one.

`CredentialKey` is `<scope>/<id>`, where the scope is the owning plugin's
registered name. The owner is in the key because a `grant` payload is written
in its owner's format: two plugins serving the same provider name would
otherwise read each other's payload, and a record left by an uninstalled
plugin could not be told from a live one. The `/` also keeps the grammar
disjoint from `CredentialRef`, so the key spaces cannot collide.

`CredentialRecord` is `api-key` (key and/or provider environment values) or
`grant` (an opaque, owner-owned payload). The asymmetry is deliberate: an api
key is the harness's own data, a grant is a package it carries for someone
else. `modifyRecord` is the only write path because a correct write depends
on the current value — a token refresh is read-decide-replace under one
cross-process lock, without which two processes rotating one refresh token
lose whichever wrote first.

`.credentials.yaml` becomes a versioned two-section document. The pre-release
flat layout is refused by name, with the entry count and the one edit needed,
rather than read as an empty store — which would surface as an authentication
failure on the first request instead of at load. A grant payload is admitted
in both directions, so a value the document could not read back exactly as
written is refused rather than stored lossily.
2026-08-20 17:58:38 +08:00
Yichen Jiang 26a8e6a555 feat(atomic-write): state the writer-lock wait limit per call
How long a contender waits is a property of the operation the lock holder
runs, not of the write protocol. The 2s default was sized for the
render-and-rename cycle every call site had; a credential mutation that
refreshes an expired token performs a network round trip while holding the
lock, and leaving the default in place would fail every other writer of that
file for the duration.

`withFileLock` takes an optional `waitMs`; the retry cadence stays fixed
because it governs how often a contender asks, which no caller varies. Every
existing call site keeps the default.
2026-08-20 17:58:38 +08:00
_Kerman a577a48acd Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2702 2026-08-20 17:52:56 +08:00
Chinesezjc f5faeae4d3 Merge pull request #2798 from deepseek-harness/ci/release-check-panel
ci: stop PR gray checks from lifecycle and release publish jobs
2026-08-20 17:36:12 +08:00
_Kerman cdb918c4b0 chore(storage-json): exempt the shared unit lifecycle from the duplication gate
The two standalone unit classes deliberately mirror the KvUnit drain/guard
lifecycle (close + assertOpen); mark the block with a reason-carrying
jscpd ignore so the duplication gate stays green.
2026-08-20 17:34:08 +08:00
pku-xht 3a9e1a6e24 Merge pull request #2749 from deepseek-harness/codex/cache-hit-decimal-display-v2
feat(web): preserve near-full cache-hit precision
2026-08-20 17:27:06 +08:00
_Kerman f6080c3753 docs(session-projection-cache): sync catalogs, type-equiv, and event consumers after master merge
Regenerate config/cordis catalogs and doc graphs (the master merge changed
configs and consumers), add the DomainSpec layout field to the storage
type-equiv block, record session-projection-cache as a session/created
consumer, and drop the leftover experimental/team ghost directories from
the master rename. All 37 static gates pass.
2026-08-20 17:26:32 +08:00
pku-xht 36aead7320 Merge remote-tracking branch 'origin/master' into codex/cache-hit-decimal-display-v2 2026-08-20 17:18:29 +08:00
_Kerman 2c11e73c55 Merge remote-tracking branch 'origin/master' into xtr/projection-per-session-cache 2026-08-20 17:15:25 +08:00
_Kerman eb1f167fa4 refactor(session-projection-cache): restore the base method order
Keep the base class's relative method order (write before coldSnapshot) so
the diff against the base shows the cold-read methods as a pure insertion
instead of a reorder of existing methods.
2026-08-20 17:14:05 +08:00
Yichen Jiang 6d6262703b Merge pull request #2820 from deepseek-harness/feat/1687-multiline-question-answer
feat(web): answer ask_user_question over multiple lines
2026-08-20 17:12:39 +08:00
Yichen Jiang b2c9c3ce37 fix(web): derive the caret-delete range from what the draft lost
A caret Backspace or Delete replaces no selection, so `beforeinput` reports
the bare caret and the previous derivation produced a negative inserted
length and fell back to the ambiguous scan. The delete half of the defect
survived, and the component test missed it by pre-expanding the selection to
the span the engines never report.

The range for a caret delete now comes from the direction `inputType` names
and the number of characters the draft actually lost, measured rather than
assumed to be one, so a grapheme, word, or line deletion sizes correctly.
Only the insert and delete families are recorded; a history replay reports
wherever the caret sits and would name a wrong span while passing every check.

Component tests cover the caret Backspace, Delete, and word-delete gestures,
and an assembled browser scenario drives them as real key presses, which is
the only place an engine's reported range is observable.
2026-08-20 17:11:35 +08:00
Yichen Jiang 7260f4cf64 fix(web): cap the answer field at six text lines in both variants
The card-wide `border-box` reached `.fieldMirror`, so the growth cap counted
text plus padding. The inline variant carries none and landed on the declared
line count, while the optionless variant's 16px inset spent two thirds of a
line and delivered its last one as an 8px sliver. The e2e measured only the
inline shape, so nothing caught the drift.

The mirror now takes `box-sizing: content-box`, which states the cap in the
units it is written in, and the cap moves to six lines. The e2e asserts whole
text lines rather than a box height, and covers the optionless shape — asked
straight through the user-questions seam, since a layout metric needs no model
round — including that the reserved empty field is fully covered by its own
control.
2026-08-20 16:58:41 +08:00
Yichen Jiang 477615162a feat(ui-conversation): lexical chip node, projections, span map 2026-08-20 16:57:56 +08:00
Yichen Jiang 2279fd19b0 chore(ui-conversation): add lexical dependencies and jsdom spike 2026-08-20 16:46:57 +08:00
_Kerman b67761a8a5 fix(session-projection-cache): checkpoint at session creation
A session that never talks — a forked child seeded with its ancestor's
title, say — previously got its first cache row only at detach; a crash,
or a fork held live in the store, left the seed-derived values (the
title) unreadable on the cold list. Session creation is now a third
mandatory write point: the creation checkpoint folds the seed and
persists immediately. Write-policy docs (README + catalogs) updated.
2026-08-20 16:37:41 +08:00
imccyu 3866791579 Merge pull request #2725 from deepseek-harness/worktree-bootserver
feat(webserver): structured index injection table and the client boot seams
2026-08-20 16:26:31 +08:00
_Kerman 08e546eff1 feat(storage-json): one-time migration of a legacy whole-unit file to per-record
Opening a per-record unit splits a legacy `<root>/<name>.json` (the
pre-per-record single-file layout) into per-record documents; an
already-present new record wins, and the legacy file is deleted once
every record migrated. The migration also runs when the new tree is
absent — the fresh-upgrade shape — and foreign, shapeless, or malformed
legacy files are left alone. This preserves previously cached session
titles, list metadata, stats, and subagent identity across the medium
change.
2026-08-20 16:25:39 +08:00
_Kerman 84db39cec4 feat(session-projection-cache): seed cold reads from the cache and write back
A detached history read still traverses the complete log, but each unit's
fold is now seeded from its cached checkpoint: the registry's restore
slices off the already-folded prefix (events at or below the row's seq)
and applies only the tail. The first cold read writes the refreshed
checkpoint back (fail-soft), so the cache row is created on first read
and kept current afterwards. The recipe lives on the cache
(cachedCheckpoint, coldSnapshot, writeBack); the api-proxy carrier only
supplies the stored header and the full log.
2026-08-20 16:25:39 +08:00
imccyu be3a630da8 docs(web): retire tap-era prose across READMEs, subsystems, and notes 2026-08-20 16:13:05 +08:00
imccyu d582939783 docs(web): align injection-surface JSDoc, notes, and bilingual READMEs 2026-08-20 16:13:05 +08:00
imccyu 97f4d4608b test(gateway): pin the namespace atomic-visibility guarantee 2026-08-20 16:13:05 +08:00
imccyu 10f9f506e2 fix(web): stand down prefetch only when the transport owns bundle bytes 2026-08-20 16:13:05 +08:00
imccyu 3ca4997cd2 test: cover gateway rollback and theme fallback branches 2026-08-20 16:13:05 +08:00
imccyu d4fd03ae53 chore(docs): classify IndexInjection and regenerate the catalog surfaces 2026-08-20 16:13:04 +08:00
imccyu 156bd075a9 feat(webserver): structured index injection table and the client boot seams
Replace per-plugin tapIndex regex edits with pure-data IndexInjection rows
collected fresh per render over one webserver/index-inject event. One table,
two renderers: the served form renders rows into index.html; a static worker
form ships the same rows over its boot payload. tapIndex survives as the
raw-HTML escape hatch, applied after row rendering; client-modules and
ui-theme move to the event, and the manifest global renders as
globalThis["__DSH_BOOT__"].

The client boot chain gains the seams a pre-injected transport needs: the
module loader takes loadBundle from the transport global by default, HTTP
prefetch stands down when a transport owns bundle bytes, the web-app bundle
can decline frontend serving, the gateway client installs a namespace's
whole method group inside its fiber apply so a parked dependent never
observes the service without its methods, and the dynamic-code precheck
gates through new Function so hosts without a real node:vm keep the
define-time parse gate.
2026-08-20 16:13:04 +08:00
_Kerman 4347ee17f3 fix(test): use unique temp dirs for acp-demo composition persistence
The composition tests hardcoded shared /tmp/dsh-acp-demo-* persistence
roots. On the shared self-hosted CI VM, concurrent jobs running the same
master-level test file opened the same SQLite session-query.db and one
failed with "database is locked". Use mkdtemp-unique directories so each
run owns its SQLite index while still exercising explicit
persistenceRoot forwarding.
2026-08-20 16:04:40 +08:00
_Kerman 02a608271e Merge origin/master into xtr/projection-per-session-cache 2026-08-20 16:03:51 +08:00
pku-xht 7ef1c458f0 fix(win32-process): close PR1 validation gaps 2026-08-20 16:03:15 +08:00
Chinesezjc 56a8f7d325 fix(cic): cover release-publish in client-build gate and correct group wording
Address the latest review pass on PR #2798:

- client-build-environment.client.spec.ts: add release-publish.yml to
  dshBuildWorkflows so the 'workflow env must not set DSH_CLIENT_*' gate covers
  the new dsh publish path (it runs build:official and writes a dsh client
  build record). vendor-publish runs only build:lib:host, so it is not added.
- 2026-08-10-npm-release-sequences note (en/zh/i18n): the Release-publish group
  is carried by the publish job (job-level concurrency), not the whole
  workflow; corrected the wording.
2026-08-20 15:59:40 +08:00
07akioni e483c9e30e Merge pull request #2776 from deepseek-harness/feat/table-optmize
feat(web): wrap markdown tables to the column with an overflow wide view
2026-08-20 15:46:40 +08:00
Chinesezjc 16affb84fb fix(cic): restore subscription-type gates and note table for split publish
Address the fresh review pass on PR #2798:

- ci-workflow.spec.ts: restore the subscription-type assertions the rewrite had
  dropped (issue-lifecycle pull_request types omit ready_for_review and include
  review_requested; pull_request_review types == ['submitted']) alongside the
  new step-level gate checks, so the 'tests pin the subscribed events' gate
  holds.
- 2026-08-10-npm-release-sequences note (en/zh/i18n): the three-sequence table's
  Workflow column now lists the pack and publish workflows for dsh/vendor, and
  line 114 no longer claims release.yml publishes (the dsh pack job packs the
  vendored family for verification; release-publish.yml repacks and publishes).

Follow-up for the pack-job copy drift is filed as #2816.
2026-08-20 15:41:24 +08:00
Yichen Jiang 795d36d68f fix(web): carry the composer edit range from the pre-edit selection
Ordinary typing supplied no edit range, so the machine recovered one by
scanning the two drafts for a common prefix and suffix. That reading is
ambiguous whenever the inserted text repeats what it lands against, and the
greedy scan always slides the edit as late as the characters allow. A
reference renders as '@' plus its label, so typing '@' immediately before one
reads as an insertion inside the reference; reconcile then applies its
intersect rule and drops the occurrence. Submission takes the occurrence-free
path and sends the human-facing label instead of the owner's model form, past
the serialization guard that only fires when an occurrence survives.

InputBar now records the textarea's selection during beforeinput and passes
the resulting range to setDraft, which the machine already prefers over its
own scan. A record that cannot describe the reported change yields no range
and the scan still runs.
2026-08-20 15:32:51 +08:00
Chinesezjc abe414a7e3 Merge remote-tracking branch 'origin/master' into ci/release-check-panel 2026-08-20 15:30:47 +08:00
Yichen Jiang 4562616c9b docs(apiproxy): record that a pending question dies with the host
The pending-question registry holds the awaiting tool call's own
resolve/reject, so it is host-process memory. events.mux replays every
still-pending question on reopen, which covers a browser reload or a
reconnect, but a host restart takes the awaiting turn with it and the
reopened Session offers no composer for that question.
2026-08-20 15:29:14 +08:00
Yichen Jiang 9616790b6c feat(web): answer ask_user_question over multiple lines
A question that carried options collected its free-text answer in a
single-line input: a long sentence scrolled sideways inside one line and
Shift+Enter was inert, so an answer with structure could not be typed.
The optionless question already used a textarea, but a fixed 64-140px box
that never followed the draft.

Both shapes now answer into one AnswerField: a `textarea rows=1` sharing a
grid cell with a hidden mirror that renders the draft plus a trailing
newline and so owns the height. Soft wraps are invisible to a '\n' count,
so the mirror is what grows the box; growth stops at eight lines and the
textarea scrolls from there, keeping the choices the answer belongs to in
view. Enter still continues and submits, Shift+Enter breaks the line, and
the IME guard is unchanged.
2026-08-20 15:29:13 +08:00
_Kerman 28b265c1e9 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2702
# Conflicts:
#	examples/headless-agent/tests/snapshots/headless-profile/session.expected.jsonl
2026-08-20 15:26:37 +08:00
pku-xht 19256704c7 test(win32-process): type handle-order assertions 2026-08-20 15:25:02 +08:00
Chinesezjc 63d9de0eb3 fix(cic): address gray-check PR review - official build, step-level gate, note sync
Address ds-review-bot findings on PR #2798:

- release-publish.yml: use pnpm run build:official (not build) so the dsh
  pack step's verifyBuildArtifacts (families.ts:327, readClientBuildRecord with
  officialClientBuildEnvironment) finds the official client-build record; build
  would fail Pack release tarballs on a clean runner.
- issue-lifecycle.yml: move the previous job-level if to step level on
  Create project token and Handle repository event, so approved/commented
  reviews pass (job reported success, no gray segment) without minting a
  write-capable App token or touching the board — preserving the original
  least-privilege property.
- ci-workflow.spec.ts: lock the step-level gate on the two lifecycle steps, and
  add a release-workflow invariant test (release.yml/vendor are pack-only;
  release-publish.yml/vendor-publish.yml are workflow_dispatch-only with the
  npm-publish environment and Release-publish group) to prevent #2797 recurrence.
- Update 2026-08-10-event-directed-pr-review-status and 2026-08-10-npm-release-
  sequences notes (en/zh/i18n) to the new split and step-level behavior.

Verification: ci-workflow.spec.ts 14/14, typecheck clean, all five workflows
YAML-parse, verify-translation-pairing consistent, note-format 582.
2026-08-20 15:21:59 +08:00
pku-xht b2d344771e Merge origin/master into codex/subprocess-win32-process-primitives 2026-08-20 15:21:28 +08:00
pku-xht 5b47da02ae refactor(win32-process): restore mechanical extraction 2026-08-20 15:21:01 +08:00
_Kerman e333dfc8f5 Merge pull request #2794 from deepseek-harness/fix/web-new-session-first
fix(ui-workspace): pin the current blank New Session row first
2026-08-20 14:53:08 +08:00
07akioni c9ce61136d feat(web): reveal the wide-table scrollbar on hover instead of painting it
The themed WebKit scrollbar skin keeps a wide table's horizontal bar
permanently painted. Chromium never repaints state-conditioned scrollbar
styles (hover-conditioned ::-webkit-scrollbar* rules and :hover
scrollbar-color changes both compute but never reach the painted bar,
measured headed and headless), so the hover reveal toggles overflow-x
itself: hidden at rest with a padding-bottom matching the themed bar
height, auto on hover or keyboard focus with the padding released — the
appearing bar exactly replaces the padding and nothing below shifts.
Resting hidden overflow drops Chromium's implicit scroller focusability,
so wide wrappers carry an explicit tabindex for arrow-key scrolling.
2026-08-20 14:45:15 +08:00
_Kerman 9a2dc3327d test(web): align blank-session activity snapshot 2026-08-20 14:40:09 +08:00
_Kerman 07cf16d57c docs(session-projection-cache): sync the per-record domain medium across docs
Cache README (EN/ZH): the medium is the session_projcache domain in
per-record layout (one version-stamped document per session under the
json backend root), reads are synchronous from the domain's in-memory
tables, and the storage stack rides in base. storage-json README
documents both layouts and their contracts; web-app README notes that
storage and the projection cache live in the shared base. Regenerated:
session-projection subsystem catalog (sync cachedSnapshot, domain
medium), config-catalog (Config.root gone), module-graph (cache now
depends on storage-domain, not session-persistence), cli composition
(storage rows in base), and the projection-cache Agent Note — which now
records the file-root revision and its revert as rejected alternatives.
2026-08-20 14:38:39 +08:00
_Kerman 9226d9bbf6 test(session-projection-cache): rewrite for the per-record domain medium
cache.spec now boots the real storage stack (storage, storage-json,
storage-domain) and asserts the per-record medium directly:
<root>/session_projcache/sessions/<id>.json carries a version-stamped
{version, record} document, cachedSnapshot is synchronous (zero-I/O from
the domain's in-memory tables), and the write-policy / fail-soft / listing
coverage is preserved at 100%. json-backend.spec gains a per-record layout
block (per-record documents, overwrite/delete/reopen, unsafe keys and
undeclared tables rejecting, foreign-document discard on open, closed
guard, close drain, unreadable-as-absent); storage-domain domain.spec
covers layout validation and descriptorOf projection. list-children.spec
mounts the storage stack for its projectionCache cases and its
cachedSnapshot mocks and reads go synchronous; the api-proxy specs' cache
mocks go synchronous too. devDeps and tsconfig references updated for the
storage stack.
2026-08-20 14:38:33 +08:00
_Kerman b3b6407a2c fix(ui-workspace): promote new sessions only once 2026-08-20 14:21:55 +08:00
_Kerman 50ad2aba19 fix(session-persistence): repair persistence CI gates
- document the exported SqliteStore prefix/suffix loaders (verify-export-jsdoc)
- share createStoredEventRead from session-persistence so the standalone
  SQLite store stops duplicating the service helper (duplication gate)
- route replaceStored header upserts through writeRow (duplication gate)
- move replacement/conflict test SQL into closed test resources so the
  SQLite SQL resource boundary test passes
2026-08-20 14:21:47 +08:00
_Kerman 3a4232a8fa fix(bundle): promote the storage stack and the projection cache to base
The storage hub, json backend, and domain form are general infrastructure,
and the projection cache is a session-layer service that depends on them —
both belong in the shared base, not in the web overlay. Base now provides
storage / storage-json / storage-domain / session-projection-cache; the
web-app overlay keeps its surface consumers (workspace, message-feedback),
which inherit storageDomain from base (a child layer sees parent services).
This reverts the storage stack's historical web-app-only placement and the
file-root design's base mount of the cache.
2026-08-20 13:56:23 +08:00
_Kerman 4ea6f4df24 Merge pull request #2730 from deepseek-harness/xtr/projection-state-schema
refactor(projection): separate host state from client views
2026-08-20 13:55:58 +08:00
hypatiamay fe12e04732 Merge pull request #1798 from deepseek-harness/codex/fix-bwrap-proc-root-escape
fix(sandbox): prevent bwrap procfs root escapes
2026-08-20 13:48:37 +08:00
_Kerman e01c1a4b41 fix(bundle): mount the projection cache in the web-app overlay
The cache now opens its domain through ctx.storageDomain, which the
web-app overlay provides (storage-json + storage-domain, backend json).
A parent layer cannot see a child layer's services, so the base-layer
mount from the file-root design is reverted: the cache mount moves back
to web-app next to its storage dependencies, and Config.root is gone.
2026-08-20 13:47:53 +08:00
_Kerman 1201ecc828 fix(session-projection-cache): store checkpoints on a per-record storage domain
Restore the storage-domain medium the file-root design replaced: the cache
opens the session_projcache domain (per-record layout — one document per
session under the json backend root) and checkpoint writes land through
the domain's write chain. Reads and writes now share ONE coherent state:
cachedSnapshot reads synchronously from the domain's in-memory tables,
and every write is durability-first-then-memory, so a read can never go
around the write chain to the medium. The hand-rolled write chains,
in-flight tracking, per-session file paths, owner-only file modes, and
the sqlite no-path special case are gone; Config.root is removed and the
domain's version stamp makes a checkpointRecord bump discard stale
sessions per record instead of rejecting the whole medium. The async
ripple of the old file read is reverted: api-proxy's listing column and
subagent's cold identity read go back to synchronous cachedSnapshot.
2026-08-20 13:47:47 +08:00
_Kerman 501f387b46 feat(storage): add the per-record layout to the json backend
The json backend now serves two layouts. single (the default) keeps the
whole unit as one document at <root>/<name>.json; per-record keeps one
version-stamped document per record at <root>/<name>/<table>/<key>.json
(plus global.json), so one write rewrites one record instead of the whole
unit. The per-record unit is stateless — the directory is the state,
loadAll re-reads the tree, and every write is a single durable file
operation — while single keeps its authoritative in-memory state and
whole-file publish. Records keys must be path-safe ([a-zA-Z0-9_-]+);
an unsafe key rejects. A record document that is malformed or stamped
with another version reads as an absent record: one bad or stale file
never bricks the unit, and a version bump discards stale records instead
of migrating them. DomainSpec and KvUnitDescriptor gain the optional
layout field (defineDomain validates it, descriptorOf projects it).
2026-08-20 13:47:39 +08:00
Hypatia May 9003f459aa Merge remote-tracking branch 'origin/master' into codex/fix-bwrap-proc-root-escape 2026-08-20 13:38:36 +08:00
_Kerman d53292b30a fix(ui-workspace): make the blank-session pin render-only and skip masked drags
Review follow-up on #2794: the pin was applied inside nextSessionOrderAccount,
whose output syncSessionOrderAccount persists into sessionOrderByAccount, so a
reused blank stayed first forever after turning non-blank (even across
reloads). Move the pin to the render-derived layer (orderedWorkspaces,
orderedUngroupedSessionIds, ungrouped order, flat rows) so the persisted
account order is never touched, and skip drags the pin would mask (dragging
the pinned blank, or parking another row into the pinned slot) entirely,
including the Host account write.

Adds regression tests for the masked-drag skip and for the pin releasing when
the blank turns real; updates the sidebar-order Agent Note (EN + ZH) and its
pairing hash.
2026-08-20 13:25:55 +08:00
_Kerman fa39fb0881 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2730 2026-08-20 13:25:35 +08:00
Yichen Jiang d18f4ed3de Merge pull request #2796 from deepseek-harness/worktree/mention-backdrop-perf-issue-4bd518
fix(web): key composer reference decorations by draft order
2026-08-20 13:21:29 +08:00
_Kerman f9cd580a33 Merge remote-tracking branch 'origin/master' into xtr/projection-state-schema 2026-08-20 13:21:03 +08:00
Chinesezjc 03d1dead79 test(subagent): rethrow accumulated cleanup errors; register fresh handle
Address ds-review-bot re-review: collect per-cleanup rejections and rethrow
as AggregateError so real flush failures surface instead of being swallowed;
register the cold-resume context's second persistence handle in cleanups so
it closes even on a failure path; drop the unverifiable flake-history aside.
2026-08-20 13:17:28 +08:00
Chinesezjc a33ed4ddf8 ci: stop PR gray checks from lifecycle and release publish jobs
Remove the three skipped (gray) checks from the PR check panel without changing
functional semantics:

- issue-lifecycle: remove the job-level 'if' that skipped the lifecycle job on
  non-changes-requested pull_request_review events, so it now runs and reports
  success (the lifecycle handler already no-ops for approved/commented reviews).
  The changes-requested board transition is unchanged.
- release.yml / release-vendor.yml: drop the publish job (and its
  workflow_dispatch 'publish' input + RELEASE_PUBLISH pass-through) so it no
  longer appears as a skipped Publish-to-npm check on PRs; the files keep the
  pack job that validates tarballs on PR/push.
- new release-publish.yml / release-vendor-publish.yml: manual workflow_dispatch
  only, repack on the current tree then publish, so publication behaves exactly
  as the old publish job (explicit dispatch, uses the packed bytes) but never
  shows as a PR check.

Update the 2026-08-10 review-status note (en/zh/i18n) and the issue-lifecycle
spec assertion to match the unconditional lifecycle job.

Verification: ci-workflow.spec.ts 19/19, all five workflows YAML-parse, typecheck
clean, verify-translation-pairing consistent, note-format 582.
2026-08-20 13:15:58 +08:00
_Kerman c9f51173c3 test(acp): keep persistent-pwsh-tool-turn fixture in canonical packed layout
Migrate the fixture merged from master through the canonical projection so
the repository-wide snapshot layout check passes without re-recording.
2026-08-20 13:13:56 +08:00
Yichen Jiang 99aad0ebcd fix(web): key composer reference decorations by draft order
The backdrop keyed each plain-text reference mark by its draft offset, so
any character typed ahead of a reference changed the key and made React
unmount the mark with its nested spans and inline glyph. Every keystroke
before a reference rebuilt every reference after the caret.

A scan derives these ranges fresh on every render, so a range carries no
identity past the render slot it occupies. The mark now keys by its index
in the offset-sorted textRefs list. Structured chips keep occurrenceId,
the identity their occurrence table owns.
2026-08-20 12:59:13 +08:00
_Kerman 98723525c6 docs(notes): record current-blank pinning in the sidebar order note
The New Session being created renders first in its account while selected,
in both order modes; opening or reusing a blank never advances its
updatedAt, so the pin keeps the reused row at the front.
2026-08-20 12:51:59 +08:00
_Kerman d0b7dea8af fix(ui-workspace): pin the current blank New Session row first
Clicking New Session reuses the workspace's existing blank session when one
exists; reuse only opens it, so its updatedAt (host: max(createdAt,
lastPromptAt)) never advances and the row kept its old creation-time
position in the sidebar. nextSessionOrderAccount now pins the currently
selected blank session to the front of its account in both Manual and Last
updated modes; non-blank navigation stays untouched.

Fixes #2788
2026-08-20 12:51:51 +08:00
Chinesezjc 297fff6e9c Merge pull request #2768 from deepseek-harness/ci/split-master-workflows
ci: split master-only jobs into ci-master.yml
2026-08-20 12:19:10 +08:00
Kaige-Gao 4e1b3e4b87 Merge pull request #2608 from deepseek-harness/fix/permission-copy-and-default
fix(web): improve permission labels and blank defaults
2026-08-20 11:58:25 +08:00
Chinesezjc 77437b1f50 docs(e2e): point keyless-gate comment at ci.yml (PR) and ci-master.yml (push)
The e2e comment said the keyless gates run in ci.yml on every push/PR; since the
split, master push is covered by ci-master.yml standby instead.
2026-08-20 11:25:21 +08:00
Chinesezjc a42102fb27 Merge pull request #2758 from deepseek-harness/knip-eval
Trim knip.json to 655 lines by removing 15 stale or glob-duplicate workspace entries. Behavior-neutral under knip's specificity-based workspace config selection; CI green, issue policy green, review threads resolved.
2026-08-20 10:59:36 +08:00
_Kerman c26ca6acb6 fix(session-projection-cache): drain in-flight writes on disposal; sync stale lockfile and generated docs
- Track fire-and-forget durable writes and await them at plugin disposal so
  a late flush can never land after teardown (fixes the ENOTEMPTY cleanup
  race in the disposal test).
- Drop the now-async-less Service.init and flushSoft void operators to keep
  lint clean, and remove the redundant dsh-storage-json devDependency.
- Regenerate the stale pnpm lockfile and the config/persistence/module-graph
  catalogs (with zh mirrors and pairing records) that the per-session cache
  merge left out of sync, and fix the session-projection type-equiv doc
  blocks to match the source.
- Add coverage for the unrelated-log-identity and no-per-session-directory
  (sqlite) cold-read paths.
2026-08-20 10:49:43 +08:00
_Kerman bb79203f53 fix(docs): drop stale persist field from projection type-equiv block
ProjectionDefinition lost its persist?: boolean opt-in when every
projection unit became uniformly checkpointed, but the subsystem doc's
type-equiv paste still carried the field, so verify-type-equiv drifted
from packages/session/session-projection/src/index.ts. Remove the field
and its JSDoc from both language sides and re-record the bilingual
pairing record.
2026-08-20 10:29:56 +08:00
kingwl 82db1515fb fix(sandbox): isolate bwrap PID namespace 2026-08-20 10:05:16 +08:00
_Kerman 83a3457b4a Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2730 2026-08-20 10:04:04 +08:00
Kaige-Gao a0bfc2c3fe test: sync permission origin artifacts 2026-08-20 00:01:28 +08:00
Kaige-Gao 027b1d579f Merge remote-tracking branch 'origin/master' into fix/permission-copy-and-default 2026-08-19 23:23:54 +08:00
imccyu 141eb6fef8 Merge pull request #2783 from deepseek-harness/release/dsh-0.1.0-rc.8
release: [email protected]
2026-08-19 23:11:50 +08:00
imccyu f1f7dc36fa release(dsh): 0.1.0-rc.8 2026-08-19 23:00:28 +08:00
imccyu b862725e74 Merge pull request #2787 from deepseek-harness/worktree-rename-team
refactor: mark Agent Teams packages as experimental
2026-08-19 22:59:48 +08:00
imccyu 803a60264a fix: normalize release bump manifest paths 2026-08-19 22:52:40 +08:00
Kaige-Gao 8304a25d8a Merge remote-tracking branch 'origin/master' into fix/permission-copy-and-default
# Conflicts:
#	packages/subagent/subagent-codex/tests/subagent-codex.spec.ts
2026-08-19 22:50:35 +08:00
Kaige-Gao 35778ec2ff fix(web): address permission preset review feedback 2026-08-19 22:45:54 +08:00
imccyu 70a3bf4554 docs: refresh Agent Teams catalogs 2026-08-19 22:44:23 +08:00
imccyu 4dd1be1a1f refactor: rename agent teams service key 2026-08-19 22:30:36 +08:00
imccyu 0e51d5ffae refactor: prefix experimental package names 2026-08-19 22:30:36 +08:00
imccyu cb93304ec9 refactor: rename experimental agent team directories 2026-08-19 22:30:36 +08:00
_Kerman f62986c01a docs(session-projection): sync persist removal, cache root, and catalogs
- subsystem docs: drop the removed persist flag from the ProjectionDefinition
  type block (both languages).
- config-catalog regenerated (cache requires sessionProjections/sessions,
  config gains root) and the zh side synced by hand; doc graphs regenerated.
- Agent Notes: the per-session cache note records the owned root tree and
  no-persistence design; the storage-root proposal's link to it is corrected
  (two levels up).
2026-08-19 22:26:16 +08:00
_Kerman 32ed3e2bce test: adapt consumers to the cache's own root tree
The web e2e seeds no longer warm the deleted coldSnapshot; assertions do not
depend on the cache path. list-children mounts the cache with a scratch
root instead of a storage-domain backend, and drops the now-unused storage
devDependencies.
2026-08-19 22:26:08 +08:00
_Kerman a9a51f8096 fix(bundle): mount the projection cache in the base overlay
The cache now owns its storage root (dshHomePath('projections')), so the
mount moves from the web-app overlay to base with that root declared, next
to the other base session layers. web-app inherits it; its overlay mount is
removed.
2026-08-19 22:26:02 +08:00
_Kerman 89321489db refactor(session-projection-cache): own the cache tree under a config root
Store each session's projection_cache.json under the cache's own root tree
(<root>/<session-id>/projection_cache.json, wired to dshHomePath('projections')
in the base bundle) instead of beside the session log via
sessionPersistence.locate(). The cache owns its directory layout, keys
directories by the code-generated session id, and never consults the
persistence layer; the service now injects only sessionProjections and
sessions.

Drop the coldSnapshot method and its readFrom-tail fold ladder: every cold
consumer refolds from the log itself, so the cache only serves the listing
read (cachedSnapshot, one async file read per session) and the write side.
Fail-soft durability, per-path write serialization, in-flight drain, and
atomic 0600 writes are unchanged; the chain cleanup now observes its own
rejection so a failed write cannot surface as an unhandled error.

dsh-session-persistence leaves peer/dev dependencies and the tsconfig
reference; dsh-atomic-write moves to peerDependencies. Config gains a
required root.
2026-08-19 22:25:54 +08:00
Tianyi Cui 05d64b50de Merge pull request #2786 from deepseek-harness/worktree/reasoning-content-missing-bug-abeb35
fix(llm-deepseek): pass reasoning content back on every reasoned turn
2026-08-19 22:17:12 +08:00
Yichen Jiang 583894f7ae fix(llm-deepseek): pass reasoning content back on every reasoned turn
An assistant turn that answered without calling a tool serialized no
reasoning_content, so a gateway re-encoding the conversation for another
vendor had no chain of thought to hash and lost that turn's upstream
thinking signature.
2026-08-19 22:02:36 +08:00
Tianyi Cui a9dc3b7ff6 Merge pull request #2780 from deepseek-harness/worktree/brand-guidelines-i18n
docs: split brand guidelines into bilingual pair
2026-08-19 21:50:25 +08:00
Tianyi Cui c81937cdbb test: pin brand guidelines root scope 2026-08-19 21:45:43 +08:00
_Kerman 3f4c5f0563 fix(session-projection-cache): address review — atomic-write reuse, sqlite no-path, ordering and drain
- Write through @deepseek-ai/dsh-atomic-write with { mode: 0o600,
  dirMode: 0o700 } instead of exporting a second atomic-write primitive
  from dsh-storage-json; the session tree stays owner-only like the jsonl
  backend's own directories.
- Serialize atomic replacements per cache path so an older cut can never
  overwrite a newer one; track in-flight writes and drain them on
  disposal so a late flush cannot land after teardown.
- Detect the absent per-session directory before the checkpoint cut and
  durability flush: sqlite-style backends no-op the write entirely.
- Cold-read write-back path and identity both come from the stored log
  header (tail.meta), so a stale caller header cannot mint an orphan
  cache file.
- Add no-path coverage (write no-op, cachedSnapshot undefined, cold
  fallback to the full-log rung) and a concurrent-write ordering test;
  the package now holds 100% statement/branch/function/line coverage.
- Sync README.md/zh (inject list, coldSnapshot signature, per-session
  file read wording), package description, the Agent Note alternatives,
  and the superseded proposed/implemented notes (EN/ZH); add the
  concurrent-checkpoint Known Limitation.
2026-08-19 21:40:12 +08:00
Tianyi Cui 5aa99be94e test: refresh translation prompt snapshot 2026-08-19 21:39:28 +08:00
_Kerman 30334322eb fix(apiproxy): crop host-only units from wire projection blocks
history and session.list baselines built through restore/snapshot without
wireOnly leaked host-only unit state onto the wire; pass { wireOnly: true }
on the detached history fold, the attached history snapshot, and the
attached listing snapshot.
2026-08-19 21:16:00 +08:00
_Kerman aa527186d6 merge: bring in the per-session projection cache (2781) 2026-08-19 21:11:59 +08:00
_Kerman bb6faaf87b Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2698 2026-08-19 21:08:03 +08:00
_Kerman cdb4cc3c68 feat(session-projection-cache): store one projection_cache.json per session
Replace the single global session_projcache domain with a per-session
cache file inside the session's own persistence directory, resolved
through sessionPersistence.locate(meta) — the persistence backend owns
the session-directory layout, the cache service keeps every checkpoint
and cold-read responsibility.

- cachedSnapshot(meta) becomes async (one file read per session);
  coldSnapshot takes the session header so it can locate the file, with
  the stored log header remaining the identity witness.
- Backends without a per-session directory (sqlite) disable the durable
  cache: writes no-op and cold reads fall to the full-log rung. An
  obsolete global cache is never read — derived data refolds on first
  cold read (no migration).
- writeAtomic is exported from dsh-storage-json as the shared atomic
  whole-file replace primitive; api-proxy listing and subagent cold
  reads await the now-async cachedSnapshot.
- READMEs and a new Agent Note document the per-session medium.
2026-08-19 21:03:20 +08:00
Tianyi Cui 89b0f17f84 docs: split brand guidelines into bilingual pair 2026-08-19 21:01:18 +08:00
_Kerman 270a06b38b fix(session-persistence-jsonl): drop crash-unsafe cross-process log lock
The product model has no cross-process writer exclusion (the coordinator
serializes per-session operations in-process; the README documents one
live writer per session), so the wx-created .lock sibling only guarded
byte-level races while adding two failure modes: a crash leaves a stale
lock that permanently wedges that log's appends/repairs/replacements, and
a post-commit lock cleanup failure makes a committed append look failed,
so the retained write-behind batch retries into duplicate seqs.

Remove withLogLock and keep replaceStored's revision compare-and-swap at
the commit boundary (recheck immediately before the atomic rename).
2026-08-19 20:42:56 +08:00
_Kerman c1b67c901d Merge remote-tracking branch 'origin/master' into xtr/2701-stable-session-snapshots 2026-08-19 20:39:44 +08:00
_Kerman e8f4315cee fix(session): scope format registry completeness to per-session decode
buildStepIndex rejected the whole decoder at initialization whenever any
registered step could not reach the current version, so one retired old
upgrader blocked every session, including later versions whose path to
the current version is complete. planSteps already refuses a specific
stored version when a needed step is missing; initialization now checks
only step legality and duplicates.
2026-08-19 20:31:31 +08:00
pku-xht 615d910f04 Merge origin/master into codex/subprocess-win32-process-primitives 2026-08-19 20:01:10 +08:00
07akioni 000ab970f3 feat(web): size markdown tables by column count, widen wide ones past the column
Markdown tables were always rendered at natural width, so anything wider
than the 748px message column could only be read through horizontal
scrolling. Following the deepsuite chat TableWrapper treatment: tables
under four columns (and any table inside a blockquote) now fill the column
and wrap cell text down to the cells' minimum readable width, while
four-or-more-column tables keep their natural width behind the wrapper's
horizontal scroll and carry the stable md-table-wide hook. The chat
transcript widens hooked tables past the message column with a pure-CSS
container-query breakout (100cqw against ChatView's scroll container
standing in for deepsuite's JS-measured list width), keeping the table
content aligned with the message column and clamping to neutral when the
transcript is narrower than the column.
2026-08-19 19:58:14 +08:00
imccyu 75282c92c1 Merge pull request #2778 from deepseek-harness/worktree-nologo2
docs: update branding guidelines file
2026-08-19 19:03:22 +08:00
imccyu 16cfa8a395 docs: rename BRAND-GUIDELINE.md 2026-08-19 18:59:20 +08:00
Magolor 6efd8edd0f Merge pull request #2306 from deepseek-harness/codex/sqlite-v2-chunk-packing
feat(session): optimize SQLite persistence layout
2026-08-19 18:48:33 +08:00
Magolor 93b4b98ef3 feat(session): optimize SQLite persistence layout 2026-08-19 18:36:27 +08:00
imccyu 1a5e038fb9 Merge pull request #2665 from deepseek-harness/worktree-nologo
feat(client): configure build-time branding
2026-08-19 18:33:45 +08:00
imccyu 8c542e1649 docs: add GUIDELINES.md 2026-08-19 18:21:35 +08:00
imccyu 50a953fef3 fix: ci 2026-08-19 18:21:35 +08:00
imccyu 319d9a7984 feat(client): compose deployment branding through slots 2026-08-19 18:21:35 +08:00
imccyu 738dcced9b feat(release): validate client build artifacts 2026-08-19 18:21:27 +08:00
imccyu 66a7081c15 feat(build): bind client artifacts to build profiles 2026-08-19 18:21:27 +08:00
imccyu 93cbb3799d feat(client): inject public build environment 2026-08-19 18:21:26 +08:00
Yichen Jiang 1943a532f6 Merge pull request #2769 from deepseek-harness/worktree/web-reference-ui-polish
fix(web): align reference input and recall ordering
2026-08-19 18:12:46 +08:00
_Kerman e7d24de36c Merge pull request #2300 from deepseek-harness/feat/pwsh-persistent-pty
feat(pty): persistent pwsh over the PTY seam on Windows
2026-08-19 18:03:56 +08:00
Yichen Jiang 1585e539d2 fix(web): address reference review defects 2026-08-19 18:02:10 +08:00
_Kerman 842f42d7ea Revert "fix: resolve remaining review findings — explicit turnBoundary dependency and uniform missing-key handling"
This reverts commit 3a664c73e131d073025c5c3041e3f4a3cebb3889.
2026-08-19 18:01:11 +08:00
_Kerman 5ef3f0bd94 fix: resolve remaining review findings — explicit turnBoundary dependency and uniform missing-key handling
- user-approval: name the absent agent loop when the turnBoundary
  projection is not registered (instead of the misleading 'outside an
  open turn') and declare dsh-agent-loop as a peer dependency; add a
  regression test for the missing-unit composition (v4p).
- session-title / time-context / agent-instructions: converge the
  self-registered-key-absent handling to a loud throw with the same
  v8-ignored comment style (v5 suggestion).
2026-08-19 17:58:29 +08:00
Magolor c474d28d0b Merge pull request #2722 from deepseek-harness/agent/avoid-persistence-seed-clone
perf(session): 避免重复克隆持久化 seed
2026-08-19 17:58:26 +08:00
Chinesezjc 7ae647d52c fix(cic): narrow workflow.on before Object.keys in event-set assertion
The exact-event-set assertion called Object.keys on a Record<string, unknown>'s
on field without narrowing, failing typecheck (TS2769). Guard with isRecord
before asserting the full event sets.
2026-08-19 17:48:32 +08:00
_Kerman 58ebaa63d0 docs(notes): refresh superseded projection notes for the mandatory seam
Update in place the implemented notes whose mechanisms this stack changed:
the subagent list identity note drops the deleted
SUBAGENT_CONTROL_PROJECTIONS_UNAVAILABLE error contract and hostile-unit
probe for the required-injection seam; the durable-subagent-catalog note
drops the same stale error-code reference; the sandbox pair replaces the
effectiveSandboxMode/effectiveApprovalPolicy trio with the sandboxMode
projection unit on the required registry; the plan collaboration note
replaces foldPlanMode with the plan projection unit. EN/ZH in lock-step;
i18n pairing re-recorded.
2026-08-19 17:46:11 +08:00
Chinesezjc 6d6e4e17c8 fix(cic): sync event-set assertion, zh twins, and master-workflow attribution
Address the 7 remaining review threads on PR #2768:

- spec: assert the exact full event sets for both workflows (ci-master =
  [push, workflow_dispatch], ci.yml = [pull_request]) instead of only the
  negated checks, so losing/adding a wrong event fails.
- 2026-07-21 note line 29: 'The ci-master and Sandbox workflows keep their
  cross-platform references on master pushes' (en+zh) — ci.yml is PR-only.
- failover-runbook line 19 (en+zh): the push-reachable classification now names
  ci-master.yml for the drills/wine cache and ci.yml for the PR jobs, dropping
  the stale pull-request-gated phrasing.

i18n hashes re-recorded for both notes; spec 13/13, pairs consistent,
note-format 575.
2026-08-19 17:46:06 +08:00
_Kerman 2a4f6541d6 fix: revert the projection-registration form per review
Per the imccyu review, the pre-existing goal, permissions, and plan units
go back to registering through the ctx.inject(['sessionProjections'], …)
child form instead of the required-inject direct register; goal returns to
zero diff (its service never reads projections). The mandatory-seam rework
for these three sites moves to a follow-up PR. New projection units keep
the required-inject direct-register form.

Regenerated catalog and subsystem docs follow the reverted service
signatures.
2026-08-19 17:46:02 +08:00
Chinesezjc 7247de9d3d fix(cic): restore serial-linux drill comment, sync pnpm-isolation note, polish runbook
Address the second review pass on PR #2768:

- Restore the serial-linux-selfhosted drill comment in ci-master.yml (it was
  lost in the split boundary, leaving serial-linux-selfhosted as the only
  comment-less job); adapted to the current-state fact that this workflow never
  listens to pull_request while keeping the no-cache-steps reason, the
  DSH_CI_FAILOVER_LINUX switch guidance, and push-triggered semantics.
- Update 2026-07-29-pnpm-setup-runner-isolation (en/zh + i18n): the regression
  test and setup steps now span ci.yml and ci-master.yml.
- failover-runbook line 19: the push-reachable classification now names
  ci-master.yml for the drills/wine cache and ci.yml for the pull-request jobs,
  dropping the stale pull-request-gated phrasing.
- all-checks-passed comment in ci.yml notes that needs cannot reach across
  workflow files (ci-master job are deliberately outside this PR verdict).

Verification: ci-workflow.spec.ts 13/13, both workflows YAML-parse with correct
concurrency, 3 translation pairs consistent, note-format 575.
2026-08-19 17:44:40 +08:00
_Kerman abe572e7c4 merge: bring in the base's uniform checkpointing
Reconcile the base's persist removal and later master content with the
migration branch: keep 2742's wireOnly read options, the host-inclusive
snapshot/viewCheckpoint/restore defaults, and the drive's late-event
replay (applyToCell) that bare-session reads rely on.
2026-08-19 17:27:47 +08:00
Chinesezjc 82f9040a7c fix(cic): correct pnpm-caching note and extend setup-dest test to ci-master
- The pnpm-caching note placed node-compat in ci-master.yml, but it stays a PR
  job in ci.yml; only the two runner benchmarks moved. Correct en/zh line 15 and
  re-record the pair.
- The pnpm/action-setup destination test only iterated ci.yml; extend it to also
  cover ci-master.yml so its five pnpm setups stay regress-tested.
2026-08-19 17:25:59 +08:00
Chinesezjc 1d5e4199c8 fix(cic): address CI-split review - restore PR concurrency, fix comment migration, restore deleted spec block
Per review on PR #2768:

- Restore a concurrency block in ci.yml (cancel-in-progress: true) so a fresh
  PR push cancels the superseded run; GitHub has no default PR auto-cancel,
  so removing it would stack a second full 9-job run on every push.
  Update the ci-workflow.spec assertion accordingly.
- Fix comment misplacements from the split boundary: ci.yml's all-checks-passed
  now carries its own branch-protection comment (the drill comment that was
  orphaned above it is gone), and ci-master.yml no longer ends with an orphaned
  all-checks-passed comment.
- Restore the DeepSeek e2e workflow describe-block in ci-workflow.spec.ts that
  the rewrite had silently deleted (e2e.yml is unchanged).
- serial-windows comment no longer claims non-blocking-for-PR/absent-from-needs
  since ci-master never listens to pull_request.
- DSH_TELEMETRY_DISABLED safe-use comment restored in ci-master.yml env; split
  rationale (mi gray segments in PR check) documented in .github/AGENTS.md.

Verification: ci-workflow.spec.ts 13/13, both workflows YAML-parse with correct
concurrency, git diff --check clean.
2026-08-19 17:24:58 +08:00
Yichen Jiang bbc356144d Merge remote-tracking branch 'origin/master' into worktree/web-reference-ui-polish 2026-08-19 17:11:46 +08:00
Yichen Jiang 988dd7824a fix(web): align reference input and recall ordering 2026-08-19 17:11:36 +08:00
_Kerman 917ef58f79 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300 2026-08-19 17:09:18 +08:00
Chinesezjc 61f910d1c6 ci: split master-only jobs into ci-master.yml
Split the single ci.yml into two workflows so the PR check panel stops listing
master-only obs jobs that skip (gray) and block the aggregate green-check:

- ci.yml is now pull_request-only, holding only the 9 PR jobs (node-24,
  node-24-coverage, node-24-consumers, node-compat, python-sdk, python-runtime,
  windows, windows-native, all-checks-passed). It drops the workflow-level
  concurrency block since master carve-outs no longer apply.
- ci-master.yml (new) carries the six master/dispatch jobs (wine-apt-cache,
  serial-linux-selfhosted, serial-macos, serial-windows, and both runner
  benchmarks) with the push-exempt cancel-in-progress block and suite input.
  It does not listen to pull_request, so its jobs never appear in PR checks.

ci.yml keeps the wine apt cache seed/restore (repo-scoped by key), so moving the
producer to ci-master.yml does not break the PR windows job's restore.

Update ci-workflow.spec.ts to assert the two-workflow split: ci-master owns the
drills/benchmarks and the push-exemption concurrency, ci.yml is PR-only without
concurrency. Update the serial-reference, portable-required, failover-runbook,
and pnpm-caching notes (en/zh + i18n) and .github/AGENTS.md to reflect ci-master.

Verification: scripts/ci-workflow.spec.ts 12/12, both workflows YAML-parse,
verify-translation-pairing consistent, verify-agent-note-format passes.
2026-08-19 17:09:18 +08:00
_Kerman 86831ea9a2 docs(notes): date the mandatory projection-seam note 2026-08-19
The note was committed on 2026-08-19 but filed under 2026-08-07 while
building on the 08-19 state-and-client-views note; rename the triplet to
align the filename with the actual date and update the inbound
architecture links.
2026-08-19 16:59:07 +08:00
_Kerman 5ddbc6e71f refactor(session-projection): checkpoint every projection unit (migration side)
Adapts this branch to the base's removal of the persist opt-in: the
registry folds and checkpoints every registered unit, the host-only
subagent identity drops its explicit persist: true, and the
state-and-client-views note records the uniform rule. The cordis API
catalog and session-projection subsystem signatures are regenerated.
2026-08-19 16:59:00 +08:00
_Kerman b0c2e2bf01 refactor(session-title): keep title input as an O(1) projection
The titleInput unit no longer retains the full eligible message history
in bounded reverse-linked chunks. It folds only {first, last, count} —
the values scheduling and fallback reads need — and the full eligible
prefix for one provider generation is scanned from the session log at
execution time. The projection state is O(1) per session instead of
growing with every user message.

The README description updates accordingly and drops the inaccurate
"latest request route" claim; the projection test now asserts the
bounded aggregate and its checkpoint row.
2026-08-19 16:58:53 +08:00
_Kerman f364d6ba37 fix: address ds-review-bot findings on the projection migration
- llm-retry: validate config before registering the projection unit;
  document the branded-retry-id zod cast; start stateVersion at 1.
- agent-loop: register turnBoundary only after every config validation,
  so a rejected constructor leaves no unit behind; the defensive-cap
  test no longer needs fiber cleanup.
- agent-instructions: keep newest-first per-scope change history so the
  latest visible change survives a surface replacement shadowing the
  newest one (restores the previous scan-visible semantics); add a
  regression test for the delete-after-shadow sequence.
- tool-skill: keep catalog-message history so a shadowed newest catalog
  message still falls back to the latest visible digest.
- session-query-sqlite: drop the unused required sessionProjections
  injection.
- plan-mode: restore the command/done error-drop regression test and the
  cold-replay command/done fold; drop the inaccurate state-reference
  comment.
- tool-todo: remove a stray blank line; document the turnBoundary
  reader contract on the projection type.
2026-08-19 16:58:47 +08:00
_Kerman 327b86d2ea refactor(session-projection): checkpoint every projection unit uniformly
Drop the persist?: boolean opt-in: every unit's state — client-visible and
host-only alike — is now written to the projection cache. A unit can no
longer silently skip the durable cache, host-only units no longer need an
explicit flag to participate in cold restore, and the persist-sharing
conflict check disappears with the field.

- ProjectionDefinition/ErasedDefinition lose persist; register overloads
  simplify; checkpoint/restoreFloor/restore fold every registered unit.
- Registry and cache tests drop the persist:true fixtures and the
  persistence-policy sharing test.
- READMEs and the state-and-client-views note record the uniform rule;
  cordis API catalog and subsystem signatures regenerated.
2026-08-19 16:55:10 +08:00
Chinesezjc e122005011 Merge pull request #2744 from deepseek-harness/ci/remove-hosted-serial-linux
ci: remove dead hosted serial-linux job
2026-08-19 16:26:36 +08:00
pku-xht ce46af97f2 Merge commit '84d329db60462a97ff7de82d8c7bd101676a3f0e' into codex/subprocess-win32-process-primitives 2026-08-19 16:19:10 +08:00
Chinesezjc 674b3d8afd test(subagent): address continuation cleanup review
- Keep cleaning remaining roots even if one cleanup rejects.
- Collapse the duplicated Windows-EPERM rationale to one comment.
- Dispose the cold-resume context's second JsonlSessionPersistence handle on
  the shared root before afterEach removes it.
2026-08-19 16:18:37 +08:00
lsdsjy f938d8e1c8 fix(ci): reuse pinned bubblewrap setup in e2e 2026-08-19 16:08:56 +08:00
Chinesezjc 50c22ee472 chore(knip): drop stale and glob-duplicate workspace entries
Remove 15 workspaces entries from knip.json: 2 keys naming packages that no
longer exist (packages/util/home, packages/client/web-ui) and 13 entries
whose entry/project equal the packages/*/* glob default. knip selects one
config per matched key by specificity, so a removed entry either lost an
unresolvable target or fell back to an identical glob config; knip still
runs clean (0 issues). 655 lines, down from 790.
2026-08-19 16:01:17 +08:00
lsdsjy f8e4ca0bb0 Merge pull request #2410 from deepseek-harness/feat/auto-open-web-ui
feat(web,cli): open the ready Web UI by default
2026-08-19 16:00:38 +08:00
Chinesezjc ea0906a99d test(subagent): close persistence handle before deleting temp root
The continuation spec cleaned each mkdtemp root with rmSync in afterEach
without closing the JsonlSessionPersistence handle first. On Windows,
rmSync recursive over a directory whose file handle is still open fails
with EPERM, surfacing intermittently in native complete as
dsh-subagent-continuation-* cleanup failures. Close the persistence
fiber before rmSync (mirrors jsonl.spec.ts), preserving per-root
dispose-then-delete order.
2026-08-19 15:57:51 +08:00
imccyu 2bff588f3d Merge pull request #2756 from deepseek-harness/fix/oxlint-ci-diagnostic-locations
fix(ci): preserve oxlint diagnostic locations
2026-08-19 15:56:36 +08:00
Chinesezjc a0877ae4a1 docs: drop dangling 'additional' on self-hosted serial in larger-hosted note
L55 said 'An additional serial Linux reference runs ...', but L53 already lists the
self-hosted serial Linux standby as the existing reference, so 'additional'
implied a second one. Reword to 'The self-hosted serial Linux reference runs ...'
and mirror in zh L55. Re-record the i18n hash.
2026-08-19 15:56:16 +08:00
imccyu 3b9edc2939 fix(ci): preserve oxlint diagnostic locations 2026-08-19 15:47:43 +08:00
lsdsjy 9e97269bc5 fix(ci): reuse pinned bubblewrap setup in e2e 2026-08-19 15:42:12 +08:00
lsdsjy d66841ea3f feat(web,cli): open the ready Web UI by default 2026-08-19 15:42:12 +08:00
Yichen Jiang 3f5fc12b4c fix(web): restore settings focus after commit 2026-08-19 15:40:49 +08:00
_Kerman 7d3ba2a85b Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300 2026-08-19 15:39:30 +08:00
CreatixChu 24ef32c7b8 Merge pull request #2134 from deepseek-harness/worktree/abort-partial-finalize
feat(agent-loop): finalize a cancelled stream's delivered prefix
2026-08-19 15:39:14 +08:00
Chinesezjc a989d4e98b docs: separate portable vs complete-aggregate evidence in larger-hosted note
Per review: the self-hosted serial standby is not portable evidence — portable
means standard GitHub-hosted capacity without repository-external runner
configuration, which the self-hosted vm-backup/dsh-win-ci pools do not satisfy.
In 2026-07-22-evidence-based-larger-hosted-runners L73, distinguish the two:
standard-hosted compatibility jobs preserve portable evidence, while the
self-hosted serial standby preserves complete-aggregate evidence. Update the en
and zh pair and re-record the i18n hash.
2026-08-19 15:37:58 +08:00
CreatixChu e84b82d745 Merge pull request #733 from deepseek-harness/worktree/web-file-session-references
feat(web): add file and session references
2026-08-19 15:30:32 +08:00
Chinesezjc 72f0c9dc6d docs: sync serial-linux removal across remaining implemented notes
Keep the remaining current-state Agent Notes in line with removing the hosted
serial-linux job (PR #2744), per the implemented-note rule that mechanisms stay
current in the same change that alters them:

- 2026-07-30-web-browser-snapshot-ci-gate (L15/L21): the hosted default-branch
  Linux serial job no longer produces the browser cache; pull requests restore
  the archived cache without a master producer, and only the self-hosted standby
  runs the comparison on master.
- 2026-07-24-web-gui-browser-e2e-lane (L49): no hosted Linux serial producer of
  the browser cache remains; the self-hosted standby runs the same gate.
- 2026-07-23-portable-required-pull-request-ci (L19): the serial completeness
  check is now provided by the self-hosted vm-backup/dsh-win-ci standby lanes,
  with serial-macos as the only disabled hosted serial.
- 2026-07-22-evidence-based-larger-hosted-runners (L17/L53/L73): serial
  completeness evidence comes from the self-hosted standby pools; no hosted
  Linux serial reference remains.

All four en/zh pairs updated with consistent current-state wording (no deletion
narrative) and i18n hashes re-recorded; note-format still passes.
2026-08-19 15:22:57 +08:00
creatixchu 54cd736a4e Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-08-19 15:21:17 +08:00
_Kerman ea35359b86 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300 2026-08-19 15:12:21 +08:00
creatixchu 09b3dfa06d Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 15:09:59 +08:00
pku-xht f4caaf9697 Merge commit '698c1ce95b23d649a3fb21da13660ba23f063537' into codex/subprocess-win32-process-primitives 2026-08-19 15:06:36 +08:00
_Kerman e0984854a1 Merge remote-tracking branch 'github/master' into xtr/2701-stable-session-snapshots 2026-08-19 15:01:40 +08:00
Chinesezjc 2824ef7ab4 docs, ci: apply second serial-linux review pass
Address the review findings from the fresh pass on PR #2744:

- 2026-07-21 note L31: the enabled serial references run on the self-hosted
  vm-backup/dsh-win-ci pools and the only remaining disabled hosted serial is
  serial-macos (macos-latest); removed the stale hosted ubuntu-latest/windows-2025
  serial framing and the outdated 'when enabled, serial / windows' clause.
- Drop remaining change-narrative from both notes: L19 (serial / linux, macos)
  and the 2026-07-26 caching note L16/L34 now state only current facts without
  deletion dates/PR numbers; the no-producer fact has one home (L16). zh.ms'
  '直至其过期为逐出' corrected to '直至其被逐出'. Bilingual hashes re-recorded.
- ci.yml TODO notes that re-enabling serial-macos does not restore a Linux
  hosted-cache producer and records the seeder-vs-remove decision direction.
- The Playwright restore's failover-skip comment is now self-contained (the
  VM's persistent browser cache is warm) instead of pointing at the coveragelane
  rationale, which is pnpm-store-specific.

Verification: scripts/ci-workflow.spec.ts passes (12/12), YAML re-parses,
both translation pairs consistent, git diff --check clean.
2026-08-19 15:01:37 +08:00
ihsiang 0497a10f90 Merge pull request #2686 from deepseek-harness/ihsiangzhang/rail-search-outside-click-fix
fix(ui-workspace): keep rail-opened search expanded when the opening click reaches document
2026-08-19 14:58:18 +08:00
creatixchu ff88d3dd00 Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 14:55:32 +08:00
creatixchu 9620a752c8 refactor(agent-loop): 缩小取消前缀收尾范围 2026-08-19 14:55:26 +08:00
_Kerman cb0747091b Merge remote-tracking branch 'origin/master' into xtr/projection-state-schema 2026-08-19 14:52:29 +08:00
Yichen Jiang fe351b4d28 Merge pull request #2650 from deepseek-harness/worktree/llm-pi-ai-config-exposure-05f455
fix(llm-pi-ai): 补全 pi-ai 协议兼容开关,修复 OpenAI 兼容网关无法接入
2026-08-19 14:51:02 +08:00
_Kerman 571dba37cb Merge remote-tracking branch 'origin/master' into xtr/projection-state-schema 2026-08-19 14:50:24 +08:00
creatixchu e7a668906a Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	packages/client/connection/src/client/fixture.ts
#	packages/client/ui-conversation/src/client/input/facade.ts
#	packages/client/ui-conversation/src/client/input/hub.ts
#	packages/client/ui-conversation/tests/input-matrix.client.spec.tsx
#	packages/client/ui-conversation/tests/input-scenarios.client.spec.tsx
#	packages/client/ui-conversation/tests/skeleton.client.spec.tsx
2026-08-19 14:49:57 +08:00
pku-xht fa2ce12162 review fix: avoid bigint cache-hit formatting 2026-08-19 14:41:23 +08:00
pku-xht a4da0f40d5 feat(web): preserve near-full cache-hit precision 2026-08-19 14:41:23 +08:00
_Kerman ad94c35a77 docs: refresh config catalog source links 2026-08-19 14:40:23 +08:00
Yichen Jiang 07fbaa9b30 Merge remote-tracking branch 'origin/master' into HEAD 2026-08-19 14:39:44 +08:00
Chinesezjc 0593293b0a ci, docs: address serial-linux removal review
Apply review feedback on the serial-linux removal (PR #2744):

ci.yml:
- Rewrite the new comments as current-state statements, not change
  narrative (dsh-prose-standard): the TODO names serial-macos as the one
  remaining disabled hosted serial job; serial-macos's intro and the
  self-hosted standby's frozen-archive note no longer narrate the deletion.
- The self-hosted standby's frozen-archive comment states its own reason
  (full history to resolve DSH_ARCHIVE_BASE_REF against github.event.before)
  instead of referenceing a now-nonexistent hosted serial reference.
- Move the hosted-cache comment above the pnpm restore so it covers both
  restore-keys fallback steps, and describe the real consequence (matches the
  archived entry until evict, then cold) instead of the false
  'cold on a lockfile change'. Restore the per-step failover-skip note.

Agent Note 2026-07-26-pnpm-action-setup-for-symmetric-ci-caching:
- Update the restore-only bullet and the consequences closing line (it
  described serial-linux as the active master-push producer of the pnpm store
  cache) to state that no master job produces these hosted keys since the
  producer was removed; the Problem and Alternatives sections are historical
  context and are left unchanged. Re-record the bilingual pair hashes.

Verification: scripts/ci-workflow.spec.ts passes (12/12), YAML re-parses,
both translation pairs consistent, git diff --check clean.
2026-08-19 14:39:03 +08:00
Yichen Jiang c2a6f67e22 Merge remote-tracking branch 'origin/master' into worktree/fix-settings-focus 2026-08-19 14:38:07 +08:00
pku-xht 051851ac60 Merge commit '806f0f1ae7af106f12237bbd56cfe6f16b79cecb' into codex/subprocess-win32-process-primitives 2026-08-19 14:35:58 +08:00
_Kerman 4729554c5b Merge remote-tracking branch 'github/master' into xtr/2701-stable-session-snapshots
# Conflicts:
#	examples/acp-agent/tests/acp.snapshot.ts
#	examples/acp-agent/tests/snapshots/code-mode-read-image/session.jsonl
#	examples/acp-agent/tests/snapshots/inline-image-prompt/session.jsonl
#	examples/acp-agent/tests/snapshots/read-image-dimension/session.jsonl
#	examples/acp-agent/tests/snapshots/read-image/session.jsonl
2026-08-19 14:35:52 +08:00
yx.zhang f6a90db467 review: address ds-review-bot findings on rail-search fix
- Translate the zh Agent Note's title and section headings and align
  its rail terminology with the established zh READMEs (轨道).
- Disambiguate 'the browser's listener' to WorkspaceBrowser's in the
  English note.
- Record the in-flight outside-click exception in the ui-workspace
  README (both languages) and the owning workspace-sidebar feature
  note, cross-linked to the bug-fix note.
- Add an apps/web real-browser scenario pinning the document-level
  bubble the jsdom test cannot replay: one real rail click must leave
  the search expanded and focused, and a genuine outside click must
  dismiss it afterwards. Negative-controlled against the unguarded
  code (fails in 12s on the aria-expanded assertion).
- Register the new e2e file in the host tsconfig face and the client
  face's exclude list.
2026-08-19 14:34:17 +08:00
yx.zhang 106b117e18 fix(ui-workspace): keep rail-opened search expanded when the opening click reaches document
The rail search click flips the shell wide and mounts the outside-click
dismissal listener during its own dispatch; the click then bubbles to
document with the unmounted rail button as its target — outside
searchRoot — so the listener dismissed the search it just opened. The
listener now stays off while the rail gesture is in flight
(searchOnExpand), which already ends exactly when focus lands.

The regression test replays the document-level bubbling order that
fireEvent on the button alone does not exercise.
2026-08-19 14:34:16 +08:00
_Kerman da463ddebc refactor(subagent): normalize optional timing output 2026-08-19 14:34:00 +08:00
_Kerman e1a71c08bc fix(test): retain session fixture line diagnostics 2026-08-19 14:33:27 +08:00
_Kerman 9127d7e8b7 fix(session-projection): keep host state off wire 2026-08-19 14:32:48 +08:00
Yichen Jiang 4f1eb8f3ac Merge pull request #2724 from deepseek-harness/worktree/deepseek-native-multimodal
feat(llm-deepseek): support native multimodal requests
2026-08-19 14:32:32 +08:00
pku-xht 5f6936b4f6 Merge commit 'ccadc8a43aca7c11d7a42b75ae8115730ce57e68' into codex/subprocess-win32-process-primitives 2026-08-19 14:28:39 +08:00
_Kerman f281933dde fix doc-site fence cache safety 2026-08-19 14:27:56 +08:00
Yichen Jiang 7748a2f19c Merge remote-tracking branch 'origin/worktree/deepseek-native-multimodal' into worktree/deepseek-vision-model-catalog 2026-08-19 14:24:42 +08:00
Yichen Jiang 458a742cfe Merge remote-tracking branch 'origin/master' into worktree/deepseek-native-multimodal 2026-08-19 14:22:22 +08:00
07akioni 7d2982de68 Merge pull request #2695 from deepseek-harness/fix/open-file-fail
feat(web): Implement file-open failure handling in chat view
2026-08-19 14:16:37 +08:00
07akioni 2aaf760fa2 Merge pull request #2709 from deepseek-harness/feat/home-path-abbr
feat(ui-tool): integrate connection handling for POSIX home path abbreviation
2026-08-19 14:16:08 +08:00
pku-xht 163fef7d64 Merge commit '881f7fe696c64e7775572680a38af07be6e9d158' into codex/subprocess-win32-process-primitives 2026-08-19 14:12:26 +08:00
_Kerman e850c07691 perf(infra): parallelize hygiene checks 2026-08-19 14:12:16 +08:00
_Kerman 04a5e4b592 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2702
# Conflicts:
#	examples/acp-agent/tests/snapshots/product-subagent-result-diagnostic/session.jsonl
2026-08-19 14:06:11 +08:00
_Kerman 00257fa079 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300 2026-08-19 14:04:04 +08:00
_Kerman acbb2532ab Merge remote-tracking branch 'origin/xtr/projection-state-schema' into xtr/session-projection-migrations
# Conflicts:
#	packages/subagent/subagent-claude-code/tests/real-product.spec.ts
#	packages/subagent/subagent-codex/tests/real-product.spec.ts
2026-08-19 14:03:36 +08:00
Chinesezjc 89caa9dac2 docs: note hosted serial-linux removed as dead code
Keep the 2026-07-21 serial-reference note current with the ci.yml change: the
standard-hosted serial / linux definition no longer exists (removed as dead
code), and the current serial / windows definition is the in-house standby, not
a disabled standard-hosted job. Re-record the translation-pair hashes.
2026-08-19 14:02:35 +08:00
_Kerman 52a1f80327 Merge remote-tracking branch 'origin/master' into xtr/projection-state-schema 2026-08-19 14:01:31 +08:00
Chinesezjc e6b494ed17 ci: remove dead hosted serial-linux job
serial-linux (hosted ubuntu-latest) has been `if: false` since 2026-07-30 and
never runs. Remove the dead job block and retire the dangling references:

- TODO(hosted-serial-ci) narrowed to the single remaining disabled hosted
  serial job (serial-macos); the hosted linux definition is gone.
- The cache producer comment no longer claims serial-linux refreshes the
  hosted pnpm/Playwright caches; there is currently no active master producer
  for them, so restores are cold on a lockfile change.
- The self-hosted standby's frozen-archive comment no longer cross-references
  the deleted job.
- serial-macos gains its own intro comment since the shared 'hosted reference
  jobs below are disabled' lede was removed.

No runner allocation, required gate, or all-checks-passed.needs reference this
job; the aggregate is unchanged.
2026-08-19 14:00:33 +08:00
Chinesezjc 6079181d1a Merge pull request #2673 from deepseek-harness/fix/web-feedback-note-popover
fix(feedback): float the note editor in a popover
2026-08-19 13:59:30 +08:00
Yichen Jiang 9b5fad14e0 Merge remote-tracking branch 'origin/master' into HEAD 2026-08-19 13:59:24 +08:00
Yichen Jiang 3b74deec3e fix(llm-pi-ai): pin compat field types both ways and refuse empty values
The upstream-type proof only ran covariantly, so it caught a profile
field wider than pi-ai's but not one narrower — the direction its own
JSDoc claimed to guard. It now asserts both directions; the reverse holds
today because every field is either derived from upstream or a boolean.

`ModelCompat` gained `BedrockCompat`, which the gate had already started
serving, and the per-field protocol lists now match what the gates
resolve: `docs/config-catalog.md` pastes that JSDoc verbatim, so a stale
list there contradicted the README in the same change. The interface
header names the Responses grouping, since a catalog reader never sees
the README passage that explains it.

Valueless keys are judged after the name, so a withheld or misspelled key
written bare is refused for being that name rather than sent back for a
value it would be refused with anyway; the remedy no longer promises an
installed catalog value that a hand-declared route does not have. The
check covers `undefined` beside `null`: schemastery keeps the key either
way, and a cordis.yml entry reaches that state through `!!js undefined`,
so it is a config boundary rather than a typed one.

Coverage follows the composed path: the rejection is asserted through a
written settings section, and a switch is carried from that section onto
the wire a provider receives.

Refs #2646
2026-08-19 13:58:55 +08:00
_Kerman f8828ffe3e refactor(test): simplify session fixture decoding 2026-08-19 13:58:41 +08:00
_Kerman 1a72ae202a refactor(session): migrate host state reads to projections 2026-08-19 13:57:58 +08:00
pku-xht 943daa17dc Merge pull request #2640 from deepseek-harness/codex/product-subagent-failure-facts-codex
fix(subagent): preserve Codex failure facts
2026-08-19 13:50:47 +08:00
Chinesezjc e2ee5c0f5d feat(feedback): float the note editor in a popover, not inline in the actions row
The message-feedback note editor previously expanded inline inside the
assistant message's shared IconActions row, overflowing the row at every
viewport and pushing the branch action and the clock out of the column.
Rework it into a portable popover: the note editor is a fixed-position panel
portaled to document.body and anchored to the note trigger, so the row keeps
its single 28px line whether the editor is open or not and the panel escapes
the column's overflow clip.

The like/dislike buttons and the note trigger stay in the row unchanged; the
trigger toggles the popover (textarea + Save/Cancel + note-save failure) which
auto-focuses the input and closes on Escape or an outside click, returning
focus to the trigger. Rating/list-load failures surface in the row, note-save
failures inside the popover. Reuse the Menu portal surface tokens and add
@types/react-dom so the createPortal usage typechecks.

Layout e2e sweeps six viewports and pins that opening the editor leaves the
row's overflow, line count, and out-of-column items unchanged, and that the
panel is outside the column, within the viewport, and anchored to its trigger.
Unit tests cover the popover's portal-to-body, toggle, Escape/outside-click
dismissal, and unmount early-returns.
2026-08-19 13:49:30 +08:00
pku-xht bae043e432 Merge pull request #2636 from deepseek-harness/codex/product-subagent-failure-facts-claude
fix(subagent): preserve Claude Code failure facts
2026-08-19 13:48:10 +08:00
Yichen Jiang c4037732ae docs(user): point the provider guide at the adapter's catalog section
The full switch list already exists and is generated from source, so the
guide needs a way in rather than a copy: `config-catalog.md` carries 107
plugin sections, and linking the whole file leaves a reader to find the
one that configures the page they are on. Both mentions now deep-link the
`dsh-llm-pi-ai` anchor.

Refs #2646
2026-08-19 13:46:39 +08:00
_Kerman f4af19d724 perf(infra): shorten doc-sync critical path 2026-08-19 13:45:34 +08:00
_Kerman 9921de2d03 refactor(test): keep session fixture projection local 2026-08-19 13:41:42 +08:00
pku-xht 23b573b23f Merge remote-tracking branch 'origin/codex/product-subagent-failure-facts-claude' into codex/resolve-pr2640-20260819134000 2026-08-19 13:39:34 +08:00
pku-xht 7e764e168d Merge remote-tracking branch 'origin/master' into codex/resolve-pr2636-2640-20260819133346 2026-08-19 13:34:07 +08:00
Turtle 907c6334c1 Remove Knip from repository tooling 2026-08-19 13:33:24 +08:00
Yichen Jiang 30a838cda3 docs(user): guide gateway request-compatibility switches
The Models page has no field for `compat`, and the symptom it addresses —
a gateway holding a working key at a reachable address while refusing
every request — reads as a credential or connectivity problem. Give it
the same treatment `input` already has: name the symptom, show the two
switches that account for most of it, and state the resolution order.

Refs #2646
2026-08-19 13:33:08 +08:00
Magolor 53c4a4a174 docs(session): document persistence seed ownership 2026-08-19 13:31:07 +08:00
Magolor 1c77a78d6a perf(session): reuse immutable persistence seed 2026-08-19 13:31:07 +08:00
Yichen Jiang 03b5d3e2f6 Merge remote-tracking branch 'origin/master' into HEAD 2026-08-19 13:29:59 +08:00
_Kerman 18b0edb664 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300
# Conflicts:
#	python/sdk-runtime/package.json
2026-08-19 13:12:47 +08:00
_Kerman 4c421ec882 refactor(session-projection): separate state from client views 2026-08-19 13:11:05 +08:00
fz 5b3a881302 Merge pull request #2554 from deepseek-harness/feat/python-sdk-standard-agent-runtime
feat(python-sdk): support bundled preset runtime dependencies
2026-08-19 12:58:45 +08:00
Yichen Jiang c8815e50ad test(llm-deepseek): gate preview vision smoke 2026-08-19 12:57:49 +08:00
Yichen Jiang 910be91a9f Merge branch 'worktree/deepseek-native-multimodal' into worktree/deepseek-vision-model-catalog 2026-08-19 12:49:22 +08:00
Yichen Jiang 66056b6991 Merge remote-tracking branch 'origin/master' into HEAD 2026-08-19 12:47:37 +08:00
Yichen Jiang 4a02791c9a fix(llm): address multimodal review findings 2026-08-19 12:47:24 +08:00
Yichen Jiang cd7e45ced6 Merge remote-tracking branch 'origin/master' into worktree/deepseek-native-multimodal 2026-08-19 12:35:05 +08:00
07akioni 11ed98de55 Merge remote-tracking branch 'origin/master' into fix/open-file-fail 2026-08-19 12:27:34 +08:00
07akioni 149d4ba01c Merge remote-tracking branch 'origin/master' into feat/home-path-abbr 2026-08-19 12:24:40 +08:00
_Kerman 34a04ab077 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2698
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-08-19 11:59:15 +08:00
_Kerman 28d561f757 Merge remote-tracking branch 'origin/master' into xtr/2701-stable-session-snapshots 2026-08-19 11:58:50 +08:00
_Kerman 7a5bfe187a Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300 2026-08-19 11:56:27 +08:00
CreatixChu ba4aa807f6 Merge pull request #2623 from deepseek-harness/worktree/command-attachment-envelope
feat(commands): route composer image attachments through slash commands
2026-08-19 11:51:07 +08:00
Yichen Jiang 4fa38d6a23 feat(llm-deepseek): publish the vision model 2026-08-19 11:50:34 +08:00
_Kerman d1b16e57d2 fix(snapshot): align malformed-row labels and restore projection coverage 2026-08-19 11:49:46 +08:00
Yichen Jiang 1c64e72bcb Merge remote-tracking branch 'origin/master' into HEAD 2026-08-19 11:49:20 +08:00
Yichen Jiang cf4a27c471 fix(llm-pi-ai): refuse valueless compat and group gates by compat type
Review found two live defects in the compat surface.

A valueless key (`supportsDeveloperRole:`) survives schemastery as null,
and resolution carried it forward as a configured value. It landed on
`Model.compat` as null, which replaced the installed catalog entry's
value and left pi-ai's `??` reaching for its baseURL detection — the
catalog layer skipped entirely, and the switch written but not applied.
The vocabulary check now refuses it where it is written, matching the
`reasoningEfforts` precedent in the same file.

The gates were keyed by protocol name, but pi-ai keys compat by type:
`openai-responses`, `azure-openai-responses`, and `openai-codex-responses`
share one `OpenAIResponsesCompat`, so two shipped catalog routes were
refused the fields their own models declare. Gates now group by compat
type, `bedrock-converse-stream` gains its own, and the protocol set is
derived from `Model.compat`'s conditional so a release that gives a
further protocol a compat type fails the gate list by name.

Field types are derived from upstream rather than restated, with a proof
pinning the profile assignable to the upstream types, so a widened value
union cannot silently narrow what configuration accepts.

The `undefined` filter stays removed: `exactOptionalPropertyTypes` keeps
a typed caller from writing one, and schemastery never materializes one,
so it was validation for a value the static interface already excludes.

Refs #2646
2026-08-19 11:48:01 +08:00
_Kerman 036ba74c43 test(fs-local): attribute diff-basis cancellation to fsio allocations
The observes-cancellation-after-open/stat test asserted that the
process-wide Buffer.allocUnsafe call count stayed flat after abort, but
vitest's fork IPC (node:internal/child_process serialization) also calls
Buffer.allocUnsafe, so unrelated IPC traffic made the assertion
timing-racy under CI load. Attribute each allocation to the fsio read
path by stack and assert that the abort prevents the diff-basis buffer
allocation.
2026-08-19 11:41:49 +08:00
Yichen Jiang 7078918b30 feat(llm-deepseek): support multimodal requests 2026-08-19 11:39:52 +08:00
_Kerman 0f7cfd992a Merge remote-tracking branch 'github/master' into xtr/2701-stable-session-snapshots
# Conflicts:
#	apps/web/tests/snapshots/web-search-round/session.jsonl
#	examples/acp-agent/tests/snapshots/skill-load/session.jsonl
2026-08-19 11:20:03 +08:00
_Kerman 64c11fa055 Merge remote-tracking branch 'origin/master' into xtr/session-format-migration 2026-08-19 11:18:37 +08:00
_Kerman eb2c9780a5 test(snapshot): address envelope projection review 2026-08-19 11:17:54 +08:00
_Kerman 44feadea05 fix(session): load legacy compact events 2026-08-19 11:15:25 +08:00
creatixchu fcaa0efec5 Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-19 11:11:15 +08:00
_Kerman c4b3f48e64 fix(session): address format migration review 2026-08-19 11:07:23 +08:00
creatixchu c91672a44a Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 11:06:59 +08:00
_Kerman f97ea54ca9 fix(ci): install Wine offline from the restored apt archive
The windows wine-blocking job installs Wine with apt-get over the local
.deb archive, but apt re-downloads the full 100+ MB closure from the
Ubuntu mirror anyway. A degraded runner network stalled that transfer
past the job's 15-minute budget and cancelled the check. Install the
restored archive directly with dpkg (no repository access) and keep the
apt network install as the fallback when the archive cannot satisfy the
closure.
2026-08-19 11:06:57 +08:00
Yichen Jiang 67a7c79004 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/context/agent-instructions/tests/agent-instructions.spec.ts
2026-08-19 11:01:27 +08:00
creatixchu 5766480e5b Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 10:51:25 +08:00
Chinesezjc 657f52eb21 Merge pull request #1787 from deepseek-harness/feat/plan-narrow-viewport-regression
fix(web): wrap the composer control row so the plan chip never overlaps the model trigger
2026-08-19 10:50:54 +08:00
_Kerman 97a3bb746d Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300 2026-08-19 10:42:53 +08:00
Dudu-0223 36d8a2ae9a Merge pull request #2603 from deepseek-harness/codex/web-search-multiple-queries
Support bounded multi-query web search
2026-08-19 10:41:14 +08:00
Dudu-0223 d57c2d19db fix(web): require queries array for web search 2026-08-19 10:33:43 +08:00
Dudu-0223 6b4df99c44 fix multi-query web search review feedback 2026-08-19 10:33:43 +08:00
Dudu-0223 d792a89c8c test web search title fallback 2026-08-19 10:33:43 +08:00
Dudu-0223 b06722e2d4 support bounded multi-query web search 2026-08-19 10:33:43 +08:00
_Kerman 450a1f8811 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300 2026-08-19 10:33:31 +08:00
fz 2814a338be test(subprocess): restore host-exit readiness handshake 2026-08-19 10:01:11 +08:00
pku-xht a163f4019b fix(sandbox): preserve all drain failures 2026-08-19 08:58:12 +08:00
pku-xht 03186fe93f fix(sandbox): cancel sibling drain after child termination 2026-08-19 08:45:54 +08:00
pku-xht 60587b4901 fix(sandbox): cancel sibling drain on termination failure 2026-08-19 08:06:38 +08:00
pku-xht 8505d61f69 test(sandbox): remove duplicate failure assertion 2026-08-19 07:24:36 +08:00
pku-xht 9241ac22af test(sandbox): preserve rejection evidence 2026-08-19 07:21:00 +08:00
pku-xht f9a264c76e test(sandbox): keep aggregate failure assertion typed 2026-08-19 07:15:00 +08:00
pku-xht 33e90e9919 fix(sandbox): terminate on first drain failure 2026-08-19 06:58:54 +08:00
pku-xht 5375142827 fix(sandbox): contain drain failure settlement 2026-08-19 06:35:50 +08:00
pku-xht 4605124732 ci(windows): exercise ABI probes on failover standby 2026-08-19 05:49:56 +08:00
pku-xht 4f381b83c9 refactor(win32-process): remove redundant suspension 2026-08-19 05:23:43 +08:00
pku-xht 5490a5e070 ci(windows): run ABI probes with MSVC 2026-08-19 05:09:38 +08:00
pku-xht 4a722de4fa fix(win32-process): close PR1 review gaps 2026-08-19 05:03:59 +08:00
pku-xht ab494bfdca refactor(win32-process): narrow PR1 native surface 2026-08-19 04:39:31 +08:00
pku-xht f1fd304dff fix(sandbox): memoize inherited settlement promise 2026-08-19 04:14:07 +08:00
pku-xht e18564de03 chore(sandbox): align inherited wait lint 2026-08-19 04:11:59 +08:00
pku-xht 00af8d4f77 test(i18n): model reserved paths portably 2026-08-19 04:08:47 +08:00
pku-xht 668da7f507 refactor(win32-process): share native process primitives 2026-08-19 04:08:46 +08:00
pku-xht ae9b69287f fix(i18n): encode exact link paths safely 2026-08-19 03:56:17 +08:00
pku-xht 0a1a1b9379 test(i18n): share structure signature fixture 2026-08-19 03:53:05 +08:00
pku-xht dd13c05192 fix(i18n): resolve merge and Markdown edge cases 2026-08-19 03:47:00 +08:00
pku-xht 2c94ec6cd3 fix(i18n): localize encoded exact links 2026-08-19 03:09:49 +08:00
pku-xht b7e195a7e6 fix(i18n): align translation briefing link rules 2026-08-19 03:01:11 +08:00
pku-xht f5eb06915a refactor(i18n): remove directory index inference 2026-08-19 02:52:15 +08:00
pku-xht 8a334c4d49 fix(i18n): bind localized links to active pairs 2026-08-19 02:26:57 +08:00
pku-xht 4f8ff004e6 docs(i18n): point tutorial entries at index pages 2026-08-19 02:01:56 +08:00
pku-xht d745107674 Merge master at 782f67a into localized Chinese links
# Conflicts:
#	.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml
#	.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md
2026-08-19 01:55:07 +08:00
pku-xht 72884ec430 fix(subagent): merge terminal and process facts 2026-08-19 01:10:29 +08:00
pku-xht 34d313693d test(subagent): pin terminal exit ordering 2026-08-19 00:29:40 +08:00
pku-xht 8debb798d8 fix(subagent): bound Codex process settlement 2026-08-18 23:59:43 +08:00
pku-xht 7fb9de99b5 fix(subagent): close Codex failure result gaps 2026-08-18 23:06:14 +08:00
fz e9cf468e06 Merge remote-tracking branch 'origin/master' into feat/python-sdk-standard-agent-runtime 2026-08-18 22:50:44 +08:00
pku-xht cede4fdb76 test(subagent): use valid process outcomes 2026-08-18 22:48:24 +08:00
pku-xht 1b9fd9eaa7 test(subagent): trim redundant product evidence 2026-08-18 22:41:32 +08:00
imccyu c1eac0ba54 Merge pull request #2635 from deepseek-harness/perf/partitioned-coverage
perf(ci): parallelize coverage and web snapshots in-job
2026-08-18 22:13:16 +08:00
pku-xht 032bc08f81 Merge commit '21a9ccf299a720c36f58f7389340690d33b525ce' into codex/product-subagent-failure-facts-codex
# Conflicts:
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md
#	packages/subagent/subagent-codex/README.i18n.yaml
#	packages/subagent/subagent-codex/README.md
#	packages/subagent/subagent-codex/README.zh.md
#	packages/subagent/subagent-codex/src/run.ts
#	packages/subagent/subagent-codex/tests/real-product.spec.ts
#	packages/subagent/subagent-codex/tests/subagent-codex.spec.ts
2026-08-18 22:13:00 +08:00
imccyu 45a73e3ed5 fix(ci): preserve Windows gate ordering 2026-08-18 22:03:20 +08:00
imccyu d54f6382c8 fix(ci): preserve Windows coverage failures 2026-08-18 21:45:25 +08:00
pku-xht c3a04de1cf test(subagent): model Claude spawn errors with failed handles 2026-08-18 21:41:06 +08:00
imccyu ce128804e3 fix(test): restore Codex fixture command path 2026-08-18 21:34:55 +08:00
Kaige-Gao b03b1f2e7b fix(web): improve permission labels and blank defaults 2026-08-18 21:30:28 +08:00
pku-xht ec3da3809a refactor(subagent): align Claude teardown with live handles 2026-08-18 21:29:32 +08:00
imccyu 975bf864ef fix(ci): make Windows fixtures portable 2026-08-18 21:19:06 +08:00
pku-xht bf2e9e474c refactor(subagent): simplify Claude cleanup ownership 2026-08-18 21:17:41 +08:00
imccyu 5ba9e50bb0 fix(ci): stabilize native Windows coverage 2026-08-18 21:15:21 +08:00
imccyu ef75b6ff2f perf(ci): parallelize coverage and web snapshots in-job 2026-08-18 21:15:20 +08:00
pku-xht 27b5c12da9 fix(i18n): preserve authored external URLs 2026-08-18 21:14:43 +08:00
pku-xht ad6516933b fix(i18n): close automated review findings 2026-08-18 21:02:50 +08:00
pku-xht 733966dac5 Merge commit '44f371ceb659af3795bc04efb512ae6454dc8593' into codex/product-subagent-failure-facts-claude
# Conflicts:
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md
#	packages/subagent/subagent-claude-code/README.i18n.yaml
#	packages/subagent/subagent-claude-code/README.md
#	packages/subagent/subagent-claude-code/README.zh.md
#	packages/subagent/subagent-claude-code/src/index.ts
#	packages/subagent/subagent-claude-code/src/run.ts
#	packages/subagent/subagent-claude-code/tests/subagent-claude-code.spec.ts
2026-08-18 20:43:04 +08:00
pku-xht f6fb074036 refactor(i18n): remove obsolete link lookup 2026-08-18 20:19:38 +08:00
07akioni 92a60f87b0 Merge remote-tracking branch 'origin/master' into fix/open-file-fail 2026-08-18 20:14:56 +08:00
07akioni f15ca23386 fix: ci 2026-08-18 20:14:40 +08:00
07akioni 51c86af1e9 chore: refresh client catalog and module graph for connection inject 2026-08-18 20:09:55 +08:00
pku-xht df11a8af92 fix(i18n): scope switcher and merge validation 2026-08-18 20:05:01 +08:00
07akioni 996f6e49a5 fix: ci 2026-08-18 20:04:18 +08:00
pku-xht b032097c2a fix(subagent): preserve terminal turn precedence 2026-08-18 20:02:37 +08:00
07akioni b8670e3fbe fix: ci 2026-08-18 19:58:55 +08:00
pku-xht d5397cbc29 Merge commit '8b4b0bb75463e0150cfe5d042d9833e56c4d221c' into codex/product-subagent-failure-facts-codex
# Conflicts:
#	packages/subagent/subagent-codex/README.i18n.yaml
#	packages/subagent/subagent-codex/README.md
#	packages/subagent/subagent-codex/README.zh.md
#	packages/subagent/subagent-codex/tests/real-product.spec.ts
#	packages/subagent/subagent-codex/tests/subagent-codex.spec.ts
2026-08-18 19:51:06 +08:00
pku-xht 205159049f Merge master at 44f371c into localized Chinese links 2026-08-18 19:50:29 +08:00
07akioni 6a5118eb5c fix: ci 2026-08-18 19:44:03 +08:00
07akioni bd41b3cbc7 Merge remote-tracking branch 'origin/master' into feat/home-path-abbr 2026-08-18 19:42:01 +08:00
pku-xht 1c253f7c5a refactor(i18n): narrow link normalization 2026-08-18 19:41:52 +08:00
pku-xht 08ec2622b0 fix(i18n): share Markdown link parsing 2026-08-18 19:37:53 +08:00
pku-xht c119710560 Merge pull request #2579 from deepseek-harness/codex/installable-codex-provider
feat(subagent): make Codex provider directly installable
2026-08-18 19:37:21 +08:00
pku-xht 46fd537b20 Merge commit '43f08ef2867b288331271df679b2a731b76c8919' into codex/product-subagent-failure-facts-claude
# Conflicts:
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/subagent/subagent-claude-code/src/index.ts
#	packages/subagent/subagent-claude-code/tests/real-product.spec.ts
#	packages/subagent/subagent-claude-code/tests/subagent-claude-code.spec.ts
2026-08-18 19:36:16 +08:00
pku-xht 1df24165d0 Merge pull request #2392 from deepseek-harness/codex/installable-product-subagents
feat(subagent): make Claude Code provider directly installable
2026-08-18 19:33:03 +08:00
07akioni dd3ea3db2e fix: ci 2026-08-18 19:31:12 +08:00
pku-xht a54e58d504 Merge codex/installable-product-subagents into codex/installable-codex-provider 2026-08-18 19:26:11 +08:00
07akioni 20a5f5a3ee feat(ui-tool): integrate connection handling for POSIX home path abbreviation 2026-08-18 19:25:13 +08:00
pku-xht 0f734991e1 test(web): refresh product subagent skill rendering 2026-08-18 19:19:58 +08:00
pku-xht 72ae04abde test(subagent): cover bounded Codex stderr tail 2026-08-18 19:16:22 +08:00
07akioni 2442e63360 fix: cr 2026-08-18 19:14:20 +08:00
pku-xht 6ebf8d199d fix(subagent): preserve Codex process exit facts 2026-08-18 19:14:02 +08:00
pku-xht 8729f38015 Merge master at 43f08ef into localized Chinese links 2026-08-18 19:13:47 +08:00
pku-xht 2070f127ee Merge codex/installable-product-subagents into codex/installable-codex-provider 2026-08-18 19:09:35 +08:00
07akioni 0148c9bef6 Merge remote-tracking branch 'origin/master' into fix/open-file-fail 2026-08-18 19:06:27 +08:00
pku-xht 4be7e7680e test(acp): refresh product subagent skill snapshot 2026-08-18 19:04:18 +08:00
07akioni e3752e207e fix: remove debug code 2026-08-18 19:02:38 +08:00
pku-xht 8d3674695b docs(i18n): localize Chinese internal links 2026-08-18 19:00:37 +08:00
pku-xht 89e09b0023 Merge codex/installable-product-subagents into codex/installable-codex-provider 2026-08-18 18:59:40 +08:00
07akioni 4037762dc0 fix: build 2026-08-18 18:57:37 +08:00
07akioni b1be9e93cd fix: optimize ui 2026-08-18 18:54:18 +08:00
pku-xht 02a32d93f2 Merge master into codex/installable-product-subagents 2026-08-18 18:47:34 +08:00
Chinesezjc 0b42971d0c Merge pull request #2628 from deepseek-harness/fix/locale-default-english
fix(locale): open in English when the browser names no shipped language
2026-08-18 18:37:11 +08:00
pku-xht 836c322758 Merge pull request #2638 from deepseek-harness/codex/product-subagent-named-instances-codex
feat(subagent): support named Codex provider instances
2026-08-18 18:31:04 +08:00
pku-xht 1ec9c0c4a6 Merge codex/installable-product-subagents into codex/installable-codex-provider 2026-08-18 18:29:37 +08:00
_Kerman b6e61f61ac test: omit persistence envelopes from session snapshots 2026-08-18 18:27:01 +08:00
Chinesezjc 3967df95f7 docs(locale): clarify full-rollout note on the en fallback default
The Consequences bullet named the zh copy surface the 'zh default', which
could be read as the product's opening locale. It covers component-copy
coverage only; the opening/fallback locale (browser naming no shipped
language, or a non-browser run) is en since FALLBACK_LOCALE moved. State that
explicitly and cross-link the browser-derived-initial-locale note, in both
languages, and re-record the .i18n.yaml pairing.
2026-08-18 18:19:30 +08:00
pku-xht 67266b07cf Merge master into named Codex instances 2026-08-18 18:17:16 +08:00
Chinesezjc 6f0681f1ab Merge branch 'master' of github.com:deepseek-harness/deepseek-harness into fix/locale-default-english
# Conflicts:
#	packages/client/locale/tests/apply.client.spec.ts
#	packages/client/ui-agent-preset/tests/apply.client.spec.ts
#	packages/client/ui-settings-general/tests/apply.client.spec.ts
#	packages/client/ui-settings-models/tests/apply.client.spec.ts
#	packages/client/ui-settings-plugins/tests/apply.client.spec.ts
#	packages/client/ui-theme/tests/apply.client.spec.ts
2026-08-18 18:16:33 +08:00
Chinesezjc 8c7d8ad33f Merge remote-tracking branch 'origin/master' into feat/plan-narrow-viewport-regression
# Conflicts:
#	apps/web/tests/scaffold.ts
2026-08-18 18:15:38 +08:00
_Kerman f73f2d9b65 docs(config): refresh persistence source link 2026-08-18 18:15:17 +08:00
pku-xht b1a895640e Merge master into codex/installable-product-subagents 2026-08-18 18:11:42 +08:00
_Kerman 44b676af68 Merge remote-tracking branch 'origin/master' into xtr/session-format-migration 2026-08-18 18:09:23 +08:00
_Kerman d4ff836dc2 refactor(session-persistence): share stored read machinery 2026-08-18 18:06:48 +08:00
pku-xht a3fc0b5ecd test(subagent): use platform Codex argv 2026-08-18 18:06:06 +08:00
pku-xht a881208f4a Merge commit 'bda9231260082ff5f06eba352bcfc49865895e04' into codex/product-subagent-failure-facts-codex 2026-08-18 18:04:33 +08:00
fz 1b9f9ae256 fix(ci): install local Python release wheels 2026-08-18 18:02:02 +08:00
Yichen Jiang 6c16d29b24 Merge pull request #2613 from deepseek-harness/feat/web-settings-describe-mirror
refactor(client): serve every settings consumer from one describe mirror
2026-08-18 17:58:26 +08:00
pku-xht aee72bce93 Merge commit '70707a46f6868858a0e80ad8bf48ba160403e1eb' into codex/product-subagent-failure-facts-claude 2026-08-18 17:57:06 +08:00
Chinesezjc 9301def7eb fix(locale): tighten parity gate and correct copy-source wording
Address the three open review threads on the dictionary parity gate.

Regex/TEXT: localeOf now requires an uppercase ASCII [A-Z] flat-letter at
the third position of a name-prefix shape, so zh2Foo/zh_probe are no longer
treated as dictionaries in localeOf while the admission pre-filter skips
them. The two now agree exactly.

register detection now also admits a bare register identifier callee in
addition to a property access, covering a future destructured
register(NS, 'zh'|'en', dict) call instead of silently dropping it.

A 3-arg register whose dictionary argument is a local variable is resolved
through module-scope const initializers; one that cannot be resolved to an
object literal makes the gate refuse with a named error rather than skipping
the registration and narrowing the sweep.

Also restate the FALLBACK_LOCALE rationale: the residual case points at
English because a browser naming neither shipped language is the reader
least likely to read Chinese, not because English is the copy's source
language (Chinese is; packages/client/AGENTS.md). Sync the identical claim
in the bilingual Agent Note and re-record its .i18n.yaml pairing.
2026-08-18 17:56:49 +08:00
pku-xht 9e8a620f61 Merge named Claude instances into named Codex instances 2026-08-18 17:52:10 +08:00
Yichen Jiang f4caa4dbdf Merge pull request #2619 from deepseek-harness/worktree/web-pi-ai-retry-default
feat(llm): default model retries to five
2026-08-18 17:50:39 +08:00
pku-xht 5ce9a7eb97 Merge merged permissions stack into Claude failure facts 2026-08-18 17:49:32 +08:00
pku-xht fd4b1c428a Merge Codex permission modes into named Claude instances 2026-08-18 17:44:39 +08:00
_Kerman cc9ab200c7 feat(session): add format migration decoder pipeline 2026-08-18 17:42:40 +08:00
07akioni aab839a971 feat(web): Implement file-open failure handling in chat view 2026-08-18 17:39:38 +08:00
Chinesezjc 0fe31f11a3 fix(locale): correct two stale product-default-Chinese comments
Chinese is no longer the product default since FALLBACK_LOCALE moved to en
in this branch. connectFreshWorkspaceZh and the access-confirmation scenario
both reach the Chinese surface by advertising ZH_BROWSER_LOCALE, not by
inheriting a default, so their comments must say so.
2026-08-18 17:39:06 +08:00
Chinesezjc e78fdf05fe Merge branch 'master' of github.com:deepseek-harness/deepseek-harness into fix/locale-default-english 2026-08-18 17:38:33 +08:00
Yichen Jiang 455cd2630a Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default 2026-08-18 17:38:19 +08:00
pku-xht f8912628f5 Merge pull request #2589 from deepseek-harness/codex/product-subagent-noninteractive-permissions-codex
feat(subagent): add Codex non-interactive permission modes
2026-08-18 17:37:06 +08:00
fz 7bb766fc82 fix(python-sdk): make runtime readiness explicit 2026-08-18 17:36:59 +08:00
pku-xht 50ba75762b Merge pull request #2607 from deepseek-harness/codex/workflow-manual-disclosure
feat(workflow): let users control run and phase disclosures
2026-08-18 17:30:06 +08:00
pku-xht 31ce2a400b Merge Claude permission modes into Codex permission modes 2026-08-18 17:19:21 +08:00
Yichen Jiang 2b3a8d1845 ci: refresh pull request checks 2026-08-18 17:18:39 +08:00
pku-xht 859525a64e Merge origin/master into Claude permission modes 2026-08-18 17:16:45 +08:00
Yichen Jiang 78fc31d06b test(llm-pi-ai): remove unreachable compat fallback 2026-08-18 17:13:47 +08:00
creatixchu bb3e1d46cb Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-18 17:11:42 +08:00
pku-xht ec9d4a6803 Merge Claude permission modes into Codex permission modes
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-08-18 17:11:10 +08:00
Yichen Jiang 3ec495f8fa Merge remote-tracking branch 'origin/master' into worktree/llm-pi-ai-config-exposure-05f455
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
2026-08-18 17:10:13 +08:00
Yichen Jiang aef4b1323b Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default 2026-08-18 17:07:16 +08:00
Yichen Jiang 2ae1a4ebc7 Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	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/src/config.ts
2026-08-18 17:07:05 +08:00
creatixchu 96442bd4e5 test(subprocess): publish exit fixture state atomically 2026-08-18 17:06:46 +08:00
creatixchu bd1083d78a test(commands): align image dimension limits 2026-08-18 17:06:42 +08:00
pku-xht 7f6b517018 Merge origin/master into Claude permission modes
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/subsystems/subagent.i18n.yaml
#	packages/subagent/subagent/README.i18n.yaml
2026-08-18 17:04:42 +08:00
lsdsjy 71ef418566 Merge pull request #2664 from deepseek-harness/docs/readme-cdn-links
feat(community,infra): publish README assets through CDN
2026-08-18 17:04:11 +08:00
creatixchu d71f744c16 Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-18 16:58:46 +08:00
Yichen Jiang 03fd7c003b test(web): update retry status golden 2026-08-18 16:57:31 +08:00
CreatixChu e399dff459 Merge pull request #2647 from deepseek-harness/worktree/image-request-budget
fix(llm-pi-ai): bound request image payload by offloading oldest images
2026-08-18 16:57:02 +08:00
Yichen Jiang d415b63c19 test(client): cover settings lifecycle guards 2026-08-18 16:55:39 +08:00
_Kerman 815b6ce5ad Merge remote-tracking branch 'origin/master' into feat/pwsh-persistent-pty 2026-08-18 16:47:45 +08:00
Yichen Jiang 4f64e20b41 test(llm-pi-ai): cover compat validation branches 2026-08-18 16:43:59 +08:00
creatixchu 1022467d93 Merge remote-tracking branch 'origin/master' into worktree/image-request-budget 2026-08-18 16:43:58 +08:00
Yichen Jiang 3daad96733 Merge pull request #2668 from deepseek-harness/worktree/model-picker-bulk-select
feat(web): add bulk selection to model picker
2026-08-18 16:43:16 +08:00
Yichen Jiang 75c9f05c6b test(llm): expect five replay retries 2026-08-18 16:40:54 +08:00
_Kerman dc8991879a test(agent-instructions): extend the workspace-context wait budget 2026-08-18 16:38:52 +08:00
_Kerman 5648d4ad1c test(typert): poll for the steady-state registration failure log 2026-08-18 16:38:44 +08:00
Yichen Jiang 5372fc384e chore(llm): trim retry default refactor 2026-08-18 16:36:41 +08:00
Yichen Jiang dc4ffabb53 Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default 2026-08-18 16:33:33 +08:00
Yichen Jiang 0ca0f3d0b8 refactor(llm): use one five-retry default 2026-08-18 16:33:22 +08:00
Yichen Jiang 381a1aef28 Merge branch 'master' into worktree/model-picker-bulk-select 2026-08-18 16:32:22 +08:00
creatixchu 831670533b Merge remote-tracking branch 'origin/master' into worktree/image-request-budget 2026-08-18 16:31:40 +08:00
creatixchu d007f437cc Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-18 16:25:11 +08:00
lsdsjy 49b48369db fix(community,llm): remove duplicate README assets 2026-08-18 16:21:54 +08:00
lsdsjy c1c955bb09 feat(community,infra): publish README assets through CDN 2026-08-18 16:21:54 +08:00
Anshuo 721ff76d24 Merge pull request #2156 from deepseek-harness/agentteams-runtime-cli-v2
feat(team): add experimental durable Agent Teams runtime
2026-08-18 16:14:53 +08:00
creatixchu 51fa8da8a3 fix(plan): accept image-only plan requests 2026-08-18 15:43:59 +08:00
Yichen Jiang cf7d485b5e fix(client): harden settings describe mirror 2026-08-18 15:26:16 +08:00
creatixchu 35a10ec41a Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/client/ui-conversation/src/client/chat/MessageItem.tsx
#	packages/client/ui-conversation/tests/input-bar.client.spec.tsx
#	packages/client/ui-subagent/package.json
#	pnpm-lock.yaml
2026-08-18 15:22:32 +08:00
Yichen Jiang f4551895bc Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default 2026-08-18 15:14:15 +08:00
Yichen Jiang 1dbafe2973 refactor(llm): centralize deployment retry defaults 2026-08-18 15:14:09 +08:00
fz ee5280bd6e fix(python-sdk): harden packaged runtime behavior 2026-08-18 14:38:42 +08:00
Yichen Jiang 02008db244 Merge remote-tracking branch 'origin/master' into feat/web-settings-describe-mirror 2026-08-18 14:37:07 +08:00
_Kerman d0cdf52030 docs(pwsh): align persistent PTY contracts 2026-08-18 14:31:28 +08:00
_Kerman cef99b17d4 test(acp): snapshot persistent PowerShell tool 2026-08-18 14:31:22 +08:00
_Kerman 2f759a6b65 fix(shell): preserve prompt-like PowerShell output 2026-08-18 14:30:59 +08:00
_Kerman 91e8d62b2a fix(subprocess): detect exited Windows terminals 2026-08-18 14:30:47 +08:00
creatixchu 5849c57c0c fix(images): align provider-safe payload defaults 2026-08-18 14:00:00 +08:00
fz 94f6fd1306 Support MCP in packaged Python runtime 2026-08-18 13:50:53 +08:00
_Kerman b72bd6f5be merge: bring master into feat/pwsh-persistent-pty 2026-08-18 13:36:46 +08:00
Chinesezjc 8e2785d9eb fix(locale): cover direct register() dictionaries and assert <html lang> assembled
The parity gate recognized only a `[['zh',{...}],['en',{...}]]` array, so the
two separate ctx.locale.register(NS, 'zh'|'en', {...}) calls in
ui-permission-presets were unchecked: deleting a key from one side left the
gate green. Pair those calls by their namespace argument. Widen the pre-filter
to admit zhSettings/accessZh spellings, which a bare \b(zh|en)\b misses and
would have skipped before parsing.

Assert document.documentElement.lang in the assembled app. The served markup
already ships lang="en", so the fr-FR scenario passes whether or not the sync
runs; the zh scenario is the discriminating half and now asserts zh-CN before
the switch and en after it.

Drop the dead vi.unstubAllGlobals() from the document-language spec, which
manages navigator with defineProperty and never calls vi.stubGlobal.
2026-08-18 13:28:18 +08:00
Yichen Jiang 3e1915a3b2 feat(web): add model picker bulk selection 2026-08-18 13:07:11 +08:00
Chinesezjc cb0d835582 Merge remote-tracking branch 'origin/master' into fix/locale-default-english 2026-08-18 12:48:52 +08:00
Chinesezjc 6e9b2560a3 fix(locale): keep the test-runtime devDependency and narrow the parity gate catch
Restore @deepseek-ai/dsh-client-test-runtime in ui-settings-general: the
package still imports bindSnapshotSelector from it in
tests/components.client.spec.tsx, so removing it was manifest drift. The
earlier knip report predated that file arriving on this branch.

Swallow only ENOENT when reading a directory in the parity gate. A broad catch
treated EACCES or an I/O failure as "absent", which would narrow the sweep and
let the gate pass while checking less.
2026-08-18 12:25:09 +08:00
Chinesezjc 9de06952ab fix(locale): persist an explicit pick of the provisional locale
setLocale returned early when the id already matched the active locale, so
choosing the language already on screen wrote nothing. That value may be a
provisional browser-derived or fallback resolution nothing has stored, so a
different browser sharing the DSH home still resolved on its own. Write
unconditionally; keep the render publish conditional.

Broaden the dictionary parity gate to every workspace package, pair zh/en
across sibling files and inline registrations, and fail when a dictionary has
no counterpart. It previously scanned only packages/client and packages/
extensions, compared within a single module, and silently skipped unpaired
dictionaries -- so the split locales/zh.ts + en.ts common pair, the inline
directory-picker-browse dictionary, and session-log-export were unchecked.
Normalize paths at ingestion so the sweep does not narrow on Windows.

Regenerate the client API catalog and update the locale README pair: both
described the old zh fallback direction.

Add the English fallback dialog golden, and drop a dead afterEach plus the
blank lines left where the dead browser-language pins were removed.
2026-08-18 12:18:03 +08:00
creatixchu 761d9d1978 fix(web): render command errors as banners 2026-08-18 12:06:40 +08:00
creatixchu 1492b0cfee Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope
# Conflicts:
#	apps/web/tests/assembled-boot.ts
2026-08-18 12:00:46 +08:00
creatixchu a26332d38a Merge remote-tracking branch 'origin/master' into worktree/image-request-budget 2026-08-18 11:58:47 +08:00
imccyu 68f519a74c test(web): make Cordis continuation turn deterministic 2026-08-18 11:58:11 +08:00
Dudu-0223 570aff0e27 refactor(team): incubate Agent Teams packages 2026-08-18 11:58:11 +08:00
Dudu-0223 0283d62c76 fix(team): address runtime review feedback 2026-08-18 11:58:11 +08:00
Dudu-0223 3546f595b9 feat(team): add durable Agent Teams runtime 2026-08-18 11:58:11 +08:00
CreatixChu 2edf88a6a7 Merge pull request #2629 from deepseek-harness/worktree/image-dimension-limit
fix(attachment): refuse oversized image sides at admission
2026-08-18 11:57:41 +08:00
creatixchu 28c2647293 fix(llm-pi-ai): address image offload review 2026-08-18 11:56:18 +08:00
creatixchu 2d895bfbb7 Merge remote-tracking branch 'origin/worktree/image-dimension-limit' into worktree/image-request-budget 2026-08-18 11:47:42 +08:00
creatixchu abfd537588 Merge remote-tracking branch 'origin/master' into worktree/image-dimension-limit 2026-08-18 11:45:08 +08:00
creatixchu bbb7651af3 Merge remote-tracking branch 'origin/worktree/image-dimension-limit' into worktree/image-request-budget 2026-08-18 11:42:12 +08:00
Dudu-0223 f2653b81d7 Merge pull request #2601 from deepseek-harness/codex/subagent-report-next-step
Deliver subagent reports at the next step
2026-08-18 11:39:49 +08:00
creatixchu d559ba9b2b fix(attachment): address dimension-limit review 2026-08-18 11:30:07 +08:00
fz 85e821b926 fix(ci): remove flaky subprocess readiness handshake 2026-08-18 11:28:58 +08:00
Chinesezjc bf4cb507f1 fix(locale): track the active locale in <html lang>
The document language attribute was a static value in the served markup, so
it reported zh-CN for an English UI and would have reported en for a Chinese
one once the resolved default changed. Set it from the active locale at
plugin activation and on every switch, carrying a BCP 47 tag (zh-CN / en).

Drop the now-unused dsh-client-test-runtime devDependency from
ui-settings-general: removing its dead browser-language pin left the package
with no remaining use of it, which knip reports as an error.
2026-08-18 11:25:39 +08:00
Yichen Jiang 884f7b9c41 fix(llm-pi-ai): expose the pi-ai wire-compat surface
pi-ai infers a request's shape from the provider id and baseURL, and for
an endpoint it does not recognize it answers as though it were OpenAI
itself. A hand-declared route is by construction such an endpoint, so a
model declaring reasoningEfforts sent its system prompt as the developer
role with no configuration able to say otherwise — a gateway rejecting
that role could not be connected at all. Writing the switch anyway
validated, persisted, and was then dropped, so the misconfiguration
looked applied.

Three drift gates classify all thirty upstream compat fields as offered
or withheld, keyed by `keyof` so a pi-ai upgrade fails the build until
the new field is classified. Twenty are offered: what a private URL
cannot imply. The rest stay withheld because pi-ai's installed catalog
sets them for a named vendor.

Protocol applicability is now per field rather than per block, so
supportsDeveloperRole reaches an openai-responses route and the
anthropic-messages switches reach theirs. A compat key no protocol
declares, or one a gate withholds, is refused where it is written.

Fixes #2646
Refs #1976
2026-08-18 11:24:33 +08:00
Yichen Jiang 950fcf9df6 Merge remote-tracking branch 'origin/master' into feat/web-settings-describe-mirror
# Conflicts:
#	packages/client/locale/tests/apply.client.spec.ts
#	packages/client/ui-permission-presets/src/client/index.ts
#	packages/client/ui-permission-presets/src/client/settings-store.ts
#	packages/client/ui-permission-presets/tests/permission-presets-row.client.spec.tsx
#	packages/client/ui-permission-presets/tests/settings-store.client.spec.ts
#	packages/client/ui-settings-general/src/client/index.ts
#	packages/client/ui-settings-models/src/client/index.ts
#	packages/client/ui-settings-models/src/client/store.ts
#	packages/client/ui-settings-models/tests/apply.client.spec.ts
#	packages/client/ui-settings-models/tests/components.client.spec.tsx
#	packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx
#	packages/client/ui-settings-models/tests/provider-form.client.spec.tsx
#	packages/client/ui-settings-models/tests/store.client.spec.ts
#	packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx
#	packages/client/ui-settings-plugins/tests/apply.client.spec.ts
#	packages/client/ui-settings/README.i18n.yaml
#	packages/client/ui-settings/README.md
#	packages/client/ui-settings/README.zh.md
#	packages/client/ui-settings/src/client/index.ts
#	packages/client/ui-settings/src/client/settings-scope.ts
#	packages/client/ui-settings/tests/plugin.client.spec.ts
#	packages/client/ui-settings/tests/settings-scope.client.spec.ts
#	packages/client/ui-theme/tests/apply.client.spec.ts
2026-08-18 11:23:25 +08:00
creatixchu 0b4a322003 fix(llm-pi-ai): bound request image payload by offloading oldest images
Every image in history is base64-inlined into every request, so a long
session's request body grows until a gateway request-size cap rejects it
with 413 and every retry resends the same oversized body, permanently
wedging the session. Each provider route now carries maxRequestImageBytes
(default 24MiB): when the accumulated base64 image payload exceeds it,
the oldest images are replaced by a fixed model-facing placeholder until
the request fits, so the newest images survive and the session keeps
completing requests. 413 and request-body-cap wording now classify as
INVALID_REQUEST instead of the generic PI_AI_ERROR.

Fixes #2644
2026-08-18 11:18:51 +08:00
Dudu-0223 20cd777753 Cover next-step report delivery in subagent runtime 2026-08-18 11:14:10 +08:00
Dudu-0223 d91df8cbd5 Deliver subagent reports at next step 2026-08-18 11:14:10 +08:00
creatixchu 609ee2facf Merge remote-tracking branch 'origin/master' into worktree/image-dimension-limit 2026-08-18 11:12:56 +08:00
Tianyi Cui 58e1aa8183 Merge pull request #2642 from deepseek-harness/fix/code-runtime-python-release-version
fix(code-runtime-python): match the rc.7 root version
2026-08-18 11:05:44 +08:00
Chinesezjc acc9359a53 Merge remote-tracking branch 'origin/master' into fix/locale-default-english
# Conflicts:
#	packages/client/ui-settings-models/tests/apply.client.spec.ts
#	packages/client/ui-settings-plugins/tests/apply.client.spec.ts
#	packages/client/ui-theme/tests/apply.client.spec.ts
2026-08-18 10:53:18 +08:00
Chinesezjc b940dca18d fix(code-runtime-python): match the rc.7 root version
The 0.1.0-rc.7 release commit bumped every release member except
code-runtime-python, which had landed on master between rc.6 and that
release. check-workspace-constraints requires each non-private workspace
package to carry the root version, so the constraints gate inside
`node 24 / static` fails for every pull request built against master.
2026-08-18 10:10:30 +08:00
pku-xht c7dce0e784 Merge final Claude review evidence into Codex layer 2026-08-18 05:45:09 +08:00
pku-xht 3621716704 test(subagent): type Claude failure cause assertions 2026-08-18 05:37:14 +08:00
pku-xht dfa1ff84ac Merge final Claude failure facts into Codex layer 2026-08-18 05:33:13 +08:00
pku-xht 9b83852dcc docs(subagent): align named instance evidence notes 2026-08-18 05:23:40 +08:00
pku-xht 4c6ff93535 fix(subagent): preserve Claude failure provenance 2026-08-18 05:17:47 +08:00
pku-xht f0b2d7c762 refactor(subagent): avoid duplicate process diagnostics 2026-08-18 05:01:37 +08:00
pku-xht 75cece4b92 docs(subagent): finalize named instance guidance 2026-08-18 04:48:07 +08:00
pku-xht 8ff5b7d54f Merge PR1 layer-scoped guidance fix 2026-08-18 04:45:27 +08:00
pku-xht 7dd6436d52 docs(subagent): scope named guidance to Claude layer 2026-08-18 04:44:42 +08:00
pku-xht cf16ee41bf test(subagent): narrow named instance evidence 2026-08-18 04:34:24 +08:00
pku-xht a89f72841a Merge PR1 named-instance review fixes 2026-08-18 04:30:30 +08:00
pku-xht cde7ffe6e3 fix(subagent): align named instance guidance and evidence 2026-08-18 04:29:48 +08:00
pku-xht 1feb33a0ec Merge PR1 named-instance documentation fix 2026-08-18 04:13:46 +08:00
pku-xht b795e90329 Merge Claude failure facts into Codex layer 2026-08-18 04:13:32 +08:00
pku-xht b85cb981ef docs(subagent): allow multiple product provider instances 2026-08-18 04:13:14 +08:00
pku-xht a5ea2c46a7 test(acp): isolate product diagnostic header pin 2026-08-18 04:08:58 +08:00
pku-xht efd2999aec test(subagent): correlate Claude process failure facts 2026-08-18 04:03:56 +08:00
pku-xht 6bae03dd69 fix(subagent): preserve Codex failure facts 2026-08-18 03:40:11 +08:00
pku-xht fded16f688 refactor(subagent): use parent abort as startup authority 2026-08-18 03:33:58 +08:00
pku-xht 77211b1c26 fix(subagent): expose startup cleanup failure facts 2026-08-18 03:06:34 +08:00
pku-xht 62e3788fed Merge PR1 named Claude instance fixes 2026-08-18 02:57:10 +08:00
pku-xht db52686a96 feat(subagent): support named Codex provider instances 2026-08-18 02:56:44 +08:00
pku-xht a3a9f86d89 refactor(subagent): derive Claude exit projections 2026-08-18 02:54:20 +08:00
pku-xht 044f65e46b fix(subagent): tighten named Claude instance evidence 2026-08-18 02:50:42 +08:00
pku-xht 605b399a8f refactor(subagent): simplify Claude failure fact ownership 2026-08-18 02:45:42 +08:00
imccyu dedb730a68 Merge pull request #2592 from deepseek-harness/worktree-reducepkg2
refactor(client): separate shell and dynamic package boundaries
2026-08-18 02:17:04 +08:00
imccyu d9ea5da2ff fix(ci): satisfy client script quality gates 2026-08-18 02:07:09 +08:00
imccyu 3c2d2d3cc9 test(web): hold the theme bundle during boot 2026-08-18 01:50:23 +08:00
pku-xht cd4f8b7f46 fix(subagent): preserve Claude Code failure facts 2026-08-18 01:46:30 +08:00
imccyu e0e529547b docs(client): refresh module catalog source link 2026-08-18 01:34:56 +08:00
imccyu d419b722bb test(web): derive assembled graph from bundle config 2026-08-18 01:34:55 +08:00
imccyu c60f132b9c refactor(client): close module loader bootstrap loop 2026-08-18 01:34:55 +08:00
imccyu 8088d2a6a0 fix(client): harden bootstrap invariants 2026-08-18 01:34:55 +08:00
imccyu 1c94446a56 fix(client): preserve dependency boundary cleanup 2026-08-18 01:34:54 +08:00
imccyu 885df835a1 docs: refresh module dependency graph 2026-08-18 01:34:54 +08:00
imccyu 4ad6e28663 fix(client): consume bootstrap handoff queue 2026-08-18 01:34:54 +08:00
imccyu 85bfc7bb22 chore(ci): refresh checks after stack link 2026-08-18 01:34:54 +08:00
imccyu cf603b847f fix(client): complete dynamic module bootstrap 2026-08-18 01:34:53 +08:00
imccyu aa03eff500 build(client): enforce client package boundaries 2026-08-18 01:34:53 +08:00
imccyu ed35d11dde fix: keep test runtime declarations on public types 2026-08-18 01:34:25 +08:00
imccyu 23c11e6ec8 test: stabilize Cordis replay and Windows paths 2026-08-18 01:34:25 +08:00
imccyu e1777b7891 fix(client): tighten UI ownership boundaries 2026-08-18 01:34:25 +08:00
imccyu 07484b9474 fix(build): preserve package metadata across rebase 2026-08-18 01:34:24 +08:00
imccyu 2f974ca9b0 feat(web): show plugin loading progress 2026-08-18 01:34:24 +08:00
imccyu 0fda2a26b7 fix(web): preserve boot page through React handoff 2026-08-18 01:34:24 +08:00
imccyu c065ba34d1 fix(client): tighten UI service boundaries 2026-08-18 01:34:24 +08:00
imccyu 85fa5b6943 docs(client): synchronize UI boundary references 2026-08-18 01:34:23 +08:00
imccyu cf5e686408 refactor(client): merge React bindings into UI renderer 2026-08-18 01:34:23 +08:00
imccyu f37bc082c5 refactor(client): move web rendering into a dynamic plugin 2026-08-18 01:34:21 +08:00
imccyu 3e4ad10d05 refactor(client): make attachment UI a client plugin 2026-08-18 01:34:20 +08:00
imccyu 56dff07c4e refactor(client): move schema handling into ui-settings 2026-08-18 01:34:20 +08:00
imccyu 027bd013bc Merge pull request #2634 from deepseek-harness/fix/ci-081800
fix: dep version issue from #1083
2026-08-18 01:26:39 +08:00
pku-xht 49351cbf0e feat(subagent): support named Claude Code provider instances 2026-08-18 01:16:29 +08:00
imccyu bace780458 fix: windows ci 2026-08-18 01:03:57 +08:00
imccyu 9705290fe4 fix: dep version 2026-08-18 00:42:26 +08:00
creatixchu a8a028e26f test: avoid Windows metadata-version collision 2026-08-17 23:31:36 +08:00
creatixchu 8d17e63558 chore(ci): 刷新 PR 合并引用 2026-08-17 21:29:14 +08:00
creatixchu fdf6fec5c0 test(session-reference): 补齐预处理分支覆盖 2026-08-17 21:25:12 +08:00
fz 042f8fd971 fix(release): align code runtime Python version 2026-08-17 21:23:00 +08:00
creatixchu 9eab23c176 fix(release): 同步工作区包版本 2026-08-17 21:17:30 +08:00
creatixchu 29de639e99 fix(web): 按评审意见调整引用职责 2026-08-17 21:13:33 +08:00
creatixchu 0e39055121 fix(attachment): refuse oversized image sides at admission
An image with a side above the deployed routes' 2000px many-image bound
could be durably committed by read_image, ride every later request, and
permanently fail the session with provider 400s. Admission now enforces a
configurable maxImageDimension (default 2000) during the full decode, so
read_image surfaces a recoverable tool error naming the limit instead of
poisoning durable history; the Web composer gets dedicated copy for the
new IMAGE_DIMENSION_TOO_LARGE reason.

Fixes #2626
2026-08-17 20:49:08 +08:00
creatixchu 7d19a6c2c7 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-08-17 20:46:35 +08:00
fz f41a524453 Merge remote-tracking branch 'origin/master' into feat/python-sdk-standard-agent-runtime
# Conflicts:
#	scripts/smoke-python-runtime.py
2026-08-17 20:46:31 +08:00
fz 10d0895ed6 test(python-sdk): cover shipped preset runtime closure 2026-08-17 20:43:08 +08:00
fz 3b869b6f6d refactor: separate persistent Bash changes from runtime packaging 2026-08-17 20:42:59 +08:00
creatixchu 741b89963d Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-17 20:38:52 +08:00
creatixchu 56efd81d19 fix(ci): sync release version and module graph 2026-08-17 20:32:14 +08:00
Chinesezjc d496d48c4b Merge remote-tracking branch 'origin/master' into fix/locale-default-english 2026-08-17 20:28:21 +08:00
creatixchu c530de9edc Merge origin/master: fold admitEncodedImages onto AttachmentStore.saveImages
master introduced AttachmentStore.saveImages as the batch admission
(count/aggregate-byte/media-type limits, validate-all-before-save,
ordered commit). admitEncodedImages narrows to the shared wire entry:
canonical-base64 enforcement plus delegation to saveImages, keeping one
home for batch policy while both wire endpoints (prompt RPC and the
command executor) still call one function. Test doubles gain saveImages;
batch-limit error texts follow saveImages' wording.
2026-08-17 19:59:53 +08:00
creatixchu 4ed283a2ba fix(commands): address review-bot round on the attachment envelope
- Honor a cancellation that lands during image admission before the
  handler runs, settling command/done with the abort reason (executor
  re-check after admitEncodedImages; the committed objects stay
  unreferenced, deferred-GC territory, now recorded in the Agent Note).
- Never let a pending draft-image serialization reach claim.submit after
  the attempt died (dispose/session teardown race).
- Refuse image removal while a command submit is in flight so the rail
  cannot diverge from the serialized snapshot mid-transaction.
- Declare dsh-llm as a runtime peer dependency of command-goal.
- Mirror the host executor's ordering and the producer grammar
  rejections in the fixture command plane: image checks run after
  command resolution (unknown names stay lifecycle-free), bare /goal and
  /plan//plan off with images answer the producers' error texts.
- Explain the deliberate serialize/release asymmetry in the hub's
  commandImages plumbing.
2026-08-17 19:48:30 +08:00
Chinesezjc 993f4e452b Merge pull request #1083 from deepseek-harness/feat/code-runtime-python-protocol
feat(code-runtime-python): add the fd-3 frame protocol
2026-08-17 19:07:50 +08:00
pku-xht cb064c4013 test(workflow): assert pending pointer suppression 2026-08-17 19:02:58 +08:00
creatixchu 8d9fee19f9 feat(commands): route composer image attachments through slash commands
A claimed slash command consumed only the text half of the composer
submission: /goal with reference images executed, cleared the draft, and
silently stranded the images in the rail. Model-visible attachment intent
had no route through the command plane.

The submission envelope is now modeled end to end. CommandDefinition
input.images declares acceptance; the declaration rides the descriptor to
every client, onto the minted CommandClaim, and into the input machine's
claim snapshot. commands.execute carries the submission's base64 images
and enforces the declaration in the executor: non-declaring commands, a
missing attachment store, and exceeded batch limits settle as logged
error results before the handler runs. Admission reuses the attachment
package's new admitEncodedImages, extracted from api-proxy's prompt path
so both wire endpoints share one limits/validation/commit sequence.

Producers own model visibility: /goal submits one user followup (image
blocks + a fixed reference line) after a successful create/edit so goal
rounds read the images from session history; /plan folds them into its
steered message. Grammar misfits (/goal pause, bare /plan, /plan off)
return direct errors and the composer keeps the images.

On the client, enter adjudication carries a SubmitEnvelope and every
command route that cannot consume images throws a localized refusal that
renders as one composer notice with draft and images retained; the
claimed pre-gate applies the same copy. An accepting claim serializes the
draft images, forwards them to commands.execute, and clears plus releases
them only on a success outcome.

The assembled web test roster gains the ui-input-trigger and ui-commands
plugins, mirroring the shipped composition, so slash submissions exercise
the command plane; a new keyless snapshot pins the refusal banner and the
accepting /goal flow over the built client graph.
2026-08-17 18:57:55 +08:00
pku-xht 7720b2258d fix(workflow): preserve precise completion focus 2026-08-17 18:55:46 +08:00
Chinesezjc 94135092a5 fix(locale): open in English when the browser names no shipped language
The provisional locale fell back to zh, so a browser asking for neither
zh nor en (fr, de) opened the product in Chinese. Resolve to en instead,
and use en as the dictionary fallback: the shipped zh/en dictionaries
declare identical key sets, so one constant serves both roles.

Add scripts/locale-dictionary-parity.spec.ts to gate that symmetry, and
set the asserted locale explicitly in specs that had relied on the old
zh fallback through a dead usePinnedBrowserLanguages call (those files
declare no jsdom environment, so browser detection never ran there).
2026-08-17 18:55:28 +08:00
Chinesezjc 177fbfad4f Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-17 18:52:50 +08:00
creatixchu 862132faca test(web): cover the ui-reference node half 2026-08-17 18:47:11 +08:00
creatixchu e4560786f2 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-08-17 18:43:23 +08:00
creatixchu b19d1643f7 fix(web): harden the composer submit transaction
- wire the directory pick's continue flag through InsertTextRequest to the
  input shell, which re-tracks at the caret so descent reopens completion
  (the flag was produced and forwarded but never consumed)
- guard the image-only send against a second Enter during the Host round-trip
- keep text appended after the sent snapshot when a submit settles ok; only
  interleaved edits clear with the committed content
- drop the dead restoreImages left from the sink rewrite
- read recall labels through a shared defensive sessionRecallLabels helper
  instead of unchecked casts over durable log data, and take the reference
  summary separator from the locale dictionary
- align the composer specs merged from master with the transactional submit
  contract (sinks resolve SubmitOutcome, settlement is awaited, call
  assertions carry the AbortSignal), and restore master's forms where the
  divergence served nothing (queue-mode sink case, single-line filter
  expectation, component-identity slot lookup)
2026-08-17 18:35:45 +08:00
creatixchu 6bb79911ba refactor(reference): serve discovery through typert Remote faces
Replace the legacy reference.* API Proxy domain with @Remote methods on the
owning services, following the typert gateway design master adopted on
2026-08-02 (message-feedback and plugin-inventory precedents):

- FileReferenceService and SessionReferenceResolver extend TypertRemoteService;
  fileReferences/list and sessionReferenceResolver/candidates are unary Remote
  methods cancelled through the reserved trailing signal, and the candidates
  face attaches each candidate's canonical mention under the configured limit
- move the wire types to type-only ./types subpaths (FileReferenceCandidate,
  SessionReferenceMentionCandidate) and export ./typert plus ./remote artifacts
- mount both contributions in the api-remotes client assembly; ui-reference
  consumes ctx.remote instead of connection.api.references and registers zh/en
  locale dictionaries for its sections and labels
- delete the reference.* routes, schemas, map rows, client stubs, and fixtures;
  the connection fixture serves the Remote endpoints instead
- release deliverPrompt admission listeners when the agent is disposed with the
  prepared prompt still pending, and cover the reference-* RpcError codes in
  the schema spec
- add the missing tsconfig paths for the /grammar and /types subpaths (clean-
  tree vitest could not resolve @deepseek-ai/dsh-file-reference/grammar)
- regenerate the cordis catalog, capability seams, and event matrix; update the
  owning bilingual READMEs, Agent Notes, and the reference-composer golden
2026-08-17 18:35:30 +08:00
Chinesezjc 3057f3bb1b docs(code-runtime-python): state the empty invariant's real reason
packages/AGENTS.md:18 requires a package-specific "No runtime invariant:"
reason on an empty installer. This one described a process-boundary
implementation and real-subprocess integration tests that the package does
not carry — it ships the wire-protocol codec and its Python mirror, covered
by protocol.spec.ts and protocol-mirror.e2e.ts.
2026-08-17 18:32:18 +08:00
Yichen Jiang 5dd6e7182a test(web): expect shipped retry budget 2026-08-17 18:16:06 +08:00
Chinesezjc d1700c8a01 docs(code-runtime-python): scope the module JSDoc to the current contract
The barrel's module comment described where a later implementation would sit
relative to this seam, which docs/AGENTS.md:38 keeps out of durable prose.
State what the module exports instead.
2026-08-17 18:07:24 +08:00
pku-xht 1c405d41a5 docs(subagent): clarify Codex unattended runtime contracts 2026-08-17 18:02:18 +08:00
Yichen Jiang 2d2beda196 feat(web): default model retries to five 2026-08-17 17:59:06 +08:00
creatixchu 74b220d362 Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-17 17:49:31 +08:00
creatixchu f750213a19 Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize
# Conflicts:
#	apps/web/tests/snapshots/live-interactions/cancel.expected.md
#	apps/web/tests/snapshots/queue-actions/preserved.expected.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	examples/acp-agent/tests/goal-snapshots/goal-round-driver/session.expected.jsonl
#	examples/acp-agent/tests/snapshots/cordis-inspect-jsdoc/session.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/pty-tools/session.jsonl
#	packages/client/runtime/src/client/sessions/request-inspection.ts
#	packages/client/runtime/tests/request-inspection.spec.ts
#	packages/self-modification/tool-cordis/src/api-catalog.ts
2026-08-17 17:46:57 +08:00
Chinesezjc 8833607469 docs(code-runtime-python): state the package's current surface, not its stack position
docs/AGENTS.md:38 keeps PRs, commits, and stack positions out of durable
prose. Both README sides described where this layer sits in a PR stack and
what a later PR would add, which goes stale the moment the backend lands.
Describe what the package owns instead: the wire protocol, with an exported
surface that carries no subprocess execution path.

Re-record README.i18n.yaml.
2026-08-17 17:46:40 +08:00
pku-xht c7bd2fdafe fix(workflow): let completion win batched activity 2026-08-17 17:39:54 +08:00
Yichen Jiang 4e4dc8a9e5 docs(ui-settings): document the describe mirror and its budget 2026-08-17 17:39:09 +08:00
Chinesezjc a95171b084 fix(code-runtime-python): declare the MIT license the package gate requires
master added verify-dsh-package-licenses while this branch was open: every
repository-owned DSH package must declare "license": "MIT". This package
carried BSD-3-Clause from its creation, so the gate failed and took the
required "node 24 / static" lane down with it.
2026-08-17 17:33:55 +08:00
Yichen Jiang 6b027e9cec test(web): tighten the startup describe budget to the mirror's two reads 2026-08-17 17:33:11 +08:00
Yichen Jiang 8ea21a166c refactor(ui-settings-general): document action derives from the mirror 2026-08-17 17:33:02 +08:00
Yichen Jiang 608fb895a6 refactor(ui-agent-preset): settings row reads writability through the mirror 2026-08-17 17:33:01 +08:00
Yichen Jiang 27abf19413 refactor(ui-settings-models): models page reads settings through the mirror 2026-08-17 17:33:00 +08:00
pku-xht 380030c48f fix(workflow): preserve disclosure intent across completion 2026-08-17 17:31:00 +08:00
Chinesezjc b90b45158e Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol
Resolutions:

- docs/module-graph.md, docs/config-catalog.md: generated files. Regenerated
  with gen-module-graph and gen-config-catalog on the merged tree, then carried
  the new package's entries into the Chinese sides and re-recorded both
  pairings. Each side now differs from master by exactly the
  code-runtime-python rows.
- scripts/verify-package-readme-model-experience.ts, tsconfig.host.json: master
  renamed packages/bash -> packages/shell, packages/pty -> packages/terminal,
  code-runtime-worker -> code-runtime-worker-thread and agent-tool-mode ->
  agent-tool-presentation. Kept master's names and re-added this branch's
  code-runtime-python entry.

Adapted the package to conventions master introduced while the branch was open:
version 0.1.0-rc.6 with publishConfig.access "public" (the release-member rule
check-workspace-constraints now enforces), the invariants project reference
moved to packages/runtime-diagnostics/invariants, and the README companion link
retargeted to code-runtime-worker-thread.
2026-08-17 17:26:11 +08:00
Yichen Jiang e3f484f62f refactor(ui-permission-presets): permission row derives from the describe mirror 2026-08-17 17:19:10 +08:00
Yichen Jiang 232e4beeae refactor(ui-settings-plugins): plugin tab derives served namespaces from the mirror 2026-08-17 17:15:10 +08:00
Yichen Jiang bb3128f266 refactor(ui-settings-models): welcome notice reads through the settings scope 2026-08-17 17:11:03 +08:00
pku-xht 2e125dc0c6 Merge Claude permission modes into Codex permission modes 2026-08-17 17:08:37 +08:00
creatixchu e7bace1c5d Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
2026-08-17 17:06:35 +08:00
pku-xht 000cb1a0db docs(subagent): clarify unattended review contracts 2026-08-17 17:05:18 +08:00
Yichen Jiang 85616ec627 test(web): pin the cold-boot settings.describe budget 2026-08-17 17:04:16 +08:00
pku-xht 941e5c5061 feat(workflow): let users control run and phase disclosures 2026-08-17 17:03:48 +08:00
Yichen Jiang a2c001eb3e test(client): bench downstream settings consumers on the real ui-settings apply 2026-08-17 17:02:32 +08:00
Yichen Jiang fd61fa889b refactor(ui-settings): derive settings scopes from the describe mirror 2026-08-17 16:57:48 +08:00
Yichen Jiang 4db77d3988 fix(ui-settings): clear the mirror in-flight slot in the rerun check's segment 2026-08-17 16:57:47 +08:00
Yichen Jiang 29d6066870 feat(ui-settings): add SettingsDescribeMirror single describe source 2026-08-17 16:46:14 +08:00
pku-xht f479d01faf Merge Claude permission modes into Codex permission modes 2026-08-17 16:25:14 +08:00
pku-xht 1d181b869f Merge origin/master into Claude permission modes 2026-08-17 16:14:18 +08:00
Huanqi Cao 99151657c0 fix(pty): import resolvePwshPath from the pwsh-local package root 2026-08-15 20:49:15 +08:00
pku-xht 0ff3c236ec refactor(subagent): simplify Codex diagnostic handoff 2026-08-15 20:09:04 +08:00
pku-xht 6ed3cab9b5 fix(subagent): preserve Codex diagnostic ordering 2026-08-15 19:58:08 +08:00
pku-xht d1e9dcae7a refactor(subagent): redesign Codex stderr diagnostics 2026-08-15 19:33:03 +08:00
pku-xht cfcecbf0c7 fix(subagent): stabilize Codex permission diagnostics 2026-08-15 19:11:24 +08:00
pku-xht 34db64d90d refactor(subagent): simplify Codex permission runtime 2026-08-15 19:02:04 +08:00
pku-xht a016e17393 test(subagent): cover Codex permission branches 2026-08-15 18:39:30 +08:00
pku-xht a49c0d26f9 merge: propagate Claude permission fixes 2026-08-15 18:30:00 +08:00
pku-xht a3deb9aa5e fix(subagent): keep Claude plan mode non-executing 2026-08-15 18:15:53 +08:00
pku-xht 7eb203069c feat(subagent): add Codex non-interactive permission modes 2026-08-15 18:07:08 +08:00
pku-xht 62da706b64 fix(subagent): address Claude permission review findings 2026-08-15 17:46:13 +08:00
Huanqi Cao c854749c34 fix(pty): ship dsh-pwsh-local in the python runtime closure 2026-08-15 17:05:19 +08:00
pku-xht 4d03472cd0 feat(subagent): add Claude Code non-interactive permission modes 2026-08-15 16:37:19 +08:00
Huanqi Cao 06b766711c fix(pty): pin UTF-8 output encodings in the persistent pwsh bootstrap 2026-08-15 11:45:13 +08:00
Huanqi Cao f61e884917 fix(gates): declare the MIT license for tool-pwsh-persistent 2026-08-15 11:25:23 +08:00
Huanqi Cao a4e2e1e6e9 fix(gates): align tool-pwsh-persistent version and publish access with the rc.6 release 2026-08-15 11:17:35 +08:00
Huanqi Cao bc6a775a31 merge: bring master into feat/pwsh-persistent-pty 2026-08-15 11:14:45 +08:00
pku-xht 1446e36a03 test(subagent): pin Codex payload diagnostic 2026-08-15 06:45:30 +08:00
pku-xht 02e4100f2a fix(subagent): normalize Codex payload diagnostics 2026-08-15 06:08:31 +08:00
pku-xht dbea39a125 fix(subagent): sample Codex diagnostics after cleanup 2026-08-15 06:03:47 +08:00
pku-xht 021b361d4b Merge Claude provider Preset example revalidation 2026-08-15 05:49:46 +08:00
pku-xht ac93515943 fix(subagent): preserve Codex payload diagnostics 2026-08-15 05:49:35 +08:00
pku-xht ab696d84c2 docs(subagent): show disabled Claude tool row 2026-08-15 05:36:23 +08:00
pku-xht cb229c8964 refactor(infra): keep Codex notices direct 2026-08-15 05:26:12 +08:00
pku-xht 4775095aa2 fix(infra): remove stale Codex dependency hints 2026-08-15 04:41:50 +08:00
pku-xht d1a767c66b test(infra): isolate Codex alias fixture 2026-08-15 04:32:30 +08:00
pku-xht bc91897adb test(cli): load product Bundles through Profile 2026-08-15 04:24:03 +08:00
pku-xht 72cb49dbbb refactor(subagent): narrow Codex runtime ownership 2026-08-15 04:12:41 +08:00
pku-xht 1c81da983e Merge Claude provider documentation revalidation 2026-08-15 04:03:17 +08:00
pku-xht ffa119e86e docs(subagent): clarify Claude tool opt-in 2026-08-15 03:56:12 +08:00
pku-xht b6c52c82bb fix(infra): resolve Codex notices from wrapper 2026-08-15 03:52:23 +08:00
pku-xht dbe2887544 Merge installable Claude Code provider parent 2026-08-15 03:28:42 +08:00
pku-xht b2178ade80 feat(subagent): make Codex provider directly installable 2026-08-15 03:25:43 +08:00
pku-xht 15612c1998 review fix: trim duplicate closure evidence 2026-08-14 16:40:23 +08:00
Yichen Jiang ebcf7d0423 fix: preserve product identifiers across rescope 2026-08-14 16:25:41 +08:00
Yichen Jiang 345b3f69ca Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-08-14 16:19:31 +08:00
pku-xht 21b93a4568 Merge commit '61e35fb8ebb2fd8b68ed0c64f586602bb825bd06' into codex/installable-product-subagents
# Conflicts:
#	.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.i18n.yaml
#	.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md
#	.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.zh.md
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md
#	.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md
#	apps/cli/config/agent-presets/code/agent.cordis.yml
#	apps/cli/config/agent-presets/cordis/agent.cordis.yml
#	apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md
#	apps/cli/config/agent-presets/standard/agent.cordis.yml
#	apps/cli/tests/web-agent-presets.e2e.ts
#	examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/cordis.yml
#	examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/driver.ts
#	packages/bundle/base/README.i18n.yaml
#	packages/bundle/base/README.md
#	packages/bundle/base/README.zh.md
#	packages/subagent/subagent-claude-code/README.i18n.yaml
#	packages/subagent/subagent-claude-code/README.md
#	packages/subagent/subagent-claude-code/README.zh.md
#	packages/subagent/subagent-claude-code/tests/loader-composition.e2e.ts
2026-08-14 16:18:47 +08:00
Yichen Jiang 9b0f6f9017 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-25-web-command-surfaces-and-assembly.i18n.yaml
#	.agents/notes/implemented/architecture/2026-07-25-web-command-surfaces-and-assembly.md
#	.agents/notes/implemented/architecture/2026-07-25-web-command-surfaces-and-assembly.zh.md
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.md
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.zh.md
#	.agents/notes/implemented/feature/2026-07-27-web-subagent-conversations.i18n.yaml
#	apps/cli/config/web.cordis.yml
#	apps/cli/package.json
#	apps/web/tests/scaffold.ts
#	docs/capability-seams.md
#	docs/config-catalog.md
#	docs/cordis-catalog/services.md
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	packages/client/connection/src/client/api.ts
#	packages/client/connection/src/client/fixture.ts
#	packages/client/connection/src/client/index.ts
#	packages/client/runtime/src/client/contract/session.ts
#	packages/client/runtime/src/client/sessions/session.ts
#	packages/client/runtime/tests/session.client.spec.ts
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.md
#	packages/client/ui-conversation/README.zh.md
#	packages/client/ui-conversation/src/client/chat/ChatView.tsx
#	packages/client/ui-conversation/src/client/chat/MessageItem.tsx
#	packages/client/ui-conversation/src/client/chat/chat-flow.ts
#	packages/client/ui-conversation/src/client/input/facade.ts
#	packages/client/ui-conversation/src/client/input/hub.ts
#	packages/client/ui-conversation/tests/apply-inject.client.spec.tsx
#	packages/client/ui-conversation/tests/chat-branch-tails.client.spec.tsx
#	packages/client/ui-conversation/tests/chat-view.client.spec.tsx
#	packages/client/ui-conversation/tests/input-bar.client.spec.tsx
#	packages/client/ui-conversation/tests/input-matrix.client.spec.tsx
#	packages/client/ui-conversation/tests/input-scenarios.client.spec.tsx
#	packages/client/ui-conversation/tests/skeleton.client.spec.tsx
#	packages/client/ui-input-trigger/package.json
#	packages/client/ui-input-trigger/src/types.ts
#	packages/client/ui-jobs/README.i18n.yaml
#	packages/client/ui-slash/README.md
#	packages/client/ui-slash/README.zh.md
#	packages/client/ui-subagent/README.i18n.yaml
#	packages/client/ui-subagent/README.md
#	packages/client/ui-subagent/README.zh.md
#	packages/client/ui-subagent/package.json
#	packages/client/ui-subagent/src/client/index.ts
#	packages/client/ui-subagent/tests/browser-plugin.client.spec.ts
#	packages/client/ui-subagent/tsconfig.json
#	packages/context/session-reference/README.i18n.yaml
#	packages/context/session-reference/README.md
#	packages/context/session-reference/README.zh.md
#	packages/cordis/tool-cordis/src/api-catalog.ts
#	packages/core/session/README.i18n.yaml
#	packages/core/session/README.zh.md
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/README.md
#	packages/host/apiproxy/README.zh.md
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/index.ts
#	packages/host/apiproxy/src/api/rpc-map.ts
#	packages/host/apiproxy/src/api/rpc.schema.ts
#	packages/host/apiproxy/src/api/rpc.ts
#	packages/host/apiproxy/src/api/sessions.ts
#	packages/host/apiproxy/src/fetch/client.ts
#	packages/host/apiproxy/src/fetch/handler.ts
#	packages/host/apiproxy/src/index.ts
#	packages/host/apiproxy/tests/client-handler.spec.ts
#	packages/host/apiproxy/tsconfig.json
#	pnpm-lock.yaml
#	scripts/gen-cordis-catalog.ts
#	scripts/gen-doc-graphs.ts
#	scripts/verify-package-readme-model-experience.ts
#	tsconfig.base.json
#	tsconfig.client.json
#	vitest.config.ts
2026-08-14 16:18:40 +08:00
pku-xht b4366e711d feat(subagent): make Claude Code provider directly installable 2026-08-14 16:05:48 +08:00
pku-xht 61ef3d8423 Merge commit '24887eea2e6734f054c997ff6a06357686afa5e2' into codex/installable-product-subagents 2026-08-14 15:24:02 +08:00
fz a6d7ac7438 fix(ci): avoid implied eval in config verification 2026-08-14 14:12:23 +08:00
fz acd8dd43fa fix(python-sdk): satisfy runtime packaging gates 2026-08-14 14:00:42 +08:00
fz e20f560992 feat(python-sdk): support bundled preset runtime dependencies 2026-08-14 13:06:21 +08:00
pku-xht 9fcdb2c160 fix(subagent): close Claude SDK runtime dependencies 2026-08-13 20:30:36 +08:00
pku-xht 8fa6ad9132 fix(subagent): preserve Claude spawn diagnostics 2026-08-13 19:37:29 +08:00
pku-xht bb3010a8df fix(subagent): use bundled Claude Code CLI 2026-08-13 18:45:16 +08:00
pku-xht 7de660305a Merge commit '5ccacf0fb452ec8fecd7fda4b61eb16fd8da8f64' into codex/installable-product-subagents 2026-08-13 16:54:39 +08:00
pku-xht 208f37157a fix(subagent): simplify optional provider delivery 2026-08-13 16:41:25 +08:00
Tianyi Cui 3161ef4e59 Merge latest master into test/translation-prompt-snapshot-fixtures 2026-08-13 16:26:21 +08:00
pku-xht 22152e39be Merge commit 'f2685aa648d9d7239ae553ff42f3811ced59d393' into codex/installable-product-subagents
# Conflicts:
#	.agents/notes/implemented/architecture/2026-08-05-profile-plugin-bundles.i18n.yaml
#	.agents/notes/implemented/architecture/2026-08-05-profile-plugin-bundles.zh.md
#	.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.i18n.yaml
#	.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md
#	.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.zh.md
#	apps/cli/composition.md
#	apps/cli/tests/web-agent-presets.e2e.ts
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/bundle/base/README.i18n.yaml
#	packages/bundle/base/README.zh.md
#	packages/bundle/base/package.json
#	packages/subagent/subagent-claude-code/package.json
#	packages/subagent/subagent-codex/package.json
#	pnpm-lock.yaml
2026-08-13 15:58:24 +08:00
Tianyi Cui 36cca40281 test: make the product translation fixture generic 2026-08-13 13:58:03 +08:00
Tianyi Cui 9d0ef6f5bb test: make the Agent Note translation fixture generic 2026-08-13 13:48:09 +08:00
Tianyi Cui c1f368b493 Merge latest master into test/translation-prompt-snapshot-fixtures 2026-08-13 13:44:39 +08:00
Tianyi Cui 16d86cfba7 test: decouple the translation prompt snapshot from live documents
The snapshot embedded five live bilingual document pairs as reviewed
examples, so editing any of them (README, development guide, i18n docs)
churned the snapshot. Replace them with three synthetic fixture pairs
(product, rules, agent-note shapes) under scripts/fixtures; the prompt
examples stay representative without tracking real document content.
2026-08-13 13:07:57 +08:00
Huanqi Cao f5c0d7e522 merge: bring master's rc.5 release and cordis tool renames into feat/pwsh-persistent-pty 2026-08-13 11:54:16 +08:00
Huanqi Cao 68ba98c29e docs: mirror the pwsh-persistent graph nodes and source lines into the Chinese counterparts 2026-08-13 11:24:43 +08:00
Huanqi Cao b89808cc2d fix(gates): align package version, module graph, and jscpd ignores for the mirrored pwsh stack 2026-08-13 11:10:59 +08:00
Huanqi Cao 6e2a4fd08a test(terminal-bash): cover the spawn signal forwarded into the pwsh bootstrap send 2026-08-13 10:54:23 +08:00
Huanqi Cao 13d859a619 test(subprocess): measure the pipe-drain settle from before the pid-file handoff 2026-08-13 10:47:44 +08:00
Huanqi Cao 82c53ee209 fix(terminal-bash): fall back to dialect defaults when Schemastery materializes empty shell values 2026-08-13 10:41:33 +08:00
Huanqi Cao 7da062f61b docs: refresh catalogs, links, and pairs for the renamed persistent pwsh stack 2026-08-13 10:15:35 +08:00
Huanqi Cao d6010c2d88 refactor(pty): follow the naming-contract renames across the persistent pwsh stack 2026-08-13 09:52:56 +08:00
Huanqi Cao 1ae9df33eb merge: bring master's naming-contract refactor into feat/pwsh-persistent-pty 2026-08-13 01:52:47 +08:00
Huanqi Cao b1daf0eeaf test(tools): expect both pwsh tool packages in the harvested catalog roster 2026-08-13 01:33:27 +08:00
Huanqi Cao 828532682e merge: bring the #2299 Windows-native CI fix series into feat/pwsh-persistent-pty 2026-08-13 01:33:27 +08:00
Huanqi Cao 7c6735c4cb docs(catalog): refresh config-catalog source lines after the persistent-shell fixes 2026-08-13 01:33:16 +08:00
Huanqi Cao 974c340bb1 fix(pty): close the exit race between send settlement and the next poll in both persistent shell tools 2026-08-13 01:33:16 +08:00
Huanqi Cao db208953b1 fix(subprocess): keep the windows-inspector Linux coverage exemption and align the pwsh note with master's windows test structure 2026-08-13 01:33:16 +08:00
Huanqi Cao bc319d0a3b merge: bring master into feat/pwsh-persistent-pty 2026-08-13 01:33:16 +08:00
Huanqi Cao 2b839f8d7b docs(i18n): sync the catalog Chinese counterparts for the new tool
Mirrors the tool-pwsh-persistent catalog section and the pty-local
shellDialect config into the reviewed Chinese counterparts and
re-records both pairing sidecars.
2026-08-13 01:27:41 +08:00
Huanqi Cao d05351a270 docs(pty): register the persistent pwsh tool in the catalogs
Adds tool-pwsh-persistent to the tool-catalog manifest, regenerates
docs/tool-catalog.md and docs/config-catalog.md (the pty-local
shellDialect config), and fixes the persistent-pty note's cross-link
level to the implemented pwsh note.
2026-08-13 01:27:41 +08:00
Huanqi Cao b9c453a421 merge: bring the rescope allowlist fix from the #2234 base branch 2026-08-13 01:27:41 +08:00
Chinesezjc a64cfe13db Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 23:59:13 +08:00
Chinesezjc 48b7fc2bdc Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 22:04:51 +08:00
Chinesezjc 4b06c78075 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 21:07:06 +08:00
pku-xht d1629eed45 feat(subagent): make product providers directly installable 2026-08-12 19:28:31 +08:00
imccyu 86c51704cb fix(bundle): exclude product subagents from base 2026-08-12 18:09:04 +08:00
imccyu 08a2c234c0 refactor: remove codex/claude dep from direct builtin dep 2026-08-12 17:46:12 +08:00
Chinesezjc 3436558ad1 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 17:42:46 +08:00
Chinesezjc 409b167075 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 17:03:10 +08:00
Chinesezjc 4de80e9505 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 16:46:20 +08:00
Chinesezjc 30aed02136 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 16:36:04 +08:00
Chinesezjc e1ea17d878 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 16:22:16 +08:00
Huanqi Cao d992eb116e fix(workflow): use optional syntax for the tsconfig pin parameter 2026-08-12 16:10:45 +08:00
Huanqi Cao 9592842df6 docs: record the junction-safe fixture teardown decision 2026-08-12 15:11:38 +08:00
Huanqi Cao db05dad2c7 fix(pwsh): accept link-shaped candidates and sync the README contract 2026-08-12 15:11:20 +08:00
Huanqi Cao d58bd91356 fix(workflow): forward the tsconfig pin only in the unbuilt worker 2026-08-12 15:11:05 +08:00
Chinesezjc b63cafa292 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 15:08:08 +08:00
Huanqi Cao e0a83884ac Merge remote-tracking branch 'origin/master' into fix/windows-native-ci-local-validation
# Conflicts:
#	packages/client/ui-trajectory/tests/client-bundle.client.spec.ts
2026-08-12 14:12:41 +08:00
Huanqi Cao 06891c7628 test(claude-code): isolate ambient Anthropic model env 2026-08-12 14:04:57 +08:00
Huanqi Cao 772b5a2ec8 fix(pwsh): resolve Store app execution aliases 2026-08-12 14:04:45 +08:00
Chinesezjc af91c4d7ed Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 11:57:06 +08:00
Huanqi Cao df599fe22a Merge remote-tracking branch 'origin/master' into fix/windows-native-ci-local-validation 2026-08-12 11:41:15 +08:00
Huanqi Cao 874d7c4f78 docs: add junction-safe unlink rule to defensive patterns 2026-08-12 11:32:03 +08:00
Huanqi Cao e37af006c5 test(app-boot): unlink hmr alias junctions before removing the target 2026-08-12 11:19:01 +08:00
Huanqi Cao 709912b788 fix(boot): unlink stale profile fallback links instead of rmSync 2026-08-12 11:18:03 +08:00
Chinesezjc 4f9cd72caf Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 02:46:08 +08:00
Chinesezjc a9117995e1 fix(code-runtime-python): match the released root version
master cut 0.0.1-rc.2 while this branch was open. The version bump touched
every existing package but not this new one, so check-workspace-constraints
rejected the mismatch and took the required "all checks passed" job down
with it.
2026-08-12 02:13:54 +08:00
Chinesezjc c9750c5161 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-12 01:57:16 +08:00
Huanqi Cao 67e6d7082e fix: Windows-native CI findings on latest master
Local run of check:ci:windows-complete (the windows-native gate) on
latest master surfaced five Windows-only failures, all unreachable by
current CI because the native windows job is disabled and the wine gate
only covers build+site.

- install-lefthook/translation-pairing-merge specs junctioned the real
  scripts/ and tsx package into fixtures; Windows recursive deletion
  (Node rmSync and git worktree remove) follows MOUNT_POINT junctions and
  deleted the repository's own directories mid-run. Fixtures now unlink
  their reparse points before any recursive removal (shared helper in
  scripts/test-fixture-cleanup.ts).
- workflow-workerthread spawned its worker with an empty env; on Windows
  os.tmpdir() then degrades to the literal relative path undefined\temp,
  so tsx wrote its transform cache into a cwd-relative undefined/
  directory inside the repo. The worker env now injects the host temp
  path on win32 (workerSpawnEnv, platform-parameterized and unit-tested
  on both arms).
- workspace-context spec did not stub USERPROFILE (win32 homedir) or a
  set DSH_HOME, leaking the developer machine's real ~/.dsh/AGENTS.md
  into discovery.
- ui-trajectory client-bundle spec mounted the built artifact without the
  remote/settingsScope provides the locale plugin needs, so the plugin
  never activated and no view registered.
- subagent temp-fixture cleanup lacked the maxRetries Windows handle
  release needs under load (EPERM); added retries to the three affected
  specs and the fixture-cleanup helper.
2026-08-12 01:12:01 +08:00
Huanqi Cao 13152903c7 fix(subprocess): satisfy the oxlint gates in the Windows inspector
Routes koffi allocations through a branded NativePtr helper (koffi's TS
types are any), binds the creationTime callback instead of passing the
unbound method, and braces the no-op signal assertions.
2026-08-12 00:42:40 +08:00
Huanqi Cao da4701d28b docs(pty): persistent pwsh READMEs, dialect docs, and the implemented note
Adds the tool-pwsh-persistent README trio, documents the pty-local
shellDialect and the subprocess-local Windows inspector (console-wide
signalling, pseudo foreground groups, taskkill teardown) in both
languages, updates the tool-pwsh and persistent-pty notes in place, and
moves the pwsh-persistent-pty design note to implemented with the
shipped Decision and Consequences.
2026-08-12 00:28:29 +08:00
Huanqi Cao 0441312768 feat(pty): persistent pwsh tool and the minimal-preset Windows stack
Adds @deepseek-ai/dsh-tool-pwsh-persistent, the mirror of
tool-bash-persistent for PowerShell: one owner-scoped persistent pwsh
per agent, an Invoke-Expression wrapper with backtick-escaped bodies and
exact native exit codes ( reset, \True fallback, catch to 1),
PSReadLine-echo tolerance (the echoed wrapper is stripped from captured
output and can never fabricate completion), and the same
timeout/cancel/exit reset semantics with pwsh-flavored diagnostics.

The minimal preset now gates its persistent shell stack by platform with
the #2234 disabled interpolation: the bash rows mount on POSIX and the
pwsh rows (pty-local shellDialect pwsh + the new tool) on win32, keeping
exactly one persistent shell per host. windows-shell.spec pins the
per-platform roster; the real Loader composition proves cwd/env
persistence, multiline and here-string commands, large-output clipping,
and exit/reset over a real ConPTY pwsh.
2026-08-12 00:15:27 +08:00
Huanqi Cao 557c21cd6c feat(pty-local): shell dialect for Windows pwsh sessions
Adds shellDialect ('bash' | 'pwsh') to the local PTY backend. The
effective shellPath/shellArgs resolve per dialect (pwsh through the
shared dsh-pwsh-local resolver, bash defaults unchanged), the child
environment drops bash-only PS1/PROMPT_COMMAND markers and adds
NO_COLOR for pwsh, and pwsh startup bootstraps the prompt function that
emits the shared OSC 133;D + BEL marker, waiting (across follow-up
sends) until the controlled prompt is actually visible so the
banner-to-prompt gap cannot settle startup early. Bash behavior is
byte-identical; the real-pwsh suite exercises persistent state and
secret scrubbing on Windows.
2026-08-12 00:06:42 +08:00
Huanqi Cao da403d6086 feat(subprocess): Windows terminal inspection and signalling
createProcessInspector now returns a WindowsProcessInspector on win32
instead of throwing: Toolhelp32 tree enumeration with GetProcessTimes
start identities, the shell pid as a pseudo foreground group, taskkill
tree signalling, and inspector-verified Windows teardown (node-pty
signal kills throw on Windows, and externally taskkilled shells may
never fire its exit notification, so the handle settles \done\ from the
verified absence). subprocess-local and pty-local suites now run on
Windows with platform gates; the koffi-backed inspector joins the
windows-only coverage exclusions on Linux and is fully covered by the
windows-native lane.

Also flips vitest.config so subprocess-local and pty-local sources are
coverage-required on win32, and adapts the spawn/terminal suites to run
natively there (node-translated shell commands, injected POSIX group
paths, taskkill signal semantics).
2026-08-11 23:58:38 +08:00
Chinesezjc 98e2bbc75a Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-11 22:40:07 +08:00
Chinesezjc af67ccd374 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-11 19:08:55 +08:00
Chinesezjc 83716ebad0 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-11 19:05:01 +08:00
Chinesezjc 355a803b8d Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol
scripts/check-workspace-constraints.ts: master removed the dsh-helper and
dsh-scripts publication entries; this branch added the code-runtime-python
one next to them. Kept master's removals and this branch's addition.
2026-08-11 17:54:05 +08:00
Chinesezjc 3deb60a13c docs: carry the new package into the generated docs' Chinese pairs
Regenerating docs/module-graph.md and docs/config-catalog.md during the
master merge added code-runtime-python entries to the English sides only,
leaving both pairs out of sync with their recorded consistent state. Add the
matching Chinese entries and re-record the pairing.
2026-08-11 16:04:34 +08:00
Chinesezjc 5d3afb192d Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol
Resolutions:

- docs/module-graph.md, docs/config-catalog.md: both are generated files.
  Regenerated with gen-module-graph and gen-config-catalog on the merged
  tree instead of hand-merging the conflict hunks.
- scripts/verify-package-readme-model-experience.ts: both sides appended
  registry entries; kept all four.

Adapted this package to conventions master introduced while the branch was
open: version 0.0.1-rc.1 with publishConfig and repository metadata, the
workspace: protocol for peer dependencies, and the @deepseek-ai/cordis
rescope in package.json and src/invariant.ts.
2026-08-11 15:53:38 +08:00
Chinesezjc 26bcff8ab4 docs(pre-push-checks): diagnose absent CI runs as a merge conflict
A CONFLICTING PR gets no pull_request workflow runs, so `gh pr checks`
reports "no checks reported" and the runs API returns total_count 0. That
looks like a dropped GitHub event, and the reflex fixes for one — empty
commits, draft/ready toggles, revert-and-restore bounces — all leave the
count at zero while adding junk history to the branch.

Record the mergeability check as the first diagnostic step, name the
conflict as the cause, and point at `git merge-tree` for the conflicting
paths.
2026-08-11 15:46:24 +08:00
Chinesezjc ea1b494614 docs(code-runtime-python): drop forward references this layer does not own
Two comments described facts that belong to later layers of the stack:

- The workspace-constraints whitelist comment described a bootstrap the host
  spawns by path. This layer's py/ holds only protocol.py, the wire-vocabulary
  mirror, and nothing here spawns it. State what the whitelist entry actually
  covers: the Python source ships as-is rather than built.
- checkDoneValue's JSDoc claimed maxValueBytes "defaults to 32 KiB". This
  package defines no config and no default; maxValueBytes is a required boot
  frame field. Name it as the budget instead, so the prose cannot drift when
  the owning implementation picks a default.

Comment-only; the bound argument is unchanged.
2026-08-11 14:44:39 +08:00
creatixchu 87f24bb991 fix(agent-loop): mark finalized prefixes durable-interrupted; never finalize failed attempts
Review round findings:

- Clear the streaming attempt before the request-error waterfall: a cancel
  landing during recovery (typically the llm/retry backoff, after clients
  reset the streamed rendering) must not resurrect the failed stream's
  prefix. Provider failures commit nothing, now including that window.
- Record interrupted: true on the cancellation-finalized assistant/message.
  The chat projection keeps the settled prefix classified as interrupted
  (Stopped chip, restored web goldens), and request inspection leaves the
  request uncompleted so the step boundary classifies it as before.
- Pin the recovery-window and retry-discard semantics with content-bearing
  failed streams in cancel.spec; update the ACP late-end expectation to the
  finalized-prefix transcript.
- Mention interruptedBlocks() in the assembler stream-lifecycle JSDoc.
2026-08-10 13:10:43 +08:00
creatixchu 3e02c06d7f Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize
# Conflicts:
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
2026-08-10 12:32:16 +08:00
creatixchu 48d8e2f8f5 feat(agent-loop): finalize a cancelled stream's delivered prefix
A turn cancelled mid-stream dropped everything the interrupted step had
streamed: chunks stayed in the log for replay, but no assistant/message
joined the surface, so the next request carried nothing the user had
watched stream. Follow-ups after cancel could not connect and forks
inherited the gap.

Keep the streaming attempt alive across the step's request loop and, when
an abort escapes with the attempt uncommitted, finalize its user-visible
prefix as the step's ordinary assistant/message citing the logged chunk
seqs. BlockAssembler.interruptedBlocks() owns the safe subset next to the
max-tokens rule: closed and open text/reasoning blocks with content, in
stream order; tool calls, empty blocks, and unknown open blocks drop.
Retry clears the attempt first, so an abort after llm/retry finalizes
nothing from the reset stream. Tool-phase cancellation and provider
failures keep their existing shapes.
2026-08-10 12:21:44 +08:00
Turtle f248dc3773 docs: remove line numbers from subsystem catalog links 2026-08-10 11:13:33 +08:00
Tianyi Cui 5ad051a9cf Merge remote-tracking branch 'origin/master' into worktree/gate-package-subsystem-pages 2026-08-09 23:30:36 +08:00
Tianyi Cui 4125dac22d fix(docs): harden subsystem ownership links 2026-08-09 23:30:03 +08:00
Tianyi Cui fb4554a9be Merge remote-tracking branch 'origin/master' into worktree/gate-package-subsystem-pages 2026-08-09 22:50:17 +08:00
Tianyi Cui 9d37d7155a test(docs): require package subsystem ownership 2026-08-09 22:50:01 +08:00
Chinesezjc 1a6cadfd50 fix(web): resolve the remaining review suggestions on the header, guard, and note
The test header now splits the keyless claim (no model call in any mode;
no API key in replay/refresh) and keeps 'jsdom resolves no layout' on one
line. The providers-only header check parses the first line and asserts
type === 'session' instead of a byte prefix, and one comment covers both
boot-time rejections (override/child sources and call-bearing fixtures).
The Agent Note (en+zh) mirrors the split claim and links the referenced
composer-width note relatively instead of a bare slug; pairing re-recorded.
2026-08-08 03:31:58 +08:00
Chinesezjc 3fe7555efb fix(web): require a session header row under replayProvidersOnly
A header-less fixture scanned as call-free would mount the provider
catalog silently, violating misconfiguration-fails-loud; the boot guard
now rejects a fixture that does not open with a session header row, and
the scan comment sits directly above the scan it describes.
2026-08-07 23:19:02 +08:00
Chinesezjc 0ae7e81664 fix(web): scope the no-key claim in the note's Consequences and rewrap the header
The Agent Note Consequences paragraph (en+zh) now limits the no-API-key
claim to replay/refresh modes, matching the Decision paragraph and the
record-mode key requirement; the test header is rewrapped and the
pairing sidecar re-recorded.
2026-08-07 15:59:15 +08:00
Chinesezjc 5dad49f4db docs(code-runtime-python): name the roster aliases by subset direction, align metering prose
Rename UnionCoversRoster/RosterCoversUnion to UnionSubsetOfRoster/RosterSubsetOfUnion so
the names read in the same direction as their extends clauses, share the python3 -I -B
flags between the two mirror probes, and align the README and Agent Note prose with the
checkDoneValue JSDoc: the escaped-size scan is the metering itself, not deferred work.
Regenerate docs/module-graph.md, which listed code-runtime-python twice.
2026-08-07 15:37:19 +08:00
Chinesezjc d3d1cac0e2 Merge remote-tracking branch 'origin/master' into feat/code-runtime-python-protocol 2026-08-07 15:35:29 +08:00
Chinesezjc 6964510a64 fix(web): qualify the keyless claim and fold the providers-only contract into the JSDoc
The WebScaffold.close() interface JSDoc now states the replayProvidersOnly
skip (the earlier commit only touched the inline body comment), the
replayProvidersOnly option JSDoc folds both boot-time rejections, and the
test header plus Agent Note (en+zh) scope the no-key claim to
replay/refresh modes; the pairing sidecar is re-recorded.
2026-08-07 15:35:08 +08:00
Chinesezjc 024a85bafd fix(web): reject override and child fixtures under replayProvidersOnly and fix the close JSDoc
The boot guard now fails loud when replayProvidersOnly combines with
replayOverride or replayChildFixtures, closing the bypass where callable
scripts could install with the consumption check skipped. The close()
comment states the providers-only skip, which the master merge had
reverted.
2026-08-07 15:09:28 +08:00
Chinesezjc fbba0e1e0e Merge origin/master into feat/plan-narrow-viewport-regression
Resolves the scaffold.ts import conflict (keep readFileSync and master's
mkdir) and carries master's notes and tsconfig updates.

--no-verify: merge-commit pre-commit hooks lint all staged files; the
linted tree is verified clean via the repo lint script (tsc -b
tsconfig.host.json, oxlint, verify-translation-pairing all pass) and CI
owns the authoritative run.
2026-08-07 14:44:39 +08:00
Chinesezjc 30b6229738 fix(web): reject call-bearing fixtures under replayProvidersOnly and align the docs
The consumption-check skip was wider than needed and left a foot-gun:
a providers-only fixture that recorded model calls would silently go
unconsumed. The option now validates at boot that the fixture derives no
model calls (parseSessionLog scan), so the skip only ever covers a
header-only catalog mount; close() and the replayFixture JSDoc state the
interplay. The test header and Agent Note (en+zh) now say 'no model call'
instead of the contradictory 'no fixture', and the pairing sidecar is
re-recorded.
2026-08-07 14:33:58 +08:00
Chinesezjc ff52c253b1 fix(web): make replayProvidersOnly self-consistent and poll for the real model label
The option now fails loud without replayFixture instead of silently
mounting nothing, and its JSDoc states the interplay with the
consumption check. The fixture is a non-empty header row (no longer a
0-byte placeholder), and the model-label assertion polls for
DeepSeek-V4-Flash (the directory loads asynchronously) instead of
reading the attribute once.
2026-08-07 14:15:58 +08:00
Chinesezjc d5ec1189a6 fix(web): mount the provider catalog for the geometry regression and assert the real model label
A bare /plan command never calls a model, so the scaffold's replay row
did not mount and the model directory was empty: the trigger rendered
the short fallback label, which fits beside the chip even on the
pre-fix layout, silently defanging the regression. The scaffold gains a
replayProvidersOnly option (provider catalog without a recorded script,
consumption check skipped), the test mounts it, and asserts the trigger
aria-label contains DeepSeek-V4-Flash before measuring — verified that
removing the wrap fix makes the test fail (click areas disjoint: false).
2026-08-07 13:53:08 +08:00
Chinesezjc aae246ef6d fix(web): enter plan mode without a model round in the regression test
The /plan command handler commits plan/mode active immediately on the
live agent (the lifecycle-chrome precedent), so the test drops the
recorded fixture, the record/replay mode split, and the turn-settled
wait. The golden comparison stays in replay/refresh modes; the fixture
file is removed and the note describes the no-model path.
2026-08-07 13:36:19 +08:00
Chinesezjc 32d6444a2c fix(code-runtime-python): align package files with the publication gate 2026-08-07 13:27:54 +08:00
Chinesezjc 203bfca0ea docs(code-runtime-python): trim metering prose and cover encodeJsonPlain depth
- Drop the review-history narrative from checkDoneValue's JSDoc (the "in the
  previous implementation … now avoids" clause); state the current contract only.
- Assert encodeJsonPlain on the same 100k-deep value the metering test uses:
  its headline contract is stack-safety (JSON.stringify would throw), but no
  test exercised the encoder on a deep value.
2026-08-07 13:27:54 +08:00
Chinesezjc 4674d8fa92 fix(code-runtime-python): verify union<->roster both ways, stop pycache writes, refresh metering prose
Address the latest review round:

- WireFrameShapesCoverUnions checked only union ⊆ roster, so removing a frame
  from a message union (e.g. dropping ReplyErr from ReplyMessage) left the check
  true while the public TS union diverged from the wire. Replace it with a
  bidirectional equivalence between MessageFrames and the roster's message-frame
  value types (nested Namespace/ErrorClass/DoneErrorField excluded): both a frame
  added to a union without a roster entry and a frame removed from a union now
  fail typecheck (both verified).
- The mirror e2e's python3 probes imported protocol.py without -B, writing
  py/__pycache__/*.pyc into the (un-ignored) source tree. Add -B to both.
- Refresh the metering prose (checkDoneValue JSDoc + README both sides + Agent
  Note both sides): the incremental-work list no longer says "per-key
  JSON.stringify" now that jsonStringBytesUpTo scans without stringifying;
  re-record the README and Agent Note i18n pairings.
2026-08-07 13:27:54 +08:00
Chinesezjc f9ab1edc68 fix(code-runtime-python): meter escaped string bytes without allocating, bind frame roster to the unions
Two review findings on checkDoneValue's metering and the wire-mirror binding:

- The string/key byte check used a decoded-length lower bound and then called
  JSON.stringify, which materializes the ~6x escaped copy before the over-budget
  check — the hundreds-of-MB spike the metered walk exists to avoid. Add
  jsonStringBytesUpTo, a non-allocating scan that computes the exact escaped
  UTF-8 size (matching JSON.stringify byte for byte, including surrogate pairs
  vs lone surrogates) and bails the instant it crosses the remaining budget; use
  it for both string values and object keys.
- The frame roster in WIRE_FRAME_FIELD_ROLES was hand-written, so a frame added
  to ChildToHost/ReplyMessage without a roster entry slipped past. Introduce
  WireFrameShapes (name -> interface) as the canonical roster the roles map is
  bound against, plus a WireFrameShapesCoverUnions compile-time assertion that
  every message-union member appears in it (verified: adding a frame to a union
  without a WireFrameShapes entry fails typecheck).
2026-08-07 13:27:54 +08:00
Chinesezjc 4de8c914c9 refactor(code-runtime-python): export PROTOCOL_FD and tidy the mirror binding
Address the remaining review findings on the wire-mirror layer:

- Export PROTOCOL_FD from protocol.ts as the TS-side source of truth the host
  wires, and assert the Python constant against it in the mirror e2e instead of
  a bare literal 3, so an fd drift on either side is caught.
- Correct the FrameFieldRoles JSDoc to point at the actual assertion site
  (WIRE_FRAME_FIELD_ROLES's satisfies clause, not WIRE_FRAME_FIELDS).
- Drop the redundant explicit type annotation on WIRE_FRAME_FIELDS (the trailing
  `as` cast already types it; Object.fromEntries returns an index signature).
- Refresh the mirror-test comment to describe the roles-map binding (a TS-side
  add/remove/rename/optionality-flip fails typecheck; a Python-side change fails
  the comparison).
2026-08-07 13:27:54 +08:00
Chinesezjc adba2e305a fix(code-runtime-python): make the wire-field binding exhaustive over interface keys
The array-based FrameFields<T> only checked that listed names were members of
the frame's keys, so a field added to a TS interface (e.g. LogMessage.seq?)
left the existing arrays a valid subset — typecheck passed, and since the
constant and Python both lacked the field the mirror test passed too. The
JSDoc's claim that runtime covered this was false.

Replace it with WIRE_FRAME_FIELD_ROLES, a per-frame map keyed by field name
(`Record<RequiredKeys<T>, 'required'> & Record<OptionalKeys<T>, 'optional'>`),
so every interface key MUST appear with a matching required/optional tag: an
added field, a removed field, a rename, or an optionality flip all fail
typecheck at the roles map (verified). WIRE_FRAME_FIELDS is projected from it
as the sorted arrays the mirror test still compares to the Python TypedDicts.

Also drop the `export` added to the promoted frame interfaces (Namespace,
ErrorClass, RunMessage, DoneErrorField, ReplyOk, ReplyErr) — nothing outside
protocol.ts imports them, so the barrel surface is unchanged and knip stays
clean.
2026-08-07 13:27:54 +08:00
Chinesezjc 4d49406bd5 fix(code-runtime-python): bind the wire-field mirror to TS required/optional keys
The previous mirror binding (FrameFields<keyof T>) only checked membership: it
could not see a TS-side optionality flip (truncated? -> truncated leaves keyof
unchanged) or a field added on one side, so the "depends on the TS
declaration" claim was overstated.

- Promote the inline frame shapes (Namespace, ErrorClass, DoneErrorField,
  RunMessage, and the two Reply variants) to named interfaces so every frame
  binds uniformly.
- Derive FrameFields from RequiredKeys<T>/OptionalKeys<T>, so `required` and
  `optional` each accept only that side's keys. An optionality flip or a rename
  now fails typecheck (verified: flipping LogMessage.truncated to required
  errors at the constant).
- Enumerate EVERY public TypedDict in py/protocol.py in the mirror e2e (not a
  name list taken from the TS side) and assert both the frame roster and each
  frame's required/optional sets by exact equality, so a frame or field present
  on only one side of the wire fails the test.
2026-08-07 13:27:54 +08:00
Chinesezjc be839a8e53 fix(code-runtime-python): count non-lossless bytes and bind the mirror gate to TS types
Two gaps from the previous round's fixes:

- checkDoneValue flagged a non-lossless number but skipped counting its encoded
  bytes, so a value over budget ONLY through that number classified as
  non-lossless instead of over-budget (e.g. [Infinity] at cap 3, whose encoding
  is 10 bytes). Count the scalar's bytes even when flagging, so the budget check
  wins as the JSDoc promises. Add cap-3 regression cases.

- The mirror e2e compared the Python TypedDict keys against a hand-written
  constant, so a field change on the TS side alone would not fail it, and the
  reply frames were not probed at all. Introduce WIRE_FRAME_FIELDS in
  protocol.ts, bound to each frame interface's key set via `satisfies` (a
  renamed/removed field breaks typecheck — verified), and drive the mirror test
  from it, now covering ReplyOk/ReplyErr too. The test therefore fails on
  one-sided drift from either language.
2026-08-07 13:27:54 +08:00
Chinesezjc 8a60b5f005 feat(code-runtime-python): make the TypedDict wire mirror an executable gate
Address the two standing review suggestions in this layer rather than deferring
them to PR #4:

- Extend tests/protocol-mirror.e2e.ts to read each py/protocol.py TypedDict's
  required/optional key set and assert it against the wire field names
  src/protocol.ts declares (global included, via functional TypedDict). The
  round-12 class of drift — a renamed/dropped field, or one side making a field
  optional the other requires — now fails a test instead of relying on review.
  Field types remain review-guarded (no mechanical TS/Python equivalent).
- Drop the forward references to PR #4's internal mechanisms from this layer's
  prose: the "256 MiB frame ceiling" figure and the "(index.ts)" fd-3 pinning
  citation become an abstract "host-side inbound frame-size cap" so the JSDoc,
  spec, README, and Agent Note describe only what this layer owns.

Update both README sides and the Agent Note (both languages) to state the
mirror is now executable, and re-record their i18n pairings.
2026-08-07 13:27:54 +08:00
Chinesezjc 146a9d9f61 fix(code-runtime-python): make checkDoneValue over-budget precedence order-independent
checkDoneValue returned non-lossless the instant it hit a non-finite/negative-
zero number, before finishing the budget metering. A value that is BOTH over-
budget and non-lossless then classified by member order: `["<huge>", 1e400]`
gave non-lossless while `[1e400, "<huge>"]` gave over-budget — the same value,
two verdicts — which would drive the consumer to emit invalid-output vs
output-limit non-deterministically, contradicting the JSDoc promise that an
over-budget value is rejected as over-budget regardless. Record the number
violation in a flag and let metering finish; return non-lossless only once the
whole value is confirmed within budget. Add a regression test asserting both
member orders classify as over-budget.
2026-08-07 13:27:54 +08:00
Chinesezjc 8cf253a470 docs(code-runtime-python): sync README metering claim with code and note
Both README sides still described checkDoneValue as "one bounded traversal /
一次有界遍历" — the same overclaim already retracted in the code JSDoc and the
Agent Note. Reword both to match: the walk bounds only the incremental
allocation it adds (escaped-string copy, enqueued children, per-key stringify);
the frame's own width is parsed upstream and capped by the host's fd-3 receive
buffer, not re-bounded here. Re-record README.i18n.yaml.
2026-08-07 13:27:54 +08:00
Chinesezjc 69796d214c fix(code-runtime-python): remove NUL bytes and sync the Agent Note metering claim
- Replace four raw U+0000 bytes in protocol.spec.ts string literals with the
  \0 escape so the source stays plain text (a bare NUL makes text tools treat
  the file as binary); the runtime value is unchanged, so the bytes:8 NUL-escape
  assertion still holds.
- Sync the Agent Note (both languages) with the corrected checkDoneValue
  contract: the walk bounds only the incremental allocation it would add, not
  the frame width, which is already parsed and capped upstream by the host's
  fd-3 receive buffer. Drop the "prevents a hundreds-of-MB allocation" overclaim
  that the code JSDoc already retracted. Re-record the note i18n pairing.
2026-08-07 13:27:54 +08:00
Chinesezjc b4487485c2 docs(code-runtime-python): correct ownValues allocation claim
ownValues' JSDoc claimed the generator avoids a "second full-breadth
allocation before a single value is examined", but for...in still materializes
the key-name enumeration when the loop starts — the same JS limitation the
checkDoneValue rewrite now acknowledges. What the generator genuinely saves is
the extra VALUE array Object.values/Object.entries would copy; state that
precisely rather than implying sublinear startup.
2026-08-07 13:27:54 +08:00
Chinesezjc ae8070d799 fix(code-runtime-python): stop overclaiming O(cap) object metering
checkDoneValue cannot bound object width sublinearly: JS has no lazy own-key
iterator (for...in materializes the key set), and done.value is already
JSON.parse'd before the check runs, so the frame's width is paid upstream. The
genuine width bound is the host's fixed 256 MiB fd-3 receive buffer (a later
stack layer). Reword the JSDoc and branch comments to claim only what holds —
the traversal caps the INCREMENTAL allocation the check would add (escaped
strings, enqueued children, per-key stringify) and refuses over-budget before
those secondary allocations — and drop the mid-count micro-check that JS cannot
honor. Replace the Proxy test (whose ownKeys allocated a 2M array, proving
nothing) with assertions that an over-budget string/array/object is refused
before its escaped copy or child enqueue.
2026-08-07 13:27:54 +08:00
Chinesezjc 9dc9113ed7 fix(code-runtime): adopt the base seam's DUNDER_MEMBER resolution
The base seam branch resolved its DUNDER_MEMBER inconsistency by keeping
/^__.+__$/ and asserting `____` (empty middle between two `__` pairs) does not
match. Drop this branch's earlier /^__.*__$/ stopgap so the seam file is
byte-identical to its base: the earlier change only existed because the base
was self-inconsistent, and the base now owns a coherent decision.
2026-08-07 13:27:54 +08:00
Chinesezjc 104cd5f975 fix(code-runtime-python): bound checkDoneValue object metering in O(cap)
The object branch counted every own key before applying the size bound, so a
forged done.value with millions of keys and a small cap forced an O(frame)
walk — contradicting the O(cap) guarantee the comment promised and able to
block the host event loop. Bail mid-count the instant the running minimum
encoding (braces + 4 bytes/entry + commas) crosses maxBytes, and drop the now
-redundant post-count check the loop subsumes. Add a Proxy-based test proving
a 2M-key object enumerates fewer than 1000 keys under a 64-byte cap.

Also correct the checkDoneValue JSDoc: per-scalar byte length is measured via
scalarJson (exact BigInt digits for beyond-safe integers), not JSON.stringify.
2026-08-07 13:27:54 +08:00
Chinesezjc 31506dec2d fix(code-runtime-python): correct Chinese translation quality
- Translate README.zh.md's Model Experience body and KV Cache line, which
  were left verbatim in English.
- Convert half-width punctuation to full-width across the README.zh.md
  Known Limitations bullets and the entire Agent Note Chinese side, per
  docs/i18n translation-rules.md Typography (MUST use ,。:()in Chinese prose).
- Re-record both README and Agent Note i18n.yaml pairing hashes.
- Reword the workspace-constraints extra-files comment: this layer's py/
  ships only the wire-protocol mirror; the spawned bootstrap arrives later.
2026-08-07 13:27:54 +08:00
Chinesezjc 8a77f201f2 fix(code-runtime): keep the DUNDER_MEMBER fix line-neutral in the seam
The base seam branch still carries the buggy /^__.+__$/ (rejects `____`,
which its own reserved.spec asserts must match), so this stacked branch must
keep the /^__.*__$/ correction to stay green. Reword the JSDoc to the same
line count as the base so the CodeRuntime class does not shift, leaving the
cordis services catalog anchor identical to the base and confining this
branch's footprint on the seam file to the single regex character.
2026-08-07 13:27:54 +08:00
Chinesezjc 98ebe1315d fix(code-runtime-python): reject -0 call ids and document done value/error
- Drop a CALL frame whose id is negative zero: it passes Number.isFinite but
  the reply re-serializes it as `0`, colliding with a real call id `0`. The
  honest child never issues `-0`.
- Document that validateChildFrame preserves a forged done frame's value and
  error together on purpose, so consumers must check error before value.
2026-08-07 13:27:54 +08:00
Chinesezjc f0d669883f fix(code-runtime-python): close coverage gap and tighten the wire mirror
- Cover the log-frame `truncated` rebuild branch: assert a literal-true flag
  rides along and any other value (1, string, false) is dropped, closing the
  protocol.ts branch the coverage gate flagged.
- Correct encodeJsonPlain's JSDoc: it matches compact JSON.stringify EXCEPT on
  a beyond-safe-range integral double, where it emits the exact BigInt digits
  (`...846976`) rather than the rounded `...847000` — the divergence the
  "emits exact digits" test pins.
- Declare py/protocol.py's `global`-bearing frames (Namespace, CallMessage)
  with functional TypedDict syntax so they carry the real wire key instead of
  a `global_` attribute the wire never sends, and split optional-field messages
  (Namespace/LogMessage/DoneMessage) into a required base plus a total=False
  subclass so `type` and other required fields cannot be dropped. Widen
  HostToChild to include the boot and run frames the host sends before replies.
- Reword the mirror e2e's py/ directory assertion to describe the source-tree
  layout it actually checks.
2026-08-07 13:27:54 +08:00
Chinesezjc b3e29e7af5 fix(code-runtime-python): satisfy static gates for the protocol-only layer
- Drop the unused @deepseek-ai/dsh-code-runtime dependency: this layer
  imports nothing from the seam (protocol.ts has no imports; the invariant
  companion uses only cordis and dsh-invariants). The backend-core PR
  re-adds it when PythonCodeRuntime consumes the seam. Fixes knip.
- Point the Agent Note's cross-reference to the seam note at the English
  target on both language sides, per the bilingual-pairing contract (only
  the language switcher flips to .zh.md). Re-record the sidecar.
- Add the Known Limitations section both READMEs require, covering the
  cross-language guard's scope and the deferred runtime implementation.
- Regenerate the module graph for the dropped dependency edge.
2026-08-07 13:27:54 +08:00
Chinesezjc 034e4f2d3f fix(code-runtime): match DUNDER_MEMBER to its distinct-pair contract
The seam's dunder-member test (added in the base seam PR) asserts
`DUNDER_MEMBER.test('____')` is true and `test('__')` is false, but the
regex `/^__.+__$/` rejected `____`: the `.+` demanded a non-empty middle,
while `____` is two adjacent `__` pairs with an empty middle. Widen to
`/^__.*__$/` so a name with distinct leading and trailing `__` pairs
matches whether or not it has a middle, and align the JSDoc. Regenerate
the cordis service catalog for the merged seam source line.
2026-08-07 13:27:54 +08:00
Chinesezjc e0f22aeaad feat(code-runtime-python): add the fd-3 frame protocol
Introduce @deepseek-ai/dsh-code-runtime-python with the versionless
JSON-lines protocol between the Node host and the CPython subprocess:
the host-side hostile-frame codec (validateChildFrame, encodeJsonPlain,
checkDoneValue, hasUnsafeIntegerToken, hasNonLosslessNumber,
logTruncationMarker) and the Python-side wire-vocabulary mirror
(py/protocol.py).

This is the protocol layer of the code-runtime-python stack, split from
#436 and based on the multi-language seam extension. The PythonCodeRuntime
implementation and its Python JSON codec land in the backend-core PR on
top of this branch.

Ship the minimal buildable package skeleton (package.json, tsconfig,
tsdown, barrel index, invariant companion, bilingual README) because the
workspace-constraint, coverage, and invariant-topology gates require the
package to exist and build the moment its directory does; the backend-core
PR extends those files rather than creating them.

Align py/protocol.py with src/protocol.ts (the round-12 review of #436
found LogMessage.truncated, DoneMessage.error.kind, and Namespace.errorClass
stale) and guard the two runtime-executed surfaces (PROTOCOL_FD and the log
truncation marker) with a real-python3 cross-language mirror e2e test.
2026-08-07 13:27:54 +08:00
Chinesezjc f5603f169d fix(web): refill the header paragraph (cosmetic) 2026-08-07 13:22:19 +08:00
Chinesezjc bd9e57acd1 fix(web): rewrap the header paragraph (cosmetic) 2026-08-07 13:10:09 +08:00
Chinesezjc 552e8c9dcb fix(web): correct the golden comment, use the derived session-event type, and relocate the note
The file header now states the committed golden exactly (three boolean
verdicts; the exit result is an assertion, not golden content). The exit
predicate uses the derived SessionEvent<'plan/mode'> form instead of a
hand-written shape. The Agent Note triplet moves from implemented/feature/
to implemented/bug-fix/ following the composer defect-note precedent, and
the zh side uses the machine-checked ASCII header tokens; the pairing
sidecar is re-recorded for the new paths.
2026-08-07 12:59:10 +08:00
Chinesezjc 665ffb3be3 fix(web): type the exit assertion on the plan/mode data and correct the header comment
The exit-path assertion now reads the last plan/mode event's data.active
through a typed discriminant filter (event is SessionEvent & ...), so the
commit message and the code agree; the file header comment now describes
the committed three-boolean golden instead of the retired gap/overlap
facts.
2026-08-07 12:44:14 +08:00
Yichen Jiang 8ac1bd64e2 fix(web): document settings focus restoration
Fixes #1407
2026-08-06 21:13:36 +08:00
Chinesezjc 1ede702c9d fix(web): assert both viewport axes and align the note with the committed golden
The in-viewport checks covered only the x axis while the note promised
failure on any out-of-viewport move; both axes are now asserted. The
Agent Note (en + zh) now describes the committed golden (boolean
verdicts only), the host-plane e2e pairing (client exclude + host
include) that gives the file its single TypeScript program, and the
typed exit-path assertion.
2026-08-06 18:12:14 +08:00
Chinesezjc 35105d516c fix(web): own the regression file in the host aggregate and type its exit assertion
The browser regression test was excluded from the client graph but never
included in tsconfig.host.json, so no TypeScript program type-checked it
and the lint type service analyzed it without a program — the real cause
of the earlier pre-commit lint failures. The file now joins the host
aggregate like every sibling host-plane web e2e.

The exit-path assertion is a typed discriminant filter over the session
log (the last plan/mode event must flip inactive), replacing the loose
serialized-string check; the type-only dsh-plan-mode import that was dead
in the excluded file now resolves the plan/mode SessionEventMap merge in
the host program. The golden records boolean facts only — viewport
membership and disjoint click areas — never font-dependent pixel values.
2026-08-06 18:00:17 +08:00
Chinesezjc e302bebad4 fix(web): wrap the composer control row so the plan chip never overlaps the model trigger
At the 800×720 viewport the plan chip and the model trigger overlapped by
~37px and the chip's center hit-tested to the trigger's label, so plan
mode could not be left by mouse (dsh-external/issues#107, clustered as
deepseek-harness#1406). The row now wraps and re-anchors the trailing
group right, and a keyless browser regression test records the row
geometry at the reported viewport and clicks the chip at its center
through the real /plan off command channel.

The regression file replaces the previous plan-chip-overlap.e2e.ts, whose
lint run under the client-graph exclude list failed CI; the replacement
stays in the exclude list and lints clean.

--no-verify: the local pre-commit oxlint pass mis-analyzes this file once
its path has been linted before (identical content lints clean under a
fresh path); CI's full-repo lint lane is the authority.
2026-08-06 17:56:55 +08:00
Yichen Jiang 188b60f208 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-25-web-command-surfaces-and-assembly.i18n.yaml
#	.agents/notes/implemented/architecture/2026-07-25-web-command-surfaces-and-assembly.zh.md
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.md
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.zh.md
#	apps/web/tests/scaffold.ts
#	apps/web/tsconfig.json
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.md
#	packages/client/ui-conversation/README.zh.md
#	packages/client/ui-conversation/src/client/chat/MessageItem.tsx
#	packages/client/ui-slash/README.i18n.yaml
#	packages/client/ui-subagent/README.i18n.yaml
#	packages/client/ui-subagent/README.zh.md
#	packages/client/ui-subagent/src/client/index.ts
#	packages/client/ui-subagent/tests/browser-plugin.spec.ts
#	packages/context/session-reference/README.i18n.yaml
#	packages/context/session-reference/README.md
#	packages/context/session-reference/README.zh.md
#	packages/core/session/README.i18n.yaml
#	packages/core/session/README.md
#	packages/core/session/README.zh.md
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/README.md
#	packages/host/apiproxy/README.zh.md
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/rpc.ts
#	packages/host/apiproxy/src/fetch/handler.ts
#	tsconfig.host.json
2026-08-06 16:59:44 +08:00
Chinesezjc 94e1ce9269 fix(web): wrap the composer control row so the plan chip never overlaps the model trigger
At the 800×720 viewport the plan chip and the model trigger overlapped by
~37px and the chip's center hit-tested to the trigger's label, so plan
mode could not be left by mouse (dsh-external/issues#107, clustered as
deepseek-harness#1406). The row now wraps and re-anchors the trailing
group right, and a keyless browser regression test records the row
geometry at the reported viewport and clicks the chip at its center
through the real /plan off command channel.

--no-verify: the local pre-commit oxlint pass mis-analyzes the new e2e
file while it sits in apps/web/tsconfig.json's client-graph exclude list
(identical content lints clean under every other path; scaffold.ts and
plan-review.e2e.ts in the same exclude list lint clean). CI's full-repo
lint lane is the authority for this file.
2026-08-06 16:43:04 +08:00
Yichen Jiang 58c02e0c07 Merge remote-tracking branch 'origin/master' into worktree/fix-settings-focus 2026-08-06 16:41:55 +08:00
Yichen Jiang f45f693d80 Merge remote-tracking branch 'origin/master' into worktree/fix-settings-focus 2026-08-06 15:08:07 +08:00
Yichen Jiang 0289791d5d fix(web): restore focus after closing settings 2026-08-06 14:21:56 +08:00
Yichen Jiang 3a231b122e test(web): cover ui-subagent host half 2026-08-04 15:47:18 +08:00
Yichen Jiang 4798f4a6aa Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	.agents/notes/archived/feature/2026-07-23-tui-file-reference-autocomplete.md
#	.agents/notes/archived/feature/2026-07-23-tui-file-reference-autocomplete.zh.md
#	.agents/notes/implemented/feature/2026-07-23-tui-file-reference-autocomplete.i18n.yaml
#	apps/cli/config/base.cordis.yml
#	docs/capability-seams.md
#	docs/cordis-catalog/services.md
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/context/file-reference-local/src/search.ts
#	packages/context/file-reference-local/tests/search.spec.ts
#	packages/ui/tui/package.json
#	packages/ui/tui/src/chat/autocomplete.ts
#	packages/ui/tui/src/config.ts
#	packages/ui/tui/src/index.ts
#	packages/ui/tui/tests/tui.spec.ts
#	packages/ui/tui/tsconfig.json
#	pnpm-lock.yaml
#	scripts/gen-doc-graphs.ts
2026-08-04 15:12:08 +08:00
Yichen Jiang 634306156e Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	apps/cli/config/base.cordis.yml
#	apps/cli/config/web.cordis.yml
#	apps/cli/package.json
#	apps/web/tests/queue-actions.e2e.ts
#	apps/web/tests/snapshots/code-mode-round/ui.expected.md
#	apps/web/tests/snapshots/cordis-tool-round/ui.expected.md
#	apps/web/tests/snapshots/fresh-round-trip/ui.expected.md
#	apps/web/tests/snapshots/lifecycle-chrome/reloaded.expected.md
#	apps/web/tests/snapshots/live-interactions/cancel.expected.md
#	apps/web/tests/snapshots/live-interactions/error-auth.expected.md
#	apps/web/tests/snapshots/live-interactions/retry.expected.md
#	apps/web/tests/snapshots/question-composer/answered.expected.md
#	apps/web/tests/snapshots/queue-actions/editing.expected.md
#	apps/web/tests/snapshots/queue-actions/ui.expected.md
#	apps/web/tests/snapshots/steering/mid-steer.expected.md
#	apps/web/tests/snapshots/steering/settled.expected.md
#	docs/config-catalog.md
#	docs/cordis-catalog/services.md
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	packages/client/runtime/src/client/sessions/session.ts
#	packages/client/runtime/tests/fold-adapter.spec.ts
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.zh.md
#	packages/client/ui-conversation/src/client/chat/ChatView.tsx
#	packages/client/ui-conversation/src/client/chat/MessageItem.module.css
#	packages/client/ui-conversation/src/client/chat/MessageItem.tsx
#	packages/client/ui-conversation/src/client/chat/chat-flow.ts
#	packages/client/ui-conversation/src/client/input/contract.ts
#	packages/client/ui-conversation/src/client/input/facade.ts
#	packages/client/ui-conversation/src/client/input/hub.ts
#	packages/client/ui-conversation/src/client/input/machine.ts
#	packages/client/ui-conversation/tests/apply-inject.spec.tsx
#	packages/client/ui-conversation/tests/chat-branch-tails.spec.tsx
#	packages/client/ui-conversation/tests/chat-view.spec.tsx
#	packages/client/ui-conversation/tests/input-bar.spec.tsx
#	packages/client/ui-conversation/tests/input-machine.spec.ts
#	packages/client/ui-conversation/tests/skeleton.spec.tsx
#	packages/client/ui-reference/README.i18n.yaml
#	packages/client/ui-reference/package.json
#	packages/client/ui-reference/tsconfig.json
#	packages/client/ui-slash/README.i18n.yaml
#	packages/client/ui-slash/README.md
#	packages/client/ui-slash/README.zh.md
#	packages/client/ui-subagent/README.md
#	packages/client/ui-subagent/README.zh.md
#	packages/client/ui-subagent/src/client/index.ts
#	packages/client/ui-subagent/tests/browser-plugin.spec.ts
#	packages/client/ui-trajectory/tests/client-bundle.spec.ts
#	packages/core/session/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/README.md
#	packages/host/apiproxy/README.zh.md
#	packages/host/apiproxy/package.json
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/index.ts
#	packages/host/apiproxy/src/api/sessions.ts
#	packages/host/apiproxy/src/fetch/handler.ts
#	packages/host/apiproxy/src/index.ts
#	packages/ui/tui/src/index.ts
#	packages/ui/tui/tests/tui.spec.ts
#	pnpm-lock.yaml
2026-08-03 19:34:40 +08:00
Yichen Jiang 05b4352fe1 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-07-30 20:24:36 +08:00
Yichen Jiang f91ebab413 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.zh.md
2026-07-30 20:24:06 +08:00
Yichen Jiang 9943451f3a Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	apps/cli/cordis.yml
#	docs/cordis-catalog/services.md
#	docs/event-producer-consumer.md
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.zh.md
#	packages/client/ui-conversation/src/client/chat/MessageItem.module.css
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/index.ts
#	packages/host/apiproxy/src/api/rpc.schema.ts
#	packages/host/apiproxy/src/api/rpc.ts
#	packages/host/apiproxy/src/fetch/handler.ts
#	pnpm-lock.yaml
2026-07-30 20:13:55 +08:00
Yichen Jiang 979e9ca6e7 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	docs/module-graph.md
2026-07-30 10:47:01 +08:00
Yichen Jiang e3d02f3c10 fix(web): deduplicate reference submission paths 2026-07-30 10:43:35 +08:00
Yichen Jiang 04aed3fb5a Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	apps/cli/package.json
#	apps/web/tests/slash-flow.snapshot.ts
#	docs/capability-seams.md
#	docs/cordis-catalog/events.md
#	docs/cordis-catalog/services.md
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/src/client/chat/MessageItem.module.css
#	packages/client/ui-conversation/src/client/chat/MessageItem.tsx
#	packages/client/ui-conversation/tests/chat-branch-tails.spec.tsx
#	packages/client/ui-reference/README.i18n.yaml
#	packages/client/ui-slash/README.i18n.yaml
#	packages/client/ui-slash/README.md
#	packages/client/ui-slash/README.zh.md
#	packages/client/ui-slash/package.json
#	packages/client/ui-slash/src/client/MenuView.tsx
#	packages/client/ui-slash/tsconfig.json
#	packages/client/ui-subagent/README.zh.md
#	packages/context/session-reference/README.i18n.yaml
#	packages/context/session-reference/README.zh.md
#	packages/cordis/tool-cordis/src/api-catalog.ts
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/README.md
#	packages/host/apiproxy/README.zh.md
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/sessions.ts
#	packages/host/apiproxy/src/fetch/handler.ts
#	packages/ui/tui/src/index.ts
#	packages/ui/tui/tests/tui.spec.ts
#	pnpm-lock.yaml
#	scripts/verify-package-readme-model-experience.ts
#	tsconfig.host.json
2026-07-30 10:36:24 +08:00
Yichen Jiang c4bb19dfb0 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.i18n.yaml
#	apps/cli/package.json
#	docs/cordis-catalog/services.md
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	packages/client/connection/src/client/fixture.ts
#	packages/client/connection/tests/fake-api.ts
#	packages/client/runtime/tests/fake-api.ts
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/src/client/input/hub.ts
#	packages/client/ui-conversation/tests/apply-inject.spec.tsx
#	packages/context/session-reference/README.i18n.yaml
#	packages/context/session-reference/tests/session-reference.spec.ts
#	packages/core/session/README.i18n.yaml
#	packages/core/session/README.md
#	packages/core/session/README.zh.md
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/README.md
#	packages/host/apiproxy/README.zh.md
#	packages/host/apiproxy/package.json
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/rpc-map.ts
#	packages/host/apiproxy/src/api/rpc.schema.ts
#	packages/host/apiproxy/src/api/rpc.ts
#	packages/host/apiproxy/src/api/sessions.ts
#	packages/host/apiproxy/src/fetch/client.ts
#	packages/host/apiproxy/src/fetch/handler.ts
#	packages/host/apiproxy/tests/client-handler.spec.ts
#	packages/host/apiproxy/tests/fetch-carrier.spec.ts
#	packages/ui/tui/src/index.ts
#	pnpm-lock.yaml
#	tsconfig.base.json
#	tsconfig.client.json
2026-07-29 10:22:36 +08:00
Yichen Jiang ba4b793d00 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	apps/cli/package.json
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	packages/client/connection/src/client/api.ts
#	packages/client/connection/src/client/index.ts
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/src/client/chat/chat-flow.ts
#	packages/client/ui-conversation/tests/chat-view.spec.tsx
#	packages/core/session/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/README.md
#	packages/host/apiproxy/README.zh.md
#	packages/host/apiproxy/package.json
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/tsconfig.json
#	pnpm-lock.yaml
#	tsconfig.base.json
2026-07-28 18:08:38 +08:00
Yichen Jiang 12f69144a4 fix(web): harden session reference submission 2026-07-28 15:16:36 +08:00
Yichen Jiang 5bc27af7f1 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-25-web-command-surfaces-and-assembly.i18n.yaml
#	.agents/notes/implemented/architecture/2026-07-25-web-command-surfaces-and-assembly.md
#	.agents/notes/implemented/architecture/2026-07-25-web-command-surfaces-and-assembly.zh.md
#	docs/cordis-catalog/events.md
#	docs/event-producer-consumer.md
#	packages/client/ui-slash/README.i18n.yaml
#	packages/client/ui-slash/README.md
#	packages/client/ui-slash/README.zh.md
#	packages/client/ui-subagent/src/client/index.ts
#	packages/client/ui-subagent/tests/browser-plugin.spec.ts
2026-07-28 15:11:43 +08:00
Yichen Jiang ffcedc9fcc Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-07-28 11:38:32 +08:00
Yichen Jiang 1d3b36d0a6 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.md
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.zh.md
#	packages/context/session-reference/README.i18n.yaml
2026-07-28 11:37:59 +08:00
Yichen Jiang 2a549c244c Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.md
#	.agents/notes/implemented/feature/2026-07-21-cross-session-references.zh.md
#	docs/config-catalog.md
#	docs/cordis-catalog/events.md
#	docs/cordis-catalog/services.md
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	packages/client/connection/src/client/api.ts
#	packages/client/connection/src/client/index.ts
#	packages/client/runtime/src/client/sessions/conversation.ts
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/src/client/chat/MessageItem.module.css
#	packages/client/ui-conversation/src/client/chat/MessageItem.tsx
#	packages/client/ui-conversation/tests/chat-branch-tails.spec.tsx
#	packages/context/file-reference-local/src/search.ts
#	packages/context/file-reference-local/tests/search.spec.ts
#	packages/core/session/src/index.ts
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/fetch/handler.ts
#	packages/ui/tui/src/chat/file-autocomplete.ts
#	packages/ui/tui/src/file-autocomplete.ts
#	packages/ui/tui/src/index.ts
#	packages/ui/tui/tests/tui.spec.ts
#	scripts/verify-package-readme-model-experience.ts
#	tsconfig.client.json
2026-07-28 11:33:33 +08:00
Yichen Jiang ad3632f122 feat(web): add file and session references 2026-07-27 15:25:33 +08:00
7658 changed files with 415060 additions and 142781 deletions

No files matched your search

+1 -1
View File
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/README.md
README.md: ae8e4724d610c97d74910d7dec5c95af69e93281
README.zh.md: a16403ae87cd16d758b8303f42f60ad34b9c1eb3
README.zh.md: 8cecc7068d9efc5e2ebb78d2301d03633f70f137
+7 -5
View File
@@ -16,13 +16,13 @@
文件名中的日期是该主题**首次提出**的时间(以 git 历史为准)。Agent Note 之间的交叉引用使用相对 Markdown 链接(`[topic](../../implemented/architecture/2026-…-….md)`),从不使用纯文字或编号,这样既可机械检查,也能在文件夹间移动时保持有效。
活跃生命周期目录树就是工作清单:浏览其生命周期/类别文件夹,或搜索仓库即可。请勿添加集中式 `INDEX.md`;设计理由见[不设索引的 Agent Note](implemented/process/2026-07-19-remove-generated-agent-note-index.md)。未来指导价值较低的已实施记录会移至下文所述、单独冻结的 [`archived/`](archived/AGENTS.md) 目录树。
活跃生命周期目录树就是工作清单:浏览其生命周期/类别文件夹,或搜索仓库即可。请勿添加集中式 `INDEX.md`;设计理由见[不设索引的 Agent Note](implemented/process/2026-07-19-remove-generated-agent-note-index.zh.md)。未来指导价值较低的已实施记录会移至下文所述、单独冻结的 [`archived/`](archived/AGENTS.md) 目录树。
<a id="classification"></a>
## 分类
每份 Agent Note 属于 `scripts/agent-note-tree.ts` 中封闭集合里的一个路径编码类别;分类门禁拒绝其他文件夹。新增类别需要同时更新规范集合与本节。见[分类 Agent Note](implemented/process/2026-06-20-agent-note-classification.md)。
每份 Agent Note 属于 `scripts/agent-note-tree.ts` 中封闭集合里的一个路径编码类别;分类门禁拒绝其他文件夹。新增类别需要同时更新规范集合与本节。见[分类 Agent Note](implemented/process/2026-06-20-agent-note-classification.zh.md)。
| 类别 | 覆盖范围 |
|---|---|
@@ -41,7 +41,9 @@
归档路径编码为 `archived/{class}/yyyy-mm-dd-topic-title.md`;其中有意省略 `implemented`,因为只有 implemented Agent Note 可以进入归档。归档变更会移动完整的英文、中文和伴随记录三个文件,保留 `Status: implemented`,在两种语言的文件中紧接该状态行插入相同的 `Archived: YYYY-MM-DD` 行,重新记录伴随记录,并修复或删除入站链接。归档时只允许对内容做这些更改。
封存后,每组归档文件都永久冻结。禁止编辑、翻译、重新格式化、更新、移动或删除,也不得将其视为当前行为的权威依据。文档门禁会跳过归档源文件,包括其中的出站链接;当活跃文档有意引用历史时,仍可链接到归档 Agent Note。[`verify-archived-agent-notes`](../../scripts/verify-archived-agent-notes.ts) 强制执行封闭的类别目录树、完整的三文件配对、归档元数据、伴随记录 hash,以及仅追加的冻结内容 manifest(元数据清单)。[归档政策 Agent Note](implemented/process/2026-07-26-frozen-agent-note-archive.md) 记录了设计依据。
封存后,每组归档文件都永久冻结。禁止编辑、翻译、重新格式化、更新、移动或删除,也不得将其视为当前行为的权威依据。文档门禁会跳过归档源文件,包括其中的出站链接;当活跃文档有意引用历史时,仍可链接到归档 Agent Note。[`verify-archived-agent-notes`](../../scripts/verify-archived-agent-notes.ts) 强制执行封闭的类别目录树、完整的三文件配对、归档元数据、伴随记录 hash,以及仅追加的冻结内容 manifest(元数据清单)。[归档政策 Agent Note](implemented/process/2026-07-26-frozen-agent-note-archive.zh.md) 记录了设计依据。
<a id="when-to-write-one"></a>
## 何时需要写一份
@@ -57,7 +59,7 @@
## 文件格式
每份活跃 Agent Note 遵循统一的文件内格式,由 `pnpm run verify-agent-note-format`([scripts/verify-agent-note-format.ts](../../scripts/verify-agent-note-format.ts),`doc-sync`(文档同步门禁)的一环)强制执行;该格式的设计动机及其否决的替代方案见[统一格式 Agent Note](implemented/process/2026-07-05-uniform-agent-note-format.md)。归档记录保留封存时的格式,并增加上述归档日期行。
每份活跃 Agent Note 遵循统一的文件内格式,由 `pnpm run verify-agent-note-format`([scripts/verify-agent-note-format.ts](../../scripts/verify-agent-note-format.ts),`doc-sync`(文档同步门禁)的一环)强制执行;该格式的设计动机及其否决的替代方案见[统一格式 Agent Note](implemented/process/2026-07-05-uniform-agent-note-format.zh.md)。归档记录保留封存时的格式,并增加上述归档日期行。
### 头部块
@@ -126,4 +128,4 @@ Status: <status>
### 中文对侧文件
`.zh.md` 对侧文件按 [i18n 约定](../../docs/i18n/README.md)逐章节与其英文对侧文件保持相同结构;机器检查的头部标记(`# Agent Note: ` 和 `Status:` 行)保持英文原样不翻译。格式门禁跳过 `.zh.md` 文件;配对门禁检查它们的一致性。
`.zh.md` 对侧文件按 [i18n 约定](../../docs/i18n/README.zh.md)逐章节与其英文对侧文件保持相同结构;机器检查的头部标记(`# Agent Note: ` 和 `Status:` 行)保持英文原样不翻译。格式门禁跳过 `.zh.md` 文件;配对门禁检查它们的一致性。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-19-gui-layering-and-rpc-protocol.md
2026-07-19-gui-layering-and-rpc-protocol.md: b27d8d024612d890819bfca9b43c0c81464dfdd3
2026-07-19-gui-layering-and-rpc-protocol.zh.md: 3cf4ba6421c7332c1f8cebb61656a1546f3ad45f
@@ -1,6 +1,7 @@
# Agent Note: GUI layering and the RPC protocol — host/client layering by capability provider, the four-quadrant message model, and the fetch carrier
Status: implemented
Archived: 2026-08-27
English | [中文](2026-07-19-gui-layering-and-rpc-protocol.zh.md)
@@ -26,7 +27,7 @@ Directories layer as follows:
- `packages/host/*`: packages provide host-side capability only (representing the Node.js engineering core built on the existing harness plugin system), and additionally
- the unified backend protocol (fetch, HTTP, streaming interfaces…) — definitions and support, see the "Message protocol" sections below
- `packages/client/*`: packages provide client-side capability only; every package stays single-sided. Three kinds live here (the axes are owned by the [client plugin loading note](2026-07-23-client-plugin-loading-model.md)):
- **Pure libraries** (`ui-slots`, `web-react`, `ui-primitives`, plus the `loader` kernel package): ordinary root-index packages, statically bundled into the shell; the first three are seeded into the module table.
- **Pure libraries** (`ui-slots`, `ui-primitives`, plus the `loader` kernel package): ordinary root-index packages, statically bundled into the shell; the two client libraries are seeded into the module table.
- **Static-arrival entry packages** (`connection`, `runtime`, `ui-theme`, `i18n`, `hmr`): no `dsh.client` key and no browser bundle — the shell bundles their `src/client/` half and registers it with `ctx.modules`; they are governed as entries of the host-authored graph like everything else.
- **Fetch-arrival plugin packages** (`ui-layout`, `ui-sidebar`, `ui-conversation`, `ui-trajectory`): dual-entry — the root index is the node half (an empty `apply`, existing so the host Loader governs lifecycle and the web plugin registry discovers the package.json `dsh.client` declaration); the implementation lives under `src/client/`, shipped as the `./client` subpath (a tsdown closure-factory bundle). Cross-plugin consumption of `/client` is type-only; value cooperation goes through cordis services.
- `apps/` holds the externally exported applications, assembled from Client / Host mixtures.
@@ -39,7 +40,7 @@ apps/* (applications: apps/web = vite app, apps/cli = bin dispatch)
│ consume
▼
packages/host/* packages/client/*
apiproxy front layer: protocol pure libs: ui-slots / web-react / ui-primitives
apiproxy front layer: protocol pure libs: ui-slots / ui-primitives
runtime assembly / host entity dsh.client plugins ×8 (node half = empty apply,
webserver Web HTTP carriage client half = src/client/)
│ ctx.plugin(...) ▲ import only apiproxy's /api /client subpaths
@@ -65,8 +66,8 @@ On the protocol side: TS interfaces (`packages/host/apiproxy/src/api/`, zero Nod
| Front layer | `dsh-host-apiproxy` | TS/zod definitions (api/) + the fetch abstraction (fetch/: handler + client base class) | Keep it simple — every consumer needs it; importable from Node and browser alike; protocol content in the "Message protocol" sections below; clients must not bypass api through ctx |
| Assembly layer | `dsh-host-runtime` | Plugin composition + ApiProxy integration + the web UI plugin mount (in-memory Loader tree over the eight dsh.client packages); home of host-level configuration (defaults/persistenceRoot, future user profile) | Which plugins mount and with what defaults is decided only here; shells must not alter the assembly |
| Carrier layer | `dsh-host-webserver` | Web HTTP and upgrade: static serving + `/api/*`→handler forwarding + WebSocket upgrade route + close semantics; plugin bundle endpoint + `__DSH_BOOT__` manifest injection (fed by the web plugin registry) | Web (browser access) only; zero workspace dependencies (the registry arrives by structural injection); Electron does not reuse it |
| Client libraries | `dsh-client-ui-slots` / `dsh-client-web-react` / `dsh-client-ui-primitives` | Slot registry core / ctx↔React glue / pure React atoms | Zero cordis runtime dependency in components; seeded into the loader module table by the shell |
| Client plugins | `dsh-client-connection` / `dsh-client-runtime` / `dsh-client-ui-theme` / `dsh-client-i18n` / `dsh-client-ui-layout` / `dsh-client-ui-sidebar` / `dsh-client-ui-conversation` / `dsh-client-ui-trajectory` | Browser-side cordis plugin tree (wire consumer, core services, theme, i18n, layout, sidebar, conversation, trajectory) — see the web client architecture note | Dual entry (node half = empty apply; implementation in `src/client/`); the consumption face goes exclusively through ApiProxy |
| Client libraries | `dsh-client-ui-slots` / `dsh-client-ui-primitives` | Slot contracts / pure React atoms | Seeded into the loader module table by the shell |
| Client plugins | `dsh-client-connection` / `dsh-client-runtime` / `dsh-client-ui-theme` / `dsh-client-ui-renderer` / feature UI packages | Browser-side Cordis plugin tree: wire consumer, core services, theme, React rendering, and feature composition — see the web client architecture note | Dual entry (node half = empty apply; implementation in `src/client/`); cross-plugin value cooperation uses services and slots |
| Application | `@deepseek-ai/dsh` (apps/cli) + `dsh-web-frontend` (apps/web, the vite application) | Coarse bin dispatch + one assembly module per application (web.ts / headless.ts); the vite app is a thin main over the `dsh-client-web` shell surface | Applications use dynamic imports so they never load each other; workspace knowledge like dist location stays in the app |
#### Naming rule
@@ -209,7 +210,7 @@ The same domain tree as `ApiProxy`, but unary methods **take the business payloa
### The instance-level envelope observation aspect
All four quadrant full forms pass through `onEnvelope`; the base implementation is an **instance-owned microtask-batched buffer** (frame storms must not disturb consumers per frame; module-level state would leak across instances/tests, hence instance-owned). Observers subscribe via `subscribeEnvelopes(listener)` (receiving whole batches as `readonly RpcMessage[]`, returning an unsubscribe function); a listener throw is isolated (observation must never bite the carrier). With no subscribers the buffering costs nothing. No shipped consumer subscribes today — the aspect is the designated seat for wire diagnostics (the retired RPC debug panel was its first consumer, and a future one plugs in without touching the carrier).
All four quadrant full forms pass through `onEnvelope`; the base implementation is an **instance-owned microtask-batched buffer** (frame storms must not disturb consumers per frame; module-level state would leak across instances/tests, hence instance-owned). Observers subscribe via `subscribeEnvelopes(listener)` (receiving whole batches as `readonly RpcMessage[]`, returning an unsubscribe function); a listener throw is isolated (observation must never bite the carrier). With no subscribers the buffering costs nothing. No shipped consumer subscribes — the aspect is the designated seat for wire diagnostics (the retired RPC debug panel was its first consumer, and a future one plugs in without touching the carrier).
### The subclass table (transport carriage)
@@ -1,10 +1,11 @@
# Agent Note: GUI 分层与 RPC 协议——host/client 按能力提供方分层、四象限消息模型与 fetch 载体
Status: implemented
Archived: 2026-08-27
[English](2026-07-19-gui-layering-and-rpc-protocol.md) | 中文
> 分工线:本篇 = 分层模型 + 通道无关的 RPC 协议;协议的 Web 实现由 HTTP 上行加 [WebSocket 下行载体](2026-08-04-websocket-downlink-carrier.md)组成,浏览器对象层见 [Web 客户端架构笔记](2026-07-19-gui-web-client-architecture.md)。
> 分工线:本篇 = 分层模型 + 通道无关的 RPC 协议;协议的 Web 实现由 HTTP 上行加 [WebSocket 下行载体](2026-08-04-websocket-downlink-carrier.zh.md)组成,浏览器对象层见 [Web 客户端架构笔记](2026-07-19-gui-web-client-architecture.zh.md)。
## Problem
@@ -23,13 +24,13 @@ Status: implemented
目录按照如下分层:
- `packages/host/*`:包只提供 Host 侧能力(代表了以现在 Harness 实体插件系统为主体的 Node.js 代码核心工程),除此之外,还包含
- 统一后端协议(fetch、HTTP、流式接口等)定义和支持,见本篇「消息协议」起各节
- `packages/client/*`:包只提供 Client 侧能力,每包单边不混。这里住三类包(两条轴归 [client 插件装载笔记](2026-07-23-client-plugin-loading-model.md) 所有):
- **纯库**(`ui-slots`、`web-react`、`ui-primitives`,外加内核包 `loader`):普通根入口包,静态打包进壳;前三者播种进模块表。
- `packages/client/*`:包只提供 Client 侧能力,每包单边不混。这里住三类包(两条轴归 [client 插件装载笔记](2026-07-23-client-plugin-loading-model.zh.md) 所有):
- **纯库**(`ui-slots`、`ui-primitives`,外加内核包 `loader`):普通根入口包,静态打包进壳;两个客户端库播种进模块表。
- **静态到达 entry 包**(`connection`、`runtime`、`ui-theme`、`i18n`、`hmr`):无 `dsh.client` 键、无浏览器 bundle——壳把它们的 `src/client/` 半边打进自己的 bundle 并向 `ctx.modules` 登记;它们与其余单元一样,作为 host 独家撰写的图里的 entry 受治理。
- **fetch 到达插件包**(`ui-layout`、`ui-sidebar`、`ui-conversation`、`ui-trajectory`):双入口——根入口是 node 半边(空 `apply`,其存在是为了让 host Loader 管辖生命周期、让 web 插件注册表发现 package.json 的 `dsh.client` 声明);实现住在 `src/client/` 下,经 `./client` 子路径发布(tsdown 闭包工厂 bundle)。跨插件消费 `/client` 只限类型;值层面的协作走 cordis 服务。
- `apps/` 作为对外导出的应用入口,可以由 Client / Host 混合组装。
- `apps/web`(`dsh-web-frontend`)是 vite 应用:`dsh-client-web` 导出的壳 API 之上的一层薄 `main.ts`。
- `apps/cli`(`@deepseek-ai/dsh`)分发命令:`dsh web` = Host + webserver + 构建出的 `dsh-web-frontend` dist;`dsh --profile headless` = [直接使用核心 Agent/Session 的入口](2026-08-09-headless-direct-core-entry-point.md),不含 Host、HTTP 或浏览器层。
- `apps/cli`(`@deepseek-ai/dsh`)分发命令:`dsh web` = Host + webserver + 构建出的 `dsh-web-frontend` dist;`dsh --profile headless` = [直接使用核心 Agent/Session 的入口](2026-08-09-headless-direct-core-entry-point.zh.md),不含 Host、HTTP 或浏览器层。
- 将来的 Electron 应用经由 IPC fetch 载体复用同一套 web client 包。
```
@@ -37,7 +38,7 @@ apps/* (applications: apps/web = vite app, apps/cli = bin dispatch)
│ consume
▼
packages/host/* packages/client/*
apiproxy front layer: protocol pure libs: ui-slots / web-react / ui-primitives
apiproxy front layer: protocol pure libs: ui-slots / ui-primitives
runtime assembly / host entity dsh.client plugins ×8 (node half = empty apply,
webserver Web HTTP carriage client half = src/client/)
│ ctx.plugin(...) ▲ import only apiproxy's /api /client subpaths
@@ -50,9 +51,9 @@ harness core packages ──────────────────┘
- `runtime → apiproxy` 单向;apiproxy 仅依赖类型定义。
- client 侧包**永不 import** host 侧包的运行时(只吃 `/api`、`/client` 两个浏览器安全子路径)。
- `webserver` 不依赖 `runtime`:它提供 `{ fetch }` 特定实现 ——「webserver ← runtime」只是运行时注入关系,不是包依赖。
- client 侧跨包 import 插件包一律走 `/client` 子路径,且插件包之间只限类型 import——跨插件值 import 在 tsdown 纯度门禁处即构建错误(值层面的协作走 cordis 服务;边规则归 [client 插件装载笔记](2026-07-23-client-plugin-loading-model.md) 所有)。
- client 侧跨包 import 插件包一律走 `/client` 子路径,且插件包之间只限类型 import——跨插件值 import 在 tsdown 纯度门禁处即构建错误(值层面的协作走 cordis 服务;边规则归 [client 插件装载笔记](2026-07-23-client-plugin-loading-model.zh.md) 所有)。
TypeScript 以 solution 根引用的**两个聚合 program** 检查(`tsconfig.json` = solution;`tsconfig.host.json` = host 侧 + 测试,排除 `packages/client`;`tsconfig.client.json` = client 各包及其测试):两侧在相同键(`sessions`、`loader`)下以不同服务合并 cordis `Context` 接口,单一 program 会同时看到两份声明合并而报冲突。共享叶子包(session/llm/tools/apiproxy 等)只构建一次,由两个 program 共同引用([拓扑](../process/2026-07-22-tsconfig-solution-root-two-aggregates.md))。
TypeScript 以 solution 根引用的**两个聚合 program** 检查(`tsconfig.json` = solution;`tsconfig.host.json` = host 侧 + 测试,排除 `packages/client`;`tsconfig.client.json` = client 各包及其测试):两侧在相同键(`sessions`、`loader`)下以不同服务合并 cordis `Context` 接口,单一 program 会同时看到两份声明合并而报冲突。共享叶子包(session/llm/tools/apiproxy 等)只构建一次,由两个 program 共同引用([拓扑](../process/2026-07-22-tsconfig-solution-root-two-aggregates.zh.md))。
协议侧:TS interface(`packages/host/apiproxy/src/api/`,零 Node 依赖,浏览器可 import);wire 消息统一为**双向模型**——每条逻辑消息按「谁发起 × request/response」分类(两轴四格,后文称四象限),与物理通道解耦;客户端统一继承 `AbstractApiClient`(协议不变量全在基类,平台差异只是 `doFetch` 传输切面)。
@@ -63,8 +64,8 @@ TypeScript 以 solution 根引用的**两个聚合 program** 检查(`tsconfig.
| 前置层 | `dsh-host-apiproxy` | TS/zod 定义 (api/)+ fetch 抽象 (fetch/:handler + 客户端基类) | 做简单、每个消费方都要;Node/浏览器皆可 import;协议内容见下文「消息协议」起各节;client 不得经 ctx 绕开 api |
| 装配层 | `dsh-host-runtime` | 插件组合 + ApiProxy 集成 + web UI 插件挂载(覆盖八个 dsh.client 包的内存 Loader 树);host 级配置归属地(defaults/persistenceRoot,将来用户 profile) | 装什么插件、给什么默认值只在这里定;壳不得改装配 |
| 承载层 | `dsh-host-webserver` | Web HTTP 与 upgrade:静态服务 + `/api/*`→handler 转发 + WebSocket upgrade route + close 语义;插件 bundle 端点 + `__DSH_BOOT__` manifest(元数据清单)注入(由 web 插件注册表供给) | Web(浏览器访问)专用;零 workspace 依赖(注册表经结构注入到达);Electron 不复用它 |
| client 库 | `dsh-client-ui-slots` / `dsh-client-web-react` / `dsh-client-ui-primitives` | slot 注册表核心 / ctx↔React 胶合 / 纯 React 原子组件 | 组件零 cordis 运行时依赖;由壳播种进 loader 模块表 |
| client 插件 | `dsh-client-connection` / `dsh-client-runtime` / `dsh-client-ui-theme` / `dsh-client-i18n` / `dsh-client-ui-layout` / `dsh-client-ui-sidebar` / `dsh-client-ui-conversation` / `dsh-client-ui-trajectory` | 浏览器侧 cordis 插件树(wire 消费方、核心服务、主题、i18n、布局、侧栏、对话、轨迹)——见 Web 客户端架构笔记 | 双入口(node 半边=空 apply;实现在 `src/client/`);消费面唯一经 ApiProxy |
| client 库 | `dsh-client-ui-slots` / `dsh-client-ui-primitives` | slot 约定 / 纯 React 原子组件 | 由壳播种进 loader 模块表 |
| client 插件 | `dsh-client-connection` / `dsh-client-runtime` / `dsh-client-ui-theme` / `dsh-client-ui-renderer` / 功能 UI 包 | 浏览器侧 Cordis 插件树:wire 消费方、核心服务、主题、React 渲染与功能组合——见 Web 客户端架构笔记 | 双入口(node 半边=空 apply;实现在 `src/client/`);跨插件值协作经服务与 slot 完成 |
| 应用 | `@deepseek-ai/dsh`(apps/cli)+ `dsh-web-frontend`(apps/web,vite 应用) | bin 粗分发 + 每个应用一个拼装模块(web.ts / headless.ts);vite 应用是 `dsh-client-web` 壳表面之上的薄 main | 各应用使用动态 import,因此不会互相加载;dist 定位等 workspace 知识留在 app |
#### 命名规则
@@ -167,7 +168,7 @@ export type ResponseValue<K> =
### 帧(server→client,具名 union)
两条逻辑流:mux 流(`/api/events.mux`,全 session 聚合)与 host 流(`/api/events.host`,host 级事件)。浏览器通过每流一条下行 WebSocket 消费,进程内 fetch 载体以 SSE 保持同构;物理边界见 [WebSocket 下行载体](2026-08-04-websocket-downlink-carrier.md)。帧示例一行:
两条逻辑流:mux 流(`/api/events.mux`,全 session 聚合)与 host 流(`/api/events.host`,host 级事件)。浏览器通过每流一条下行 WebSocket 消费,进程内 fetch 载体以 SSE 保持同构;物理边界见 [WebSocket 下行载体](2026-08-04-websocket-downlink-carrier.zh.md)。帧示例一行:
| 帧 type | 载荷 | 何时发 |
|---|---|---|
@@ -207,14 +208,14 @@ export type ResponseValue<K> =
### 实例级 envelope 观测切面
四象限全形均过 `onEnvelope`;基类实现是**实例持有的微任务合批缓冲**(帧风暴不逐帧惊扰消费方;模块级状态会跨实例/测试泄漏,故实例持有)。观测者经 `subscribeEnvelopes(listener)` 订阅(收整批 `readonly RpcMessage[]`,返回退订函数);listener 抛异常被隔离(观测不得反噬载体)。无订阅者时零缓冲成本。当前没有任何现役消费方订阅——该切面是 wire 诊断的预留位(已退役的 RPC 调试面板是它的首个消费方,将来的诊断消费方接入时不动载体)。
四象限全形均过 `onEnvelope`;基类实现是**实例持有的微任务合批缓冲**(帧风暴不逐帧惊扰消费方;模块级状态会跨实例/测试泄漏,故实例持有)。观测者经 `subscribeEnvelopes(listener)` 订阅(收整批 `readonly RpcMessage[]`,返回退订函数);listener 抛异常被隔离(观测不得反噬载体)。无订阅者时零缓冲成本。没有任何已交付消费方订阅——该切面是 wire 诊断的预留位(已退役的 RPC 调试面板是它的首个消费方,将来的诊断消费方接入时不动载体)。
### 子类表(传输承载)
| 子类 | 所在包 | doFetch | 用途 |
|---|---|---|---|
| `InProcessApiClient` | apiproxy 本包 | 注入的 `{ fetch }` handler | **同构点**:`new InProcessApiClient(toFetchHandler(api))` 全程不过网络但真跑 wire 序列化/zod/SSE 帧;载体测试与调用方可以在不打开端口的情况下运行这套协议,而产品 `dsh --profile headless` 直接驱动 core |
| `WebApiClient` | dsh-client-connection | `globalThis.fetch` 上行 + 每逻辑流一条同源 WebSocket 下行 | 浏览器客户端;物理边界见 [WebSocket 下行载体](2026-08-04-websocket-downlink-carrier.md) |
| `WebApiClient` | dsh-client-connection | `globalThis.fetch` 上行 + 每逻辑流一条同源 WebSocket 下行 | 浏览器客户端;物理边界见 [WebSocket 下行载体](2026-08-04-websocket-downlink-carrier.zh.md) |
| `FixtureApiClient` | dsh-client-connection | 不用(协议层覆写) | 无 server 的 UI 开发(`?fixture`):覆写 `callUnary`/`openMux`/`openHost`/`respond` 虚方法,自己就是假 server(帧 rpcId 由它 mint,语义自洽) |
| IPC 桥子类(假想示例——尚无此形态) | Electron 壳 | IPC 序列化往返 | 只需换 doFetch,约定/基类零改 |
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-08-04-websocket-downlink-carrier.md
2026-08-04-websocket-downlink-carrier.md: 5edcdd95cf2845d455a61930a9fc00e7e57e72eb
2026-08-04-websocket-downlink-carrier.zh.md: 213697effb8655583e7c420e58acfd171261a8d8
@@ -1,6 +1,7 @@
# Agent Note: WebSocket carrier for browser downlinks
Status: implemented
Archived: 2026-08-27
English | [中文](2026-08-04-websocket-downlink-carrier.zh.md)
@@ -16,7 +17,7 @@ WebSocket carries only the host→browser downlink. All client→host unary call
## Upgrade and lifecycle boundaries
`dsh-host-webserver` provides an exact upgrade-route registration point alongside ordinary routes, dispatches Node upgrade sockets by pathname only, contains raw-socket errors, and waits for surviving upgraded connections to close during server teardown; it knows nothing about Harness frames or WebSocket messages. `dsh-client-connection` owns the WebSocket handshake, frame output, and stream cancellation, and reuses the `/api` Host/Origin trust fence before upgrade. An untrusted authority or cross-origin Origin is rejected before `ctx.apiProxy.events.*` starts.
`dsh-host-webserver` provides an exact upgrade-route registration point alongside ordinary routes, dispatches Node upgrade sockets by pathname only, contains raw-socket errors, and waits for surviving upgraded connections to close during server teardown; it knows nothing about Harness frames or WebSocket messages. `dsh-client-connection` owns the WebSocket handshake, frame output, and stream cancellation. Before upgrade it applies the `/api` Host/Origin checks followed by the same signed browser-cookie authentication as unary HTTP. An untrusted authority or cross-origin Origin receives 403; a trusted but unauthenticated request receives 401; neither starts a Remote stream.
A browser abort or socket close cancels the corresponding host stream; plugin teardown also waits for that source iterator's cleanup. If a host stream throws midway, the carrier sends one existing `stream/error` frame and then closes the socket; the client treats that frame as connection loss rather than delivering it to a business sink. Each WebSocket reports open independently, and the existing readiness handshake still waits until mux and host are both open and the `host.describe` HTTP call has succeeded before publishing connected.
@@ -1,6 +1,7 @@
# Agent Note: 浏览器下行 WebSocket 载体
Status: implemented
Archived: 2026-08-27
[English](2026-08-04-websocket-downlink-carrier.md) | 中文
@@ -16,7 +17,7 @@ WebSocket 只承担 host→browser 下行。所有 client→host unary 调用和
## Upgrade 与生命周期边界
`dsh-host-webserver` 提供与普通 route 并列的精确 upgrade-route 注册点,只按 pathname 分发 Node upgrade socket,隔离原始 socket 错误,并在 server teardown 期间等待仍存活的升级连接关闭;它不认识 Harness 帧或 WebSocket 消息。`dsh-client-connection` 拥有 WebSocket handshake、frame 写出和流取消,并在 upgrade 前复用 `/api` 的 Host/Origin 信任栅栏。未受信任的 authority 或跨来源 Origin 在 `ctx.apiProxy.events.*` 启动前即被拒绝。
`dsh-host-webserver` 提供与普通 route 并列的精确 upgrade-route 注册点,只按 pathname 分发 Node upgrade socket,隔离原始 socket 错误,并在 server teardown 期间等待仍存活的升级连接关闭;它不认识 Harness 帧或 WebSocket 消息。`dsh-client-connection` 拥有 WebSocket handshake、frame 写出和流取消。upgrade 前先执行 `/api` Host/Origin 校验,再执行与一元 HTTP 相同的签名浏览器 cookie 认证。未受信任的 authority 或跨来源 Origin 得到 403;Host 可信但未认证的请求得到 401;两者都不会启动 Remote stream。
浏览器 abort 或 socket close 会取消对应的 host 流;插件 teardown 还会等待该 source iterator 完成清理。host 流中途抛错时,载体发送一个现有的 `stream/error` frame 后关闭 socket;客户端把该 frame 收敛为连接丢失,不投递给业务 sink。每条 WebSocket 独立报告 open,既有 readiness handshake 仍等待 mux、host 都 open 且 `host.describe` HTTP 调用成功后才发布 connected。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-11-plugin-settings-tabs.md: 1f1701e000b891b4fc00bc666f603ee00bae50a7
2026-08-11-plugin-settings-tabs.zh.md: f76a4a9e2317eb6603b48e1a7e451abdc55e00ff
@@ -1,6 +1,7 @@
# Agent Note: Feature-owned tabs in Plugins settings
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-11-plugin-settings-tabs.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: “插件”设置中的功能自有标签页
Status: implemented
Archived: 2026-08-22
[English](2026-08-11-plugin-settings-tabs.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.md
2026-07-31-composer-text-layers-share-one-scrollport.md: eb50673bb5fac50e12b0325c22c67072e130efb6
2026-07-31-composer-text-layers-share-one-scrollport.zh.md: f0af130d34682fcdfe145eb73b18187ca316c0d2
@@ -1,6 +1,7 @@
# Agent Note: The composer's two text layers share one scrollport
Status: implemented
Archived: 2026-08-20
English | [中文](2026-07-31-composer-text-layers-share-one-scrollport.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: composer 的两层文本共用同一个滚动容器
Status: implemented
Archived: 2026-08-20
[English](2026-07-31-composer-text-layers-share-one-scrollport.md) | 中文
@@ -24,7 +25,7 @@ composer 的文本由两层叠放绘制(见 [InputBar](../../../../packages/cl
于是浏览器在同一帧、同一个合成器上,把同一个偏移施加给两层。光标与字形的绑定来自结构本身,而不是来自持续维护:没有代码要跑,没有事件要等,也没有任何状态可能落后一帧。滚轮接力处理器保留,只是从 textarea 改挂到滚动容器上,并且仍是这个盒子上唯一的监听。
Safari 的原生文本控件存在一个引擎例外:跨过软换行阈值的删除可能在镜像层收缩后仍保留原先的行布局。[Safari 软换行恢复](2026-08-13-safari-textarea-soft-wrap-reflow.md)会在绘制前恢复零溢出不变量,而不改变单滚动容器设计。
Safari 的原生文本控件存在一个引擎例外:跨过软换行阈值的删除可能在镜像层收缩后仍保留原先的行布局。[Safari 软换行恢复](2026-08-13-safari-textarea-soft-wrap-reflow.zh.md)会在绘制前恢复零溢出不变量,而不改变单滚动容器设计。
上一版机制所需要的两样东西随它一起消失:
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-04-large-history-pagination-call-stack.md: 12e9bbf72c2eea2058bf83fe864e09b4a520d391
2026-08-04-large-history-pagination-call-stack.zh.md: 288687b05ecdfc2858b4d67e1be199135ea20227
@@ -1,6 +1,7 @@
# Agent Note: Large history provenance is scanned without argument expansion
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-04-large-history-pagination-call-stack.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 大规模历史记录的溯源信息通过扫描处理,不做参数展开
Status: implemented
Archived: 2026-08-22
[English](2026-08-04-large-history-pagination-call-stack.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-06-plan-narrow-viewport-regression.md: c42a110bf487ffab8f5975e65a8eb9bff4f1b0ae
2026-08-06-plan-narrow-viewport-regression.zh.md: 3df4f8aca57a1830d7f8062cefe76ac1afa9c2ce
@@ -0,0 +1,34 @@
# Agent Note: narrow-viewport plan chip click-area regression test
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-06-plan-narrow-viewport-regression.zh.md)
## Problem
The external report dsh-external/issues#107 (clustered internally as deepseek-harness#1406) measured that at viewports between 760px and 850px the plan control and the model selector overlapped, with the model selector covering the plan control's click area so plan mode could not be left by mouse at 800×720. Its acceptance list asked for a browser regression test asserting that the plan center hit-tests to the plan button.
The browser regression test reproduced the report on current master: at 800×720 the plan chip and the model trigger overlapped by 36.9px and the chip's center hit-tested to the trigger's label. The composer control row is `display: flex; justify-content: space-between` with `.trailing { flex: none }`: when the combined control width exceeds the card, the shrinking `.tools` group keeps its flow children inside its `min-width: 0` box, so the chip — the last flow child before the overflow — is painted over the trailing group. The plan-control form changed since the report (select → chip, `c20b988166`/`fe91919346`) and the row gained adaptive behavior (`c8c75ec891`, [web-composer-shared-width-axis](../feature/2026-08-04-web-composer-shared-width-axis.md)), but the row had no wrap, so the overlap survived both.
## Decision
The row wraps instead of shrinking its left group into the right group's area: `.row { flex-wrap: wrap }` plus `margin-left: auto` on `.trailing`, which re-anchors the trailing group (model + send) to the right edge of its wrapped line while `space-between` already pins it right on a single line. Wrapping is the acceptance's "wrap, fold, or re-arrange controls when space runs out" option, keeps every control at full width (no label folding that would hide the model name or the Plan wordmark), and holds at every viewport width by construction instead of at a calibrated container-query threshold.
Add `apps/web/tests/plan-control-row.e2e.ts`: enter plan mode with the real `/plan` command (no argument — the command handler commits plan/mode active without a model round, the lifecycle-chrome precedent), so the test needs no model call in any mode and no API key in replay/refresh; a providers-only fixture mounts the model catalog without a script to consume. The file joins the host-plane e2e pairing like every sibling: excluded from the client graph in `apps/web/tsconfig.json` (it imports host-plane types) AND included in the host aggregate in `tsconfig.host.json`, so exactly one TypeScript program owns it — the pairing that also gives the lint type service its program.
The geometry golden records stable facts — viewport membership on both axes and disjoint click areas — never absolute coordinates, whose pixel values depend on installed fonts and differ between macOS and Linux. The behavior assertions implement the acceptance directly: the click areas are disjoint, the click at the chip's center (Playwright's actionability check) leaves plan mode through the real command channel (`/plan off` via `commands.execute`), and the last `plan/mode` event in the session log flips inactive.
## Alternatives considered
**Seed a cold session (composer-tab-geometry pattern).** Rejected: the exit path executes `/plan off` through `commands.execute`, which needs the live agent a cold seeded session does not have; `connectFreshWorkspace` keeps one, matching the product's user path.
**Pin absolute bounding boxes in the golden.** Rejected: chip and trigger widths depend on the installed fonts, so absolute coordinates would churn across platforms without a behavior change.
**Reuse the plan-review fixture shape (exit_plan_mode review takeover).** Rejected: the takeover replaces the composer's control row, which is the surface under test.
**Container-query label folding for the chip and/or the model trigger.** Rejected for the fix: two packages (ui-plan, ui-model) would need calibrated thresholds and the chip's own icon-only fold still leaves ~7px of overlap at the reported viewport unless the trigger folds too. Wrapping is one rule in one package and holds at every width.
## Consequences
Any future change to the control row layout — fonts, gaps, media or container queries — that re-introduces overlap or moves the chip out of the viewport on either axis fails this test. The test needs no API key in replay/refresh modes: plan mode toggles through the command handler without a model round, and a providers-only replay fixture (no recorded script, consumption check skipped) mounts the model directory so the trigger renders its real long label — the width that made the reported overlap measurable; the test asserts that label before measuring. The golden is compared in replay and record modes and rewritten in refresh mode.
@@ -0,0 +1,34 @@
# Agent Note: 窄视口下 Plan chip 点击区域回归测试
Status: implemented
Archived: 2026-08-22
[English](2026-08-06-plan-narrow-viewport-regression.md) | 中文
## 问题
外部报告 dsh-external/issues#107(内部聚类为 deepseek-harness#1406)测得视口宽度在 760px 到 850px 之间时 Plan 控件与模型选择器发生重叠,模型选择器覆盖 Plan 控件的点击区域,导致在 800×720 下无法用鼠标退出 Plan 模式。其验收清单要求增加浏览器回归测试,断言 Plan 中心命中 Plan 按钮。
浏览器回归测试在当前 master 上复现了报告:800×720 下 Plan chip 与模型 trigger 重叠 36.9px,chip 中心命中 trigger 的 label。composer 控制行是 `display: flex; justify-content: space-between` 且 `.trailing { flex: none }`:当控件总宽超过卡片时,可收缩的 `.tools` 组把流内子项留在 `min-width: 0` 的盒内,于是 chip——溢出前最后一个流内子项——被绘制到 trailing 组上方。报告以来 Plan 控件形态已变(select → chip,`c20b988166`/`fe91919346`),控制行也获得过自适应能力(`c8c75ec891`,[web-composer-shared-width-axis](../feature/2026-08-04-web-composer-shared-width-axis.zh.md)),但该行没有换行,重叠在两次重构后依然存在。
## 决策
控制行换行而不是把左侧组收缩进右侧组的区域:`.row { flex-wrap: wrap }` 加上 `.trailing` 的 `margin-left: auto`——后者把 trailing 组(模型选择 + 发送)重新锚定到换行后的右缘,单行时 `space-between` 已把它钉在右侧。换行是验收中"空间不足时允许换行、折叠或重新排列控件"的选项,保持每个控件全宽(不做会隐藏模型名或 Plan 字样的 label 折叠),并且按构造在所有视口宽度下成立,而非依赖标定的容器查询阈值。
新增 `apps/web/tests/plan-control-row.e2e.ts`:通过真实 `/plan` 命令(无参数——命令 handler 不经模型回合即提交 plan/mode active,lifecycle-chrome 先例)进入 Plan 模式,因此测试在任何模式下都无需模型调用,仅在 replay/refresh 下无需 API key;providers-only fixture 挂载模型目录而无脚本可消费。该文件与所有同类 host 平面 e2e 一样采用成对登记:在 `apps/web/tsconfig.json` 的 exclude 列表(它导入 host 平面类型,client 图绝不编译它),同时在 `tsconfig.host.json` 的 host 聚合 include 中——恰好一个 TypeScript 程序拥有它,这也是 lint 类型服务获得程序的配对方式。
几何 golden 记录稳定事实——两个轴上的视口内位置与点击区域不相交——绝不记录绝对坐标,其像素值依赖安装字体且在 macOS 与 Linux 间不同。行为断言直接实现验收:点击区域不相交、点击 chip 中心(Playwright 的可操作性检查)经真实命令通道(`commands.execute` 执行 `/plan off`)退出 Plan 模式,且会话日志中最后一条 `plan/mode` 事件翻转为 inactive。
## 备选方案
**冷会话 seed(composer-tab-geometry 模式)。** 否决:退出路径经 `commands.execute` 执行 `/plan off`,需要 live agent,而冷 seed 会话没有;`connectFreshWorkspace` 保留一个,与产品的用户路径一致。
**golden 固定绝对 bounding box。** 否决:chip 与 trigger 宽度依赖安装字体,绝对坐标会在平台间漂移而不反映行为变化。
**复用 plan-review fixture 形态(exit_plan_mode review takeover)。** 否决:takeover 会替换 composer 控制行,而被测表面正是控制行。
**chip 与/或模型 trigger 的容器查询 label 折叠。** 否决(作为修复):两个包(ui-plan、ui-model)需要各自标定阈值,且 chip 单独折叠为 icon-only 在报告视口下仍剩约 7px 重叠,除非 trigger 也折叠。换行是一个包中的一条规则,且在所有宽度下成立。
## 后果
任何改变控制行布局的后续改动——字体、间距、媒体查询或容器查询——一旦重新引入重叠或把 chip 沿任一轴移出视口,本测试即失败。测试在 replay/refresh 模式下无需 API key:Plan 模式经命令 handler 切换,不经模型回合;providers-only replay fixture(无录制脚本,跳过消费检查)挂载模型目录,使触发器渲染真实的长标签——正是使报告重叠可测量的宽度;测试在测量前断言该标签。golden 在 replay 与 record 模式下比较,在 refresh 模式下重写。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-11-preset-card-description-clamp.md: b9088b46184cde6f000fa39afbfe2d1145137b24
2026-08-11-preset-card-description-clamp.zh.md: a7a3c4f26a55405715fe017ec3a7deb164432b0e
@@ -1,6 +1,7 @@
# Agent Note: Preset cards clamp their description instead of sizing the roster
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-11-preset-card-description-clamp.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 预设卡片截断自身描述,而不是由描述决定整份名单的高度
Status: implemented
Archived: 2026-08-22
[English](2026-08-11-preset-card-description-clamp.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.md
2026-08-13-safari-textarea-soft-wrap-reflow.md: 45cb3f39c50c72b44b8ae952ce3a861210e9f00a
2026-08-13-safari-textarea-soft-wrap-reflow.zh.md: 37409b010c0009edf3c944076ba8c3db1b140de9
@@ -1,6 +1,7 @@
# Agent Note: Safari textarea soft-wrap shrink recovery
Status: implemented
Archived: 2026-08-20
English | [中文](2026-08-13-safari-textarea-soft-wrap-reflow.zh.md)
@@ -1,12 +1,13 @@
# Agent Note: Safari textarea 软换行收缩恢复
Status: implemented
Archived: 2026-08-20
[English](2026-08-13-safari-textarea-soft-wrap-reflow.md) | 中文
## 问题
composer 把光标与选区留在透明的原生 textarea 中,由 backdrop 绘制可见字形,并由隐藏的镜像层决定完整草稿高度。因此,[单滚动容器决策](2026-07-31-composer-text-layers-share-one-scrollport.md)依赖 textarea 不持有可滚动溢出:每次草稿提交后,它的 `scrollHeight` 与 `clientHeight` 相等,`scrollTop` 为零。
composer 把光标与选区留在透明的原生 textarea 中,由 backdrop 绘制可见字形,并由隐藏的镜像层决定完整草稿高度。因此,[单滚动容器决策](2026-07-31-composer-text-layers-share-one-scrollport.zh.md)依赖 textarea 不持有可滚动溢出:每次草稿提交后,它的 `scrollHeight` 与 `clientHeight` 相等,`scrollTop` 为零。
当 Backspace 让草稿跨过软换行阈值,同时 React 更新镜像层时,Safari 26.5.2 可能保留 textarea 原先的原生行布局。在复现出的两行变一行转换中,镜像层、backdrop、自增高栈和 textarea 盒都变为 28px 高,但 textarea 仍报告 `scrollHeight=52` 与 `scrollTop=20`。光标留在陈旧的原生行中,而 backdrop 已正确绘制为一行。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-20-composer-edit-range-from-selection.md
2026-08-20-composer-edit-range-from-selection.md: 46eaa0add61bdab9fdcb4fcfd0ec08b44481126d
2026-08-20-composer-edit-range-from-selection.zh.md: 73a3903ad6c7c0aad55a35aacc5e1396084b6e7a
@@ -0,0 +1,48 @@
# Agent Note: Composer edits carry the range they applied to
Status: implemented
Archived: 2026-08-20
English | [中文](2026-08-20-composer-edit-range-from-selection.zh.md)
## Problem
The input machine keeps its reference occurrences aligned by reconciling them against one edit range: entries before the range shift, entries after it hold, and an entry the range intersects loses its structured identity and stays behind as ordinary draft text. That last rule is the deliberate meaning of editing inside a reference.
Ordinary typing supplied no range. A controlled textarea's change event carries only the resulting string, so the machine recovered the range by scanning the two drafts for a common prefix and suffix. That recovery is ambiguous whenever the inserted text repeats the text it lands against, and the greedy scan always resolves the ambiguity the same way: it slides the edit as late as the characters allow.
A reference renders as `@` followed by its label, so typing `@` immediately before one produces exactly that collision. The user inserts at the reference's own offset; the scan reports an insertion one character later, inside the reference; reconcile applies the intersect rule and drops the occurrence. Deleting a character in front of such a reference slides the same way.
The draft then still reads correctly to the eye while carrying no structured reference, and submission takes the occurrence-free path that sends the draft verbatim. The host receives the human-facing label instead of the owner's model form and resolves nothing. The serialization guard that exists to prevent exactly this downgrade never runs, because it only fires when an occurrence survives to be serialized.
This became reachable when references [became literal inline text](../feature/2026-07-27-web-file-and-session-references.md). A reference previously occupied one `U+FFFC`, a character no keystroke produces, so the scan had nothing to collide with.
## Decision
`InputBar` records the textarea's selection and `inputType` during `beforeinput` and passes the resulting range to `setDraft`, which the machine already accepts and prefers over its own scan. A textarea exposes the edit no other way — `getTargetRanges()` is empty for form controls.
An edit that replaces a selection reports that selection, and it is the range outright; the inserted length is whatever the draft grew by once the replaced range is accounted for. A caret delete replaces nothing and reports the bare caret, so its range comes from the direction `inputType` names and the number of characters the draft actually lost. The count is measured rather than assumed to be one, because a single caret gesture removes a multi-unit grapheme, a word, or a line just as readily. Chromium, WebKit, and Firefox all report the collapsed caret for `deleteContentBackward` and `deleteContentForward`, and all three derive the same range from it.
Only the `insert` and `delete` families are recorded. A history replay reports wherever the caret happens to sit, which would survive every check while naming the wrong span; ignoring it leaves that path on the scan.
The record is consumed once and cleared. A record whose draft length disagrees with the draft the change reports, a selection past the draft, a shrinking edit over a selection the caret cannot explain, or an undirected delete all yield no range, and the machine falls back to its scan. Paste and the boundary Backspace and Delete gestures already supplied their own ranges and are untouched.
## Testing
Component tests cover the trigger character typed in front of a reference, a caret Backspace, a caret Delete, a caret word delete, and a delete over a selection, asserting in each case that the occurrence survives at the shifted offset. The caret cases fail against the scan-recovered range, and the word case fails against a fixed one-character step.
An assembled browser scenario drives the same gestures as real key presses against the shipped composition, which is the only place the range an engine reports for them can be observed; its golden projects the backdrop's segments, since the decoration layer is aria-hidden and the accessibility tree cannot see the chip. A real composition driven through the browser's IME path reports the composing segment as the selection at every intermediate state, and the reference survives each one.
## Alternatives considered
**Disambiguate the scan with the post-edit caret.** The caret pins which of the textually equivalent readings happened, and the change event already carries it. Rejected because it keeps a reconstruction where an exact fact is available, and it cannot separate the deleted and inserted halves of a replaced selection at all.
**Give references a leading marker no keystroke produces.** A private-use character in place of the literal `@` removes the collision at the representation level, and the reject list for pasted text already names that range. Rejected because it re-adds a character that every serialization, selection, and accessibility path has to strip, to buy what an exact range buys directly, and it would leave ordinary typing reconstructing its range for every other reason.
**Widen reconcile to keep an occurrence when the range only touches its edge.** Rejected because the misattributed offset lands strictly inside the reference, not on its boundary, so the rule change would not reach this defect while making the intersect rule vaguer.
## Consequences
Every native textarea edit that reaches `onChange` now names the range it applied to, so occurrence offsets follow the edit that actually happened rather than one merely consistent with the resulting characters. Draft writes that originate in the facade rather than the DOM — `insertText` and the command-token splices among them — still carry no range and keep the scan, as do the fallbacks above.
The composer now depends on `beforeinput` preceding each value change, and on `inputType` naming the direction of a caret delete. Any future edit path that mutates the value without either silently returns to the scan rather than breaking, which keeps the failure mode the old behavior instead of a wrong range.
@@ -0,0 +1,48 @@
# Agent Note: 输入框的编辑自带它所作用的范围
Status: implemented
Archived: 2026-08-20
[English](2026-08-20-composer-edit-range-from-selection.md) | 中文
## 问题
输入机器靠一个编辑范围来对齐引用 occurrence:范围之前的条目右移,之后的条目不动,被范围相交的条目失去结构化身份、以普通草稿文本留在原地。最后一条是"在引用内部编辑"的刻意含义。
普通打字不提供范围。受控 textarea 的 change 事件只带结果字符串,于是机器靠扫描两份草稿的公共前后缀来还原范围。只要插入的文本与它落点处的文本重复,这个还原就是有歧义的,而贪心扫描永远以同一种方式消解歧义:把编辑尽量往后滑。
引用渲染为 `@` 加标签,所以紧挨着引用前面打一个 `@` 恰好构成这种撞车。用户在引用自身的偏移处插入;扫描报告的插入位置晚一个字符,落在引用内部;reconcile 执行相交规则,删掉这个 occurrence。删除这类引用前面的一个字符会以同样方式滑动。
此时草稿看上去仍然正确,却已不携带任何结构化引用,提交走的是无 occurrence 的那条路,把草稿原样发出。宿主收到的是给人看的标签而不是所有者的模型形式,什么也解析不出来。专为阻止这种降级而存在的序列化守卫从不运行,因为它只在还有 occurrence 需要序列化时才触发。
这条路径是在引用[变成字面内联文本](../feature/2026-07-27-web-file-and-session-references.md)之后才可达的。此前一个引用占据一个 `U+FFFC`——任何按键都打不出的字符,扫描无从撞车。
## 决策
`InputBar` 在 `beforeinput` 期间记录 textarea 的 selection 与 `inputType`,并把由此得到的范围传给 `setDraft`;机器本就接受该参数,并优先于自身的扫描。textarea 没有别的途径暴露这次编辑——`getTargetRanges()` 对表单控件返回空。
替换一段选区的编辑会报告那段 selection,它直接就是范围;插入长度是扣除被替换范围后草稿增长的量。折叠光标的删除不替换任何东西、只报告光标本身,因此它的范围来自 `inputType` 指明的方向加上草稿实际减少的字符数。这个数量是**测量**得到而非假定为 1,因为一次折叠手势同样可能删掉一个多码元字形、一个词或一整行。Chromium、WebKit 与 Firefox 对 `deleteContentBackward` 和 `deleteContentForward` 都报告折叠光标,三者由此推导出相同的范围。
只有 `insert` 与 `delete` 两族会被记录。历史回放报告的是光标当时碰巧所在的位置,那会通过全部校验却指向错误区间;忽略它即让该路径留在扫描上。
记录只消费一次即清空。记录的草稿长度与 change 报告的草稿不符、selection 越过草稿末尾、选区之上出现光标无法解释的收缩、以及方向不明的删除,这几种情况都不产出范围,机器回落到扫描。粘贴以及边界处的 Backspace 与 Delete 手势本就自带范围,未受影响。
## 测试
组件测试覆盖在引用正前方输入触发字符、折叠 Backspace、折叠 Delete、折叠整词删除,以及选区替换式删除,每种都断言 occurrence 在右移后的偏移处存活。折叠类用例在扫描还原的范围下失败,整词用例在固定一字符步长的实现下失败。
组装层浏览器场景以真实按键对已发布组合驱动同样的手势——那是唯一能观察到引擎为这些手势报告何种范围的地方;其 golden 投影的是 backdrop 的分段,因为装饰层是 aria-hidden 的,无障碍树看不到 chip。经浏览器 IME 路径驱动的真实组合在每个中间态都把组合段报告为 selection,引用在每一步都存活。
## 备选方案
**用编辑后的光标位置消解扫描的歧义。** 光标能钉住若干文本等价读法中真正发生的那一种,而 change 事件本就携带它。拒绝:在已有精确事实可用时仍保留一次重建,而且它根本无法把"替换一段选区"拆成删除与插入两半。
**给引用一个按键打不出的前导标记。** 用私有区字符取代字面 `@`,在表示层消除撞车,而粘贴文本的剔除名单本就点名了那个区段。拒绝:为了换取一个精确范围本就能直接换到的东西,却重新引入一个必须在所有序列化、选择和无障碍路径上剥离的字符,而且普通打字仍会因为其他原因继续重建自己的范围。
**放宽 reconcile,让范围只触及边缘时保留 occurrence。** 拒绝:误判出的偏移严格落在引用内部而非边界上,规则放宽够不到这个缺陷,只会让相交规则本身更含糊。
## 后果
每一次经 `onChange` 到达的原生 textarea 编辑现在都指明它作用的范围,因此 occurrence 偏移跟随的是真实发生的编辑,而不是某个仅仅与结果字符一致的编辑。源自 facade 而非 DOM 的草稿写入——`insertText` 和命令 token 的替换等——仍不带范围并保留扫描,上述各类回落同样如此。
输入框由此依赖 `beforeinput` 先于每次取值变更发生,并依赖 `inputType` 指明折叠删除的方向。未来任何绕过其中之一改写取值的编辑路径会静默回落到扫描而不是出错,也就是说失效模式退回旧行为,而不是一个错误的范围。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-20-composer-reference-decoration-keys.md
2026-08-20-composer-reference-decoration-keys.md: 316d45841c658d3d65246fb7425526b10e2f6bf3
2026-08-20-composer-reference-decoration-keys.zh.md: 90ac7c8011bb7f7f45312c25ffccb7dbbbb70505
@@ -0,0 +1,40 @@
# Agent Note: Composer reference decorations key by draft-order ordinal
Status: implemented
Archived: 2026-08-20
English | [中文](2026-08-20-composer-reference-decoration-keys.zh.md)
## Problem
The composer backdrop renders the draft as an array of segments: plain strings, a leading claim-token mark, one element per structured reference, and one mark per plain-text reference range. React reconciles that array by key.
Structured references carry an identity — the occurrence table mints an `occurrenceId` that survives every edit — so their chips key by it. Plain-text reference ranges have no such identity: `scanTextRefs` re-derives them from the draft on every render, and nothing outside that scan remembers a range between two keystrokes.
Keying those ranges by their draft offset made the key change whenever earlier text changed length. React then treated the range as a different element, unmounted the mark with its nested spans and inline glyph, and mounted a replacement. Every character typed or deleted ahead of a reference rebuilt every reference after the caret, and the work grew with the reference count. [Directory-syntax ranges](../feature/2026-07-27-web-file-and-session-references.md) made that path routine: they match on `@path/` syntax without a lexicon, and each one renders an icon.
## Decision
A plain-text reference mark keys by its index in the offset-sorted `textRefs` list, computed where the boundary list is assembled so a skipped boundary cannot shift it. The scan already returns the ranges in draft order, so the ordinal names the render slot a range occupies, which is the only identity a scan-derived range has.
Structured chips keep `occurrenceId`. The two key strategies differ because the two range kinds differ in identity, not by oversight: a range the occurrence table owns keeps its node across reordering, and a range only a scan knows keeps its node across offset shifts.
A range that stops matching the scan still loses its decoration, because it disappears from `textRefs` and the ordinal it held no longer exists.
## Testing
A component test holds the mark element and its glyph, types a character ahead of the range, and asserts the same nodes are still mounted; it then edits the token out of match shape and asserts the decoration is gone. The test fails against an offset-derived key.
## Alternatives considered
**Key by the range text.** Rejected: duplicate references collide on one key, and editing inside a range changes its key, which reintroduces the remount this fixes.
**Give scan-derived ranges an identity table.** Rejected: it adds mutable state whose only consumer is a render key, and the scan would have to diff against the previous draft to maintain it. An edit that breaks a match simply dropping the range on the next scan is what keeps `scanTextRefs` a pure derivation.
**Drop the keys and let React match by position.** Rejected: React requires keys on elements inside an array, and the plain string segments between them already match by index, so an unkeyed element warns without changing the outcome.
## Consequences
Typing ahead of a reference updates text nodes only; the mark and its icon stay mounted. The backdrop's per-keystroke DOM work no longer scales with the number of references in the draft.
Because the key names a position, inserting a reference ahead of existing ones reuses the earlier nodes with new content instead of re-creating them. That is correct for these marks, which hold no focus, selection, or animation state, and it is the condition any future decoration on this layer meets before it keys by ordinal.
@@ -0,0 +1,40 @@
# Agent Note: 输入框引用装饰按草稿顺序序号取 key
Status: implemented
Archived: 2026-08-20
[English](2026-08-20-composer-reference-decoration-keys.md) | 中文
## 问题
输入框 backdrop 把草稿渲染成一组片段:纯文本字符串、开头的 claim token 标记、每个结构化引用一个元素、每个纯文本引用范围一个标记。React 按 key 协调这个数组。
结构化引用带有身份——occurrence 表铸造的 `occurrenceId` 在任何编辑后都保持不变——因此它们的 chip 用它作 key。纯文本引用范围没有这种身份:`scanTextRefs` 在每次渲染时从草稿重新推导它们,扫描之外没有任何东西在两次按键之间记住某个范围。
用草稿偏移量给这些范围取 key,会让前面文本长度一变 key 就变。React 于是把该范围当作另一个元素,卸载带嵌套 span 和内联图标的标记,再挂载一个替代品。在引用前面输入或删除任意字符,都会重建光标之后的每一个引用,工作量随引用数量增长。[目录语法范围](../feature/2026-07-27-web-file-and-session-references.zh.md)让这条路径成为常态:它们按 `@path/` 语法匹配,不依赖 lexicon,而且每个都渲染一个图标。
## 决策
纯文本引用标记以它在按偏移排序的 `textRefs` 列表中的下标作 key,在组装 boundary 列表处计算,因此被跳过的 boundary 不会让它偏移。扫描本身已按草稿顺序返回范围,所以该序号命名的是范围占据的渲染槽位,而这正是扫描推导出的范围唯一拥有的身份。
结构化 chip 保留 `occurrenceId`。两种 key 策略不同,是因为两类范围的身份不同,而非疏漏:occurrence 表拥有的范围在重排后保住自己的节点,只有扫描知道的范围在偏移变化后保住自己的节点。
不再匹配扫描规则的范围仍然失去装饰,因为它从 `textRefs` 中消失,它占据的序号也不复存在。
## 测试
组件测试持有标记元素及其图标,在范围之前输入一个字符,断言仍是同一批节点;随后把 token 编辑成不再匹配的形态,断言装饰消失。该测试在偏移量 key 下失败。
## 备选方案
**按范围文本取 key。** 拒绝:重复引用会撞同一个 key,且在范围内部编辑会改变 key,重新引入本次修复消除的重挂载。
**为扫描推导的范围建立身份表。** 拒绝:这会引入唯一消费者是渲染 key 的可变状态,而且扫描必须与上一版草稿做 diff 才能维护它。破坏匹配的编辑在下一次扫描时直接丢掉该范围,正是这一点让 `scanTextRefs` 保持为纯推导。
**去掉 key,让 React 按位置匹配。** 拒绝:React 要求数组内的元素带 key,而它们之间的纯文本片段本就按下标匹配,因此无 key 元素只会告警,不改变结果。
## 后果
在引用之前输入只更新文本节点;标记及其图标保持挂载。backdrop 每次按键的 DOM 工作量不再随草稿中的引用数量增长。
由于 key 命名的是位置,在已有引用之前插入新引用会以新内容复用先前的节点,而不是重建它们。对这些不持有焦点、选择区或动画状态的标记而言这是正确的,这也是该图层上任何未来装饰按序号取 key 前需要满足的条件。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-24-system-prompt-section-order-ties.md
2026-08-24-system-prompt-section-order-ties.md: d92756e751e893b1d03b8892ef71ff9faac9d2c6
2026-08-24-system-prompt-section-order-ties.zh.md: 4a822b7925a38feb254dbc534fc6153c76a93e19
@@ -0,0 +1,28 @@
# Agent Note: Equal-order system-prompt sections render in activation order
Status: implemented
Archived: 2026-08-25
English | [中文](2026-08-24-system-prompt-section-order-ties.zh.md)
## Problem
`SystemPromptRegistry` sorts sections by `order` with a stable sort, so equal orders render in plugin-activation order. `tool:cordis` and `tool:workflow` both declared `order: 115`, while their activation order varies between clean platform compositions. ACP and SDK snapshot replays could therefore assemble the same sections in a different order from their committed `system-prompt.expected.md` files.
## Decision
Give the affected sequence distinct values without changing its established relative order: `tool:cordis` stays at 115, `tool:workflow` uses 115.5, `tool:ralph` stays at 116, continuable subagent guidance stays at 116.5, and child-report guidance stays at 117. Prompt text and tool schemas remain unchanged.
## Alternatives considered
**Normalize section order in the snapshot harness.** Rejected because the runtime, request header, and model prompt would remain sensitive to activation timing while only the fixture comparison hid the difference.
**Tie-break equal orders by section name in the registry.** Rejected because it would silently reorder every existing tie. Explicit orders keep each model-visible placement local to the contributing plugin.
## Consequences
The Cordis and workflow guidance has a platform-independent order while Ralph remains before continuable subagent and child-report guidance. Prompt-section placements that require a stable relative position need distinct `order` values; other equal-order sections retain activation-order semantics and are outside this decision.
## Testing
The keyless ACP and SDK snapshot replays pin Cordis before workflow and preserve the workflow, Ralph, continuable-subagent, and child-report sequence. The full snapshot suite verifies the refreshed fixtures.
@@ -0,0 +1,28 @@
# Agent Note: 等序系统提示词分段按激活顺序渲染
Status: implemented
Archived: 2026-08-25
[English](2026-08-24-system-prompt-section-order-ties.md) | 中文
## Problem
`SystemPromptRegistry` 使用稳定排序按 `order` 排列分段,因此相同 order 的分段会按插件激活顺序渲染。`tool:cordis` 与 `tool:workflow` 都声明了 `order: 115`,但两者在不同平台的全新组合中激活顺序不同。因此,ACP(Agent Client Protocol)与 SDK 的快照回放可能把相同分段组装成不同于已提交 `system-prompt.expected.md` 文件的顺序。
## Decision
在不改变既有相对顺序的前提下,为受影响的分段序列指定互不相同的 order:`tool:cordis` 保持 115,`tool:workflow` 使用 115.5,`tool:ralph` 保持 116,可继续运行的子代理指引保持 116.5,子代理报告指引保持 117。提示词文本与工具 schema 保持不变。
## Alternatives considered
**在快照 harness 中规范化分段顺序。** 已否决,因为运行时、请求标头和模型提示词仍然受激活时序影响,只有 fixture 比较会隐藏差异。
**在注册表中用分段名称打破并列。** 已否决,因为这会静默重排每一组现有并列。显式 order 让每个模型可见位置都由贡献该分段的插件就地决定。
## Consequences
Cordis 与 workflow 指引具有不依赖平台的顺序,同时 Ralph 仍排在可继续运行的子代理指引和子代理报告指引之前。需要稳定相对位置的提示词分段必须使用互不相同的 `order`;其他等序分段仍采用激活顺序,不属于本决策的范围。
## Testing
无密钥 ACP 与 SDK 快照回放会固定 Cordis 排在 workflow 之前,并保留 workflow、Ralph、可继续运行的子代理和子代理报告指引的顺序。完整快照套件验证刷新的 fixture。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-07-30-versioned-gui-welcome-onboarding.md: 370793dd4e6d744ea61fc9319a94728dbbf3e1fe
2026-07-30-versioned-gui-welcome-onboarding.zh.md: 7b99377d00127174d5bfd8d080107c2cb67e6fff
@@ -1,6 +1,7 @@
# Agent Note: Versioned GUI welcome onboarding
Status: implemented
Archived: 2026-08-22
English | [中文](2026-07-30-versioned-gui-welcome-onboarding.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 版本化 GUI 欢迎引导
Status: implemented
Archived: 2026-08-22
[English](2026-07-30-versioned-gui-welcome-onboarding.md) | 中文
@@ -10,9 +11,9 @@ GUI 的凭据引导从 DeepSeek 专用的就绪状态检查开始,但内部测
## 决策
**设置外壳协调有序步骤。** `settings.onboarding` 仍是根作用域 list,但 `ui-settings` 会把其中各条目的 id 和顺序投影到一个协调器中,并且只挂载第一个未完成的步骤。当前注册方会收到 `complete()` 和 `openSection(id)`;所有权转移前,不会挂载后续步骤。`ui-settings-models` 现在以顺序 `-100` 注册恢复后的欢迎声明,以顺序 `0` 注册 DeepSeek 条件式凭据步骤;两者当前的共用展示由[共用弹窗引导决策](2026-08-13-shared-modal-product-onboarding.md)持有。
**设置外壳协调有序步骤。** `settings.onboarding` 仍是根作用域 list,但 `ui-settings` 会把其中各条目的 id 和顺序投影到一个协调器中,并且只挂载第一个未完成的步骤。当前注册方会收到 `complete()` 和 `openSection(id)`;所有权转移前,不会挂载后续步骤。`ui-settings-models` 现在以顺序 `-100` 注册恢复后的欢迎声明,以顺序 `0` 注册 DeepSeek 条件式凭据步骤;两者当前的共用展示由[共用弹窗引导决策](2026-08-13-shared-modal-product-onboarding.zh.md)持有。
**产品欢迎步骤按版本管理并归功能插件所有。** 该声明曾由[移除首次启动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.md)历史决策移除,现在以新的测试阶段文案恢复在 `ui-settings-models` 中。`ui-settings-general` 仍不注册任何引导步骤;持有当前两个步骤的插件也持有文案、store 和共用弹窗。
**产品欢迎步骤按版本管理并归功能插件所有。** 该声明曾由[移除首次启动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.zh.md)历史决策移除,现在以新的测试阶段文案恢复在 `ui-settings-models` 中。`ui-settings-general` 仍不注册任何引导步骤;持有当前两个步骤的插件也持有文案、store 和共用弹窗。
**持久化的 `ui-onboarding` 分节持有确认状态。** 宿主端在 user-settings seam 中注册它,存入当前 `$DSH_HOME/settings.yaml`;当前欢迎 store 通过既有公开 settings API 读写其中的 `welcomeNoticeVersion`。connection 插件通过 `ctx.connection.isLoopback` 统一发布当前页面是否使用 loopback authority;hostname 判定留在 connection 包内,其他客户端插件只消费服务状态,而不导入其实现。API Proxy 在可配置提供方 namespace 之外,通过封闭的允许列表暴露这一个产品 namespace,同时不会把它的变更视为模型目录失效事件。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-06-bundled-dsh-badge-skill.md: 2909736d53f8aff41ca69e705de44657bc1b4f1e
2026-08-06-bundled-dsh-badge-skill.zh.md: de85e9476d3945cd13335ef596243bc2a126ae55
@@ -1,6 +1,7 @@
# Agent Note: Bundled dsh badge skill
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-06-bundled-dsh-badge-skill.zh.md)
@@ -1,12 +1,13 @@
# Agent Note: 内置 dsh 徽章 skill
Status: implemented
Archived: 2026-08-22
[English](2026-08-06-bundled-dsh-badge-skill.md) | 中文
## 问题
[Cordis 教程](../../../../docs/cordis-tutorial/index.md)的各个页面都使用官方「powered by dsh」徽章,但交付的 CLI(命令行界面)既没有用于在其他位置应用同样署名的可复用指令,也没有可显式选择加入的提供方。
[Cordis 教程](../../../../docs/cordis-tutorial/index.zh.md)的各个页面都使用官方「powered by dsh」徽章,但交付的 CLI(命令行界面)既没有用于在其他位置应用同样署名的可复用指令,也没有可显式选择加入的提供方。
## 决策
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-07-workspace-picker-composer-entry.md: 023cbe09dd75015a1555103642d1b66ce75aafc9
2026-08-07-workspace-picker-composer-entry.zh.md: 6b84885b11fb5372a51d620b40ea7d24fe7e45a2
@@ -1,6 +1,7 @@
# Agent Note: The no-Workspace composer opens the existing picker
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-07-workspace-picker-composer-entry.zh.md)
@@ -1,12 +1,13 @@
# Agent Note: 未选择 Workspace 时从编辑器打开现有选择器
Status: implemented
Archived: 2026-08-22
[English](2026-08-07-workspace-picker-composer-entry.md) | 中文
## 问题
[Session scope 决策](../architecture/2026-07-25-web-client-session-scope-and-provide-channel.md)会在 Workspace 存在前保留同一个常驻编辑器,但 textarea 处于禁用状态,只有较小的 Workspace chip 能打开选择器。用户首次点击最显眼、也最熟悉的输入区域时,界面不会响应,尽管同一界面已有继续操作的入口。
[Session scope 决策](../architecture/2026-07-25-web-client-session-scope-and-provide-channel.zh.md)会在 Workspace 存在前保留同一个常驻编辑器,但 textarea 处于禁用状态,只有较小的 Workspace chip 能打开选择器。用户首次点击最显眼、也最熟悉的输入区域时,界面不会响应,尽管同一界面已有继续操作的入口。
## 决策
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-10-creator-guidance-introduce-cue.md: 2954bb9dca6bd5359ab3ed4b7e32bd8336709a10
2026-08-10-creator-guidance-introduce-cue.zh.md: 4f818b3a444cbc7bbd4355ac8e7a883aaa4bfa51
@@ -1,6 +1,7 @@
# Agent Note: Creator guidance lands as an introduce cue on the preset chip
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-10-creator-guidance-introduce-cue.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 创造模式引导以介绍动效落在预设 chip 上
Status: implemented
Archived: 2026-08-22
[English](2026-08-10-creator-guidance-introduce-cue.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-11-collapsible-ask-user-question-card.md: 08e87b0d1f05f47c5bc87ef9b32cab05ef229e5c
2026-08-11-collapsible-ask-user-question-card.zh.md: fd3b838ff174dcdb3d4994fe30b193d63f5c4d15
@@ -1,6 +1,7 @@
# Agent Note: Collapsible Ask-User Question Card
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-11-collapsible-ask-user-question-card.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 可收起的提问卡片
Status: implemented
Archived: 2026-08-22
[English](2026-08-11-collapsible-ask-user-question-card.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-11-web-export-command-and-dialog.md: aba9048f26237ea01e861a5ee6e31b89429629c8
2026-08-11-web-export-command-and-dialog.zh.md: be4a3a53b1ff75cfbe176e258fb6a73e5abfee22
@@ -1,6 +1,7 @@
# Agent Note: Web `/export` shares the streamed Session ZIP download
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-11-web-export-command-and-dialog.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Web `/export` 共用流式 Session ZIP 下载
Status: implemented
Archived: 2026-08-22
[English](2026-08-11-web-export-command-and-dialog.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/feature/2026-08-18-product-subagent-failure-facts.md
2026-08-18-product-subagent-failure-facts.md: b1d80cf66172ac67d38dbad873fa4cbd970a775c
2026-08-18-product-subagent-failure-facts.zh.md: df4b14b4a243f7768240678b8d434c7aef7d48a7
@@ -0,0 +1,81 @@
# Agent Note: Product subagents expose bounded structured failure facts
Status: implemented
Archived: 2026-08-21
English | [中文](2026-08-18-product-subagent-failure-facts.zh.md)
## Problem
The [Claude Code and Codex product providers](2026-08-04-claude-code-and-codex-subagent-backends.md) receive structured product failures, but a published run historically flattened most of them to the shared `error` stop reason. Product logs retained detail that the foreground parent and a [one-shot background Job](2026-08-12-product-subagent-one-shot-background-tasks.md) could not use to distinguish a product limit, an execution failure, or an early process exit.
Copying SDK error text, app-server payloads, or stderr into the result would expose task text, paths, environment values, credentials, or product internals. Adding shared error fields would also make the provider-neutral [subagent seam](2026-06-21-subagent-capability-seam.md) own product version vocabularies that change independently.
## Decision
Each product Provider owns the mapping from its pinned official structured failures, current operation, and managed process outcome to one fixed safe diagnostic line. `SubagentResult` remains unchanged: consumers receive the existing bounded `diagnostic` string and do not parse its product-private fields. The [minimal-diagnostics decision](../simplification/2026-08-21-product-subagent-minimal-diagnostics.md) supersedes this note's complete Claude Code subtype mirror; this note continues to own the current detailed Codex categories until that provider adopts the same simplification.
### Safe diagnostic
The structured line has this fixed order:
```text
Product subagent failure (product: <product>; stage: <stage>; category: <category>; HTTP status: <status>; exit code: <code>; signal: <signal>)
```
The Provider omits unavailable optional fields. Exit code and signal are independent facts and are each retained when observed. A contributing permission decision from the [non-interactive permissions decision](2026-08-15-product-subagent-noninteractive-permissions.md) follows the structured line; the latest safe permission fact remains operation-local. The shared result boundary limits the complete text to 4096 UTF-8 bytes.
Successful results and local cancellation expose no failure fact. Raw product errors, stderr, tool input, paths, environment values, credentials, and protocol payloads never enter the diagnostic. Startup and cleanup rejections use the same safe line in their Error message. Original failures remain on internal cause chains; Provider Host logs and forwarded stderr remain product-local observation only.
### Claude Code facts
The [minimal-diagnostics decision](../simplification/2026-08-21-product-subagent-minimal-diagnostics.md) exclusively owns Claude Code categories, stages, process facts, permission ordering, and verification for Agent SDK 0.3.241 and Claude Code 2.1.241. This note carries no separate Claude category contract.
### Codex facts
Codex app-server 0.147.0 defines eleven string categories and five object variants. The Provider preserves `contextWindowExceeded`, `sessionBudgetExceeded`, `usageLimitExceeded`, `serverOverloaded`, `cyberPolicy`, `internalServerError`, `unauthorized`, `badRequest`, `threadRollbackFailed`, `sandboxError`, and `other`. It also preserves `httpConnectionFailed`, `responseStreamConnectionFailed`, `responseStreamDisconnected`, `responseTooManyFailedAttempts`, and `activeTurnNotSteerable`; the four connection/stream variants retain numeric `httpStatusCode`, while the active-turn variant does not expose `turnKind`. Unknown strings, objects with another variant set, malformed values, and unclassified exceptions use `unknown`.
| Stage | Owned operation | Observable failure |
| --- | --- | --- |
| `initialize` | App-server spawn and initialize/initialized handshake | `start()` rejects with fixed safe facts and any process outcome already observed |
| `thread-start` | Ephemeral `thread/start` request and response validation | `start()` rejects with the thread stage and any available process outcome |
| `turn-start` | Published `turn/start` request, provisional ids, and early frames | The run resolves as `error` with a safe unknown fallback when no structured category exists |
| `turn` | Terminal notification, final-answer selection, and error-info mapping | The complete category and optional HTTP status reach the non-completed result |
| `process` | Managed app-server exits before another terminal path settles | The run resolves as `error` with `process-exit` and any available code and signal |
| `teardown` | Wire close and process-tree release | `dispose()` rejects independently; startup rollback aggregation exposes both startup and teardown lines |
`contextWindowExceeded` remains `max-tokens`; every other known or unknown Codex category remains `error`, and `cyberPolicy` does not become `refusal`.
### Ownership and lifecycle
| Fact or resource | Owner | Consumer behavior |
| --- | --- | --- |
| Codex error category | Codex Provider over its pinned official app-server | The Provider preserves its current structured category and uses `unknown` outside the recognized set |
| Current failure stage | Product Provider operation | Derived at the failure site; never persisted or used as a recovery state |
| Exit code and signal | `dsh-subprocess` process handle | The Provider displays observed values without inferring missing ones |
| Diagnostic bytes and delivery | `dsh-subagent`, foreground tool, and Job runtime | The same bounded text is presented separately from assistant output in both scheduling modes |
| Raw product failure | Product runtime, internal cause chain, and Host observation | It remains internal and never becomes model-visible result text |
## Verification
Claude Code verification is owned by the [minimal-diagnostics decision](../simplification/2026-08-21-product-subagent-minimal-diagnostics.md). Codex package tests pin all sixteen current error-info variants, HTTP status presence and absence, all six stages, unknown fallback, stop-reason preservation, permission ordering, sanitization, cancellation, concurrency, and cleanup aggregation. The real app-server fixture produces an actual Codex `internalServerError` and covers process/protocol failure and whole-tree quiescence. The keyless ACP snapshot records the Codex diagnostic in foreground error output, a background completion notice, and `job_output`.
## Alternatives considered
**Return raw SDK errors, app-server payloads, or stderr.** These values can contain commands, paths, workspace content, environment values, credentials, or upstream prose. A fixed allowlisted mapping preserves actionable facts without expanding the model-visible trust boundary.
**Add a shared product-error enum or structured result fields.** Claude Code and Codex version their error unions independently. A shared enum would duplicate those authorities and force unrelated Providers and consumers to track product releases.
**Parse generic stderr and exception messages.** Free-form text is neither stable nor safe. Only pinned structured product fields and the managed process outcome qualify as diagnostic input.
**Persist stages or add a recovery controller.** The stage is derived from the current call site only when a failure is reported. Persistence, retries, resume, and remediation need separate ownership and user contracts.
**Map product limits to new shared stop reasons.** Claude Code turn and budget limits are not token-window exhaustion, and an error category does not establish refusal semantics. Existing stop reasons remain unchanged.
## Consequences
The parent can distinguish the current Codex budget, usage, service, policy, request, connection, stream, rollback, sandbox, and active-turn categories without receiving raw product text. The [minimal-diagnostics decision](../simplification/2026-08-21-product-subagent-minimal-diagnostics.md) owns the corresponding Claude result. Foreground and background scheduling preserve the same fact because both consume one `SubagentResult`.
The diagnostic is display text rather than a new public protocol. Callers may present it but must not branch on its punctuation or product-private category names. A pinned product-version upgrade revalidates the Provider mapping and evidence without requiring every official error member to remain model-visible.
This decision adds no product session persistence, retry policy, recovery state, stderr classifier, authentication or configuration taxonomy, progress stream, or human interaction path.
@@ -0,0 +1,81 @@
# Agent Note: 产品 subagent 公开有界结构化失败事实
Status: implemented
Archived: 2026-08-21
[English](2026-08-18-product-subagent-failure-facts.md) | 中文
## Problem
[Claude Code 与 Codex 产品提供方](2026-08-04-claude-code-and-codex-subagent-backends.zh.md)会收到结构化产品失败,但已发布运行以往会把其中大多数压成共享的 `error` 终止原因。产品日志保留了细节,前台父 agent 与[一次性后台 Job](2026-08-12-product-subagent-one-shot-background-tasks.zh.md)却无法据此区分产品限制、执行失败或进程提前退出。
若把 SDK 错误文本、app-server payload 或 stderr 复制进结果,就会暴露任务文本、路径、环境值、凭证或产品内部信息。若增加共享错误字段,又会让提供方无关的 [subagent seam](2026-06-21-subagent-capability-seam.zh.md)拥有彼此独立变化的产品版本词汇。
## Decision
每个产品提供方分别拥有从锁定版本官方结构化失败、当前操作和受管进程结果到一行固定安全诊断的映射。`SubagentResult` 保持不变:消费方仍接收现有的有界 `diagnostic` 字符串,而且不解析其中由产品私有的字段。[最小诊断决策](../simplification/2026-08-21-product-subagent-minimal-diagnostics.zh.md)已经取代本说明对 Claude Code 完整 subtype 的镜像;在 Codex 采用同一简化前,本说明继续负责其当前详细类别。
### 安全诊断
结构化行采用以下固定顺序:
```text
Product subagent failure (product: <product>; stage: <stage>; category: <category>; HTTP status: <status>; exit code: <code>; signal: <signal>)
```
提供方会省略不可用的可选字段。退出码与信号是相互独立的事实,只要已观测到就分别保留。来自[非交互权限决策](2026-08-15-product-subagent-noninteractive-permissions.zh.md)且参与失败的权限决定会跟在结构化行之后;最新的安全权限事实仍只属于当前操作。共享结果边界会把完整文本限制在 4096 个 UTF-8 字节以内。
成功结果与本地取消都不公开失败事实。原始产品错误、stderr、工具输入、路径、环境值、凭证和协议 payload 绝不会进入诊断。启动与清理拒绝会在 Error 消息中使用同一安全行。原始失败保留在内部 cause 链中;提供方 Host 日志与转发的 stderr 也只作为产品本地观测。
### Claude Code 事实
[最小诊断决策](../simplification/2026-08-21-product-subagent-minimal-diagnostics.zh.md)独占负责 Agent SDK 0.3.241 与 Claude Code 2.1.241 的 Claude Code 类别、阶段、进程事实、权限顺序与验证。本说明不再承载独立的 Claude 类别约定。
### Codex 事实
Codex app-server 0.147.0 定义十一种字符串类别与五种对象 variant。提供方会保留 `contextWindowExceeded`、`sessionBudgetExceeded`、`usageLimitExceeded`、`serverOverloaded`、`cyberPolicy`、`internalServerError`、`unauthorized`、`badRequest`、`threadRollbackFailed`、`sandboxError` 和 `other`。它还会保留 `httpConnectionFailed`、`responseStreamConnectionFailed`、`responseStreamDisconnected`、`responseTooManyFailedAttempts` 与 `activeTurnNotSteerable`;四种连接/stream variant 会保留数值 `httpStatusCode`,而 active-turn variant 不公开 `turnKind`。未知字符串、同时含其他 variant 的对象、格式错误值与未分类异常统一使用 `unknown`。
| 阶段 | 归属操作 | 可观察失败 |
| --- | --- | --- |
| `initialize` | App-server spawn 与 initialize/initialized 握手 | `start()` 以固定安全事实和已经观测到的进程结果拒绝 |
| `thread-start` | 临时 `thread/start` 请求与响应校验 | `start()` 以线程阶段和可用进程结果拒绝 |
| `turn-start` | 已发布 `turn/start` 请求、暂定 id 与早到 frame | 没有结构化类别时,运行以 `error` 和安全 unknown 回退兑现 |
| `turn` | 终态通知、最终答案选择与 error-info 映射 | 完整类别与可选 HTTP status 进入非完成结果 |
| `process` | 受管 app-server 在另一终态路径结算前退出 | 运行以 `error` 兑现,并携带 `process-exit` 以及可用的退出码与信号 |
| `teardown` | Wire 关闭与进程树释放 | `dispose()` 独立拒绝;启动回滚聚合会同时公开启动与 teardown 两行 |
`contextWindowExceeded` 仍是 `max-tokens`;其他所有已知或未知 Codex 类别仍是 `error`,`cyberPolicy` 不会变成 `refusal`。
### 所有权与生命周期
| 事实或资源 | Owner | 消费方行为 |
| --- | --- | --- |
| Codex 错误类别 | Codex 提供方及其锁定的官方 app-server | 提供方保留当前结构化类别,并在已识别集合之外使用 `unknown` |
| 当前失败阶段 | 产品提供方操作 | 只在失败点派生;绝不持久化,也不作为恢复状态 |
| 退出码与信号 | `dsh-subprocess` 进程句柄 | 提供方展示已观测值,不推测缺失值 |
| 诊断字节与送达 | `dsh-subagent`、前台工具与 Job 运行时 | 两种调度模式都把同一份有界文本与 assistant 输出分开呈现 |
| 原始产品失败 | 产品运行时、内部 cause 链与 Host 观测 | 只保留在内部,绝不成为模型可见的结果文本 |
## Verification
Claude Code 验证由[最小诊断决策](../simplification/2026-08-21-product-subagent-minimal-diagnostics.zh.md)负责。Codex 包测试固定当前全部十六种 error-info variant、HTTP status 存在与缺失、六个阶段、unknown 回退、终止原因保持不变、权限顺序、脱敏、取消、并发与清理聚合。真实 app-server fixture 会产生实际 Codex `internalServerError`,并覆盖进程/协议失败与整棵进程树完全停稳。无密钥 ACP snapshot 会在前台错误输出、后台完成通知和 `job_output` 中记录 Codex 诊断。
## Alternatives considered
**返回原始 SDK 错误、app-server payload 或 stderr。** 这些值可能包含命令、路径、工作区内容、环境值、凭证或上游文本。固定白名单映射可以保留可操作事实,同时不扩大模型可见的信任边界。
**增加共享产品错误 enum 或结构化结果字段。** Claude Code 与 Codex 各自独立版本化错误联合。共享 enum 会复制这些权威,并迫使无关提供方和消费方跟随产品版本。
**解析通用 stderr 与异常消息。** 自由文本既不稳定也不安全。只有锁定版本产品提供的结构化字段和受管进程结果可以成为诊断输入。
**持久化阶段或增加恢复控制器。** 阶段只在报告失败时从当前调用点派生。持久化、重试、resume 与修复需要独立的所有权和用户约定。
**把产品限制映射为新的共享终止原因。** Claude Code 的轮次和预算限制并不表示 token 窗口耗尽,错误类别也不能证明拒绝语义。既有终止原因保持不变。
## Consequences
父 agent 可以区分当前 Codex 的预算、用量、服务、策略、请求、连接、stream、回滚、sandbox 与 active-turn 类别,而不会收到原始产品文本。[最小诊断决策](../simplification/2026-08-21-product-subagent-minimal-diagnostics.zh.md)负责对应的 Claude 结果。前台与后台调度会保留同一事实,因为二者都消费同一个 `SubagentResult`。
诊断只是展示文本,不是新的公开协议。调用方可以呈现它,但不得根据其标点或产品私有类别名称进行分支。锁定产品版本升级时必须重新验证提供方映射与证据,但不要求每个官方错误成员都继续模型可见。
本决策不增加产品会话持久化、重试策略、恢复状态、stderr 分类器、身份验证或配置分类体系、进度流或人工交互路径。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-18-web-home-path-tilde.md: 108674740c804a42ec3b0491505186215a9d9fcd
2026-08-18-web-home-path-tilde.zh.md: 1f742158f62b9b7fbb8eae8be35c13adc95f3a09
@@ -0,0 +1,38 @@
# Agent Note: Web UI abbreviates POSIX home paths as `~`
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-18-web-home-path-tilde.zh.md)
## Problem
Workspace hover cards and Tool call summaries showed full POSIX home paths. Those strings are long, repeat the same prefix on every row, and make the sidebar and transcript harder to scan. Windows paths must stay verbatim because `~` is not a Windows filesystem convention.
## Decision
`host.describe` reports the host account `home` as a required field. Client and Host ship together, so the field is required rather than optional. ApiProxy fills it from `homedir()` at describe time.
`abbreviateHomePath` in `dsh-client-runtime` is the display-only helper. It returns `~` or `~/…` when the path is the POSIX home or a descendant, and leaves the path unchanged when `home` is missing, empty, or `/`, when either value is a Windows drive or UNC path, or when the match is only a prefix (`/Users/u` does not claim `/Users/u2`). Tool summaries run workspace-relative shortening first, then this helper, so a path inside the session cwd stays short. `filePath`, Host open, and Workspace hover copy keep the authored filesystem path.
`ui-tool` and `ui-workspace` inject `connection.hostDescription` at their own slot registrations. ChatView does not grow a Host-description hook. The field is required on `ConnectionHandle`; test fakes supply a source whose snapshot may be undefined before connect.
The fixture Host home is `/home/fixture`. A second fixture Workspace at `/home/fixture/Documents/project` lets assembled replay hover `~/Documents/project` without moving the existing `/tmp/fixture` account. TerminalBlock's own prompt-label collapse is unchanged.
## Alternatives considered
**Guess `/Users` or `/home` without the real home.** Rejected because a shared prefix is not an account home, and `/Users/shared` or `/home/src` would abbreviate incorrectly.
**Abbreviate Windows `%USERPROFILE%` as `~` as well.** Rejected because the acceptance rule keeps Windows paths verbatim, and `~` is not how Explorer or `cmd` spell those paths.
**Put the helper in `dsh-home-paths`.** Rejected because that package expands configuration tildes on Node; this helper is a browser display rewrite and must not pull Node `os` into client bundles.
**Thread `home` from ChatView owner props.** Rejected because it enlarges the conversation inject face and every ChatView test harness for a display fact only Tool and Workspace cards consume.
## Consequences
POSIX home-rooted Workspace hover paths and leftover Tool path summaries display as `~`. Copy and open still use the full path. Windows drive and UNC paths never become `~`. A Host that reports `/` as home does not turn the whole filesystem into `~`. Before the first describe, or while reconnecting, the source snapshot is undefined and paths stay unabbreviated.
## Testing
Package tests cover `abbreviateHomePath`, `toolRowModel` / `readCardModel` home abbreviation, Workspace hover display versus copy, and `host.describe` schema plus live `homedir()`. Assembled replay `apps/web/tests/home-path-tilde.snapshot.ts` hovers the fixture home-descendant Workspace. Product-GUI PRs still record a real-browser GIF of the hover card.
@@ -0,0 +1,38 @@
# Agent Note: Web UI abbreviates POSIX home paths as `~`
Status: implemented
Archived: 2026-08-22
[English](2026-08-18-web-home-path-tilde.md) | 中文
## Problem
Workspace 悬停卡片和 Tool 调用摘要会显示完整的 POSIX 家目录路径。这些字符串很长,每行重复同一前缀,侧边栏和对话记录更难扫读。Windows 路径必须保持原样,因为 `~` 不是 Windows 文件系统约定。
## Decision
`host.describe` 把宿主账户的 `home` 作为必填字段上报。Client 与 Host 一同发布,因此该字段是必填而不是可选。ApiProxy 在 describe 时用 `homedir()` 填入。
`dsh-client-runtime` 中的 `abbreviateHomePath` 是仅用于展示的辅助函数。当路径是 POSIX 家目录或其后代时返回 `~` 或 `~/…`;`home` 缺失、为空或为 `/`,任一侧是 Windows 盘符或 UNC 路径,或只是前缀命中(`/Users/u` 不能收走 `/Users/u2`)时,路径保持不变。Tool 摘要先做工作区相对缩短,再调用该辅助函数,因此会话 cwd 内的路径仍然更短。`filePath`、Host 打开以及 Workspace 悬停复制仍使用作者给出的文件系统路径。
`ui-tool` 与 `ui-workspace` 在各自的 slot 注册上注入 `connection.hostDescription`。ChatView 不增加 Host 描述钩子。该字段在 `ConnectionHandle` 上是必填的;测试假对象提供一个来源,其快照在连接完成前可以为 undefined。
fixture 的 Host 家目录是 `/home/fixture`。第二个 fixture Workspace 位于 `/home/fixture/Documents/project`,组装回放可以悬停出 `~/Documents/project`,而不必移动现有的 `/tmp/fixture` 账户。TerminalBlock 自有的提示符标签折叠保持不变。
## Alternatives considered
**在没有真实 home 的情况下猜测 `/Users` 或 `/home`。** 否决,因为共享前缀不是账户家目录,`/Users/shared` 或 `/home/src` 会被错误缩写。
**同样把 Windows `%USERPROFILE%` 缩写成 `~`。** 否决,因为验收规则要求 Windows 路径保持原样,而且 Explorer 与 `cmd` 并不这样拼写这些路径。
**把辅助函数放进 `dsh-home-paths`。** 否决,因为该包在 Node 上展开配置里的波浪号;本辅助函数是浏览器展示改写,不能把 Node `os` 拉进 client 包。
**从 ChatView owner props 向下传递 `home`。** 否决,因为它会扩大 conversation 注入面和每一份 ChatView 测试夹具,而只有 Tool 与 Workspace 卡片消费这个展示事实。
## Consequences
POSIX 家目录下的 Workspace 悬停路径,以及缩短 cwd 后仍落在家目录里的 Tool 路径摘要,会显示为 `~`。复制与打开仍使用完整路径。Windows 盘符和 UNC 路径永远不会变成 `~`。若 Host 把 `/` 报成 home,不会把整个文件系统收成 `~`。首次 describe 之前或重连期间,来源快照为 undefined,路径保持未缩写。
## Testing
包测试覆盖 `abbreviateHomePath`、`toolRowModel`/`readCardModel` 的家目录缩写、Workspace 悬停展示与复制,以及 `host.describe` schema 与实时 `homedir()`。组装回放 `apps/web/tests/home-path-tilde.snapshot.ts` 悬停 fixture 中位于家目录下的 Workspace。面向产品 GUI 的 PR 仍需录制悬停卡片的真实浏览器 GIF。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-19-high-cache-hit-decimal-display.md: 83c031bd1049ec26029d2e9ba0dc5cd623c3f867
2026-08-19-high-cache-hit-decimal-display.zh.md: 62f27e39d37cf2445ac6796030092e892d82b581
@@ -0,0 +1,51 @@
# Agent Note: High cache-hit decimal display
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-19-high-cache-hit-decimal-display.zh.md)
## Problem
The Web conversation stats line rounded every non-empty cache-hit ratio to an integer. Once the actual ratio passed 99%, the display hid further progress, and a ratio of at least 99.5% appeared as 100% even while uncached input or cache writes remained.
Users therefore could not distinguish a nearly complete cache hit from a true full hit.
## Decision
`StatsLine` continues to derive the ratio from the whole-session `tokenUsage` projection owned by `@deepseek-ai/dsh-token-meter`; the projection remains the only owner of the uncached-input, cache-read, cache-write, and output counts ([projection decision](../architecture/2026-07-29-projected-token-usage-and-request-context.md)). The presentation layer changes only the text inserted into the existing `stats.cacheHit` locale template.
| Actual ratio | Display |
|---|---|
| No billed input | Cache-hit group omitted |
| Integer rounding is below 100% | Rounded integer |
| Non-full ratio whose current rounding is 100% | Minimum decimal precision whose rounded result is below 100% |
| 100% | `100%` |
Every non-empty ratio starts at zero decimal places. A non-full ratio increases precision one place at a time only while rounding would produce 100%, so `99.1%` and `99.49%` remain `99%`, while `99.5%`, `99.95%`, and `99.995%` retain one, two, and three decimal places respectively. `StatsLine` uses exact small-factor comparisons over the safe-integer token counts, then scales the near-full gap only while the intermediate remains within that range. This avoids floating-point tie errors without imposing a precision cap or substitute label. A full hit does not carry a redundant decimal. The same derived string feeds the inline row and its overflow tooltip.
## Ownership and lifecycle
Token-meter continues to fold usage from the complete durable session log. `StatsLine` performs a synchronous display derivation whenever the standard projection value changes. It introduces no setting, stored percentage, event, wire field, client state, or recovery path.
Live updates, reload replay, and reconnect recovery all restore the same `tokenUsage` counts and run the same display function. A missing projection still omits every token group, and a zero input denominator still omits only the cache-hit group.
## Verification
The component spec pins the zero denominator, ordinary integer rounding, half-step rounding at several decimal precisions, each precision boundary through three decimal places, a near-full cumulative sample that needs fourteen decimal places, the true `100%` result, both locales, and equality between inline and tooltip values. The assembled `lifecycle-chrome` replay sidecar selects `9,950 / 10,000 = 99.5%` as a deterministic ratio that integer rounding would misreport as 100% while the base session fixture remains recordable; the live assertion and post-reload browser snapshot both display `99.5%` without another model call.
## Alternatives considered
**Keep integer rounding for every ratio.** Rejected because it hides all movement above 99% and still reports some non-full hits as 100%.
**Truncate the high band to one decimal.** Rejected because `99.95%`, `99.995%`, and still closer ratios all collapse to `99.9%` instead of retaining the minimum precision that distinguishes them from a full hit.
**Cap precision and use a substitute such as `<100%`.** Rejected because the exact cumulative counts can produce the required numeric result, and a cap would make display behavior depend on an arbitrary presentation limit.
**Show one decimal at every ratio.** Rejected because the additional low-band motion adds noise and changes the established display where integer precision is sufficient.
**Persist a display percentage in token-meter.** Rejected because the projection already carries the exact counts, while presentation precision belongs to the Web stats line. A second stored value would duplicate derivable state and expand replay and wire responsibilities.
## Consequences
High cache-hit sessions remain visually stable until integer rounding would falsely report a full hit, then expose only the decimal places needed to preserve that distinction. Extremely close non-full ratios can therefore produce long decimal strings; this is the accepted cost of having no arbitrary precision cap or nonnumeric fallback. Every delivery and recovery path stays on the existing durable projection lifecycle.
@@ -0,0 +1,51 @@
# Agent Note: 高缓存命中率的小数显示
Status: implemented
Archived: 2026-08-22
[English](2026-08-19-high-cache-hit-decimal-display.md) | 中文
## 问题
Web 会话统计行会把所有非空缓存命中率舍入为整数。真实比率超过 99% 后,显示会隐藏后续提升;比率达到 99.5% 时,即使仍有未缓存输入或缓存写入,也会显示为 100%。
用户因此无法区分接近完整的缓存命中与真实满命中。
## 决策
`StatsLine` 继续从 `@deepseek-ai/dsh-token-meter` 所拥有的完整会话 `tokenUsage` 投影派生比率;该投影仍是未缓存输入、缓存读取、缓存写入与输出计数的唯一所有方([投影决策](../architecture/2026-07-29-projected-token-usage-and-request-context.zh.md))。展示层只改变插入现有 `stats.cacheHit` locale 模板的文本。
| 真实比率 | 显示结果 |
|---|---|
| 没有计费输入 | 省略缓存命中分组 |
| 整数舍入结果低于 100% | 舍入后的整数 |
| 当前舍入结果为 100% 的非满命中 | 舍入结果低于 100% 所需的最少小数位 |
| 100% | `100%` |
所有非空比率都从零位小数开始。非满命中只有在舍入结果会成为 100% 时才逐位增加精度,因此 `99.1%` 与 `99.49%` 仍显示为 `99%`,而 `99.5%`、`99.95%` 与 `99.995%` 分别保留一位、两位与三位小数。`StatsLine` 对安全整数 token 计数执行精确的小因子比较,并且只在中间值仍处于该范围内时缩放接近满命中的差值。该算法既避开浮点临界值误差,也不设置精度上限或替代文案。真实满命中不会携带多余的小数。同一份派生字符串同时用于行内统计与溢出 tooltip。
## 归属与生命周期
token-meter 继续从完整持久会话日志折叠用量。标准投影值变化时,`StatsLine` 同步派生显示文本。本决策不引入设置、持久百分比、事件、协议字段、客户端状态或恢复路径。
实时更新、刷新回放与重连恢复都会还原同一组 `tokenUsage` 计数,并运行同一个显示函数。投影缺失时仍会省略全部 token 分组;输入分母为零时仍只省略缓存命中分组。
## 验证
组件测试固定了零分母、普通整数舍入、多个小数精度上的半步舍入、直至三位小数的各个精度边界、需要十四位小数的近满累计样本、真实 `100%`、两种 locale,以及行内值与 tooltip 值的一致性。组装后的 `lifecycle-chrome` replay sidecar 将 `9,950 / 10,000 = 99.5%` 选作确定性测试输入;该比率按整数舍入会误报为 100%,同时基础会话 fixture 仍可重录。活跃页面断言与刷新后的浏览器快照都会显示 `99.5%`,且不会产生额外模型调用。
## 备选方案
**对所有比率继续使用整数舍入。** 不予采纳,因为它会隐藏 99% 以上的全部变化,并继续把部分非满命中显示为 100%。
**把高位区间向下截取到一位小数。** 不予采纳,因为 `99.95%`、`99.995%` 以及更接近满命中的比率都会坍缩为 `99.9%`,无法保留区分真实满命中所需的最少精度。
**限制精度并使用 `<100%` 等替代文案。** 不予采纳,因为精确累计计数能够产生所需的数值结果,而精度上限会让显示行为依赖任意的展示限制。
**所有比率都显示一位小数。** 不予采纳,因为低位区间的额外变化会增加无效抖动,并改变整数精度已经足够的既有显示。
**在 token-meter 中持久化显示百分比。** 不予采纳,因为投影已经携带精确计数,而展示精度属于 Web 统计行。第二个持久值会复制可派生状态,并扩大回放与协议职责。
## 后果
高缓存命中率会保持稳定的整数显示,直到整数舍入会错误地报告满命中;此时界面只展示维持区分所需的小数位。极接近满命中的非满比率可能因此产生较长的小数字符串,这是不设置任意精度上限或非数值回退所接受的代价。所有交付与恢复路径继续沿用既有持久投影生命周期。
+82 -1
View File
@@ -25,6 +25,9 @@
"architecture/2026-07-05-windows-fs-permissions.i18n.yaml": "sha256:7e61ee9bbd9de4bf3285a6f250d9625bd062e5fb90279dbffd64c820f1f7fe6b",
"architecture/2026-07-05-windows-fs-permissions.md": "sha256:03734da511eae3b0736f7cad73d9da76ae2f69f9d5ed09089b0121ccb135a861",
"architecture/2026-07-05-windows-fs-permissions.zh.md": "sha256:454848057ea905fe76c88d17264e71e71fb685f08f82088de6976878372865c3",
"architecture/2026-07-19-gui-layering-and-rpc-protocol.i18n.yaml": "sha256:855477999c84236430dc9308e16797eb21658a67a72b8537315c6964ff0c0c0a",
"architecture/2026-07-19-gui-layering-and-rpc-protocol.md": "sha256:3517f37e98e74865dced37d5e1559d443e8fa827031c8335e99a1e910586e9ac",
"architecture/2026-07-19-gui-layering-and-rpc-protocol.zh.md": "sha256:8181386d957fa6d6b3eb9b05d29adb10804b5a926853425415d368cc7fceaefa",
"architecture/2026-07-22-tui-interactive-extension-service.i18n.yaml": "sha256:1b4822af5c8d642b73e3a0b04fb0a1dea9f50d0147046fbef53f5e49c030fb91",
"architecture/2026-07-22-tui-interactive-extension-service.md": "sha256:ca6b2774f4821e66f7c8397f20fcd34926728ded853fa48cbe451db7a8d2f883",
"architecture/2026-07-22-tui-interactive-extension-service.zh.md": "sha256:5b060c7626ee796c27108be7467a5e4be0677d7525d383336e7ec31ddce5c303",
@@ -43,6 +46,12 @@
"architecture/2026-07-28-dsh-native-typescript-source-launch.i18n.yaml": "sha256:af071e07bce5d9bc8f3df65fed9dcd9b3779a98c5864badbd530363bda021b55",
"architecture/2026-07-28-dsh-native-typescript-source-launch.md": "sha256:1b56e3454277ace713e2a01c4da538c756c45bf633fd24d7b16443d584afac5d",
"architecture/2026-07-28-dsh-native-typescript-source-launch.zh.md": "sha256:8c0f97472c2c89d2c19ae5cfa68c6e67f32b50960b08b60b46496f78ea6ffad1",
"architecture/2026-08-04-websocket-downlink-carrier.i18n.yaml": "sha256:b9d742d068a0e36df2f3030f6a04a3638f3461f7e10b50ed0cd6bd5e85de5019",
"architecture/2026-08-04-websocket-downlink-carrier.md": "sha256:b9be27a4cda8abd410c6e8b728c571f96b4891eb003c5200e9a0ffbbc9145b42",
"architecture/2026-08-04-websocket-downlink-carrier.zh.md": "sha256:118b71b33710a7a3d28375c48b42c1ec19993ca7e13f286dd6ea64f934456f46",
"architecture/2026-08-11-plugin-settings-tabs.i18n.yaml": "sha256:0365da2b317fc5f94dd190064198565f4c624afc91d2e62161ab9170f79d11bc",
"architecture/2026-08-11-plugin-settings-tabs.md": "sha256:fdd92cfe55b6c4cd31b3f768dd46a2ecf129a04c9818249cbdd33857cf722bbf",
"architecture/2026-08-11-plugin-settings-tabs.zh.md": "sha256:8993df1a0178aba1ea35c460ee67c522900344a4b386287bba9dfac2bfb87efa",
"bug-fix/2026-07-20-code-mode-result-card-completeness.i18n.yaml": "sha256:1035dae11d049d32ab09fd7d4f950eceae44bf46ba498b3cfaf3c75102b9fb64",
"bug-fix/2026-07-20-code-mode-result-card-completeness.md": "sha256:6ca2c9d4df98be18813ef38b7462db880900b5bcd6944fbcd1b8f2258006b93e",
"bug-fix/2026-07-20-code-mode-result-card-completeness.zh.md": "sha256:ed85fa7f935e5f525d566bc37a92014614983e649c75de9a9f244939097a7991",
@@ -85,6 +94,9 @@
"bug-fix/2026-07-30-web-details-default-closed.i18n.yaml": "sha256:2af5559d727f3e4afdd4946eaf89ac212c81db611db78dbd9bfabb1c4661db17",
"bug-fix/2026-07-30-web-details-default-closed.md": "sha256:27a280a817c8048718bb22927e7d9572cf99ffd0c044631e99e0fd6ea236876f",
"bug-fix/2026-07-30-web-details-default-closed.zh.md": "sha256:e047c7d02cf4b95b0c7f78f4b79af254091294b05cc75e98a8bb860ae2074189",
"bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.i18n.yaml": "sha256:36fc626dcbf1e276a36713e85860752cef0b36a5881f2493bdeb6d9654621b02",
"bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.md": "sha256:3ece47f91ee5f7354ef73ca0562aafeec19f89a19d9a64c9e0a565fe6d8c2049",
"bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.zh.md": "sha256:578e772ecbc1a4a39bddbb0a9f3fdbf67c70ff8c8952cc80d2caa3d8b76e9b36",
"bug-fix/2026-07-31-hero-visible-while-blank-session-opens.i18n.yaml": "sha256:42218a762ce0141d3cb43deb6c688d3705cdc4405e03851d486c78f3d25b70ef",
"bug-fix/2026-07-31-hero-visible-while-blank-session-opens.md": "sha256:a40992e89736131f5c487e5357848f14accd06e135dbec9ce242c968a5b11d43",
"bug-fix/2026-07-31-hero-visible-while-blank-session-opens.zh.md": "sha256:e0cc576bc1c196affc9220ddabf15d735c347029c530c56454f0e585979101e1",
@@ -94,12 +106,33 @@
"bug-fix/2026-08-03-tui-long-session-render-costs.i18n.yaml": "sha256:f65f7bf8fc84c7a1f022ee393c8d969c06d9bde8bed3a0206de86fb35b246ac6",
"bug-fix/2026-08-03-tui-long-session-render-costs.md": "sha256:6ecf2ef831f527f361ade18a882d79bc6eccf15cc676d05728e7753f41cde051",
"bug-fix/2026-08-03-tui-long-session-render-costs.zh.md": "sha256:5f44e707b332e13fa06d625212173ea055c1c3c0aee60888435a0ff099ec6037",
"bug-fix/2026-08-04-large-history-pagination-call-stack.i18n.yaml": "sha256:9bb1ceec013521116ee73eb9ec28c5708ae9520d6e53dcd4a3621fd2283b215c",
"bug-fix/2026-08-04-large-history-pagination-call-stack.md": "sha256:38c5afd347b131abd6b73634d25210d593bcb1fd72c7ba501bad0b33fb639810",
"bug-fix/2026-08-04-large-history-pagination-call-stack.zh.md": "sha256:2a2790b3b3400c747e20b998edfa96788b4035ccfa5fd4100dbc9a0e694ed30e",
"bug-fix/2026-08-06-plan-narrow-viewport-regression.i18n.yaml": "sha256:fe0539da9ce4015c6deaf585350e586e99d86e0073a36e131b6f1f62cc13382b",
"bug-fix/2026-08-06-plan-narrow-viewport-regression.md": "sha256:ccecdf52213dd1f6ab9935db31906520b83a7d9166f612376877d612230d1331",
"bug-fix/2026-08-06-plan-narrow-viewport-regression.zh.md": "sha256:be10805f0cd5a4f0812c883ab7f3e1e9396b579be455696d5cd726434a26b3e1",
"bug-fix/2026-08-10-web-favicon-dark-mode.i18n.yaml": "sha256:859c4399f9a017a68ba89552fdafa05e73c0599d94cee9551c84ea5b749a14f3",
"bug-fix/2026-08-10-web-favicon-dark-mode.md": "sha256:4d17e247abd76ae3aed5fb4e075fd66a2838292f89f7021c82a79fe37ed905e6",
"bug-fix/2026-08-10-web-favicon-dark-mode.zh.md": "sha256:7bbff8a3b7061c127afcc75cd2a8043b02a999b78c0180edd8f7e4807fcfe71d",
"bug-fix/2026-08-11-preset-card-description-clamp.i18n.yaml": "sha256:d50452503b59aa22c81617888f9391f31f12a779c4b18efb2b4b6de1bd9702a6",
"bug-fix/2026-08-11-preset-card-description-clamp.md": "sha256:7eb8db697f3ad3dea8c0a6045331c05730a010404a89e2b08348cb7b0fad26c8",
"bug-fix/2026-08-11-preset-card-description-clamp.zh.md": "sha256:6d2f7b55ce02275a45adfdd853805e7daf2d6534929b77beb86685a54fc34f85",
"bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml": "sha256:3ce4f6e39e173fc304bf64deca9c95bcddc1dbb492e065ca8c267a7a40788588",
"bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md": "sha256:7b169aa4543edfc965de5a8b7b9e60aa9d9d5218693cd0b57908e2d482280723",
"bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md": "sha256:88db36c698800bf55c3c7531d6f92665576d978c29c15ff7d74215fb93376cb1",
"bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.i18n.yaml": "sha256:23c26323f92a2172fd30fd724177b84d012cf4e18f1eff79ab092d4e0687ad4e",
"bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.md": "sha256:f9edea8501df36d444d84790ef9b0ae5bed4283a9cc5a5403800b80908f3db39",
"bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.zh.md": "sha256:ddcf6bb67823d19dc98964fcb9d663a10bcf663573394cfd7b235d9801d6525a",
"bug-fix/2026-08-20-composer-edit-range-from-selection.i18n.yaml": "sha256:c91ed2d9cb2a9891011fcbbe46885bc1808e36831279d56bc5cea0b9b1515b55",
"bug-fix/2026-08-20-composer-edit-range-from-selection.md": "sha256:e36920dee0318a35eaf49bff8c574698902f3be51d6115d40a3f97fa1436bd47",
"bug-fix/2026-08-20-composer-edit-range-from-selection.zh.md": "sha256:41f44adc93797cf9073f19f954b6ac87147a2e6806f1ad051c80c3423f0175ae",
"bug-fix/2026-08-20-composer-reference-decoration-keys.i18n.yaml": "sha256:cadf1de336aa2756d1bc1c20c7679449390b0a7a4217fe9602996801b6bc1958",
"bug-fix/2026-08-20-composer-reference-decoration-keys.md": "sha256:0093eabd710f10ae1faca53be01c9404a9d63cf6a2cf4dbf226e458e6315e201",
"bug-fix/2026-08-20-composer-reference-decoration-keys.zh.md": "sha256:a5fb2a748cf6ff8353d536448a5469e731157ccc2d0bb43210ea5dc44dd8ed31",
"bug-fix/2026-08-24-system-prompt-section-order-ties.i18n.yaml": "sha256:f7a20bddd4544738ec0dbbfc52ea931f42317defa1674beb9a3c0daebd52fc2d",
"bug-fix/2026-08-24-system-prompt-section-order-ties.md": "sha256:108a97346eb7a62f1ab01f48dbb9fdd965e8991f53e382b0f501b916af0e9e23",
"bug-fix/2026-08-24-system-prompt-section-order-ties.zh.md": "sha256:3deaddfcf9736b3ff8d61b51093d7e46fdcc86103705033e4aa4c9d043794b16",
"feature/2026-06-14-acp-agent-client-protocol.i18n.yaml": "sha256:006795baa43ae962a8d125cc0f1e9f134bc2ee9fb758b6e7669e3fa0126e1918",
"feature/2026-06-14-acp-agent-client-protocol.md": "sha256:6828c0af74bb3fb96206ca6b21c0e56a000b50e4744aad4bc2c05092f3a5a31b",
"feature/2026-06-14-acp-agent-client-protocol.zh.md": "sha256:ba104e841a1fb84edbd3b6c8119d50445b7785255a7a8d13bb9ac8a2cb4d2e69",
@@ -241,6 +274,9 @@
"feature/2026-07-30-tui-details-command.i18n.yaml": "sha256:033cea6df0a16fc68cbdb435babdc6e75c1199a8e70e1a71d87c800c40f5a044",
"feature/2026-07-30-tui-details-command.md": "sha256:a13478d4e55ec6d358209b51b541413ec75d0e20dfc22196ace28020f03f0c2d",
"feature/2026-07-30-tui-details-command.zh.md": "sha256:de9c449b98468cef34ce4f9a9d2a854a5d8905eecd61f80e27a9a0e4495e9901",
"feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml": "sha256:3d453f1a8f1a642ed569d1900009b785e582614bcabf9fede566ecbd9842e3ef",
"feature/2026-07-30-versioned-gui-welcome-onboarding.md": "sha256:cfaa38cfec722ac3792a4770f7733372805a6c0571f4f08519f367976b0d2379",
"feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md": "sha256:0ce0e4616580c583725aa3d28063dc009889d7f0a260a3cdda53ff48721c1ae4",
"feature/2026-07-30-versioned-tui-first-run-welcome.i18n.yaml": "sha256:4c3fc380b0512ad7c00baacd0ac610e1a78ae45374311d9bd43bab6b5e29e630",
"feature/2026-07-30-versioned-tui-first-run-welcome.md": "sha256:296f153e6c839f3743078e4f5aab3b2befc211c934835238668c57bdeae52231",
"feature/2026-07-30-versioned-tui-first-run-welcome.zh.md": "sha256:82871a9cca1fec46bb08a5b39daad28a44bb2419dea367b4ae41af3cf07bfa65",
@@ -259,9 +295,33 @@
"feature/2026-07-31-web-cards-toolrow.i18n.yaml": "sha256:f9a6ab72a77934cdcc02167c7313f08d7e9925362017b34bed7ad56c8c70fbaa",
"feature/2026-07-31-web-cards-toolrow.md": "sha256:5058f7cec4497d1cb0a5c8e77b88fddacac6eead034f3edec88e8514919b8a3e",
"feature/2026-07-31-web-cards-toolrow.zh.md": "sha256:ba84ef2e1be61211ab5ba6950b78ede3d3a979f252bc068d3e04e2c025f7bc03",
"feature/2026-08-06-bundled-dsh-badge-skill.i18n.yaml": "sha256:4b568d89976a71b7b3864e13b36925bf055479213739ffd4ac81614e00e93e36",
"feature/2026-08-06-bundled-dsh-badge-skill.md": "sha256:7b67f7c09b7e2b2ca756983a8951dad3a15786b8cd3adc6e819f316c67d31b2c",
"feature/2026-08-06-bundled-dsh-badge-skill.zh.md": "sha256:dcc0acb2dca596196ac034a8e86a644131c5b7fb09b184ec9d8493f93019d2b1",
"feature/2026-08-07-workspace-picker-composer-entry.i18n.yaml": "sha256:24a8bb2956371c7c840a662ac16dffbe04a6bb40a7296d01db86cb85da58d238",
"feature/2026-08-07-workspace-picker-composer-entry.md": "sha256:036212fbae6f5d7194e8c7fc9b1e7cd1c35251e9c227e895834a7d00bd5f69f8",
"feature/2026-08-07-workspace-picker-composer-entry.zh.md": "sha256:fb65c3330e8324f90d1270345e1ac941fc800e8caaf3b4bbee1bbb743f713262",
"feature/2026-08-08-dsh-run-headless-command.i18n.yaml": "sha256:1c2b4c5b61b9263b6267275d6fc69faeaad3cc887f0728a7ed4172d817af812b",
"feature/2026-08-08-dsh-run-headless-command.md": "sha256:7695fe7fd322377d5986f14e35f13337f4cd376405c758218a81230f6d182d1c",
"feature/2026-08-08-dsh-run-headless-command.zh.md": "sha256:113c14a36c64d2facc8ae46f37c7aa76359d8cacb9c18fcba26a723f15d036fb",
"feature/2026-08-10-creator-guidance-introduce-cue.i18n.yaml": "sha256:74f519839f0cf82c7304bdeae41ae1cab8bb930bfb94f79ab44708acd3b72128",
"feature/2026-08-10-creator-guidance-introduce-cue.md": "sha256:3e25409dda498de150de18943ee332e1760963e377a40a365902b66f667fdc9f",
"feature/2026-08-10-creator-guidance-introduce-cue.zh.md": "sha256:203847010cab9e9d13c3969f17921d3a5aa0d69377eccfef555c7ff96572f162",
"feature/2026-08-11-collapsible-ask-user-question-card.i18n.yaml": "sha256:9c0873bbb1437bcd5025f5859e1dc447a6b936f19c2c2ad2250521a3aa773a12",
"feature/2026-08-11-collapsible-ask-user-question-card.md": "sha256:4f3b3f5d7020fefbbac8a3c36a97642721ef14a0476a7d8117bde8a128d25f42",
"feature/2026-08-11-collapsible-ask-user-question-card.zh.md": "sha256:e7186c92f77d337a875f981ae39b16331a1c5466a948415bcacfe108ad98fb63",
"feature/2026-08-11-web-export-command-and-dialog.i18n.yaml": "sha256:db7d523a2a1f82a86f532661bd2953ee8538d971d91f886e4bd4e0d88f7226b2",
"feature/2026-08-11-web-export-command-and-dialog.md": "sha256:ec44b47589ca7924018dc24f7fa73379a97b8f053d9e8ccce2aebb600230e47b",
"feature/2026-08-11-web-export-command-and-dialog.zh.md": "sha256:ad28e67d397c87300cfe1705ba3d206cc4d054e07f5647c095c718ac8cf4ec98",
"feature/2026-08-18-product-subagent-failure-facts.i18n.yaml": "sha256:0aa7a873fdd878ee7f4b0a850ecf16d7b652b4f85de979acb7efcdf90883b6c1",
"feature/2026-08-18-product-subagent-failure-facts.md": "sha256:f7e05703c44106359798e6e4b76e442a4107b62ff0363554382d4767e4806788",
"feature/2026-08-18-product-subagent-failure-facts.zh.md": "sha256:19d2619fb5b5c6e40305dd82432d837357afa433ab735504ec204a2c25582ce6",
"feature/2026-08-18-web-home-path-tilde.i18n.yaml": "sha256:f151e3e3514f59784fc646c2feb3075dc954c65110d48c2cc482ad486fc0b86f",
"feature/2026-08-18-web-home-path-tilde.md": "sha256:8c7ecf120ff8c81826160acab5fc906a2a0a14213bcd2958343cfea47328d68e",
"feature/2026-08-18-web-home-path-tilde.zh.md": "sha256:3486c5b42aed5bcadf12c62c5e1e6cf7c1b493fc1085ad7d154cdf2ec34076cc",
"feature/2026-08-19-high-cache-hit-decimal-display.i18n.yaml": "sha256:c2cb839ed676040ed62153c2aab65b677fa59739f69253af50246e79a2347620",
"feature/2026-08-19-high-cache-hit-decimal-display.md": "sha256:08cb68bfc379da47a05b816afac26126146d36d6248350d4380f7cb98607d573",
"feature/2026-08-19-high-cache-hit-decimal-display.zh.md": "sha256:9d7afe3e2fc3029fbccc643b432a01bcb3b5671750adb6945ac414ec843ca063",
"process/2026-06-11-doc-sync-enforcement.i18n.yaml": "sha256:33b6d5874427bd7a2bd82e7e2f4f482b12448b2464aef15a9c57975edb48554d",
"process/2026-06-11-doc-sync-enforcement.md": "sha256:aa2fe83d519fc30d48dff19e596e83c8922aacc9e063e14fe2cc35b769b9100e",
"process/2026-06-11-doc-sync-enforcement.zh.md": "sha256:698017bd35f030fdea3eac51df9e43138c48140f504739d687b7251d13fced2b",
@@ -322,6 +382,9 @@
"process/2026-08-08-review-driven-issue-lifecycle-triggers.i18n.yaml": "sha256:4c28c59d3fc323e7cd01eff31f1fe759834719c5bede1e82b39f868970bf856d",
"process/2026-08-08-review-driven-issue-lifecycle-triggers.md": "sha256:1b0514de5d030170e91e12e4d6ba788a9247f840e82700faa385a1c0c76ab857",
"process/2026-08-08-review-driven-issue-lifecycle-triggers.zh.md": "sha256:028d78d61f603d8bac64c4cce20b393a78f8e029d3bb4976e79a47ecaefa6032",
"process/2026-08-12-documentation-site-navigation-and-chrome.i18n.yaml": "sha256:dde0041399b253e3758045f0858488db8178ffc563ce889c8b396c87af6c3730",
"process/2026-08-12-documentation-site-navigation-and-chrome.md": "sha256:56cb836ed862378afd33eb5c1a9dc159958b35a0aed3bf4336fcf26ab0b84b8b",
"process/2026-08-12-documentation-site-navigation-and-chrome.zh.md": "sha256:f2dd4adde38a09fe312866a1e6dad0f465684d809287862f40f1a488acd4fe18",
"simplification/2026-06-20-drop-unconsumed-llm-adapter-change-event.i18n.yaml": "sha256:ad3d1263cb0051b885173bf064de62065e2c646ccaae2d7250723da3b4eab90c",
"simplification/2026-06-20-drop-unconsumed-llm-adapter-change-event.md": "sha256:8fb061d51c8c23b47d2367814bab3623c6d5b972f38d207a273caa9030b579bd",
"simplification/2026-06-20-drop-unconsumed-llm-adapter-change-event.zh.md": "sha256:2ffeaca91f82844a5616d6dcce6b4af514bb8a7c46f78e47f668b204ac6edc04",
@@ -334,6 +397,9 @@
"simplification/2026-07-02-remove-stream-chunk-mirror.i18n.yaml": "sha256:eef600eafd70a576b2ac16a74f5dd5010ee601376008a90be10f1da56d746cee",
"simplification/2026-07-02-remove-stream-chunk-mirror.md": "sha256:0c22a896260c6eb8991cc8babd8172f7b6889fc41bb891d748f34650b3eee5ec",
"simplification/2026-07-02-remove-stream-chunk-mirror.zh.md": "sha256:ae7a3c2450b16fdf2f8da9e1f83cd987bf387671ecc8ebb76d2e7541695e7ee1",
"simplification/2026-07-04-drop-image-content-block.i18n.yaml": "sha256:6af8bc85be1fc23b445b17ff96df69488afa82c7194fcb47beb7a6b7b5a1de6a",
"simplification/2026-07-04-drop-image-content-block.md": "sha256:31e619d09405044a4db4951084f8d12417868b8f255ca26a44af0a5a13d43e6b",
"simplification/2026-07-04-drop-image-content-block.zh.md": "sha256:8fa6558bbb014a38853796102099ffbd5d8151371d68d40b2bf262ad07f4c976",
"simplification/2026-07-04-drop-inert-request-knobs.i18n.yaml": "sha256:e4c992a27ae0e37e5ef663c2cddf55eefe20387fd6103bebf655834d8e75e9db",
"simplification/2026-07-04-drop-inert-request-knobs.md": "sha256:8735c2b868a85b13235e0491a0fa7b9570dd090eef5170324fc5e93782687b67",
"simplification/2026-07-04-drop-inert-request-knobs.zh.md": "sha256:78b243f5d580f2a6fbbdb7d26574295d6ed74feb8d9bba34bbcdf4aa87624b5c",
@@ -403,6 +469,18 @@
"simplification/2026-08-03-explicit-config-dsh-entrypoint.i18n.yaml": "sha256:5466161f3fb8f2e8117fe8ff242675cc9fe9ef264d1e29b9bc586891c73c051a",
"simplification/2026-08-03-explicit-config-dsh-entrypoint.md": "sha256:f23accae7d05c2e75cb73ec69b492307f1ce7526ecfa9f6b12a621e02fd1a0c3",
"simplification/2026-08-03-explicit-config-dsh-entrypoint.zh.md": "sha256:a32d2c6ecf748a16a2c35b59cd2da2fda75769e3ab24be6a2e026d8655466db4",
"simplification/2026-08-11-cmdline-program-action.i18n.yaml": "sha256:e33b6dee66e23beabf03275e4e4f15134d23a82740ae7be6afd28c11c3163fca",
"simplification/2026-08-11-cmdline-program-action.md": "sha256:e6a274bd92a35c98ea24704161b408507876de3162c0f640b4bc70a86ab4d86f",
"simplification/2026-08-11-cmdline-program-action.zh.md": "sha256:bd213ad65ea6129c5360f28b2f52e6f3e224a58d07f56da190702939e7b402ee",
"simplification/2026-08-11-quickstart-documentation-home.i18n.yaml": "sha256:548c0ff16d40fed3b3318b0b9a26e11d53a60582ff457098a212fc64e7d67eac",
"simplification/2026-08-11-quickstart-documentation-home.md": "sha256:21946a828417aca4a214a874a35e88fe5a3e5989c330421f3849937b35bb9a9b",
"simplification/2026-08-11-quickstart-documentation-home.zh.md": "sha256:cb292a428d427cf36aff0a184347f0ab653331edb874daf3c5b58a0d1f8e6964",
"simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml": "sha256:51267b74e39544991bfe606e3f749a26914162e454cf357f26223a6ed8de5fad",
"simplification/2026-08-13-remove-first-run-beta-notice.md": "sha256:7ef5c712b8dff1152becee6a3f800acd5f7589d7b000f01544f57b175660bcc1",
"simplification/2026-08-13-remove-first-run-beta-notice.zh.md": "sha256:f899c79f838b97d1eea4a118de2cf00a97bae910d86d4aabdc447b4e02fb585f",
"simplification/2026-08-19-knip-config-cleanup.i18n.yaml": "sha256:ca8f5726aed57ce376c3fbd8b70113e235f3ba37dbf290683157fb4bf143ab13",
"simplification/2026-08-19-knip-config-cleanup.md": "sha256:18c61713b3358d3019dac096afc26ce8e5189002f626b25e858dfc5e6f626c8d",
"simplification/2026-08-19-knip-config-cleanup.zh.md": "sha256:b8ff16089c1a331603bb80278544c637cb16c1fa3bcfca3c5e1187152a1a0947",
"testing/2026-06-20-remove-redundant-snapshot-log-expected-output.i18n.yaml": "sha256:4177012c0821a8c22499852ecdf096af56d7263cb91c5d9d1bcd552cc26a3e00",
"testing/2026-06-20-remove-redundant-snapshot-log-expected-output.md": "sha256:45234e7cc04b6010c6141f8d5924c04547300098f96262d423c50108e7c7011a",
"testing/2026-06-20-remove-redundant-snapshot-log-expected-output.zh.md": "sha256:15e5a4ad3dee0bb711480cabe45cd97ec37bbdba19c2c2b47d1e9c203b07a48b",
@@ -426,6 +504,9 @@
"testing/2026-07-18-tui-terminal-state-snapshots.zh.md": "sha256:26750f240f6c8a7b28746f62fe161b357e9c5dd52867cc7037399f1ed6ff37fa",
"testing/2026-07-26-execa-for-test-subprocess-plumbing.i18n.yaml": "sha256:dd45cddb591b892739b75b0c180bde7f14008f4769227b863571475be295e1e0",
"testing/2026-07-26-execa-for-test-subprocess-plumbing.md": "sha256:1f45a69d0a7367ec5afbf112a77b355339b35270af8ff52696bee879cdf770d3",
"testing/2026-07-26-execa-for-test-subprocess-plumbing.zh.md": "sha256:8a24bdc8376373d7a97f65cefc07078824bf918d6a9934056a025ecfafe8634b"
"testing/2026-07-26-execa-for-test-subprocess-plumbing.zh.md": "sha256:8a24bdc8376373d7a97f65cefc07078824bf918d6a9934056a025ecfafe8634b",
"testing/2026-08-12-required-python-runtime-pull-request-ci.i18n.yaml": "sha256:741e7e58e5e8a9c82d901c4a16a70cea9bd256eac0e94179b5a24a231bb9fe1f",
"testing/2026-08-12-required-python-runtime-pull-request-ci.md": "sha256:1f1273d7a550667533e29c76efd148aebf57581a91729c877b44a5e43a52d9ad",
"testing/2026-08-12-required-python-runtime-pull-request-ci.zh.md": "sha256:6b9bf126c6b83d9b21e135d38df677c0d5623168b4353c6ddb706f76762c2193"
}
}
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-12-documentation-site-navigation-and-chrome.md: f33f017d54bcbb3583f37be27dcd6c69952bc66a
2026-08-12-documentation-site-navigation-and-chrome.zh.md: 7f3ff5c829c561167d8e2475cd1c2adf050975be
@@ -1,6 +1,7 @@
# Agent Note: Documentation-site navigation and repository chrome
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-12-documentation-site-navigation-and-chrome.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 文档站导航与仓库 chrome
Status: implemented
Archived: 2026-08-22
[English](2026-08-12-documentation-site-navigation-and-chrome.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-07-04-drop-image-content-block.md
2026-07-04-drop-image-content-block.md: 362afbbe7c5c1a3b46b1e8abda3b0fec77d1a0e6
2026-07-04-drop-image-content-block.zh.md: 07fbbd1f165887bf3305ccfa7ba137656ce0a99c
@@ -1,6 +1,7 @@
# Agent Note: Drop the `image` content block until a path can honor it
Status: implemented
Archived: 2026-08-19
English | [中文](2026-07-04-drop-image-content-block.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 移除 `image` 内容块,直到有路径能真正处理它
Status: implemented
Archived: 2026-08-19
[English](2026-07-04-drop-image-content-block.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-11-cmdline-program-action.md: 96cbe2342eef90e68dece3c78b12a2de1bbea7c0
2026-08-11-cmdline-program-action.zh.md: f5a9fea1447c78c9f099d3b54acd5b90a21aa503
@@ -1,6 +1,7 @@
# Agent Note: parseCmdline runs the program's own commander action
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-11-cmdline-program-action.zh.md)
@@ -1,12 +1,13 @@
# Agent Note: parseCmdline 运行 program 自己的 commander action
Status: implemented
Archived: 2026-08-22
[English](2026-08-11-cmdline-program-action.md) | 中文
## Problem
`dsh-cmdline`([应用自有命令行](../architecture/2026-08-06-app-owned-command-line.md))的 `parseCmdline` 曾带着一个自造的回调:`CmdlinePlan<T> = (program, ctx) => T`,在解析成功后于该适配器的 catch 之内调用,使 plan 的 `program.error(...)` 与 help/解析错误共用同一条退出路径;它还带有只被测试使用、类型不健全的默认值 `(() => ({}) as T)`,以及没有任何 plan 读取的 `ctx` 参数。这整条接缝复制了 commander 本就定义的席位:命令的 action 处理器在 `parse` 内部运行,从中抛出的 `program.error(...)` 与语法拒绝一样遵循 `exitOverride`。
`dsh-cmdline`([应用自有命令行](../architecture/2026-08-06-app-owned-command-line.zh.md))的 `parseCmdline` 曾带着一个自造的回调:`CmdlinePlan<T> = (program, ctx) => T`,在解析成功后于该适配器的 catch 之内调用,使 plan 的 `program.error(...)` 与 help/解析错误共用同一条退出路径;它还带有只被测试使用、类型不健全的默认值 `(() => ({}) as T)`,以及没有任何 plan 读取的 `ctx` 参数。这整条接缝复制了 commander 本就定义的席位:命令的 action 处理器在 `parse` 内部运行,从中抛出的 `program.error(...)` 与语法拒绝一样遵循 `exitOverride`。
## Decision
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-11-quickstart-documentation-home.md: 653c702eba4c90e52ee0539959d926ae23a98e6c
2026-08-11-quickstart-documentation-home.zh.md: 3d21566f9e4a822d095a115a5e65bfbaa3f947df
@@ -1,6 +1,7 @@
# Agent Note: Route documentation roots to quick start
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-11-quickstart-documentation-home.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 将文档根路由指向快速开始
Status: implemented
Archived: 2026-08-22
[English](2026-08-11-quickstart-documentation-home.md) | 中文
@@ -12,7 +13,7 @@ Status: implemented
每个 locale 根路由都是重定向页面。`/` 将读者导向 `./guide/quickstart`,`/en/` 则把同一相对目标解析为 `/en/guide/quickstart`。当网站托管在源站的子路径下时,相对目标仍会保留配置的 `DOCS_BASE`。
重定向由 `docs/user/index.md` 与 `docs/user/index.zh.md` 的 VitePress frontmatter 维护。对于 locale 首页,[文档网站投影器](../process/2026-07-13-documentation-site-projection.md)只发布这段 frontmatter,因此权威 Markdown 保留中英文语言切换行,且不会渲染第二个首页。投影器测试验证两个 locale 根路由都使用相对于各自 locale 的同一快速开始目标。
重定向由 `docs/user/index.md` 与 `docs/user/index.zh.md` 的 VitePress frontmatter 维护。对于 locale 首页,[文档网站投影器](../process/2026-07-13-documentation-site-projection.zh.md)只发布这段 frontmatter,因此权威 Markdown 保留中英文语言切换行,且不会渲染第二个首页。投影器测试验证两个 locale 根路由都使用相对于各自 locale 的同一快速开始目标。
文档网站不承载产品定位和功能摘要。快速开始页面仍提供指南、开发、参考、搜索和 locale 导航。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-13-remove-first-run-beta-notice.md: 535d0a20a5805c137551e6047f40fc5cf53153b8
2026-08-13-remove-first-run-beta-notice.zh.md: 20626bbd9d0bd13c00d4ee66f5dbc267c2e92082
@@ -1,6 +1,7 @@
# Agent Note: Remove the first-run beta notice
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-13-remove-first-run-beta-notice.zh.md)
@@ -1,16 +1,17 @@
# Agent Note: 移除首次启动内测声明
Status: implemented
Archived: 2026-08-22
[English](2026-08-13-remove-first-run-beta-notice.md) | 中文
## 问题
GUI 每次首启都会先显示占满视口的内测声明:内部测试的定位表述,加上通过 `DSH_TELEMETRY_MODE` 开启 Session Log 上传的说明。会话遥测在 mode 未设置时已解析为 `DISABLED`([遥测默认关闭](../feature/2026-08-10-telemetry-default-off.md)),因此引导流程中关于遥测的全部内容就是一段教用户如何开启的提示,而内部测试的定位表述本身也不应出现在发布版本里。
GUI 每次首启都会先显示占满视口的内测声明:内部测试的定位表述,加上通过 `DSH_TELEMETRY_MODE` 开启 Session Log 上传的说明。会话遥测在 mode 未设置时已解析为 `DISABLED`([遥测默认关闭](../feature/2026-08-10-telemetry-default-off.zh.md)),因此引导流程中关于遥测的全部内容就是一段教用户如何开启的提示,而内部测试的定位表述本身也不应出现在发布版本里。
## 决策
本决策当时把首启声明从组装后的产品中整体移除,而不是改写。`ui-settings-general` 不再注册任何 `settings.onboarding` 步骤;声明组件、确认 store、文案所有者文件和 locale 键均被删除,Host 则保留 `ui-onboarding` namespace,使既有设置文档继续有效。后续的[共用弹窗产品引导](../feature/2026-08-13-shared-modal-product-onboarding.md)在 `ui-settings-models` 中恢复了一份新的简洁测试阶段声明,复用该字段与后端契约,但不会恢复已移除的接管式布局或遥测说明。遥测的开启仍是显式的部署环境变量选择,记录在 [CLI reference README](../../../../apps/cli/reference/README.md) 中;恢复后的声明不涉及如何开启遥测。
本决策当时把首启声明从组装后的产品中整体移除,而不是改写。`ui-settings-general` 不再注册任何 `settings.onboarding` 步骤;声明组件、确认 store、文案所有者文件和 locale 键均被删除,Host 则保留 `ui-onboarding` namespace,使既有设置文档继续有效。后续的[共用弹窗产品引导](../feature/2026-08-13-shared-modal-product-onboarding.zh.md)在 `ui-settings-models` 中恢复了一份新的简洁测试阶段声明,复用该字段与后端契约,但不会恢复已移除的接管式布局或遥测说明。遥测的开启仍是显式的部署环境变量选择,记录在 [CLI reference README](../../../../apps/cli/reference/README.zh.md) 中;恢复后的声明不涉及如何开启遥测。
## 曾考虑的替代方案
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-08-19-knip-config-cleanup.md: 56426aeb7ff53caf7828b3f252269559e596940d
2026-08-19-knip-config-cleanup.zh.md: a74fa831f2301d9b95d5e34b003585293501c874
@@ -0,0 +1,32 @@
# Agent Note: Deleted stale and duplicative knip.json workspace entries
Status: implemented
Archived: 2026-08-22
English | [中文](2026-08-19-knip-config-cleanup.zh.md)
## Problem
`knip.json` carried workspace entries that did no work. Some pointed at packages that no longer exist, and some duplicated the `packages/*/*` glob default exactly. Both kinds made the file larger — 790 lines — and signaled a config that had outgrown the packages it described, so a reader could not tell which entries protected real behavior and which were inert.
## Decision
Deleted 15 `workspaces` entries: 2 stale keys naming packages absent from the working tree and from `HEAD`, and 13 entries whose `entry`/`project` values were byte-identical to the `packages/*/*` glob default.
- Stale keys: `packages/util/home` (removed in `4a09d9b34d`, the harness-home resolver collapse) and `packages/client/web-ui` (no directory and no git history, an orphan key). knip 6.16 does not flag stale workspace keys — that stability check arrived in knip 6.18 — so these were inert config that only deleted when their packages disappeared.
- Glob-duplicate entries: `packages/host/webserver`, `packages/client/runtime`, `packages/core/tools`, `packages/context/tmux-context`, `packages/util/timeout`, `packages/util/output-retention`, `packages/goal/goal-round-driver`, `packages/goal/tool-goal`, `packages/util/home-paths`, `packages/fs/tool-fs-search`, `packages/client/ui-settings`, `packages/client/modules`, `packages/client/hmr`. Each declared exactly `entry: ["tests/**/*.spec.ts"]` and `project: ["src/**/*.ts", "tests/**/*.ts"]`, which equals the `packages/*/*` glob, and each package still exists, so the glob now covers it identically.
The change is a deletion only: `knip.json` went from 790 to 655 lines with no behavioral change. `pnpm run knip` runs clean (zero issues, exit 0) before and after, because knip selects one workspace config per matched key (`getConfigKeyForWorkspace` uses specificity, not array merge), so a removed entry either lost an unresolvable target or fell back to an identical glob config.
## Alternatives considered
- Fold `zod` and other workspace-level `ignoreDependencies` up to the root. Rejected: the root `ignoreDependencies` is a repository-wide fallback, and these exemptions are deliberately workspace-scoped (the README of `cordis-host-runner` records why `src` cannot import the flagged dependency while the generated TypeRT face in `lib` needs it). Widening scope would mask a genuinely misplaced dependency in any future package.
- Upgrade knip to 6.18+ to get an automatic stale-workspace check. Deferred: 6.32.2 (latest at the time) re-flags many `@deepseek-ai/...` test dependencies as unused, i.e. it changes analysis semantics, not just adds hints. That is a separate dependency-upgrade decision with its own CI blast radius, not part of this cleanup.
- Keep the entries as documentation of intent. Rejected: an entry identical to the glob it sits under documents nothing beyond the glob itself, and a key naming an absent package actively misleads.
## Consequences
- `knip.json` is 135 lines shorter and names only packages that exist with config that differs from the glob default.
- Still-explicit entries (54) all carry a real reason to differ — an `e2e`/fixture/tsx `entry`, a `project` outside the default, or a workspace-scoped `ignoreDependencies`.
- knip 6.16 cannot itself detect the next stale key, so a package removal must still remember to drop its `knip.json` key; upgrading to 6.18+ (after the analysis-semantics change is separately assessed) restores that guard.
- This realizes the "never a restatement of the default stanza" criterion of the package-inventory proposal ([topic](../../proposed/process/2026-06-20-discover-package-inventory.md)); its remaining items — the e2e entry folding and the generated inventory — stay open there.
@@ -0,0 +1,32 @@
# Agent Note: 删除 knip.json 中失效与重复的 workspace 条目
Status: implemented
Archived: 2026-08-22
[English](2026-08-19-knip-config-cleanup.md) | 中文
## 问题
`knip.json` 携带了大量不产生任何作用的 workspace 条目。其中一些指向已经不复存在的包,另一些与 `packages/*/*` 通配默认完全重复。这两类都让文件变大——790 行——并显现出配置已经超出了它所描述的包:读者无法分辨哪些条目在保护真实行为、哪些是惰性的。
## 决策
删除了 15 个 `workspaces` 条目:2 个指向工作树与 `HEAD` 中都不存在的包的失效键,以及 13 个 `entry`/`project` 与 `packages/*/*` 通配默认逐字节相同的条目。
- 失效键:`packages/util/home`(在 `4a09d9b34d`,harness home 解析器的合并改动中删除)和 `packages/client/web-ui`(无对应目录、无 git 历史,是孤儿键)。knip 6.16 不会标记失效的 workspace 键——这项稳定性检查在 knip 6.18 才引入——所以这些是本应在包消失时一并删除、却残留的惰性配置。
- 通配重复条目:`packages/host/webserver`、`packages/client/runtime`、`packages/core/tools`、`packages/context/tmux-context`、`packages/util/timeout`、`packages/util/output-retention`、`packages/goal/goal-round-driver`、`packages/goal/tool-goal`、`packages/util/home-paths`、`packages/fs/tool-fs-search`、`packages/client/ui-settings`、`packages/client/modules`、`packages/client/hmr`。每个都恰好声明了 `entry: ["tests/**/*.spec.ts"]` 和 `project: ["src/**/*.ts", "tests/**/*.ts"]`,与 `packages/*/*` 通配相等,且这些包仍然存在,因此通配现在以完全相同的方式覆盖它们。
本改动只做删除:`knip.json` 从 790 行降到 655 行,行为不变。`pnpm run knip` 在改动前后都干净通过(零问题、退出码 0),因为 knip 为每个已匹配的键选取一条 workspace 配置(`getConfigKeyForWorkspace` 按特定优先、不做数组合并),所以被删条目要么丢掉了无法解析的目标,要么回退到一个完全相同的通配配置。
## 备选方案
- 把 `zod` 及其它 workspace 级 `ignoreDependencies` 上提到根级。否决:根级 `ignoreDependencies` 是全仓库兜底,而这些豁免是刻意限定在 workspace 的(`cordis-host-runner` 的 README 记录了为什么 `src` 无法 import 被标记的依赖、而生成的 `lib` 里的 TypeRT 契约面需要它)。扩大作用域会掩盖未来任何包里真正放错位置的依赖。
- 升级 knip 到 6.18+ 以获得自动的失效 workspace 检查。延后:撰写时的最新版 6.32.2 会把大量 `@deepseek-ai/...` 测试依赖重新标记为未使用——也就是改变了分析语义,而不仅是新增提示。那是独立的依赖升级决定,带自己的 CI 影响面,不属于本次清理。
- 保留这些条目作为意图的文档。否决:与它挂在下面的通配完全相同的条目,除了通配本身外不记录任何东西;而指向不存在包的键确实会误导人。
## 结果
- `knip.json` 缩短了 135 行,并且只列出确实存在、且配置与通配默认有差异的包。
- 仍然显式的条目(54 个)都带有真实的特例理由——`e2e`/fixture/tsx 的 `entry`、超出默认的 `project`、或 workspace 级的 `ignoreDependencies`。
- knip 6.16 自身无法检测下一个失效键,因此删除包时仍须记得清理它的 `knip.json` 键;升级到 6.18+(在分析语义的改动被单独评估之后)会恢复这道守卫。
- 本改动落实了包清单提案中「绝不复述默认 stanza」的标准([议题](../../proposed/process/2026-06-20-discover-package-inventory.zh.md));其剩余项——e2e 入口折叠与生成的清单——仍在提案中保持开放。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/testing/2026-08-12-required-python-runtime-pull-request-ci.md
2026-08-12-required-python-runtime-pull-request-ci.md: e7da767f22634bd50bc4fd38b1de34677c4124e7
2026-08-12-required-python-runtime-pull-request-ci.zh.md: 702125b0da864eb35f1fe870748cc0e314b01a39
@@ -1,6 +1,7 @@
# Agent Note: Required Python runtime pull-request validation
Status: implemented
Archived: 2026-08-23
English | [中文](2026-08-12-required-python-runtime-pull-request-ci.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 必需的 Python 运行时拉取请求验证
Status: implemented
Archived: 2026-08-23
[English](2026-08-12-required-python-runtime-pull-request-ci.md) | 中文
@@ -12,9 +13,9 @@ Status: implemented
每个拉取请求都在 [CI](../../../../.github/workflows/ci.yml) 中运行必需的 `python-runtime` 作业。该作业不使用路径过滤,调用共享的[单文件可执行程序构建器](../../../../.github/workflows/build-exe-for-python-sdk.yml)构建 `node24-linux-x64`,并参与 `all checks passed`。被调用的工作流会构建真实可执行文件,运行全部无密钥 Python 完整轮次和直接二进制场景(包括两份检入的快照),构建 SDK 与运行时 wheel 包,将二者安装进干净的虚拟环境,检查可执行文件与原生 addon 的 GLIBC 依赖,并在 manylinux 2.28 容器中运行已安装的 wheel 包。
必需作业与 [Python 发布工作流](../process/2026-08-11-python-publication-workflow.md)共用同一构建器。其并发键包含调用方工作流,因此同一 ref 上的必需 CI 与显式完整发布验证不会互相取消。完整的 linux-x64、linux-arm64 和 macos-arm64 矩阵仍属于发布验证:平台无关的运行时、SDK 与快照行为只需要一个阻断合并的原生载体,而架构相关的可执行文件、addon、wheel 包标签与部署目标行为在发布前仍需要全部发布目标验证。
必需作业与 [Python 发布工作流](../process/2026-08-11-python-publication-workflow.zh.md)共用同一构建器。其并发键包含调用方工作流,因此同一 ref 上的必需 CI 与显式完整发布验证不会互相取消。完整的 linux-x64、linux-arm64 和 macos-arm64 矩阵仍属于发布验证:平台无关的运行时、SDK 与快照行为只需要一个阻断合并的原生载体,而架构相关的可执行文件、addon、wheel 包标签与部署目标行为在发布前仍需要全部发布目标验证。
进阶 exe 快照会在比较前规范化不透明的会话、消息、subagent 和工作流运行标识符。因此,新增的持久化工作流事件会改变经过审阅的预期输出,但不会把随机运行标识符写入其中。极简场景的[模型可见快照](2026-08-13-python-minimal-model-visible-snapshot.md)覆盖了这份快照所占位化的已组装系统提示词、工具 schema 与消息列表。
进阶 exe 快照会在比较前规范化不透明的会话、消息、subagent 和工作流运行标识符。因此,新增的持久化工作流事件会改变经过审阅的预期输出,但不会把随机运行标识符写入其中。极简场景的[模型可见快照](2026-08-13-python-minimal-model-visible-snapshot.zh.md)覆盖了这份快照所占位化的已组装系统提示词、工具 schema 与消息列表。
## 曾考虑的替代方案
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-11-content-block-vocabulary.md
2026-06-11-content-block-vocabulary.md: 5228724bb9101307db9929aaf7831b477c2a6022
2026-06-11-content-block-vocabulary.zh.md: b43de335917c6b5304a94b296fcb8253827b0600
2026-06-11-content-block-vocabulary.md: d7d3f6b43a3f65d1421f026e5b6c2cc1ba1eadd2
2026-06-11-content-block-vocabulary.zh.md: ed4f915dff6dcb6dbc91400f9bfa5384253aea7b
@@ -22,7 +22,7 @@ In-session context injection (`context/message`) and mid-turn steering originall
## Consequences
- Reasoning has a core home without provider-specific shapes.
- Multimodal blocks return only with coordinated adapter, UI, and compaction support; see [the drop-image Agent Note](../simplification/2026-07-04-drop-image-content-block.md).
- Multimodal blocks return only with coordinated adapter, UI, and compaction support; see [the drop-image Agent Note](../../archived/simplification/2026-07-04-drop-image-content-block.md).
- Cache hints and assistant prefill remain absent until a shipping adapter can honor them; see the [producer-less variants](../../archived/simplification/2026-07-04-prune-producerless-vocabulary-variants.md) and [inert request knobs](../../archived/simplification/2026-07-04-drop-inert-request-knobs.md) Agent Notes.
- Every adapter pays a translation cost; the first real adapters have since validated the streaming protocol, and new adapters should continue proving their provider-specific mapping in adapter-local tests.
- IDs that cross package boundaries are branded (`CallId`, the shared agent/session `SessionId`) — nominal typing at zero runtime cost.
- IDs that cross package boundaries are branded (`ToolCallId`, the shared agent/session `SessionId`) — nominal typing at zero runtime cost.
@@ -12,7 +12,7 @@ harness 需要一套统一的内部消息语言,供 agent loop(智能体循
自主拥有词汇:消息是类型化内容块的数组(`text`、`reasoning`、`tool-call`、`tool-result`),其联合类型派生自可合并扩展的 `ContentBlockMap`,插件通过声明合并添加新的块类型。同一可合并扩展映射模式为所有「字符串化」字段提供类型(`MessageSource`、`FinishReason`、`TurnTrigger`、`TurnEndReason`)。流式输出采用原始分片协议;`BlockAssembler` 是唯一的共享组装实现。适配器负责转换为提供方的协议格式(wire format)——映射成本留在适配器中,正是它该在的地方。
会话内上下文注入(`context/message`)和轮次中途 steering(中途引导)最初渲染为带标签的 user-role 信封(system-reminder 模式),而非引入新角色,因此适配器无需承担额外负担。如今两者都投影为无包装的普通用户内容;见[注入内容信封 Agent Note](../simplification/2026-07-20-unwrap-injected-content-envelopes.md)。实际适配器验证已确认此渲染方式符合当前 DeepSeek 的行为;如果未来某提供方出现不兼容,应在该适配器内处理,而非引入新的规范角色。
会话内上下文注入(`context/message`)和轮次中途 steering(中途引导)最初渲染为带标签的 user-role 信封(system-reminder 模式),而非引入新角色,因此适配器无需承担额外负担。如今两者都投影为无包装的普通用户内容;见[注入内容信封 Agent Note](../simplification/2026-07-20-unwrap-injected-content-envelopes.zh.md)。实际适配器验证已确认此渲染方式符合当前 DeepSeek 的行为;如果未来某提供方出现不兼容,应在该适配器内处理,而非引入新的规范角色。
## 曾考虑的替代方案
@@ -22,7 +22,7 @@ harness 需要一套统一的内部消息语言,供 agent loop(智能体循
## 后果
- 推理(reasoning)在核心层有了归属,无需依赖提供方特有的结构。
- 多模态块只有在适配器、UI 和上下文压缩(context compaction)三方协同支持后才会回归;见 [drop-image Agent Note](../simplification/2026-07-04-drop-image-content-block.md)。
- 多模态块只有在适配器、UI 和上下文压缩(context compaction)三方协同支持后才会回归;见 [drop-image Agent Note](../../archived/simplification/2026-07-04-drop-image-content-block.md)。
- 缓存提示与 assistant prefill 在有实际适配器能兑现之前保持缺席;见[无生产者的词汇变体](../../archived/simplification/2026-07-04-prune-producerless-vocabulary-variants.md)与[无端到端可用路径的请求旋钮](../../archived/simplification/2026-07-04-drop-inert-request-knobs.md) Agent Note。
- 每个适配器都需承担翻译成本;首批真实适配器已验证了流式输出协议,新适配器应继续在适配器本地测试中验证其提供方特有的映射。
- 跨包边界的 ID 使用品牌类型(`CallId`、agent 与会话共享的 `SessionId`)——零运行时开销的名义类型。
- 跨包边界的 ID 使用品牌类型(`ToolCallId`、agent 与会话共享的 `SessionId`)——零运行时开销的名义类型。
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-11-dev-invariants-over-deep-readonly.md
2026-06-11-dev-invariants-over-deep-readonly.md: 66980f1ee09c6112f72786d6c3a147aadbc57f6c
2026-06-11-dev-invariants-over-deep-readonly.zh.md: 0d694ea84e1b7c265491e9adb64757378b4185f1
2026-06-11-dev-invariants-over-deep-readonly.zh.md: 576e53e0b27e65f6fa071ff649509223a7bc30ff
@@ -32,7 +32,7 @@ TypeScript readonly 类型不是充分的运行时边界。它们在程序运行
### 包拥有的不变式配套插件检查关系
`dsh-invariants` 注册可配置的 `ctx.invariants` 服务,本身不包含产品检查。每个包发布一个 `./invariant` 所有权配套插件;`dsh-session`、`dsh-agent`、`dsh-scope` 和 `dsh-agent-loop` 目前添加需要跟踪状态或观察另一个 seam 的规则:单调递增的序列号、轮次与步骤嵌套、工具调用/结果配对、合法的 agent(智能体)状态转换、主体正确的作用域分发,以及循环构建的请求与从其会话日志前缀重建的请求之间的相等性。全局启用和包名 regex 过滤器归该服务所有(见[包拥有的不变式服务](2026-07-19-package-owned-invariant-service.md))。
`dsh-invariants` 注册可配置的 `ctx.invariants` 服务,本身不包含产品检查。每个包发布一个 `./invariant` 所有权配套插件;`dsh-session`、`dsh-agent`、`dsh-scope` 和 `dsh-agent-loop` 目前添加需要跟踪状态或观察另一个 seam 的规则:单调递增的序列号、轮次与步骤嵌套、工具调用/结果配对、合法的 agent(智能体)状态转换、主体正确的作用域分发,以及循环构建的请求与从其会话日志前缀重建的请求之间的相等性。全局启用和包名 regex 过滤器归该服务所有(见[包拥有的不变式服务](2026-07-19-package-owned-invariant-service.zh.md))。
当会话配套插件附加到已有会话或以种子记录初始化的会话时,它回放不可变日志以重建跟踪状态。服务为每项贡献提供一个可 dispose(资源释放)的子 fiber,因此轮次中途热重载是安全的,同时不赋予诊断逻辑对会话存储的所有权。
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-11-event-sourced-sessions.md
2026-06-11-event-sourced-sessions.md: b6d17d2db1d9b489f3d4224683b61e62be485014
2026-06-11-event-sourced-sessions.zh.md: a78349ea2385b3c9d32870757bb607f15996196d
2026-06-11-event-sourced-sessions.zh.md: 11e5740dc2636fc002ed7158167b1dfbb39a971d
@@ -24,5 +24,5 @@ MVP 要求严格的基于事件的追踪,以及完全可回放的会话(严
- 回放、追踪与遥测在结构上得到保证,而非事后附加。
- 持久化仍是插件关注点;内存存储随 dsh-session 一起提供。
- 事件词汇可通过合并扩展(插件可添加如压缩(compaction)事件);[会话持久化](2026-06-14-session-persistence.md)在日志具备持久性后固定了其结构。
- 事件词汇可通过合并扩展(插件可添加如压缩(compaction)事件);[会话持久化](2026-06-14-session-persistence.zh.md)在日志具备持久性后固定了其结构。
- 派生成本随日志长度增长,压缩(dsh-compaction)是预期的缓解手段,而不是改写日志。
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-11-microkernel-event-taxonomy.md
2026-06-11-microkernel-event-taxonomy.md: 6cacbc30f29c863de0f8ddfa4df7251a64bc80ca
2026-06-11-microkernel-event-taxonomy.zh.md: 2e43b57d62d8fca692ffab379d1841e6a3e61fad
2026-06-11-microkernel-event-taxonomy.zh.md: 1c7919392b835c491b9dc606d46f638a708d2948
@@ -25,7 +25,7 @@ Status: implemented
## 后果
- 每个 MVP 功能都映射到一个监听器([功能→机制映射](../../../../docs/cookbook/extension-cookbook.md#the-feature--mechanism-map)是证明义务,保持更新)。
- 每个 MVP 功能都映射到一个监听器([功能→机制映射](../../../../docs/cookbook/extension-cookbook.zh.md#the-feature--mechanism-map)是证明义务,保持更新)。
- HMR 与 dispose 无需额外工作:监听器和注册均为 Cordis effect。
- waterfall 语义(调用 `next()` 或短路)不直观,需要教学——在 AGENTS.md 中记录,并由组合测试覆盖。
- 循环必须具备防御性:插件异常在轮次级别被隔离,来自任何扩展点的 steering(中途引导)永远不会被搁置(有回归测试保障)。
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-11-runtime-arg-validation.md
2026-06-11-runtime-arg-validation.md: 520823c76f147205805d306e97b5461f38b84c35
2026-06-11-runtime-arg-validation.zh.md: 0a6ef40c93ec3550d6e991836950be849e86ede7
2026-06-11-runtime-arg-validation.zh.md: bc2f743300be78cc2a01f027d5aca81fcb18b468
@@ -6,7 +6,7 @@ Status: implemented
## 问题
`defineTool`([统一 schema DSL](2026-07-20-unified-json-value-schema-dsl.md))为工具作者的 `execute(args)` 提供了经 `InferArgs<S>` 映射的类型化参数。但该类型只是对运行时值的编译期声明,而这个值实际上是模型生成的 JSON:没有任何机制强制模型遵守 schema,因此畸形调用(缺少必需键、声明为数字的位置传入字符串,或字面量超出声明的集合)会以「仅在名义上类型化」的状态到达 `execute`。工具函数体随后要么在处理结构错误的数据时崩溃,要么在不报错的情况下行为异常。
`defineTool`([统一 schema DSL](2026-07-20-unified-json-value-schema-dsl.zh.md))为工具作者的 `execute(args)` 提供了经 `InferArgs<S>` 映射的类型化参数。但该类型只是对运行时值的编译期声明,而这个值实际上是模型生成的 JSON:没有任何机制强制模型遵守 schema,因此畸形调用(缺少必需键、声明为数字的位置传入字符串,或字面量超出声明的集合)会以「仅在名义上类型化」的状态到达 `execute`。工具函数体随后要么在处理结构错误的数据时崩溃,要么在不报错的情况下行为异常。
## 决策
@@ -17,8 +17,8 @@ Status: implemented
## 后果
- 模型会收到有关自身畸形调用的可操作反馈,而不是遭遇不透明的崩溃,弥合了 `InferArgs` 的承诺与运行时现实之间的鸿沟。
- 校验器与 `InferArgs` 必须保持一致;一项[属性测试](../testing/2026-06-11-property-based-testing.md)生成满足 spec 的参数并断言它们通过 `validateArgs`(同时通过针对性改坏参数来断言其会被拒绝),通过自动化检查消除这种漂移风险。
- `ToolArgsError` 是[结构化错误分类体系](2026-06-11-structured-error-taxonomy.md)中 `HarnessError` 的子类,保留其 `code` 字段;读取 `.message` 的调用方不受该层级结构影响。
- 校验器与 `InferArgs` 必须保持一致;一项[属性测试](../testing/2026-06-11-property-based-testing.zh.md)生成满足 spec 的参数并断言它们通过 `validateArgs`(同时通过针对性改坏参数来断言其会被拒绝),通过自动化检查消除这种漂移风险。
- `ToolArgsError` 是[结构化错误分类体系](2026-06-11-structured-error-taxonomy.zh.md)中 `HarnessError` 的子类,保留其 `code` 字段;读取 `.message` 的调用方不受该层级结构影响。
- 校验开销相对于一次模型调用可忽略不计。
<!-- agent-note-format: alternatives-not-recorded (pre-format Agent Note) -->
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-13-capability-seams.md
2026-06-13-capability-seams.md: 2a166278ea454895177fa12b58f5493276f19cd1
2026-06-13-capability-seams.zh.md: 0874af5826960ab9e718eb07b00c12b446edfd78
2026-06-13-capability-seams.md: 46a2c39e927e859c7eb95956d8586f3bf04c7b1c
2026-06-13-capability-seams.zh.md: f44e3e68d2153149435b0fd0aaa5fd121cf3ecad
@@ -6,7 +6,7 @@ English | [中文](2026-06-13-capability-seams.zh.md)
## Problem
The harness has swappable capabilities — bash execution today, sandboxed/remote executors and alternative model providers tomorrow. A capability has three concerns that change at different rates and for different reasons: the *contract* (what the capability is), the *implementation* (how it runs), and the *consumer API* (what the model and other plugins program against). Bundling them in one package couples those rates of change — swapping a local executor for a sandboxed one would churn the tool schemas the model sees, even though the model-facing contract never changed.
The harness has swappable capabilities, including shell execution and model providers. A capability has three concerns that change at different rates and for different reasons: the *contract* (what the capability is), the *implementation* (how it runs), and the *consumer API* (what the model and other plugins program against). Bundling them in one package couples those rates of change — swapping a local executor for a sandboxed one would churn the tool schemas the model sees, even though the model-facing contract never changed.
This is distinct from "who provides vs. needs a capability at runtime", which Cordis already answers with services + `inject` (a provider registers `ctx.shell`; a consumer declares `inject: ['bash']` and its fiber pends until the service exists). That mechanism is necessary but doesn't dictate package boundaries; this Agent Note does.
@@ -6,7 +6,7 @@ Status: implemented
## 问题
harness 具有可替换的能力:当前是 bash 执行,未来会有沙箱化/远程执行器和替代模型提供方。一项能力涉及三个关注点,它们以不同速率、因不同原因变化:*约定*(这项能力是什么)、*实现*(它如何运行)、*消费方 API*(模型和其他插件面向什么编程)。将三者捆绑在一个包中会耦合这些变化速率——把本地执行器换成沙箱化执行器时,模型看到的工具 schema 也会被搅动,尽管面向模型的约定从未改变。
harness 具有可替换的能力,包括 shell 执行和模型提供方。一项能力涉及三个关注点,它们以不同速率、因不同原因变化:*约定*(这项能力是什么)、*实现*(它如何运行)、*消费方 API*(模型和其他插件面向什么编程)。将三者捆绑在一个包中会耦合这些变化速率——把本地执行器换成沙箱化执行器时,模型看到的工具 schema 也会被搅动,尽管面向模型的约定从未改变。
这与「谁在运行时提供、谁需要一项能力」是不同的问题,后者 Cordis 已通过服务 + `inject` 解决(提供方注册 `ctx.shell`;消费方声明 `inject: ['bash']`,其 fiber 挂起直到服务存在)。该机制是必要的,但不决定包的边界;本 Agent Note 决定的是包的边界。
@@ -26,7 +26,7 @@ Service Provider 与 Consumer 由此独立演进:沙箱化执行器替换 `dsh
## 术语:seam 指三者组合,而非接口
一个 **seam** 是完整的能力——三个角色合在一起:**Service Definition**(拥有 `ctx.<key>` 和词汇的 Cordis `Service`)、一个或多个 **Service Provider**,以及一个或多个 **Consumer**。`packages/shell` 是规范范例——`dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`。一个包可以承担多个角色,但单个角色本身不是 seam。「seam」一词严格保留给这种完整能力;命名其中一个组成部分时,应使用其角色、类、服务、约定或扩展点。[术语表](../../../../docs/glossary.md#capability-seam)是规范条目。
一个 **seam** 是完整的能力——三个角色合在一起:**Service Definition**(拥有 `ctx.<key>` 和词汇的 Cordis `Service`)、一个或多个 **Service Provider**,以及一个或多个 **Consumer**。`packages/shell` 是规范范例——`dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`。一个包可以承担多个角色,但单个角色本身不是 seam。「seam」一词严格保留给这种完整能力;命名其中一个组成部分时,应使用其角色、类、服务、约定或扩展点。[术语表](../../../../docs/glossary.zh.md#capability-seam)是规范条目。
## 曾考虑的替代方案
@@ -35,4 +35,4 @@ Service Provider 与 Consumer 由此独立演进:沙箱化执行器替换 `dsh
## 后果
分离角色会增加包和样板代码(`package.json`、`tsconfig`、README 和注入接线)。换来的是:Service Provider 与 Consumer 独立发布和版本管理,新后端永远不会波及面向模型的约定。[AGENTS.md](../../../../AGENTS.md) 和 [architecture.md](../../../../docs/architecture.md) 载有这项规则;bash 三件套是参考模板。本 Agent Note 记录为什么独立变化的角色通常需要拆分,而确实共享的关注点可以保持合并。
分离角色会增加包和样板代码(`package.json`、`tsconfig`、README 和注入接线)。换来的是:Service Provider 与 Consumer 独立发布和版本管理,新后端永远不会波及面向模型的约定。[AGENTS.md](../../../../AGENTS.md) 和 [architecture.md](../../../../docs/architecture.zh.md) 载有这项规则;bash 三件套是参考模板。本 Agent Note 记录为什么独立变化的角色通常需要拆分,而确实共享的关注点可以保持合并。
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-13-twin-llm-adapters.md
2026-06-13-twin-llm-adapters.md: a4c87325a0b0d1ebe6cf8f95672e5de74ef37d57
2026-06-13-twin-llm-adapters.zh.md: 2af7e7cca4d4c40e18cece1a4dd5c9cdb11901c8
2026-06-13-twin-llm-adapters.zh.md: 36996750a16cc95393d727cffee3bcc53573eaf2
@@ -6,7 +6,7 @@ Status: implemented
## 问题
`dsh-llm` 拥有一套提供方无关的流式词汇:`StreamChunk` 协议(`block-start`、`text-delta`、`reasoning-delta`、`tool-call-delta`、`block-end`、`usage`、`finish`)以及内容块类型([内容块词汇](2026-06-11-content-block-vocabulary.md))。如果词汇仅针对单个适配器定义,就有可能将该适配器的特异行为固化到「中立」约定中:唯一实现碰巧做了什么,什么就成为事实上的规范;在第二个提供方到来之前,抽象层未经验证——而届时修复这种泄漏的代价已经很高。
`dsh-llm` 拥有一套提供方无关的流式词汇:`StreamChunk` 协议(`block-start`、`text-delta`、`reasoning-delta`、`tool-call-delta`、`block-end`、`usage`、`finish`)以及内容块类型([内容块词汇](2026-06-11-content-block-vocabulary.zh.md))。如果词汇仅针对单个适配器定义,就有可能将该适配器的特异行为固化到「中立」约定中:唯一实现碰巧做了什么,什么就成为事实上的规范;在第二个提供方到来之前,抽象层未经验证——而届时修复这种泄漏的代价已经很高。
## 决策
Loaded 100 of 7658 files, more files were not shown because too many files have changed in this diff. Show more