Compare commits

...
Author SHA1 Message Date
Yichen Jiang 82a5fd61a7 Merge pull request #3685 from deepseek-harness/worktree/release-dsh-0.1.3-alpha.2
release: [email protected]
2026-09-07 19:45:35 +08:00
Yichen Jiang e379fa8bdd release(dsh): 0.1.3-alpha.2 2026-09-07 19:27:06 +08:00
pku-xht c7e29f4b68 Merge pull request #2825 from deepseek-harness/codex/subprocess-native-containment
fix(subprocess): contain escaped descendants with native owners
2026-09-07 18:30:37 +08:00
pku-xht 0f83a2cdc0 Merge remote-tracking branch 'origin/master' into codex/subprocess-native-containment 2026-09-07 18:02:44 +08:00
ihsiang 9292dd8a2d feat(workspace): open the workspace in local apps from the web UI (#3409)
Add the first-party open-in-app host and client packages with a localized Open In menu in the Web Session header.

Resolve installed applications on macOS, Windows, and Linux, launch workspace directories through platform-specific adapters, and remember the selected application.

Closes #1500.

Co-authored-by: ihsiang <[email protected]>
2026-09-07 17:58:11 +08:00
pku-xht e9f1b6c53e Merge remote-tracking branch 'origin/master' into codex/subprocess-native-containment
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-16-explicit-turn-cancellation.i18n.yaml
#	.agents/notes/implemented/architecture/2026-07-16-explicit-turn-cancellation.md
#	.agents/notes/implemented/architecture/2026-07-16-explicit-turn-cancellation.zh.md
#	.agents/notes/implemented/architecture/2026-09-05-canonical-feedback-log.i18n.yaml
#	.agents/notes/implemented/architecture/2026-09-05-nonofficial-feedback-otel.i18n.yaml
#	.agents/notes/implemented/architecture/2026-09-06-embedded-stream-record-readers.i18n.yaml
#	.agents/notes/implemented/bug-fix/2026-09-03-normalized-unread-fs-tool-diagnostic.i18n.yaml
#	.agents/notes/implemented/bug-fix/2026-09-06-windows-python-console-spawn-wait.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-26-generic-file-upload.i18n.yaml
#	.agents/notes/implemented/feature/2026-09-07-model-switch-notice.i18n.yaml
#	.agents/notes/implemented/process/2026-09-03-semantic-issue-templates-and-policy.i18n.yaml
#	packages/shell/bash-local/tests/executor.spec.ts
#	packages/subprocess/subprocess-local/README.i18n.yaml
#	packages/subprocess/subprocess-local/README.md
#	packages/subprocess/subprocess-local/README.zh.md
#	packages/subprocess/subprocess-local/src/spawn.ts
#	packages/subprocess/subprocess-local/tests/spawn.spec.ts
#	packages/subprocess/win32-process/package.json
2026-09-07 17:43:45 +08:00
Dudu-0223 9d93c57053 Merge pull request #3672 from deepseek-harness/perf/session-observation-lazy-events
perf(session-query): materialize live observation events on first read
2026-09-07 17:40:45 +08:00
Dudu-0223 5b91dbfba0 perf(session-query): materialize live observation events on first read 2026-09-07 17:15:35 +08:00
CreatixChu cb602a0df5 Merge pull request #3507 from deepseek-harness/worktree/3410-model-switch-notice
feat(agent): announce model switches
2026-09-07 16:55:45 +08:00
creatixchu 48cc1cf1d6 feat(agent): announce model switches 2026-09-07 16:19:59 +08:00
Tianyi Cui 4ac4e3d014 Merge pull request #3668 from deepseek-harness/fix/windows-subagent-teardown-ci
test(ci): synchronize Windows waiters and complete teardown
2026-09-07 15:52:01 +08:00
Dudu-0223 96ead6091d feat(subagent): align human inbox controls (#3223)
* feat(subagent): align continuable human inbox controls

* fix: repair rebase documentation and close test persistence

* docs: refresh rebased module dependency graph
2026-09-07 07:39:39 +00:00
Tianyi Cui 5608528e14 Merge pull request #3637 from deepseek-harness/perf/frontend-scenarios
test(perf): gate long-session browser and reconnect workflows
2026-09-07 14:42:15 +08:00
Tianyi Cui b53c95e458 Merge pull request #3664 from deepseek-harness/fix/scroll-follow-pending-sample
fix(chat): preserve pinned scroll-follow across layout changes
2026-09-07 14:38:43 +08:00
Tianyi Cui 4023879df7 test(codex): finish captured cleanup after sibling failures 2026-09-07 14:30:31 +08:00
Tianyi Cui a1d11f213f test(session): observe shared waiter admission before cancellation 2026-09-07 14:30:29 +08:00
Tianyi Cui 9ef426d729 fix(chat): keep genuine near-floor scroll gestures pending 2026-09-07 13:46:30 +08:00
Tianyi Cui 421e3b075c test(subagent): preserve lane budgets and await teardown completion 2026-09-07 13:39:56 +08:00
Tianyi Cui cbdf32447e fix(benchmarks): calibrate repeated hosted browser open median 2026-09-07 13:29:38 +08:00
Tianyi Cui 1a3af89a8d fix(benchmarks): calibrate hosted paging and trajectory endpoints 2026-09-07 13:29:38 +08:00
Tianyi Cui 620c2b0b27 fix(benchmarks): calibrate hosted frontend endpoints and preserve input overlap 2026-09-07 13:29:38 +08:00
Tianyi Cui 0ac1d4d865 test(perf): align browser provisioning with hosted benchmark runner 2026-09-07 13:29:38 +08:00
Tianyi Cui c51c16cdac test(perf): respect browser failover provisioning policy 2026-09-07 13:29:38 +08:00
Tianyi Cui 00e452aa03 docs(perf): confirm repeated frontend CI calibration 2026-09-07 13:29:38 +08:00
Tianyi Cui 82cd35467a docs(perf): record first frontend CI calibration 2026-09-07 13:29:38 +08:00
Tianyi Cui 9369585872 test(perf): bound browser observers to active response 2026-09-07 13:29:38 +08:00
Tianyi Cui 2927034ffe test(perf): retain successful CI measurement output 2026-09-07 13:29:38 +08:00
Tianyi Cui 7ac5e08246 test(perf): measure real history streams and live input overlap 2026-09-07 13:29:38 +08:00
Tianyi Cui 6ad74db2e3 test(perf): gate long-session browser and active reconnect workflows 2026-09-07 13:29:38 +08:00
Tianyi Cui 843c8723e5 docs(perf): link active hosted request calibration 2026-09-07 13:29:37 +08:00
Tianyi Cui e2b81cf8bf docs(perf): distinguish hosted request and catalog budgets 2026-09-07 13:29:37 +08:00
Tianyi Cui 8e270960ed test(perf): calibrate request history on standard hosted CI 2026-09-07 13:29:37 +08:00
Tianyi Cui 73edce1ae7 perf(agent-loop): reuse proven message freezes per agent 2026-09-07 13:29:37 +08:00
Tianyi Cui 84914c316d test(perf): calibrate baseline requests for hosted CI 2026-09-07 13:29:37 +08:00
Tianyi Cui 2f0088357d test(perf): calibrate tool continuation for hosted CI 2026-09-07 13:29:37 +08:00
Tianyi Cui daa7f60630 test(perf): calibrate catalog for standard hosted CI 2026-09-07 13:29:37 +08:00
Tianyi Cui 1507f82888 docs(perf): record backend CI evidence and align workload prose 2026-09-07 13:29:37 +08:00
Tianyi Cui c599ef87c4 test(perf): baseline tool-heavy backend workflows 2026-09-07 13:29:37 +08:00
Tianyi Cui 6c4cd033e3 Merge pull request #3280 from deepseek-harness/fix/ci-node-compile-cache-data-disk
ci: redirect Node compile cache to data-volume runner temp
2026-09-07 13:24:49 +08:00
Tianyi Cui fa6bf62a98 fix(chat): settle pinned scroll deliveries before layout growth 2026-09-07 13:24:04 +08:00
Tianyi Cui ef11a4e007 Merge pull request #3644 from deepseek-harness/fix/environment-prompt-suffix
fix(system-prompt): move environment facts behind reusable instructions
2026-09-07 13:12:22 +08:00
Tianyi Cui 3d54bd6d58 Merge branch 'master' into fix/ci-node-compile-cache-data-disk 2026-09-07 13:06:30 +08:00
Tianyi Cui 403b978c6c Merge pull request #3626 from deepseek-harness/optimize/ci-compatible-selfhosted
ci: run isolated Node compatibility jobs on self-hosted Linux
2026-09-07 13:05:07 +08:00
Tianyi Cui a7ea2d74de docs: remove redundant compatibility runner guide 2026-09-07 12:42:02 +08:00
Tianyi Cui ac4fa3d6f5 docs: clarify compatibility runner scope and verification 2026-09-07 12:42:02 +08:00
Tianyi Cui a137256f80 ci: set compatibility toolcache after runner environment export 2026-09-07 12:41:23 +08:00
Tianyi Cui f7a18f49ff ci: isolate compatibility Node jobs on self-hosted Linux 2026-09-07 12:41:23 +08:00
Tianyi Cui fd9debed10 Merge branch 'master' into fix/environment-prompt-suffix 2026-09-07 12:41:16 +08:00
Tianyi Cui c379894af8 fix(ci): isolate routing test setup and correct scheduling docs 2026-09-07 12:40:40 +08:00
Tianyi Cui ab1ee99685 ci: defer macOS ARM runtime and Wine checks to master 2026-09-07 12:40:40 +08:00
Tianyi Cui 31090e240a Merge pull request #3643 from deepseek-harness/fix/ci-python-runtime-smoke-retry
fix(ci): 加固 Python runtime 构建——安装重试与凭据隔离
2026-09-07 12:29:43 +08:00
Tianyi Cui 60d3e32069 fix(test): await lazy grammar registration notifications 2026-09-07 11:54:10 +08:00
Tianyi Cui 64dfd7a425 fix(test): await Client Console subscription delivery 2026-09-07 11:35:13 +08:00
Tianyi Cui f5302b2b4d fix(test): isolate recorded Web browser timezone 2026-09-07 11:17:42 +08:00
Tianyi Cui 237b3d5edf fix(test): synchronize pwsh completion and refresh profile snapshots 2026-09-07 11:07:19 +08:00
Tianyi Cui beb23febfd Merge branch 'master' into fix/environment-prompt-suffix 2026-09-07 10:43:43 +08:00
Tianyi Cui 5c8e1b53de Merge latest master into fix/ci-node-compile-cache-data-disk 2026-09-06 21:26:37 +08:00
Tianyi Cui 40792330c0 fix(system-prompt): keep model persona prefix and place cwd in suffix 2026-09-06 20:35:42 +08:00
Tianyi Cui 1dc50c492e fix(ci): harden Python runtime builds against transient failures
Master's windows-python-console-spawn-wait fix removed the plugin-add flake
this branch previously retried, so that retry is dropped entirely; the
branch keeps the changes that remain useful.

- Retry the immutable install step up to three attempts total with a
  ten-second pause (bash on every platform): node-gyp's Node-header
  download from nodejs.org intermittently times out, as observed on the
  hosted node24-macos-x64 cell.
- Keep checkout credentials out of the build tree (persist-credentials:
  false) so dependency-install scripts cannot read the embedded token.
- Failover runbook: drop the stray leading '#' before the Dependabot
  paragraph on both sides.
- Hosted-runtime note: name the PR/commit ownership and UTC timestamps of
  the cited runs and record the constraints a future self-hosted attempt
  must satisfy; new note records the install retry decision.
2026-09-06 20:31:01 +08:00
Tianyi Cui 6ac3258390 Merge pull request #3640 from deepseek-harness/ci/benchmark-standard-runner
test(ci): move required benchmarks to standard GitHub runners
2026-09-06 20:13:05 +08:00
Tianyi Cui e28862db57 fix(system-prompt): place environment facts after reusable instructions 2026-09-06 20:08:19 +08:00
Tianyi Cui 88e4c3c235 Merge master and preserve hosted benchmark documentation 2026-09-06 19:58:19 +08:00
Tianyi Cui 6f21b112da fix: wait for the Python console runtime on Windows 2026-09-06 19:53:23 +08:00
Tianyi Cui 50b0511fe1 Merge pull request #3466 from deepseek-harness/feat/system-prompt-surface-node-notes
docs(agent-note): propose system prompt as surface node and in-history replacement
2026-09-06 11:39:05 +00:00
Tianyi Cui 86528bb8a4 Merge pull request #3642 from deepseek-harness/fix/python-runtime-hosted-windows
revert(ci): run Windows Python runtime CI on GitHub-hosted Windows
2026-09-06 19:34:47 +08:00
Tianyi Cui 083cef0aea docs(notes): record hosted Windows runtime decision, retire the proposal
The failover runbook's Windows switch scope returns to the native Windows jobs:
remove the Python runtime eligibility sentences, the pool Python prerequisite,
and the proposal links. The #3629 self-hosted Python runtime proposal is
retired (deleted as obsolete after its unmeasured-throughput run), and a new
implemented note records that the Windows x64 runtime lane stays on
GitHub-hosted Windows with the evidence and alternatives. Bilingual sidecars
re-recorded.
2026-09-06 19:18:38 +08:00
Tianyi Cui 6933eccdb0 docs(notes): record hosted Windows runtime decision, reject proposal
The failover runbook's Windows switch scope returns to the native Windows jobs:
remove the Python runtime eligibility sentences, the pool Python prerequisite,
and the links to the proposal. The self-hosted Python runtime proposal is
moved to rejected with its unmeasured-throughput verdict, and a new
implemented note records that the Windows x64 runtime lane stays on
GitHub-hosted Windows with the reasons. Bilingual sidecars re-recorded.
2026-09-06 19:17:28 +08:00
Tianyi Cui faa33c0ffa revert(ci): run Windows Python runtime CI on GitHub-hosted Windows
Windows x64 runtime builds resolve their hosted matrix.runner unconditionally
again (windows-2025 for pull-request CI). Remove the DSH_CI_FAILOVER_WINDOWS
selector, job-private Python toolchain, self-hosted dependency install and
post-step cleanup, the private setup script, and the routing spec introduced
in #3629. The Windows failover switch again covers only the native Windows
jobs in ci.yml.
2026-09-06 19:17:27 +08:00
Tianyi Cui cd5e872bed Merge branch 'master' into ci/benchmark-standard-runner 2026-09-06 18:46:12 +08:00
Tianyi Cui 3bb63f9e4e Merge pull request #3632 from deepseek-harness/perf/speed-up-skill
docs(skills): add evidence-driven performance optimization workflow
2026-09-06 18:38:27 +08:00
Tianyi Cui e29b6528c3 docs(ci): list benchmarks among fixed hosted dependencies 2026-09-06 18:35:15 +08:00
Tianyi Cui b74411d9b8 test(bench): calibrate reopen budget for standard two-CPU CI 2026-09-06 18:24:42 +08:00
Tianyi Cui f75aabcb16 test(ci): run required benchmarks on standard hosted Linux 2026-09-06 17:10:30 +08:00
Tianyi Cui ce2197aa1d docs(agent-note): propose system prompt surface and in-history updates
Consolidate the existing notes-only PR into one review baseline. Preserve the exact reviewed tree; subsequent corrections remain separate commits with their own rationale and regression evidence.
2026-09-06 16:52:38 +08:00
Tianyi Cui eece831b18 Merge pull request #3629 from deepseek-harness/optimize/python-runtime-selfhosted
ci: move Windows Python runtime CI to isolated self-hosted jobs
2026-09-06 15:56:01 +08:00
Tianyi Cui 000cd7e762 Merge master and reconcile platform failover documentation 2026-09-06 15:35:49 +08:00
Tianyi Cui d15aaee271 Merge pull request #3627 from deepseek-harness/optimize/release-rehearsal-selfhosted
ci: route trusted release rehearsals to self-hosted Linux
2026-09-06 15:22:44 +08:00
Tianyi Cui 37d3ec1681 ci: address Windows runtime routing and isolation review 2026-09-06 15:07:17 +08:00
Tianyi Cui ed183b1bd1 Merge pull request #3630 from deepseek-harness/fix/agent-message-spacing
fix(subagent): add space after agent message prefix
2026-09-06 15:03:27 +08:00
Tianyi Cui a1188bbf3f ci: contain release temporary installs and document shared routing 2026-09-06 14:57:11 +08:00
Tianyi Cui ceb3136bef ci: size PR previews on measured standard hosted runners (#3628)
* ci: measure hosted preview runner sizes [preview-sizing-benchmark]

* ci: type benchmark job keys explicitly [preview-sizing-benchmark]

* ci: size PR previews on measured standard hosted runners
2026-09-06 14:56:30 +08:00
Tianyi Cui 6cc750b006 docs(skills): route performance evidence through decision note 2026-09-06 14:50:53 +08:00
Tianyi Cui 7c3d47d4d6 test(subagent): refresh message spacing snapshots 2026-09-06 14:48:27 +08:00
Tianyi Cui 7a1cf325b8 docs(skills): add evidence-driven performance optimization workflow 2026-09-06 14:14:30 +08:00
Tianyi Cui 3a79abedec ci: use UTF-8 Python text on self-hosted Windows 2026-09-06 13:49:19 +08:00
Tianyi Cui 754a65ab2d fix(subagent): separate message prefix from body 2026-09-06 13:47:37 +08:00
Tianyi Cui 69b1e315b4 ci: use isolated self-hosted Windows Python runtime builds 2026-09-06 13:21:26 +08:00
Tianyi Cui 81dcacbb44 Merge pull request #3537 from deepseek-harness/perf/03-client-stream-fold
perf: read embedded Assistant streams per compact record
2026-09-06 13:17:51 +08:00
Tianyi Cui f66dd78ff7 ci: route trusted release rehearsals to self-hosted Linux 2026-09-06 13:01:55 +08:00
Tianyi Cui 07245b9e88 docs(llm): scope the record readers' early-exit claims; state that readers trust the static record type
Reflect the review feedback on the reader list: assistantStreamFirstTokenTime and the has-visible readers stop at the first qualifying member, while lastAssistantStreamChunk, assistantStreamChunks, and joinAssistantStreamText scan the whole stream; assembleAssistantStream feeds a BlockAssembler one joined delta per run. Record-level readers trust the static record type; expandAssistantStream is the validating path.
2026-09-06 12:46:19 +08:00
Tianyi Cui 53c2ed9916 Merge pull request #3618 from deepseek-harness/fix/session-reference-spill
fix(session-reference): spill complete truncated snapshots for retrieval
2026-09-06 12:44:37 +08:00
Tianyi Cui 165cc31eb8 perf(llm,host): read embedded Assistant streams per compact record
Session format v2 embeds each attempt's compact stream in
assistant/message and assistant/attempt, but Host and client consumers
still expanded it into per-member TimedStreamChunk arrays and did
per-member work; expandAssistantStream materializes the full array before
find/toReversed/break can answer. Session Stats (the projection phase of
every Session open), the token meter's usage and provider-assembly folds,
the subagent output fold, and the Session Controller image lookup still
paid O(members) allocation and time per settlement.

The Chat and Trajectory definitions were already settled from
message.content on master; the remaining per-member folds stay.

dsh-llm now exports record-level readers (first token, visible content,
visible text, last raw chunk of a type, raw chunks of a type, joined
text, run-aware assembly, per-run first-token/first-visible times) that
scan the compact records once with early exit. Session Stats reads
assistantStreamFirstTokenTime, the token meter reads
lastAssistantStreamChunk(stream, 'usage') and assembles through
assembleAssistantStream, the subagent output fold appends
joinAssistantStreamText, and the Session Controller scans
assistantStreamChunks(stream, 'block-end').

expandAssistantStream is deliberately not memoized: retaining expansions
costs roughly ten times the compact stream for the Session's lifetime.
It remains the validating path at durable boundaries.

Synthetic 200-turn v0 migration benchmark, median of five: first-open
projection 28.0 ms -> 5.4 ms, first-open total 76.9 -> 50.0 ms, peak RSS
137.2 -> 94.9 MB; reopen projection 17.8 -> 5.6 ms; all phase budgets and
the 128 MB heap constraint keep passing.
2026-09-06 12:41:25 +08:00
Tianyi Cui e12ca5fdf0 test(session-reference): preserve complete regression suite after rebase 2026-09-06 12:17:12 +08:00
Tianyi Cui 539b5cd93d fix: normalize JSON-escaped Windows spill locators 2026-09-06 12:17:12 +08:00
Tianyi Cui 52475cbf50 fix: spill truncated session-reference captures for retrieval 2026-09-06 12:17:12 +08:00
Tianyi Cui 72ce6964ac fix(session-reference): retain fallback for adapterless routes 2026-09-06 12:17:11 +08:00
Tianyi Cui 36a3a1188d fix(session-reference): size default budget from selected model 2026-09-06 12:17:11 +08:00
imccyu 450d98b398 Merge pull request #3586 from deepseek-harness/session-migration-preparation
perf(session): prepare historical reads before publication
2026-09-06 02:35:49 +08:00
imccyu 80306f51a6 Merge pull request #3585 from deepseek-harness/session-migration-streaming
perf(session): stream released format migrations
2026-09-06 02:34:12 +08:00
Tianyi Cui 53066fd640 Merge pull request #3535 from deepseek-harness/perf/01-session-open-benchmarks
test(perf): gate opening large Sessions with synthetic CI benchmarks
2026-09-06 02:32:09 +08:00
imccyu 591d12ce86 docs(session): document preparation-first restoration 2026-09-06 02:10:28 +08:00
imccyu 9b78f99dec perf(session): transfer frozen persistence reads into restore 2026-09-06 02:10:23 +08:00
imccyu a3e5edbdbf perf(session-persistence): prepare historical reads before publication 2026-09-06 02:08:48 +08:00
imccyu 98d2baf2e5 docs(session): document streaming format migration 2026-09-06 02:06:22 +08:00
imccyu 84c11c7243 perf(client): avoid replaying settled assistant streams 2026-09-06 02:05:52 +08:00
imccyu ec2f63dbdb perf(session-persistence): stream migration publication and verification 2026-09-06 02:05:40 +08:00
imccyu 46196d6f95 perf(session-format): stream released v0-to-v2 migrations 2026-09-06 02:05:27 +08:00
imccyu a84a8da9e1 refactor(session-format): introduce streaming migration stages 2026-09-06 02:05:09 +08:00
imccyu a548150f86 test(perf): isolate benchmark dependencies 2026-09-06 01:01:04 +08:00
imccyu 422f5a19af test(perf): calibrate CI benchmark budgets 2026-09-06 01:01:04 +08:00
imccyu 356a332195 test(perf): run benchmarks against built artifacts 2026-09-06 01:01:04 +08:00
imccyu ec954d495e test(perf): freeze released benchmark rows 2026-09-06 01:01:04 +08:00
imccyu 47a6fa0f28 test(perf): centralize lifecycle benchmarks 2026-09-06 01:01:03 +08:00
Tianyi Cui c53b0bb5ed test(perf): double the CI cost in the migration budget
The migrating first open measured 1,963 ms on the CI runner under the
128 MB heap limit; 4,000 ms keeps a 2x margin while the repeated-snapshot
implementation still fails by heap exhaustion and would need ~10 s.
2026-09-06 01:01:03 +08:00
Tianyi Cui 3285850ee5 test(perf): allow the joined-text share in the fold scaling bound
A records-proportional fold still joins 20x more text in the large window,
which measured about 2.5x the small fold; the per-delta replay measured
about 11x. A 5x bound separates the two on a noisy runner.
2026-09-06 01:01:03 +08:00
Tianyi Cui 9048e8ee11 test(perf): size the migration budget for the CI runner
The migrating first open of the synthetic log costs about 1 s on the
reference machine under the 128 MB heap limit and about twice that on the
CI runner, so 3,000 ms keeps headroom while staying far below the ~5 s
(~10 s on CI) of the repeated-snapshot implementation.
2026-09-06 01:01:03 +08:00
Tianyi Cui 74e27c97d0 test(perf): list the bench config among proxy-setup Vitest inventories
scripts/test-proxy-environment.spec.ts pins the Vitest configs that declare
setupFiles so the proxy isolation setup is never dropped; the benchmark
lane declares it too.
2026-09-06 01:01:03 +08:00
Tianyi Cui 2395f112d8 test(perf): gate opening large Sessions with synthetic CI benchmarks
Add a benchmark lane (`vitest.bench.config.ts`, `pnpm run test:bench`,
gate mode `ci-bench`) and a required `node 24 / benchmarks` CI job that
runs it alone. Benchmarks synthesize their input in-process from fixed
parameters and fail on documented budgets:

- `open-generation.bench.ts`: a 200-turn released-v0 log with 500 text
  and 125 reasoning deltas per reply (127,400 events, ~2.8 MB) encoded
  through the frozen v0 codec; the migrating first `open()` must finish
  within 2,000 ms in a child process capped at 128 MB of old space, and a
  fresh process must open the published current generation within 500 ms.
- `conversation-fold.bench.client.ts`: 200 replies whose compact streams
  hold 2,000 text + 500 reasoning deltas each, folded through every Chat
  Definition by the real assembler; the fold must finish within 150 ms
  and stay within 3x the fold of the same window with 100 deltas per
  reply.

On this commit both gates fail: the migration exhausts the 128 MB heap
(4.8 s and 696 MB peak RSS without the cap; the pre-stack decode of the
same bytes took 34 ms and 168 MB) and the fold scales 11x with the delta
count. The stacked fixes bring both paths to O(records).
2026-09-06 01:01:03 +08:00
Tianyi Cui cd4a23c5df Merge pull request #3529 from deepseek-harness/turtle/redesign-issue-pr-templates-policy
Redesign issue and pull request templates and simplify policy
2026-09-06 00:44:02 +08:00
fz 4acdf8e5bb Merge pull request #3611 from deepseek-harness/feat/sdk-disable-str-replace-editor
feat(base): remove str_replace_editor from default tools
2026-09-06 00:21:42 +08:00
Tianyi Cui a6e157c0a3 Merge pull request #3605 from deepseek-harness/fix/ptc-bash-cards
fix(web): show Bash terminal cards in PTC mode
2026-09-06 00:09:29 +08:00
fz 17d8507b87 Merge origin/master into feat/sdk-disable-str-replace-editor 2026-09-05 23:57:47 +08:00
Tianyi Cui cef72f2f27 fix(spill): publish notice through standard pure source entry 2026-09-05 23:52:59 +08:00
Tianyi Cui b25d4faaaa fix(spill): share persisted notice formatting with client recognition 2026-09-05 23:52:59 +08:00
Tianyi Cui 314cd13971 fix(web): keep spilled shell previews generic without guessing status 2026-09-05 23:52:59 +08:00
Tianyi Cui 739b38c973 docs(web): describe nested terminal details eligibility 2026-09-05 23:52:59 +08:00
Tianyi Cui 46a08db381 fix(web): render terminal cards for PTC bash subcalls 2026-09-05 23:52:59 +08:00
Tianyi Cui ce0a1e4253 Merge pull request #3368 from deepseek-harness/fix/directory-picker-win32-overread
fix(directory-picker-native): decode the Win32 picker path without a fixed 32KiB view
2026-09-05 23:51:08 +08:00
Tianyi Cui eae5c6b896 Merge pull request #3598 from deepseek-harness/feat/feedback-otel-fallback
feat(telemetry): submit explicit feedback through OTel for all users
2026-09-05 23:48:54 +08:00
fz 36a4665144 feat(base): remove str_replace_editor from default tools 2026-09-05 23:37:13 +08:00
Tianyi Cuiandzhanglunet 141d72d7cf fix(directory-picker-native): decode the Win32 picker path without a fixed 32KiB view
Replace the external ArrayBuffer view and manual UTF-16 scan with native Koffi decoding through a pointer-width buffer. Preserve the original address for CoTaskMemFree.

Exercise production resultPath with real Koffi decoding of live UTF-16 buffers. Cover zero-low-byte BMP characters, surrogate pairs, NUL termination, and strings exceeding 32 KiB; test four- and eight-byte BigInt pointer preservation and the original release address. A negative-control mutation confirms truncating a 64-bit address fails.

Keep the bilingual Agent Note focused on implementation rationale and required memory ownership. Preserve master archive seals during rebase.

Co-authored-by: zhanglunet <[email protected]>
2026-09-05 23:24:46 +08:00
Tianyi Cui 9ffe85a512 OTel uploads explicit feedback for all users by default 2026-09-05 23:21:23 +08:00
ChinesezjcandTianyi Cui 02a029e679 Feedback is recorded in the session log and delivered through DeepSeek
Co-authored-by: Tianyi Cui <[email protected]>
2026-09-05 23:21:22 +08:00
Tianyi Cui cd872be967 Merge pull request #3613 from deepseek-harness/chore/pi-ai-0.85.1
chore(llm): upgrade pi-ai to 0.85.1
2026-09-05 23:16:54 +08:00
Tianyi Cui 1a93474759 docs(llm): clarify pi-ai replay compatibility evidence 2026-09-05 22:57:00 +08:00
Tianyi Cui 7bab91d247 fix(llm): retain Anthropic resolved model during replay 2026-09-05 22:40:40 +08:00
Tianyi Cui 69a0441c34 chore(llm): upgrade pi-ai to 0.85.1 2026-09-05 22:36:58 +08:00
fz 20ed4aced0 docs(sdk): clarify the default editor selection 2026-09-05 22:28:40 +08:00
fz 965adbb5cf feat(sdk): disable str_replace_editor by default 2026-09-05 22:11:20 +08:00
Yichen Jiang 62120daf94 Merge pull request #3602 from deepseek-harness/worktree/dsh-package-manifest
refactor(manifest): centralize package manifest types
2026-09-05 21:08:27 +08:00
Yichen Jiang eea8a83a23 Merge origin/master into worktree/dsh-package-manifest 2026-09-05 20:52:58 +08:00
Yichen Jiang 37aac1a555 docs(manifest): align invariant omission wording with validation 2026-09-05 20:50:37 +08:00
Tianyi Cui 93d89dd0d5 Merge pull request #3603 from deepseek-harness/fix/ci-runtime-wheel-windows
fix(boot): normalize absolute plugin paths in patches
2026-09-05 20:50:02 +08:00
Yichen Jiang 4d56cbc3d3 refactor(manifest): centralize package manifest types 2026-09-05 20:44:31 +08:00
Tianyi Cui 4826e0c2a3 docs(boot): clarify patch path conversion ownership 2026-09-05 20:32:47 +08:00
Tianyi Cui c70b30a6fb test(cli): exercise patch removal without rapid rewrite 2026-09-05 20:25:20 +08:00
Tianyi Cui 15e444e0d7 fix(boot): normalize absolute plugin paths in patches 2026-09-05 20:14:43 +08:00
Yichen Jiang 4aa3cb7818 Merge pull request #3590 from deepseek-harness/worktree/ui-primitives-consolidation-429264
refactor(client): consolidate shared controls into ui-primitives
2026-09-05 15:33:18 +08:00
Yichen Jiang d46f840e99 Merge origin/master into worktree/ui-primitives-consolidation-429264
Archiving low-future-value Agent Notes (#3548) stripped the inbound
citations to three now-archived notes from the ui-primitives README, and
this branch rewrote the same "Controls and icons" opener so the new
component catalog owns the export enumeration. The resolution keeps this
branch's opener and drops the archived-note citation master removed, in
both languages; the pairing record is re-recorded from the merged pair.
2026-09-05 15:17:44 +08:00
Yichen Jiang c279350e03 fix(client): keep the Switch track capsule under the global corner shape
The track's radius is half its height, so its corners consume the whole
side and the global `superellipse(1.5)` squares the ends off — beside a
thumb that already opts out at `border-radius: 50%`, leaving a round knob
in a squared-off slot. Pair `corner-shape: round` with the radius, the way
every full-round radius in the repository does.

The corner-shape stylesheet spec recognizes 50%, 100%, and radii at or
above 99px, so a radius that is full-round only relative to its own box
passes it; the comment records that gap at the rule it affects.
2026-09-05 15:11:25 +08:00
Tianyi Cui d86c08bc1c Merge pull request #3548 from deepseek-harness/worktree/archive-agent-notes-20260904
docs(notes): archive low-future-value Agent Notes
2026-09-05 15:07:49 +08:00
Yichen Jiang 853de8ad0b docs(client): finish the five-state and Pill/Tag corrections
The `idle` addition left two maintainer-facing statements behind: the
README's limitations entry still listed four supported StateDot states,
and TerminalBlock's run-state JSDoc still counted the union as four while
correctly saying three of them are reachable there.

Pill's header comment still sent every capsule without `onClick` to Tag,
which contradicts both the catalog this pull request corrected and
TerminalBlock's own static read-only Pill two files away. Size separates
the two controls as much as interactivity does, and the comment now says
so. The function JSDoc and the static-mode tests stay as they are: they
describe supported behavior.
2026-09-05 15:04:17 +08:00
Yichen Jiang a6ef8dc97a fix(client): animate the unloading phase dot and correct the catalog
`unloading` marks a teardown the Host is running, which an async disposer
can hold for a while, so the inventory's dot animates it like `loading`
instead of showing the static grey `idle` mark that means no activity.

Correct four documentation facts against the shipped code: StateDot's
render JSDoc still promised four states, the catalog claimed four Tooltip
sides where TooltipSide has three, the Agent Note's geometry audit counted
three matching rules where two match, and the migrated-site and shipped-
appearance counts had drifted.

Record two things the first pass left out: TerminalBlock renders its exit
status as a static Pill, which the Tag/Pill catalog entry now accounts for
by size rather than by interactivity alone, and the disabled inventory tag
changed fill token, which joins the visual-change list.

Pin Tag's eight tones with a stylesheet spec, for the same reason StateDot
has one: CSS Modules resolve to class-name maps in component suites, so a
missing or wrong tone rule passes every render assertion.
2026-09-05 14:54:42 +08:00
Tianyi Cui 051cd4b281 docs(notes): address ds-review-bot feedback on the archive audit
- Stop treating three archived records as current authority: bounded-llm
  citation now points at the llm-retry README, the semantic-composer
  proposal cites the runtime-owned child guard as history it builds on,
  and the code-runtime comment states the deferred rationale locally.
- Fix the stale "dsh family stays restricted" claims left without their
  rationale citation: the check-workspace-constraints comment, the
  release publish comment, and the kept npm-release-sequences note now
  record that the family published publicly on 2026-08-13 (87f8e6a728).
- The rejected client-settings-locale-theme body keeps its pristine
  proposal prose with only the Status line and the two link paths whose
  targets this PR archived; the link remaps are required for
  verify-md-links and pairing, and every prose byte is untouched.
2026-09-05 14:52:33 +08:00
Tianyi Cui a7a5be1703 docs(notes): archive low-future-value Agent Notes
Run the dsh-archive-agent-notes audit over every active Agent Note on
current master, judging each record by whether its rationale still guides
work rather than by size or age.

- Archive 453 implemented bilingual triplets (417,882 English words):
  completed UI chrome, narrow adapters, closed bug fixes, implementation
  walkthroughs whose package READMEs, docs pages, generators, or successor
  notes now carry the useful behavior, and 51 records fully superseded by
  a later active note. Keep 201 implemented notes whose ownership rules,
  negative guarantees, durable or wire semantics, security rules,
  reintroduction conditions, or still-tempting rejected alternatives
  remain useful.
- Reject 7 proposals whose premise is gone or whose work shipped in
  amended form under other records; delete 2 rejected notes that no
  longer prevent a plausible mistake.
- Retarget every remaining inbound link to the archived path, and repair
  active prose that named an archived record as the owner of a live fact:
  parenthetical citations drop, ownership sentences redirect to the
  README, docs page, or active note that states the fact, and history
  citations say so. Chinese files link the English archived path because
  the pairing gate treats the frozen tree as outside the bilingual corpus.
- Seal 1,359 new frozen artifacts; existing seals are unchanged and
  outbound links from archived notes are neither inspected nor repaired.
- Regenerate docs/config-catalog.md after the hook-bridge comment edits
  shifted two source line numbers.
2026-09-05 14:37:32 +08:00
Yichen Jiang 452b2a816a refactor(client): share the capsule tag, switch, and idle state dot
Client feature plugins never import one another's components, so
ui-primitives is their only channel for sharing one. Nothing told an
author to look there first, and the package offered nothing to look
at: its README named six source files against forty-plus exports.

Add Tag (read-only capsule badge, eight tones) and Switch (36x20
toggle with a required accessible name), extend StateDotState with
idle for a tracked subject with no activity, and move ui-agent-preset,
ui-settings-plugins, and ui-settings-plugin-inventory onto them.

The plugin inventory's conditional tag referenced
--dsw-alias-state-warning-primary, which does not exist, so both
themes had been painting its hardcoded #b45309 fallback.

State the reuse rule as the first step of the new-component checklist,
and give the README a component catalog so the rule has something to
check. The rule is guidance, not a gate: a package may still write its
own control, and the Agent Note records the five that stay local.
2026-09-05 14:32:59 +08:00
Tianyi Cui 9f68695f97 docs(notes): normalize Chinese Agent Note header tokens
The Agent Note rules keep the `# Agent Note: ` title prefix and the
`Status:` line in English verbatim on both language sides. 51 Chinese
counterparts carried a full-width colon (`# Agent Note:`), an annotated
prefix (`# Agent Note(agent 决策记录):`), or a translated status token
(`状态:已实现`, `状态:implemented`, `状态:已实施`, `状态:proposed`), which the
archive verifier rejects on entry to the frozen tree. Normalize the tokens
and re-record the bilingual sidecars; no body text changes.
2026-09-05 14:23:52 +08:00
Yichen Jiang 4dd2c7b51b Merge pull request #3582 from deepseek-harness/worktree/queue-submission-sending
fix(web): show sending state for queued submissions
2026-09-05 12:39:43 +08:00
Yichen Jiang 0ea65903ce Merge pull request #3580 from deepseek-harness/worktree/fix-client-reconnection
fix(connection): recover stalled handshakes and keep retrying
2026-09-05 12:37:00 +08:00
Yichen Jiang 69161395ce fix(web): wait for queue admission before collapsed snapshots 2026-09-05 12:24:05 +08:00
Yichen Jiang 1e04fcff35 fix(connection): validate retry factors and clarify timeout recovery 2026-09-05 12:21:59 +08:00
Yichen Jiang a3ccbd4d99 fix(web): show sending state for queued submissions 2026-09-05 11:51:52 +08:00
Yichen Jiang 1bd26370cc fix(connection): recover stalled handshakes and keep retrying 2026-09-05 11:50:27 +08:00
Dudu-0223 5659d19c30 Merge pull request #3484 from deepseek-harness/fix/fork-resume-system-prompt
fix(web): avoid repeated system prompt on resume
2026-09-04 18:38:07 +08:00
Dudu-0223 d8f630f4b7 Merge remote-tracking branch 'origin/master' into fix/fork-resume-system-prompt 2026-09-04 18:13:46 +08:00
Yichen Jiang d347e70390 Merge pull request #3554 from deepseek-harness/release/dsh-0.1.3-alpha.1
release: [email protected]
2026-09-04 17:16:23 +08:00
Chinesezjc a33b9081b6 Merge remote-tracking branch 'origin/master' into fix/ci-node-compile-cache-data-disk 2026-09-04 17:13:09 +08:00
Dudu-0223 d733bb24e5 Merge remote-tracking branch 'origin/master' into fix/fork-resume-system-prompt 2026-09-04 16:58:21 +08:00
Yichen Jiang 5aff05a92f Merge branch 'master' into release/dsh-0.1.3-alpha.1 2026-09-04 16:58:08 +08:00
Yichen Jiang 2f77acb9ab Merge pull request #3558 from deepseek-harness/fix/web-clickable-links-gallery-golden
test(web): refresh the clickable-links gallery golden for the attachment button
2026-09-04 16:58:00 +08:00
Chinesezjc 4dfd3b5948 fix(note): restore blank line before Alternatives heading after merge conflict resolution 2026-09-04 16:50:44 +08:00
Dudu-0223 eb60b74f47 test(web): wait for seeded agent attachment 2026-09-04 16:43:09 +08:00
Dudu-0223 493072641d Merge remote-tracking branch 'origin/master' into fix/fork-resume-system-prompt
# Conflicts:
#	packages/client/ui-chat/src/client/conversation-nodes/chat-snapshot-builder.ts
2026-09-04 16:39:08 +08:00
Yichen Jiang c42ab9e14e test(web): refresh the clickable-links gallery golden for the attachment button 2026-09-04 16:38:22 +08:00
Dudu-0223 f0ab6a6054 fix(ui-chat): retain skill names on message upserts 2026-09-04 16:31:34 +08:00
Yichen Jiang 6a82a3b3e2 Merge branch 'master' into release/dsh-0.1.3-alpha.1 2026-09-04 16:24:04 +08:00
ihsiang 0180c5cdea Merge pull request #3547 from deepseek-harness/ihsiangzhang/tool-call-clickable-styles
feat(client): 统一回答中可点击链接样式——链接别名、hover 点状虚线、分类图标
2026-09-04 16:23:14 +08:00
Chinesezjc cff9a004a6 Merge remote-tracking branch 'origin/master' into fix/ci-node-compile-cache-data-disk 2026-09-04 16:22:44 +08:00
Yichen Jiang e94f938c05 release(dsh): align file-upload version 2026-09-04 16:21:09 +08:00
Chinesezjc f7f4bab746 Merge origin/master into fix/ci-node-compile-cache-data-disk 2026-09-04 16:17:32 +08:00
Yichen Jiang 14befe7ff7 Merge branch 'master' into release/dsh-0.1.3-alpha.1 2026-09-04 16:16:15 +08:00
Yichen Jiang 9c13703708 Merge pull request #3556 from deepseek-harness/fix/web-skill-chip-rebuilt-message
fix(web): keep skill chips on rebuilt message nodes
2026-09-04 16:16:08 +08:00
Dudu-0223 f9359b5863 Merge branch 'master' into fix/fork-resume-system-prompt 2026-09-04 16:14:09 +08:00
CreatixChu 53f6590f76 Merge pull request #3109 from deepseek-harness/worktree/2984-generic-file-upload
feat(attachment): 支持通用文件上传
2026-09-04 16:06:32 +08:00
Yichen Jiang 75d3402b84 fix(web): keep skill chips on rebuilt message nodes 2026-09-04 15:59:33 +08:00
yx.zhang 8ffdee4fe5 feat(client): unify clickable-link language with link alias and category glyphs
Clickable artifact links across the transcript (markdown anchors, prose
file mentions, web source/fetch links, produced-file chips, workflow
member links) now share one language: a dedicated --dsw-alias-link color
(light deepseek-500, dark deepseek-400) decoupled from
state-business-primary, font-weight 500, no underline at rest, and a
dotted 3px-offset underline on hover/focus. A new ui-primitives LinkIcon
leads each link with a currentColor category glyph (url / folder / code /
image / document / other) derived from the path extension by
classifyLinkPath. Produced-file chips drop the grey pill and 96px cap and
render at natural width, shrinking with ellipsis only on row overflow.
ToolRow's grey dotted file links and the grey show-in-folder action stay
as they were. The inline-code chip tint moves to neutral-50 (dark
neutral-800) with its 0.5px border kept.

Coverage: LinkIcon unit spec, refreshed markdown-dom fixtures, and the
clickable-links-gallery web e2e registered in the host compiler face.

Closes #3546
2026-09-04 15:55:49 +08:00
creatixchu e28b58f8c0 Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload
# Conflicts:
#	packages/client/ui-chat/src/client/chat/MessageItem.tsx
2026-09-04 15:41:57 +08:00
creatixchu 58ec1f0867 refactor(file-upload): keep storage helpers and the HTTP route package-private
Stop re-exporting the verbatim file-store helpers from attachment-local, move
the raw-byte upload route handler into a non-entry module of file-upload, and
drop the redundant hook type re-exports from the Client entry. The route test
moves next to the module it exercises.
2026-09-04 15:41:25 +08:00
Yichen Jiang ed67c22496 release(dsh): 0.1.3-alpha.1 2026-09-04 15:38:55 +08:00
Yichen Jiang 267d755bee Merge pull request #3552 from deepseek-harness/worktree/skill-fuzzy-search-53e21d
feat(web): fuzzy skill discovery and fact-based slash reference chips
2026-09-04 15:31:46 +08:00
Yichen Jiang 1b470211ad fix(web): address review: index skill-name batches, bound slash tokens at whitespace, chip only the leading goal token 2026-09-04 15:15:51 +08:00
Yichen Jiang d976849a6b fix(web): expect the goal command bubble to share the body face 2026-09-04 14:56:46 +08:00
creatixchu b4517feed5 Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload 2026-09-04 14:46:36 +08:00
Turtle 7acc038beb Merge pull request #3362 from deepseek-harness/refactor/session-persistence-write-lease
feat(session-persistence-jsonl): cross-process write lock (flock / named semaphore)
2026-09-04 14:45:03 +08:00
Yichen Jiang 9d947bd9cf Merge branch 'master' into worktree/skill-fuzzy-search-53e21d 2026-09-04 14:43:20 +08:00
Yichen Jiang d0da8ccf40 fix(web): decorate slash tokens in bubbles from logged skill and command facts 2026-09-04 14:38:30 +08:00
Turtle 2099 645c68daf2 Merge pull request #3530 from deepseek-harness/turtle/pr-3520-review-followup
docs(fs): record normalized unread diagnostics
2026-09-04 14:35:52 +08:00
Yichen Jiang 46d20f8bee feat(web): rank skill candidates with the shared fuzzy name ranker 2026-09-04 14:31:54 +08:00
Dudu-0223 3b95586626 Merge branch 'master' into fix/fork-resume-system-prompt 2026-09-04 14:21:42 +08:00
Turtle fa40d90023 refactor: simplify issue templates and policy 2026-09-04 14:20:20 +08:00
Turtle c58097a826 feat(session-persistence-jsonl): cross-process write-ownership lease
Write handles now hold a durable lease (session.lock.json beside the
log): a random owner token, diagnostic pid, and an expiry. Acquisition
wins by exclusive create; a second process's create or write open rejects
while the record is unrenewed for less than leaseTtlMs (default 5 min),
and takes over after that — a crashed holder is waited out, never
reclaimed by pid. The holder renews every leaseRenewIntervalMs (default
4 min); a renewal that finds a foreign, vanished, or expired record — or
fails outright — marks the lease lost permanently, so every later
append/flush rejects with SessionOwnershipLostError while reads continue.
Close releases the record; read handles never touch it. Takeover of an
expired record is eventually exclusive: a replaced holder stops within
one renewal interval.

Refs #3245
2026-09-04 14:12:14 +08:00
creatixchu 268cf0101e Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload 2026-09-04 13:08:41 +08:00
creatixchu f0e52c2731 refactor(file-upload): tighten service boundaries 2026-09-04 13:08:25 +08:00
Dudu-0223 b6b2ec4a90 Merge pull request #3480 from deepseek-harness/fix/search-result-reveal-session
Fix session search result navigation
2026-09-04 12:18:21 +08:00
Chinesezjc bee0c13f28 Merge pull request #3513 from deepseek-harness/fix/test-tmp-teardown-self-clean
test: remove dsh-* temp dirs created by unit tests at teardown
2026-09-04 12:11:53 +08:00
Dudu-0223 01a4cba942 docs(web): describe client-only resume handling 2026-09-04 12:09:45 +08:00
Dudu-0223 8ea0cc0445 Merge remote-tracking branch 'origin/master' into fix/fork-resume-system-prompt
# Conflicts:
#	apps/web/tests/message-actions.e2e.ts
2026-09-04 12:08:54 +08:00
Dudu-0223 f1e7dbce55 fix(web): keep resume prompt dedupe client-side 2026-09-04 12:08:16 +08:00
Chinesezjc 1f0a87eb06 Merge remote-tracking branch 'origin/master' into fix/test-tmp-teardown-self-clean
# Conflicts:
#	packages/subprocess/subprocess-local/tests/spawn.spec.ts
2026-09-04 11:58:16 +08:00
Dudu-0223 470ea85286 Merge origin/master into fix/search-result-reveal-session 2026-09-04 11:57:07 +08:00
Chinesezjc d8a995e00e docs: align the changed-spec count with the merged-base diff (36) 2026-09-04 11:56:31 +08:00
Turtle df07f37827 Merge pull request #3516 from deepseek-harness/turtle/issue-2390-windows-hide-subprocess
fix(subprocess): hide Windows child windows
2026-09-04 11:52:34 +08:00
Chinesezjc 3f07443702 Merge branch 'master' into fix/test-tmp-teardown-self-clean 2026-09-04 11:15:31 +08:00
Turtle 9656a1742b Merge pull request #3521 from deepseek-harness/turtle/issue-2349-windows-root-workspace
fix(workspace): preserve Windows drive roots
2026-09-04 11:10:27 +08:00
creatixchu 705cd220d4 test(web): migrate file upload snapshot to v2 2026-09-04 10:29:41 +08:00
creatixchu 48656b4594 test(session-controller): restore Session type import 2026-09-04 10:14:15 +08:00
creatixchu fb743759a7 Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload
# Conflicts:
#	apps/web/tests/scaffold.ts
#	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
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/llm/token-meter/src/index.ts
#	packages/session-query/session-log-export/README.i18n.yaml
#	packages/session-query/session-log-export/README.md
#	packages/session-query/session-log-export/README.zh.md
#	packages/session-query/session-log-export/src/archive.ts
#	scripts/package-dependency-policy.ts
2026-09-04 10:12:19 +08:00
pku-xht e82e5ffd7a fix(subprocess): normalize PTY scope launcher environment 2026-09-04 02:58:09 +08:00
pku-xht c7dc4d3833 test(subprocess): restore Cordis API projection 2026-09-04 01:30:10 +08:00
pku-xht cffb09b02c Merge commit '0d361e6eede9e8a739e776949aa7d5e3de4472da' into codex/subprocess-native-containment
# Conflicts:
#	snapshots/session/cordis-inspect-jsdoc/session.v2.jsonl
2026-09-04 00:56:00 +08:00
pku-xht d82fd86c5c fix(subprocess): isolate native runner bootstrap 2026-09-04 00:24:52 +08:00
Tianyi Cui b4ea3efcf6 Merge pull request #3400 from deepseek-harness/worktree/session-format-06-v2-snapshot-rollout
test(snapshot): roll corpus forward to format v2
2026-09-03 23:12:28 +08:00
Tianyi Cui 1d35bcfc8a Merge pull request #3533 from deepseek-harness/gate/package-version-drift
gate(constraints): enforce the dsh family version rule across apps and packages
2026-09-03 22:49:35 +08:00
Tianyi Cui a931bcf226 fix(constraints): require the shared dsh version in every workspace manifest
The dsh-family version rule lived only in the packages/ block of
checkWorkspaceManifest, so apps/ members and the root-named CLI carried the
shared version with no static check of their own. The name-based rule now
covers every scanned manifest; regression coverage names the stale-version
merge that shipped packages/util/http-proxy at 0.1.2-alpha.5 behind a
0.1.2-rc.1 family.
2026-09-03 22:41:44 +08:00
Tianyi Cui 8cb1d6a7eb Merge commit '85c23a2df3' into worktree/session-format-06-v2-snapshot-rollout 2026-09-03 22:37:26 +08:00
Tianyi Cui 86241a442d fix(session): keep independent version fields off the format generation
`SESSION_FORMAT_VERSION` is the only value that names the Session format
generation. Two other version fields had moved to 2 alongside it:

- The `dsh_session_log` request extension's outer schema `version` returns
  to 1 and its Session header projection keeps `seedLength`, derived from
  the logical inherited cut, so the external wire is unchanged in this PR;
  `sessionFormatVersion` alone identifies the embedded generation.
- The `sessionStats` projection unit's `stateVersion` returns to 1: the
  projection cache binds every checkpoint to the format generation, so a
  generation change discards old rows without a unit version bump.

Test doubles and the standalone Client fixture that build a current
header now spell `SESSION_FORMAT_VERSION` instead of the literal.
2026-09-03 22:36:51 +08:00
Tianyi Cui 6c7603aacd Merge commit '51f9d5f6c1' into worktree/session-format-06-v2-snapshot-rollout 2026-09-03 22:24:50 +08:00
Tianyi Cui 9fb0678f0b Merge commit '22472e4092' into worktree/session-format-05-v1-v2-chunk-migration 2026-09-03 22:24:36 +08:00
Tianyi Cui 721ff67ca1 Merge commit '1b6fdd0e1b' into worktree/session-format-04-live-assistant-stream 2026-09-03 22:24:22 +08:00
Tianyi Cui 6c419795f6 docs(session): name the frozen v0/v1 vocabulary in the v0-to-v1 README
The README file table listed four of the six source modules and omitted
the two largest, so the package read as an oversized identity conversion.
The summary now states that most of the source is the frozen released
v0/v1 event vocabulary, why the edge refuses a malformed historical log
before the installed current restorer runs, and that later edges reuse
those shapes; the table gains `payload-validation.ts` and
`relationships.ts` rows.
2026-09-03 22:23:53 +08:00
Tianyi Cui 17fb719138 Merge commit 'cf8f75faaf' into worktree/session-format-06-v2-snapshot-rollout 2026-09-03 22:10:02 +08:00
Tianyi Cui d58964a010 Merge commit 'be5db297c7' into worktree/session-format-05-v1-v2-chunk-migration
# Conflicts:
#	.agents/notes/implemented/architecture/2026-08-31-live-assistant-stream-frames.i18n.yaml
#	.agents/notes/implemented/architecture/2026-08-31-live-assistant-stream-frames.md
#	.agents/notes/implemented/architecture/2026-08-31-live-assistant-stream-frames.zh.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/api/session-controller/src/assistant-stream.ts
#	packages/api/session-controller/src/client/sessions/assistant-stream.ts
#	packages/api/session-controller/src/types.ts
#	packages/api/session-controller/tests/assistant-stream.client.spec.ts
#	packages/api/session-controller/tests/session-history-journal.host.spec.ts
#	packages/api/session-controller/tests/sessions-service.client.spec.ts
#	packages/api/session-controller/tests/transport.client.spec.ts
#	packages/core/agent/README.i18n.yaml
#	packages/core/agent/README.md
#	packages/core/agent/README.zh.md
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	scripts/package-dependency-policy.ts
2026-09-03 22:09:31 +08:00
Tianyi Cui 8a0c91be7f Merge commit 'c347bfcfa6' into worktree/session-format-04-live-assistant-stream 2026-09-03 21:59:19 +08:00
Tianyi Cui fe9c2d7053 refactor(agent, session-controller): drop the unread startedTime frame field
The `start` frame and the reconnect baseline attempt carried a wall-clock
`startedTime` that no Host or Client consumer read: the Host accumulator
and the Client reconciler copied it into their attempt maps and nothing
looked at it again. Presentation frames now carry only the coordinates
consumers use (attempt, revision, turn, step, chunk index, and v1 seq
provenance); the type-equivalence block, event graph, READMEs, and the
live-stream Agent Note follow the type.
2026-09-03 21:58:34 +08:00
Tianyi Cui c97df989ff refactor(session): share the canonical log basename and JSON snapshots
`session[.vN].jsonl` was assembled independently by the JSONL provider
(twice), the session-log export archive, and the recorded-session fixture
helpers. `dsh-session-format` now owns `sessionFormatLogFilename` and
`parseSessionFormatLogFilename`; the three consumers append only their
compression suffix, and the migration note names the owner.

`snapshotSessionFormatJson` re-implemented the lossless JSON walk that
`dsh-util-values` already publishes as `snapshotJsonValue` + `deepFreeze`,
and the frozen v0 relationship validator carried a third structural JSON
comparison next to `deepEqualJson`. Both now delegate; the format package
reports one `is not lossless JSON` diagnostic per labelled subject instead
of ten member-specific ones, and enumerable accessors whose values survive
a JSON round trip are accepted like `JSON.stringify` accepts them.
2026-09-03 21:48:09 +08:00
pku-xht d79f5c04e8 Merge master into codex/subprocess-native-containment 2026-09-03 21:46:02 +08:00
creatixchu de022388ea test(ci): stabilize attachment fixtures 2026-09-03 21:25:45 +08:00
Dudu-0223 d18770f50a fix(web): address latest session reveal review 2026-09-03 21:19:09 +08:00
pku-xht 423412b7bf fix(runtime): simplify executable entry dispatch 2026-09-03 21:18:27 +08:00
creatixchu 0516edb037 test(file-upload): restore host composition fixtures 2026-09-03 21:12:50 +08:00
creatixchu 2a826a93c3 Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload 2026-09-03 20:55:12 +08:00
creatixchu ea669428be refactor(attachment): unify prompt content admission 2026-09-03 20:53:29 +08:00
creatixchu 3eb9736eb6 refactor(file-upload): scope prompt binding rollback 2026-09-03 20:15:18 +08:00
pku-xht e5dbccce8c fix(subprocess): move SEA bootstrap to runtime packaging 2026-09-03 19:59:26 +08:00
Tianyi Cui 71089f8df7 Merge commit '8f7250f904' into worktree/session-format-06-v2-snapshot-rollout
# Conflicts:
#	apps/cli/tests/profiles/headless/tests/expected/subagent-settlement/child.expected.jsonl
2026-09-03 19:41:58 +08:00
Tianyi Cui 874b174fd6 test(web): compare fixture inventories by Session role and pin the v2 upload
`assertFixtureInventory` folds every retained generation of one parent or
child fixture into a single role before comparing, so an older generation kept
beside the current one is not an inventory drift. The generation spec writes
headers that match each filename, since fixture selection validates the chosen
generation, and asserts that an absent parent resolves only for an
override-only replay. The `dsh_session_log` composition expectation follows the
extension's version 2 payload.
2026-09-03 19:41:16 +08:00
Tianyi Cui d5044d5675 Merge commit 'ee4bad5cde' into worktree/session-format-05-v1-v2-chunk-migration 2026-09-03 19:25:29 +08:00
Tianyi Cui bb771b133c Merge commit '09d3a185ab' into worktree/session-format-04-live-assistant-stream 2026-09-03 19:24:54 +08:00
Tianyi Cui d455ad99e3 test(session): record the v2 SDK expectations and cover review-fix branches
The continuable-child headless expectation and the Python `advanced` and
`restart` scenarios pin the current runtime, whose subagent children carry no
`session/end-seed` marker and whose assistant messages embed their streams:
the child fixture drops the marker and renumbers its references, `advanced/`
re-records `result.json`, and both scenarios gain their v2 Session fixtures.
Unit tests cover the `tool-call-delta` id and name validation, embedded
stream members without timing arrays, and the versionless-header refusal.
2026-09-03 19:22:37 +08:00
Chinesezjc dde27f5163 Merge remote-tracking branch 'origin/master' into fix/test-tmp-teardown-self-clean 2026-09-03 19:04:31 +08:00
Turtle 6e7c3f37c1 docs(fs): record normalized unread diagnostics 2026-09-03 19:01:30 +08:00
Turtle a05b5fbe79 fix(subprocess): hide Windows cleanup helpers 2026-09-03 19:01:30 +08:00
Turtle e609fd73a3 fix(workspace): harden qualified path handling 2026-09-03 19:01:30 +08:00
Tianyi Cui 778e0866c3 test(session): cover the migration read faults and the versioned export name
The JSONL backend rethrows storage errno failures and abort signals from the
source read of a pending migration unwrapped; a test now drives both through
the stat seam so the classification stays covered. The navigation-panes Web
e2e derives the exported archive entry from `SESSION_FORMAT_VERSION`, which
`session-log-export` uses for its `session.v<N>.jsonl` name. The module graph
records the `session-log-export` → `session` peer edge.
2026-09-03 19:00:16 +08:00
Tianyi Cui 91904d7c10 Merge commit 'fef079e5c9' into worktree/session-format-06-v2-snapshot-rollout
# Conflicts:
#	snapshots/session/fs-policy-reject/session.jsonl
2026-09-03 18:51:05 +08:00
Tianyi Cui 156429e86d chore(session): satisfy the master gates on the v1-to-v2 branch
`session-format-v1-to-v2` takes the `0.1.2-rc.1` root version that master
requires, and `defineReleasedPayloadDisposition` drops the `@param` tag for a
parameter it no longer has.
2026-09-03 18:43:24 +08:00
Tianyi Cui 28b16c011a Merge commit 'a123cb0055' into worktree/session-format-05-v1-v2-chunk-migration
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
2026-09-03 18:39:44 +08:00
Tianyi Cui 13074e4aa2 Merge commit '308c1c69a6' into worktree/session-format-04-live-assistant-stream 2026-09-03 18:36:02 +08:00
Tianyi Cui 3c3ad02b30 chore(session): satisfy the master hygiene gates
`session-log-export` names its archive entry after `SESSION_FORMAT_VERSION`,
a runtime value of the shared `dsh-session` instance, so `dsh-session` becomes
a peer dependency and the export is classified as peer-required in the package
dependency policy. The three Session format packages take the `0.1.2-rc.1`
root version that master now requires.
2026-09-03 18:35:14 +08:00
Tianyi Cui 3aef64797d Merge master into session format migration
# Conflicts:
#	packages/test-support/session-snapshot/src/harness.ts
#	scripts/smoke-python-runtime.py
2026-09-03 18:31:54 +08:00
creatixchu b2c4483c9d refactor(attachment): own prompt admission on service 2026-09-03 18:18:32 +08:00
Chinesezjc cf4cfd9e4a docs: correct the changed-spec count in the Agent Note verification section 2026-09-03 18:17:09 +08:00
Turtle 818c4f344e Merge pull request #3520 from deepseek-harness/turtle/issue-2353-fs-error-copy
fix(fs): normalize unread mutation diagnostics
2026-09-03 18:15:00 +08:00
Tianyi Cui d89427ba6c Merge commit '12dabcc9d2' into worktree/session-format-06-v2-snapshot-rollout 2026-09-03 17:54:10 +08:00
Tianyi Cui 5fa5fea11d Merge commit '1f9d5f72e9' into worktree/session-format-05-v1-v2-chunk-migration
# Conflicts:
#	packages/session/session-format/README.i18n.yaml
#	packages/session/session-format/README.md
#	packages/session/session-format/README.zh.md
#	packages/session/session-format/src/catalog.ts
#	packages/session/session-format/src/types.ts
#	packages/test-support/llm-replay/tests/llm-replay.spec.ts
2026-09-03 17:53:18 +08:00
Tianyi Cui 51adfbf52c chore(session): retire the v1-to-v2 benchmark script
The repository-only benchmark, its unit-suite spec, the root script, and the
README section are removed; the accepted acceptance run's figures stay in the
embedded-assistant-streams note as recorded facts. The note also records why
the migration edge reuses the `dsh-llm` stream helpers instead of frozen
copies and why its target validation re-checks message/stream agreement
itself. A validation test that recomputed `RELEASED_V2_EVENT_TYPES` from the
same expression as its definition is dropped.
2026-09-03 17:50:09 +08:00
Tianyi Cui 7c169a04b3 Merge commit '1a244059c3' into worktree/session-format-04-live-assistant-stream 2026-09-03 17:48:54 +08:00
Tianyi Cui 13dee20db6 refactor(session): drop dead migration plumbing
`ensureJsonlGenerationCurrent` returned a live Zstandard body iterator that
every production caller disposed unread before decoding the same bytes again;
the header read now decodes only the first frame and owns no decoder past its
return. The JSONL backend reuses the generation module's stable-revision read
instead of keeping a second copy, `encodeCurrent` encodes the validated
current artifact it is documented to receive instead of re-running the
migration chain on it, and the test-only `inspectVersion` catalog method and
the `migrateSessionSnapshotFixture` duplicate of
`prepareSessionSnapshotFixtureForComparison` are removed.
2026-09-03 17:39:12 +08:00
Turtle af63a56078 test(workspace): make relative path regression portable 2026-09-03 17:30:14 +08:00
Chinesezjc c8fc38541f test: own the default spill dir in subprocess specs; correct retention wording
Second review round (ds-review-bot v4p/v5/v6): the exit cleanup claim that
collectors unlink their spill files on dispose was wrong — completed spill
files are retained (seal() only closes, discardSpill() is the only unlink),
so the exit removal only ever applies to directories that never spilled.
Reword the JSDoc, README, and Agent Note accordingly, drop the redundant
readdirSync precheck (rmdirSync ENOTEMPTY is caught anyway), and recount the
v8-ignore window. The spawn.spec default-spill test now records the default
per-process directory it created and removes it in afterAll, so a completed
spill file is never left behind by the unit suite.
2026-09-03 17:29:21 +08:00
Dudu-0223 2f396feca8 Merge branch 'master' into fix/fork-resume-system-prompt 2026-09-03 17:18:21 +08:00
Turtle d33fe767c1 fix(workspace): preserve Windows drive roots 2026-09-03 17:14:02 +08:00
Turtle 18635905aa fix(fs): normalize unread mutation diagnostics 2026-09-03 17:13:13 +08:00
Chinesezjc 1bc330ce01 docs: cross-link the spill retention decision from the teardown note
The Agent Note now links the 2026-07-17 local-spill-startup-cleanup note it
builds on, and the privateSpillDir JSDoc documents the empty-dir exit
removal alongside the directory's creation contract.
2026-09-03 17:07:43 +08:00
Chinesezjc 29e6669e3c test: narrow process-exit spill cleanup to empty dirs; drop spill-store deletion
Review (ds-review-bot) found the exit-time deletion of per-process spill
roots conflicts with the documented retention decision: spill artifacts are
model-visible locators that resumed or forked sessions may still reference
(2026-07-17-local-spill-startup-cleanup), and an exception thrown from an
'exit' listener can change the process exit code.

- dsh-spill-local: revert the exit handler entirely; its default root is
  already owned by the package's 30-day startup sweep.
- dsh-subprocess-local/spawn: remove the per-process spill dir at a
  JavaScript-observable exit only while it is EMPTY (collectors unlink
  their spill files on dispose), best-effort with a named swallow so a
  Windows-held handle never changes the exit code; dirs holding spill
  files keep them for external cleanup.
- Document the empty-dir exit removal in the package README and the Agent
  Note, and re-record both bilingual pairs.
2026-09-03 17:06:48 +08:00
Turtle cc8099dc5f fix(subprocess): hide Windows child windows 2026-09-03 17:05:18 +08:00
creatixchu f989df7c8e test(file-upload): cover extensible request identifiers 2026-09-03 17:04:29 +08:00
creatixchu 8a84c1edff test(file-upload): cover isolated service paths 2026-09-03 17:03:14 +08:00
creatixchu 33b7123e96 test(remotes): declare built smoke schema dependency 2026-09-03 16:49:08 +08:00
creatixchu 3b8245afc3 fix(build): align file upload project faces 2026-09-03 16:41:45 +08:00
creatixchu 7158227650 fix(file-upload): declare host runtime dependencies 2026-09-03 16:35:50 +08:00
Chinesezjc 6d9776a3b0 test: exempt process-exit spill cleanup from the per-file coverage gate
The exit listener runs after the coverage dump, so its body can never be
measured by the unit coverage lane; mark it v8-ignore with the reason, as
with other process-exit-only code paths.
2026-09-03 16:35:45 +08:00
Chinesezjc 1107ff5fe1 test: remove remaining dsh-* spill/temp dirs in shell and fs specs
Full-template residue histogram on the CI host surfaced four more normal-exit
leaks below the earlier cutoff: tool-bash/tool-pwsh tools.spec (module spill
dir / per-test homes), bash-sandbox sandbox.spec (module spill dir and the
read-only denial root), and fs-sandbox fs-sandbox.spec (inline tmp dir). All
four now remove what they create at the same teardown points as their
neighbors.
2026-09-03 16:26:22 +08:00
creatixchu 9fd72003e6 chore(test): remove obsolete lint suppression 2026-09-03 16:20:23 +08:00
creatixchu dd37061c2b test(client): provide file upload fixture service 2026-09-03 16:20:08 +08:00
Chinesezjc 0364343a7e test: remove dsh-* temp dirs created by unit tests at teardown
Spec files that create /tmp/dsh-* directories via mkdtemp now track and
delete them in afterEach/afterAll; module-scope fixture dirs (executor
spill dirs) are removed in afterAll. The file list came from the
observed-residue inventory on the self-hosted CI host: only specs whose
dirs actually accumulated were leak sources (issue #3134), superseding
the kept-but-unmerged CI sweep branch per the #3233 review decision.

Product per-process spill roots (dsh-subprocess-local spawn,
dsh-spill-local store) register a process-exit handler that removes the
memoized dir, so processes that used the spawn/spill path clean up on
normal exit. A SIGKILLed process cannot run in-process teardown; the
machine-side timer remains the backstop for that path.

Agent Note: .agents/notes/implemented/process/2026-08-28-test-temp-dir-self-cleanup.md
2026-09-03 16:19:18 +08:00
Dudu-0223 a22f2105e0 fix(test): stabilize trajectory history pagination 2026-09-03 16:17:43 +08:00
Tianyi Cui 1762d63e6c test(session): cover observed migration shapes 2026-09-03 16:16:09 +08:00
Dudu-0223 477ff9d5e3 fix(agent-loop): preserve resumed series boundaries 2026-09-03 16:13:45 +08:00
creatixchu 97fe39920a Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload 2026-09-03 16:10:40 +08:00
creatixchu 8fc9a11c5e refactor(attachment): isolate file upload service 2026-09-03 16:10:24 +08:00
Dudu-0223 29e20b0a9f Merge branch 'master' into fix/search-result-reveal-session 2026-09-03 16:00:19 +08:00
Chinesezjc 100fcb286f Merge pull request #3432 from deepseek-harness/fix/pwsh-loader-composition-timeout
test(pwsh): restore product-default deadline in loader composition
2026-09-03 15:59:41 +08:00
Tianyi Cui e4f46f8e4d Merge commit '4ec9519539' into worktree/session-format-06-v2-snapshot-rollout 2026-09-03 15:46:19 +08:00
Tianyi Cui cf97e3e455 Merge commit 'ad1b192078' into worktree/session-format-05-v1-v2-chunk-migration 2026-09-03 15:45:27 +08:00
Tianyi Cui e7a17eb7ac Merge commit '7931edb2eb' into worktree/session-format-04-live-assistant-stream 2026-09-03 15:44:44 +08:00
Tianyi Cui f9870325b2 fix(session): validate compaction spans by surface order 2026-09-03 15:44:04 +08:00
Tianyi Cui 7442cedc82 Merge commit '13f179cd60' into worktree/session-format-06-v2-snapshot-rollout 2026-09-03 15:28:51 +08:00
Tianyi Cui 463f8e9221 Merge commit '0d8fcd3a0e' into worktree/session-format-05-v1-v2-chunk-migration 2026-09-03 15:27:50 +08:00
Tianyi Cui 9a5611865f Merge commit 'c0c4aebaa9' into worktree/session-format-04-live-assistant-stream 2026-09-03 15:27:11 +08:00
Tianyi Cui b5f1539733 fix(session): validate surface replacement endpoints 2026-09-03 15:26:35 +08:00
Chinesezjc 91f7e08136 Merge branch 'master' into fix/pwsh-loader-composition-timeout 2026-09-03 15:05:54 +08:00
Dudu-0223 f3dab48118 Merge remote-tracking branch 'origin/master' into fix/search-result-reveal-session 2026-09-03 15:03:50 +08:00
Dudu-0223 4f0706a335 fix(web): address session reveal review 2026-09-03 15:03:38 +08:00
Dudu-0223 ed8cdafe3f test(web): update resumed conversation golden 2026-09-03 14:56:40 +08:00
Dudu-0223 6ad01cbd8d fix(web): avoid repeated system prompt on resume 2026-09-03 14:45:01 +08:00
creatixchu 1967bedd9f Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload 2026-09-03 14:43:25 +08:00
creatixchu ee23db68cf test(client): cover background upload seams 2026-09-03 14:43:07 +08:00
fz 9fe2112a63 Merge pull request #3473 from deepseek-harness/feat/python-sdk-macos-x64
feat(python): support macOS x64 runtime wheels
2026-09-03 14:36:59 +08:00
Yichen Jiang 0c99ae8557 Merge pull request #3474 from deepseek-harness/worktree/lark-docs-optimization-c86275
docs(user):  reasoning levels and model discovery in the provider guide
2026-09-03 14:30:42 +08:00
creatixchu b7e5d0b90e docs(client): refresh generated catalogs 2026-09-03 14:25:05 +08:00
creatixchu 4ed33aa581 chore(client): refresh slot source locations 2026-09-03 14:20:25 +08:00
fz 44855d1054 fix(release): align http proxy package version 2026-09-03 14:15:32 +08:00
Yichen Jiang a51474c436 docs(user): align provider guide wording with the effort menu, config button, and off semantics 2026-09-03 14:15:32 +08:00
fz 23c1052f5a docs(python): refresh runtime target notes 2026-09-03 14:15:12 +08:00
creatixchu caa4bbb474 Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload 2026-09-03 14:12:15 +08:00
creatixchu 7a99e70372 fix(client): satisfy upload package gates 2026-09-03 14:11:41 +08:00
Dudu-0223 987fde9515 Merge remote-tracking branch 'origin/master' into fix/search-result-reveal-session 2026-09-03 14:10:18 +08:00
Yichen Jiang 74c38ba9c7 Merge remote-tracking branch 'origin/master' into worktree/lark-docs-optimization-c86275 2026-09-03 14:07:26 +08:00
creatixchu 6acc828f81 test(client): widen upload carrier fixtures 2026-09-03 14:03:53 +08:00
Yichen Jiang 76fda72979 Merge pull request #3481 from deepseek-harness/fix/http-proxy-rc-version
fix(http-proxy): match the workspace version to the 0.1.2-rc.1 release
2026-09-03 14:02:58 +08:00
fz 61e4829ed7 Merge remote-tracking branch 'origin/master' into feat/python-sdk-macos-x64 2026-09-03 14:02:09 +08:00
creatixchu 4647dbf8ff fix(ui-approval): type pending approval discriminator 2026-09-03 14:01:37 +08:00
Dudu-0223 b09d3a2c0d fix(ui-workspace): reveal opened search result 2026-09-03 14:00:21 +08:00
creatixchu 6cf7b1e34f chore(client): refresh generated API catalog 2026-09-03 14:00:14 +08:00
creatixchu b8512fa5e5 Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload 2026-09-03 13:53:47 +08:00
creatixchu bbb2ca7c9b refactor(client): extract background file upload service 2026-09-03 13:53:25 +08:00
Yichen Jiang 136b67cdec fix(http-proxy): match the workspace version to the 0.1.2-rc.1 release 2026-09-03 13:50:13 +08:00
Yichen Jiang 34b33c2273 docs(user): simplify discovery, protocol, and OAuth wording in the provider guide 2026-09-03 13:31:47 +08:00
Yichen Jiang 7169660d33 Merge pull request #3198 from deepseek-harness/worktree/deepseek-harness-proxy-config-2f5b4a
feat(net): route every outbound request through the configured proxy
2026-09-03 13:19:19 +08:00
Tianyi Cui 7299d5e093 Merge commit '060de4c547f020e1953c88b98b7ab749fd9ef20f' into worktree/session-format-06-v2-snapshot-rollout 2026-09-03 13:18:35 +08:00
Tianyi Cui 4fb03d0bda fix(session): preserve v2 migration compatibility 2026-09-03 13:17:48 +08:00
Tianyi Cui d7e9115df9 Merge commit 'a4a34b2a71f6bdb92c723840dca4d7fbd71c3148' into worktree/session-format-05-v1-v2-chunk-migration 2026-09-03 13:09:15 +08:00
Tianyi Cui 401216477c Merge commit 'e6b9e90886088ffd344110d45bb406880e554a8a' into worktree/session-format-04-live-assistant-stream 2026-09-03 13:08:25 +08:00
Tianyi Cui 618a7a46e8 fix(session): accept released migration data 2026-09-03 13:07:26 +08:00
Chinesezjc ecd75e6dd6 test(pwsh): clarify deadline comment and keep case budget independent
Review feedback: the dsh-terminal-bash product default is 30s, not 300s;
the raised value bounds one send plus the complete startup sequence, so it
must cover the same cold start the tool deadline does. The vitest case
budget stays at its pre-existing 120s: the case-level timeout overrides
the lane --testTimeout, so syncing it to the plugin deadline would make a
stalled partition wait 300s instead of 120s.
2026-09-03 13:05:22 +08:00
Yichen Jiang 13f467b15b docs(user): gather settings.yaml fields under advanced configuration ahead of troubleshooting 2026-09-03 12:36:39 +08:00
Yichen Jiang be1777084d docs(user): call catalog providers built-in providers in the provider guide 2026-09-03 12:33:24 +08:00
Yichen Jiang 254c9b8b7f docs(user): guide model discovery for third-party providers 2026-09-03 11:51:46 +08:00
Yichen Jiang 410e912893 Merge remote-tracking branch 'origin/master' into worktree/lark-docs-optimization-c86275 2026-09-03 11:49:24 +08:00
Yichen Jiang 454d92dc34 docs(user): route reasoning levels and settings.yaml fields through the provider guide 2026-09-03 11:49:22 +08:00
imccyu 48d84990a0 Merge pull request #3471 from deepseek-harness/release/dsh-0.1.2-rc.1-version-to-master
sync: merge 0.1.2-rc.1 to master
2026-09-03 11:21:56 +08:00
fz 7dcdcc2965 feat(python): support macOS x64 runtime wheels 2026-09-03 11:16:34 +08:00
Yichen Jiang 427d210b5e Merge pull request #3451 from deepseek-harness/worktree/fix-model-listing-discovery
fix(llm): expand model listing discovery
2026-09-03 11:12:32 +08:00
Yichen Jiang 777d46cf81 Merge branch 'master' into worktree/fix-model-listing-discovery 2026-09-03 10:59:28 +08:00
imccyu 3225ec2d94 Merge remote-tracking branch 'origin/master' into release/dsh-0.1.2-rc.1-version-to-master 2026-09-03 10:40:28 +08:00
imccyu cea08311a0 Merge pull request #3470 from deepseek-harness/release/dsh-0.1.2-rc.1
release: [email protected]
2026-09-03 10:35:15 +08:00
pku-xht c8393a2798 test(pwsh): cover background outcome status mapping 2026-09-03 09:12:29 +08:00
pku-xht ed25d4e15b docs(subprocess): correct probe and terminal failure contracts 2026-09-03 08:58:31 +08:00
pku-xht 29c68b6da9 docs(subprocess): sync native containment evidence 2026-09-03 07:03:00 +08:00
pku-xht 0652b7b4d7 fix(subprocess): close containment review gaps 2026-09-03 06:18:21 +08:00
Tianyi Cui 06b93748eb fix(snapshot): address v2 rollout review 2026-09-03 05:15:04 +08:00
Tianyi Cui e10f671167 Merge remote-tracking branch 'origin/worktree/session-format-05-v1-v2-chunk-migration' into worktree/session-format-06-v2-snapshot-rollout
# Conflicts:
#	apps/web/tests/scaffold.ts
#	apps/web/tests/subagent-conversation.e2e.ts
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.zh.md
#	packages/test-support/llm-replay/README.i18n.yaml
#	packages/test-support/llm-replay/README.md
#	packages/test-support/llm-replay/README.zh.md
#	packages/test-support/llm-replay/tests/llm-replay.spec.ts
#	snapshots/sdk/subagent-continuable-inheritance/session.1.v2.jsonl
#	snapshots/sdk/subagent-continuable/session.1.v2.jsonl
#	snapshots/sdk/subagent-dsh-sdk-diagnostic/session.v2.jsonl
#	snapshots/sdk/subagent-list-agents/session.1.v2.jsonl
#	snapshots/sdk/subagent-send-message/session.1.v2.jsonl
#	snapshots/session/agent-instructions/session.v2.jsonl
#	snapshots/session/headless.snapshot.ts
#	snapshots/web/schedule-catalog/session.v2.jsonl
2026-09-03 05:09:32 +08:00
Tianyi Cui 67c8a58854 fix(session): address v2 migration review 2026-09-03 04:45:41 +08:00
pku-xht 14c16012fb fix(subprocess): preserve post-commit runner errors 2026-09-03 04:07:57 +08:00
pku-xht ff6a49660f fix(subprocess): tighten native containment settlement 2026-09-03 03:26:42 +08:00
Tianyi Cui a88ef734cc Merge remote-tracking branch 'origin/worktree/session-format-04-live-assistant-stream' into worktree/session-format-05-v1-v2-chunk-migration
# Conflicts:
#	.agents/notes/implemented/architecture/2026-08-31-live-assistant-stream-frames.i18n.yaml
#	.agents/notes/implemented/architecture/2026-08-31-live-assistant-stream-frames.md
#	.agents/notes/implemented/architecture/2026-08-31-live-assistant-stream-frames.zh.md
#	.agents/notes/implemented/simplification/2026-08-06-buffer-free-feedback-telemetry.i18n.yaml
#	.agents/notes/implemented/simplification/2026-08-06-buffer-free-feedback-telemetry.md
#	.agents/notes/implemented/simplification/2026-08-06-buffer-free-feedback-telemetry.zh.md
#	apps/web/tests/scaffold.ts
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/api/session-controller/src/client/sessions/assistant-stream.ts
#	packages/core/agent-loop/src/agent.ts
#	packages/core/agent-loop/src/assistant-stream.ts
#	packages/core/agent-loop/tests/loop.spec.ts
#	packages/core/agent/src/runtime-types.ts
#	packages/session/session-telemetry/tests/telemetry.spec.ts
#	packages/test-support/llm-replay/README.i18n.yaml
#	packages/test-support/llm-replay/README.md
#	packages/test-support/llm-replay/README.zh.md
#	packages/test-support/llm-replay/src/alpha-refusal-fixtures.ts
#	packages/test-support/llm-replay/src/index.ts
#	packages/test-support/llm-replay/tests/llm-replay.spec.ts
#	packages/test-support/session-snapshot/README.i18n.yaml
#	packages/test-support/session-snapshot/README.md
#	packages/test-support/session-snapshot/README.zh.md
#	packages/test-support/session-snapshot/src/suite.ts
#	packages/test-support/session-snapshot/tests/suite.spec.ts
#	snapshots/sdk/sdk.snapshot.ts
#	snapshots/session/headless.snapshot.ts
2026-09-03 03:10:05 +08:00
imccyu a66e470204 release(dsh): 0.1.2-rc.1 2026-09-03 02:27:19 +08:00
Tianyi Cui a65edc4810 fix(agent): terminate live assistant attempts 2026-09-03 02:25:25 +08:00
Tianyi Cui a5c24f204d Merge remote-tracking branch 'origin/worktree/session-format-03-v0-v1-migration' into worktree/session-format-04-live-assistant-stream 2026-09-03 02:02:47 +08:00
Tianyi Cui 731f1268d1 docs(snapshot): correct child replay ordering 2026-09-03 02:00:11 +08:00
Tianyi Cui f044d3fad2 fix(session): address v0 migration review 2026-09-03 01:52:25 +08:00
pku-xht bc681d7a54 fix(subprocess): harden cancellation settlement 2026-09-03 01:18:40 +08:00
pku-xht 05b6789425 fix(subprocess): preserve clean range after start errors 2026-09-03 00:59:07 +08:00
Turtle 0e6a397464 Merge pull request #3444 from deepseek-harness/turtle/migrate-issue-fields-to-project
fix(issue-management): use Project-local Priority
2026-09-03 00:58:00 +08:00
Turtle 692b9b59f7 fix(issue-management): complete policy token guards 2026-09-03 00:50:13 +08:00
pku-xht 35b5d78749 Merge origin/master into subprocess containment 2026-09-02 23:41:30 +08:00
pku-xht fe873955b4 Merge master@313ac567 into subprocess native containment 2026-09-02 23:00:02 +08:00
pku-xht ac1a5891c2 fix(subprocess): close remaining native containment findings 2026-09-02 22:49:46 +08:00
Tianyi Cui a8e33b62e3 Merge pull request #3434 from deepseek-harness/worktree-pkgnode
fix: Stop the packaged Python SDK runtime from hijacking spawned node commands
2026-09-02 22:47:27 +08:00
Tianyi Cui c2fa93f567 Merge remote-tracking branch 'origin/worktree/session-format-05-v1-v2-chunk-migration' into worktree/session-format-06-v2-snapshot-rollout
# Conflicts:
#	apps/web/tests/scaffold.ts
2026-09-02 22:21:50 +08:00
Tianyi Cui ac8b58241d Merge remote-tracking branch 'origin/worktree/session-format-04-live-assistant-stream' into worktree/session-format-05-v1-v2-chunk-migration
# Conflicts:
#	apps/web/tests/scaffold.ts
2026-09-02 22:19:50 +08:00
Tianyi Cui 08ef483c7a Merge remote-tracking branch 'origin/worktree/session-format-03-v0-v1-migration' into worktree/session-format-04-live-assistant-stream 2026-09-02 22:17:47 +08:00
Tianyi Cui 99567996bd test(session): cover body-free listing races 2026-09-02 22:16:06 +08:00
Tianyi Cui c0d05349e9 Merge remote-tracking branch 'origin/worktree/session-format-05-v1-v2-chunk-migration' into worktree/session-format-06-v2-snapshot-rollout 2026-09-02 21:59:19 +08:00
Yichen Jiang 8de7518c89 test(llm): replay Anthropic's documented model-listing example
The List Models reference reply joins the recorded listings so the
anthropic-messages path is pinned to the published response fields.
2026-09-02 21:58:58 +08:00
Yichen Jiang 31065cf1ab test(llm): archive recorded provider model listings
Replies captured on 2026-09-02 from OpenRouter, models.dev, and DeepSeek
replay through the discovery parser, and OpenRouter's nested
top_provider.max_completion_tokens now feeds the output-token cap.
2026-09-02 21:55:06 +08:00
Tianyi Cui 2087fd3f2c Merge remote-tracking branch 'origin/worktree/session-format-04-live-assistant-stream' into worktree/session-format-05-v1-v2-chunk-migration 2026-09-02 21:52:34 +08:00
Tianyi Cui e3e9bd5909 Merge remote-tracking branch 'origin/worktree/session-format-03-v0-v1-migration' into worktree/session-format-04-live-assistant-stream
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/core/agent/src/runtime-types.ts
2026-09-02 21:51:42 +08:00
Tianyi Cui fe06dccea4 Merge remote-tracking branch 'origin/master' into worktree/session-format-03-v0-v1-migration
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
2026-09-02 21:40:29 +08:00
Yichen Jiang 8179d929ab fix(llm): scope Anthropic /v1 handling to model discovery
Model requests hand the configured baseURL to pi-ai unchanged. Only the
discovery listing URL accepts the Anthropic API root with or without a
trailing /v1, because gateway documentation publishes both spellings.
2026-09-02 21:39:53 +08:00
Yichen Jiang b6427a899e Merge remote-tracking branch 'origin/master' into worktree/deepseek-harness-proxy-config-2f5b4a 2026-09-02 21:38:19 +08:00
imccyu 45a4868c88 test(python): pin packaged shell node resolution in the runtime smoke
The new keyless sdk-spawn-node scenario drives the platform shell tool
through a command starting with node and requires the machine's own Node
version in the tool result with no PKG_EXECPATH in the child environment,
so a pkg upgrade that re-records the child-process patch cannot silently
restore the hijack. Runs on every target through --scenario all.
2026-09-02 21:36:23 +08:00
imccyu 7187cddfb3 docs(notes): record the pkg child_process patch in the single-exe note 2026-09-02 21:36:23 +08:00
imccyu c732dedc69 fix(python): stop the packaged runtime from hijacking spawned node commands
@yao-pkg/pkg's SEA bootstrap rewrites child_process commands named node --
including the string after a -c flag, exactly the Bash tool's bash -c form --
to the executable itself and stamps PKG_EXECPATH into every child
environment, so a model-issued 'node --version' silently booted the dsh CLI
instead of the machine's Node. Pin the packager as an exact root
devDependency invoked through pnpm exec and patch out the single
patchChildProcess call from the SEA bootstrap bundle; packaged children now
resolve node through PATH like any other process. The third-party notices
drop the build-time tools section: the packager is now a declared, patched
devDependency, so the manifest and patch tiers disclose it.
2026-09-02 21:36:23 +08:00
Tianyi Cui 17f49f6191 fix(session): keep cold listing body-free 2026-09-02 21:29:43 +08:00
Tianyi Cui 9d3bbd46ee Merge pull request #3459 from deepseek-harness/revert-3452-feat/session-message-edit
Revert "feat(session, agent, web): support same-session message editing"
2026-09-02 21:21:14 +08:00
Tianyi Cui e974a655a0 Revert "feat(session, agent, web): support same-session message editing" 2026-09-02 21:20:07 +08:00
Yichen Jiang 6f7e30ed3b chore(http-proxy): follow the 0.1.2-alpha.5 release
master released 0.1.2-alpha.5 after this package was created, so the
release bump never reached it; the workspace constraints gate requires
every package version to match the root.
2026-09-02 21:19:00 +08:00
Yichen Jiang 5eb499ed35 Merge remote-tracking branch 'origin/master' into worktree/deepseek-harness-proxy-config-2f5b4a 2026-09-02 21:14:16 +08:00
Tianyi Cui d88c258dc7 Merge remote-tracking branch 'origin/worktree/session-format-03-v0-v1-migration' into worktree/session-format-04-live-assistant-stream
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/core/agent/src/runtime-types.ts
2026-09-02 20:58:27 +08:00
Tianyi Cui 5a9353adda Merge remote-tracking branch 'origin/master' into worktree/session-format-03-v0-v1-migration
# Conflicts:
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
2026-09-02 20:48:26 +08:00
lsdsjy f98bfbda85 Merge pull request #3452 from deepseek-harness/feat/session-message-edit
feat(session, agent, web): support same-session message editing
2026-09-02 20:41:36 +08:00
Tianyi Cui 06f29df392 Merge remote-tracking branch 'origin/worktree/session-format-05-v1-v2-chunk-migration' into worktree/session-format-06-v2-snapshot-rollout 2026-09-02 20:10:00 +08:00
Tianyi Cui 3ed91ab9d8 Merge remote-tracking branch 'origin/worktree/session-format-04-live-assistant-stream' into worktree/session-format-05-v1-v2-chunk-migration 2026-09-02 20:09:13 +08:00
Tianyi Cui cd708659b5 Merge remote-tracking branch 'origin/worktree/session-format-03-v0-v1-migration' into worktree/session-format-04-live-assistant-stream 2026-09-02 20:08:34 +08:00
Tianyi Cui 086b52f986 test(session): cover generation scan failures 2026-09-02 20:07:48 +08:00
Tianyi Cui 4dbd107568 Merge remote-tracking branch 'origin/worktree/session-format-05-v1-v2-chunk-migration' into worktree/session-format-06-v2-snapshot-rollout 2026-09-02 19:41:24 +08:00
Tianyi Cui 58f5e0b278 Merge remote-tracking branch 'origin/worktree/session-format-04-live-assistant-stream' into worktree/session-format-05-v1-v2-chunk-migration 2026-09-02 19:40:50 +08:00
Tianyi Cui fe9d8b552c Merge remote-tracking branch 'origin/worktree/session-format-03-v0-v1-migration' into worktree/session-format-04-live-assistant-stream 2026-09-02 19:40:13 +08:00
Tianyi Cui 17f784c936 test(subagent): scope SIGKILL grace proof to POSIX 2026-09-02 19:34:52 +08:00
Tianyi Cui 68e24ddef9 fix(test): keep v2 fixture parsing content-only 2026-09-02 19:24:32 +08:00
Tianyi Cui 4a80818ddc Merge embedded stream migration into v2 snapshot rollout 2026-09-02 19:23:45 +08:00
Tianyi Cui af68f9e10c fix(test): qualify selected replay fixture 2026-09-02 19:22:57 +08:00
Tianyi Cui bc0e57a480 Merge live assistant stream into embedded stream migration
# Conflicts:
#	apps/web/tests/scaffold.ts
2026-09-02 19:21:52 +08:00
Tianyi Cui de3ee872d6 Merge session format migration into live assistant stream 2026-09-02 19:18:16 +08:00
Tianyi Cui aa97372fe4 fix(test): repair alpha fixture and Windows gates 2026-09-02 19:17:32 +08:00
Tianyi Cui 9e371c220d Merge embedded stream migration into v2 snapshot rollout 2026-09-02 19:05:54 +08:00
Tianyi Cui 23b9dc9175 Merge live assistant stream into embedded stream migration
# Conflicts:
#	apps/web/tests/scaffold.ts
#	packages/experimental/webworker-runtime/tests/vfs-example-fixture.spec.ts
2026-09-02 19:05:23 +08:00
Tianyi Cui 42542e9a3d Merge session format migration into live assistant stream 2026-09-02 19:02:32 +08:00
Tianyi Cui 0850261706 fix(test): align current session fixture headers 2026-09-02 19:01:41 +08:00
Tianyi Cui b5b4ef74a0 Merge embedded stream migration into v2 snapshot rollout 2026-09-02 18:50:56 +08:00
Tianyi Cui df7d1b6ee2 chore(release): align v2 format package with alpha.5 2026-09-02 18:50:24 +08:00
Tianyi Cui e12258e2b7 Merge live assistant stream into embedded stream migration 2026-09-02 18:49:39 +08:00
Tianyi Cui d8cc3e035e Merge session format migration into live assistant stream 2026-09-02 18:48:50 +08:00
Tianyi Cui e0604df362 chore(release): align session format packages with alpha.5 2026-09-02 18:47:59 +08:00
Tianyi Cui 2ca559dee3 Merge master into session format migration 2026-09-02 18:46:49 +08:00
Tianyi Cui 8de41bbe99 Merge embedded stream migration into v2 snapshot rollout
# Conflicts:
#	docs/testing.i18n.yaml
#	docs/testing.md
#	docs/testing.zh.md
#	packages/test-support/session-snapshot/README.i18n.yaml
#	packages/test-support/session-snapshot/README.md
#	packages/test-support/session-snapshot/README.zh.md
#	snapshots/session/read-image-attachment-path/session.v2.jsonl
#	snapshots/session/read-image-dimension/session.v2.jsonl
#	snapshots/session/read-image-reencode/session.v2.jsonl
#	snapshots/session/read-image/session.v2.jsonl
#	snapshots/web/navigation-panes/session.jsonl
#	snapshots/web/ptc-round/session.v2.jsonl
#	snapshots/web/pwsh-terminal/session.jsonl
#	snapshots/web/seeded-history/session.jsonl
2026-09-02 18:45:14 +08:00
lsdsjy ef88756f13 feat(session, agent, web): support same-session message editing 2026-09-02 18:26:55 +08:00
Tianyi Cui c024c53d34 Merge pull request #3458 from deepseek-harness/xtr/record-browser-gif-gh-attach
docs(record-browser-gif): publish PR GIFs with gh --attach
2026-09-02 18:24:51 +08:00
Yichen Jiang ccecf4db04 fix(llm): address model discovery review 2026-09-02 18:00:43 +08:00
Tianyi Cui 2f091ee8e6 docs(record-browser-gif): publish PR GIFs with gh --attach
Prefer gh v2.99.0's repeatable --attach flag for publishing demonstration
GIFs: it uploads the artifact and rewrites the body's local-path
reference in place, keeping media out of git history without an orphan
assets branch. The assets-branch workflow remains the fallback when the
GIF exceeds 10 MB, gh is older than v2.99.0, or the repository is not on
github.com.
2026-09-02 17:58:36 +08:00
Tianyi Cui 042bd8d01a Merge live assistant stream into embedded stream migration
# Conflicts:
#	packages/session/session-projection-cache/src/spec.ts
2026-09-02 17:52:32 +08:00
imccyu 49a606bc5b Merge pull request #3456 from deepseek-harness/release/dsh-0.1.2-alpha.5-version-to-master
sync: merge 0.1.2-alpha.5 to master
2026-09-02 17:47:12 +08:00
Tianyi Cui aa2616c570 Merge session format migration into live assistant stream 2026-09-02 17:45:59 +08:00
Tianyi Cui 3bdc1b37e5 Merge master into session format migration 2026-09-02 17:43:06 +08:00
Tianyi Cui cf9948b147 Merge master into session format migration
# Conflicts:
#	packages/session/session-projection-cache/tests/cache.spec.ts
2026-09-02 17:41:58 +08:00
creatixchu a1956fa3e2 Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload 2026-09-02 17:39:48 +08:00
Dudu-0223 f7cee2c888 Merge pull request #3333 from deepseek-harness/feat/3330-team-send-message-steer
feat(agent-team): unify messages on steer
2026-09-02 17:27:55 +08:00
imccyu cf126d8699 Merge remote-tracking branch 'origin/merge/projcache-v6-compat-into-master' into release/dsh-0.1.2-alpha.5-version-to-master 2026-09-02 17:25:23 +08:00
Tianyi Cui 25098647e8 Merge live assistant stream into embedded stream migration
# Conflicts:
#	.agents/notes/implemented/architecture/2026-06-14-session-persistence.i18n.yaml
#	.agents/notes/implemented/architecture/2026-06-14-session-persistence.md
#	.agents/notes/implemented/architecture/2026-06-14-session-persistence.zh.md
#	.agents/notes/implemented/architecture/2026-08-08-bounded-session-persistence-write-batching.i18n.yaml
#	.agents/notes/implemented/architecture/2026-08-08-bounded-session-persistence-write-batching.md
#	.agents/notes/implemented/architecture/2026-08-08-bounded-session-persistence-write-batching.zh.md
#	.agents/notes/implemented/feature/2026-08-10-web-session-log-export.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-10-web-session-log-export.md
#	.agents/notes/implemented/feature/2026-08-10-web-session-log-export.zh.md
#	apps/cli/tests/profiles/headless/tests/session-format-guard.expected.e2e.ts
#	apps/web/tests/message-actions.e2e.ts
#	apps/web/tests/scaffold-generation.spec.ts
#	apps/web/tests/scaffold.ts
#	apps/web/tests/seeded-history.e2e.ts
#	apps/web/tests/subagent-conversation.e2e.ts
#	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/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	docs/subsystems/persistence.i18n.yaml
#	docs/subsystems/persistence.md
#	docs/subsystems/persistence.zh.md
#	docs/subsystems/session.i18n.yaml
#	docs/subsystems/session.md
#	docs/subsystems/session.zh.md
#	packages/api/session-controller/tests/session-projections.host.spec.ts
#	packages/core/agent-loop/tests/resume.spec.ts
#	packages/session-query/session-query-sqlite/tests/sqlite.spec.ts
#	packages/session-query/session-query/tests/tracing.spec.ts
#	packages/session/session-persistence-jsonl/README.i18n.yaml
#	packages/session/session-persistence-jsonl/README.md
#	packages/session/session-persistence-jsonl/README.zh.md
#	packages/session/session-persistence-jsonl/src/index.ts
#	packages/session/session-persistence-jsonl/tests/jsonl.spec.ts
#	packages/session/session-persistence-jsonl/tests/zstd.spec.ts
#	packages/session/session-persistence/tests/contract.ts
#	packages/session/session-persistence/tests/coordinator-contract.ts
#	packages/session/session-persistence/tests/persistence.spec.ts
#	packages/subagent/subagent/src/continuation.ts
#	packages/subagent/subagent/tests/list-children.spec.ts
2026-09-02 17:20:51 +08:00
imccyu 0a1efddd40 Merge pull request #3455 from deepseek-harness/merge/projcache-v6-compat-into-master
sync: merge projection cache fix from 0.1.2-alpha.5 to master
2026-09-02 17:18:44 +08:00
Dudu-0223 eeddd457cd fix(agent-team): preserve mailbox order on cold resume 2026-09-02 17:14:44 +08:00
Dudu-0223 1180707084 Merge remote-tracking branch 'origin/master' into feat/3330-team-send-message-steer
# Conflicts:
#	packages/experimental/agent-team/tests/team.spec.ts
2026-09-02 16:58:09 +08:00
Yichen Jiang bfdebf1d22 test(llm): expect discovery name fallback 2026-09-02 16:56:06 +08:00
imccyu c917fe6d46 Merge remote-tracking branch 'origin/master' into merge/projcache-v6-compat-into-master
# Conflicts:
#	packages/session/session-projection-cache/src/spec.ts
#	packages/storage/storage-json/src/per-record-unit.ts
#	packages/storage/storage-json/tests/json-backend.spec.ts
2026-09-02 16:55:00 +08:00
Yichen Jiang a6ed19b541 fix(llm): expand model listing discovery 2026-09-02 16:25:20 +08:00
Yichen Jiang 51c65c790d Merge remote-tracking branch 'origin/master' into worktree/deepseek-harness-proxy-config-2f5b4a 2026-09-02 16:11:28 +08:00
Turtle 9ea2329084 fix(issue-management): grant policy Project read access 2026-09-02 16:07:02 +08:00
imccyu 5a69ba1cdd Merge pull request #3445 from deepseek-harness/release/dsh-0.1.2-alpha.5
release: [email protected]
2026-09-02 15:57:43 +08:00
imccyu db6bdc3576 release(dsh): 0.1.2-alpha.5 2026-09-02 15:48:33 +08:00
imccyu 1915665e1e Merge pull request #3438 from deepseek-harness/fix/projcache-cross-version-read-compat
fix(session-projection-cache): survive upgrades across projcache domain versions
2026-09-02 15:47:14 +08:00
Turtle 39b151bda3 fix(issue-management): use Project-local Priority 2026-09-02 15:43:30 +08:00
imccyu db2dd2f840 docs(session-projection-cache): land the read-compat note as implemented and state fixture provenance in place
Review follow-ups: the Agent Note triplet moves to implemented/ rewritten as
shipped state (Decision/Consequences/Testing, present tense), cross-linked
both ways with the 2026-07-28 storage recovery proposal whose projcache
reset/destroy path it supersedes (that proposal stays live for authoritative
and whole-medium damage). The fixtures spec header and the note state the
fixture provenance as recorded facts of the released builds instead of
citing local tooling, and the spec JSDoc points at the note's final home.
2026-09-02 15:25:07 +08:00
imccyu bef26396e5 docs(session-projection-cache): cross-version read-compat note and schema-change fixture rule
The proposed Agent Note records the three shipped on-disk generations of
session_projcache, the read-compat and backup-and-skip decisions, the
upgrade matrix, and the rejected alternatives. The package README documents
the upgrade guarantees and requires every future schema or domain-version
change to land with archived fixtures and tests proving its upgrade story.
The storage subsystem page and the generated cordis catalog pick up the new
DomainSpec fields.
2026-09-02 15:25:07 +08:00
imccyu 49df707c86 fix(session-projection-cache): keep upgraded caches readable and boots safe across domain versions
The session_projcache domain declares compatibleVersions: [3, 4] and
invalidRecords: 'backup-and-skip'. The two lineage identity fields become
optional — records admitted from older versions predate them, and the single
reader (identityMatches) interprets absence as the unseeded lineage: exact
for unseeded sessions, while a seeded caller fails the match and refolds
cold, so the lineage binding keeps its protection. Upgraded homes therefore
boot and serve their cached listing titles immediately, including homes
whose new tree already holds current-stamped documents without lineage
fields, and a record failing validation anyway is backed up and skipped
instead of refusing the plugin tree.

tests/fixtures/ archives the real on-disk media of every shipped generation
(v3 whole-unit file, v4 and v5 per-record documents, and the lineage-less
current-stamped shape); fixtures.spec.ts proves each recovers through the
real storage stack, rewrites to the current format on the next live write,
and that a hopeless record is salvaged without costing the boot.
2026-09-02 15:25:07 +08:00
imccyu fcd109d29a feat(storage): version read compatibility and backup-and-skip salvage for per-record units
A DomainSpec may declare compatibleVersions: older domain versions whose
stored records the current record schemas still accept. The json backend's
per-record reads admit documents stamped with a declared version (writes
always stamp the current one), and the legacy whole-unit bootstrap migrates
only a file whose stored version is in the accepted set — previously it
migrated any version and stamped the records current, turning a discardable
stale cache into invalid-record failures that refused the whole domain at
open and permanently poisoned the new tree on first boot.

A DomainSpec may also declare invalidRecords: 'backup-and-skip' for domains
whose records are disposable derived data: a stored record failing its zod
schema is moved aside through the new optional KvUnit.backupRecord
(<key>.json.bak.<YYYYMMDDHHmm> under the json backend), logged with its
cause, and skipped, instead of rejecting the open. The default stays
fail-loud, and so do backends without backupRecord.
2026-09-02 15:25:07 +08:00
creatixchu 80b376f0ff Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload 2026-09-02 15:24:07 +08:00
Turtle 66ca93c3dc Merge pull request #3441 from deepseek-harness/turtle/fix-project-date-fields
fix(issue-management): restore Project date fields
2026-09-02 15:20:46 +08:00
Turtle 070b46e1ef fix(issue-management): restore Project date fields 2026-09-02 15:06:25 +08:00
creatixchu 8d1289420b Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload
# Conflicts:
#	packages/client/ui-attachment/README.i18n.yaml
#	packages/client/ui-attachment/README.md
#	packages/client/ui-attachment/README.zh.md
2026-09-02 14:05:03 +08:00
Tianyi Cui 9007b56360 Merge session format migration lint fix 2026-09-02 13:54:42 +08:00
Tianyi Cui 2372f84206 Merge session format migration into live assistant stream
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
2026-09-02 13:54:23 +08:00
Tianyi Cui 2b529bc2aa test(session-persistence-jsonl): keep migration assertions typed 2026-09-02 13:50:00 +08:00
Tianyi Cui 91e5f8838e Merge master into session format migration 2026-09-02 13:42:50 +08:00
Turtle be70505f9e Merge pull request #3417 from deepseek-harness/turtle/fix-issue-field-start-date
fix(issue-management): write Start date through Issue fields
2026-09-02 13:41:29 +08:00
Tianyi Cui 723980ac78 Merge master into session format migration
# Conflicts:
#	packages/experimental/webworker-runtime/tests/vfs-example-fixture.ts
2026-09-02 13:41:24 +08:00
Yichen Jiang bbae7318f0 Merge pull request #3424 from deepseek-harness/worktree/github-issue-725-verification-7e80bd
fix(llm): keep streamed tool-call identity across empty deltas
2026-09-02 13:35:55 +08:00
Tianyi Cui 7145acfe07 Merge master into session format migration
# Conflicts:
#	.agents/notes/archived/architecture/2026-06-18-shared-persistence-write-coordinator.i18n.yaml
#	.agents/notes/implemented/architecture/2026-06-14-session-persistence.i18n.yaml
#	.agents/notes/implemented/architecture/2026-06-14-session-persistence.md
#	.agents/notes/implemented/architecture/2026-06-14-session-persistence.zh.md
#	.agents/notes/implemented/architecture/2026-07-24-project-session-directories.i18n.yaml
#	.agents/notes/implemented/architecture/2026-07-24-project-session-directories.md
#	.agents/notes/implemented/architecture/2026-07-24-project-session-directories.zh.md
#	.agents/notes/implemented/architecture/2026-08-05-session-preparation.i18n.yaml
#	.agents/notes/implemented/architecture/2026-08-05-session-preparation.md
#	.agents/notes/implemented/architecture/2026-08-05-session-preparation.zh.md
#	.agents/notes/implemented/architecture/2026-08-10-message-feedback-sidecar.i18n.yaml
#	.agents/notes/implemented/architecture/2026-08-10-message-feedback-sidecar.md
#	.agents/notes/implemented/architecture/2026-08-10-message-feedback-sidecar.zh.md
#	.agents/notes/implemented/architecture/2026-08-27-handle-based-session-persistence.i18n.yaml
#	.agents/notes/implemented/bug-fix/2026-07-28-load-pre-identity-session-messages.md
#	.agents/notes/implemented/bug-fix/2026-07-28-load-pre-identity-session-messages.zh.md
#	.agents/notes/implemented/bug-fix/2026-08-04-load-pre-react-loop-sessions.md
#	.agents/notes/implemented/bug-fix/2026-08-04-load-pre-react-loop-sessions.zh.md
#	.agents/notes/implemented/bug-fix/2026-09-01-host-goal-pause-aborts-turn.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-10-web-session-log-export.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-10-web-session-log-export.md
#	.agents/notes/implemented/feature/2026-08-10-web-session-log-export.zh.md
#	apps/cli/tests/profiles/headless/tests/session-format-guard.expected.e2e.ts
#	apps/web/tests/cold-blank-session.e2e.ts
#	apps/web/tests/message-actions.e2e.ts
#	apps/web/tests/scaffold.ts
#	apps/web/tests/workspace-management.e2e.ts
#	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/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/subsystems/feedback.i18n.yaml
#	docs/subsystems/feedback.md
#	docs/subsystems/feedback.zh.md
#	docs/subsystems/persistence.i18n.yaml
#	docs/subsystems/persistence.md
#	docs/subsystems/persistence.zh.md
#	packages/acp/acp/src/index.ts
#	packages/acp/acp/tests/bridge.spec.ts
#	packages/api/session-controller/src/list.ts
#	packages/api/session-controller/tests/agent.host.spec.ts
#	packages/api/session-controller/tests/session-cold.host.spec.ts
#	packages/api/session-controller/tests/session-projections.host.spec.ts
#	packages/api/session-controller/tests/session-search.host.spec.ts
#	packages/api/session-controller/tests/test-remote.ts
#	packages/api/session-controller/tests/transport.host.spec.ts
#	packages/core/agent-loop/src/index.ts
#	packages/core/agent-loop/tests/config-session-id.spec.ts
#	packages/core/agent-loop/tests/resume.spec.ts
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/feedback/message-feedback/src/index.ts
#	packages/feedback/message-feedback/tests/helpers.ts
#	packages/feedback/message-feedback/tests/message-feedback.spec.ts
#	packages/session-query/session-log-export/src/archive.ts
#	packages/session-query/session-log-export/tests/archive.host.spec.ts
#	packages/session-query/session-log-export/tests/route.host.spec.ts
#	packages/session-query/session-query-sqlite/README.i18n.yaml
#	packages/session-query/session-query-sqlite/README.md
#	packages/session-query/session-query-sqlite/README.zh.md
#	packages/session-query/session-query-sqlite/src/index.ts
#	packages/session-query/session-query-sqlite/tests/sqlite.spec.ts
#	packages/session-query/session-query/README.i18n.yaml
#	packages/session-query/session-query/README.md
#	packages/session-query/session-query/README.zh.md
#	packages/session-query/session-query/src/corpus.ts
#	packages/session-query/session-query/tests/observation.spec.ts
#	packages/session-query/session-query/tests/session-query.spec.ts
#	packages/session-query/session-query/tests/tracing.spec.ts
#	packages/session/session-checkpoint-policy/tests/session-checkpoint-policy.spec.ts
#	packages/session/session-persistence-jsonl/README.i18n.yaml
#	packages/session/session-persistence-jsonl/README.md
#	packages/session/session-persistence-jsonl/README.zh.md
#	packages/session/session-persistence-jsonl/src/index.ts
#	packages/session/session-persistence-jsonl/tests/jsonl.spec.ts
#	packages/session/session-persistence-jsonl/tests/zstd.spec.ts
#	packages/session/session-persistence/README.i18n.yaml
#	packages/session/session-persistence/README.md
#	packages/session/session-persistence/README.zh.md
#	packages/session/session-persistence/src/coordinator.ts
#	packages/session/session-persistence/src/index.ts
#	packages/session/session-persistence/tests/contract.ts
#	packages/session/session-persistence/tests/coordinator-contract.ts
#	packages/session/session-persistence/tests/persistence.spec.ts
#	packages/session/session-telemetry/package.json
#	packages/shell/tool-bash/tests/tools.spec.ts
#	packages/subagent/subagent/src/continuation.ts
#	packages/subagent/subagent/tests/list-children.spec.ts
#	packages/workspace/workspace/src/index.ts
#	packages/workspace/workspace/tests/workspace.spec.ts
#	scripts/gen-cordis-catalog.ts
2026-09-02 13:34:40 +08:00
Chinesezjc a631115597 Merge pull request #2828 from deepseek-harness/feat/toolcard-image-result
feat(ui-tool): render read_image results as the image
2026-09-02 12:45:39 +08:00
Magolor d921d4b357 fix(storage-json): reject cross-version legacy bootstrap (#3431)
* fix(storage-json): reject cross-version legacy bootstrap

* test(webworker): sync projection cache fixture version

* docs(storage): record legacy bootstrap version ownership
2026-09-02 04:37:15 +00:00
Chinesezjc 3648331b11 Merge remote-tracking branch 'origin/master' into feat/toolcard-image-result
# Conflicts:
#	packages/client/ui-chat/src/client/chat/ChatNodeSeat.tsx
#	packages/client/ui-chat/src/client/chat/ChatView.tsx
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
2026-09-02 12:02:25 +08:00
Chinesezjc e4c822544c test(pwsh): restore product-default deadline in loader composition
The first call pays the full pwsh cold-start latency (spawn + .NET +
PSReadLine + Defender) inside the tool deadline. A 60s bound on the fully
loaded self-hosted Windows pool is exceeded often enough to reset the
session mid-test: two master CI runs (2026-09-01, runs 33524764567 and
33534262413) each failed at ~62s with the second call observing a fresh
session (cwd back at root, env empty). 300s matches the product default
so cold start no longer races the budget.
2026-09-02 11:50:18 +08:00
Xu Hanxiang d3ab4ce53d Merge pull request #3401 from deepseek-harness/issue-1424-goal-pause-stop-turn
fix(goal): abort the live turn on host-initiated pause
2026-09-02 11:32:12 +08:00
Turtle d76c974fbb Merge branch 'master' into turtle/fix-issue-field-start-date 2026-09-02 11:13:10 +08:00
creatixchu 2217ba42d7 fix(ui): align attachment cards with theme constraints 2026-09-02 11:01:45 +08:00
Yichen Jiang 6d261ecdee test(app-boot): assert the home .env proxy contract without pinning a casing
Windows folds `https_proxy` and `HTTPS_PROXY` into one variable, so the
exported spelling shadowed the file's lowercase one and the case failed
there. Each spelling now gets its own name: the file supplies a name the
shell did not export, and the shell outranks the file for the one it did.
2026-09-02 10:51:20 +08:00
Yichen Jiang 1fc6016f85 chore(http-proxy): match the workspace version bumped on master
The 0.1.2-alpha.4 release on master touched every manifest that existed
there; this package did not, so the merge left it at alpha.3 and
`check-workspace-constraints` refused the tree.
2026-09-02 10:36:10 +08:00
Yichen Jiang b03261caad fix(llm): narrow the fix to identity acceptance
Refusing a response whose tool call never receives an identity needed a new
failure code, a change to the default retryable set, and a `[DONE]` gate that
overrode the finish reason a provider had already sent — turning a safe
`max-tokens` truncation into up to five retries. The lenient wire it guarded
against is hypothetical: no report describes a stream that omits identity
entirely, and the pre-existing test for it is labelled as such.

Only `acceptIdentity` and the widened wire types remain. They close the
reported erasure and cannot reach a worse outcome than the previous
assignment, because the set of inputs that assign only narrows.
2026-09-02 10:34:09 +08:00
creatixchu 3b9ac476fb Merge remote-tracking branch 'origin/master' into worktree/2984-generic-file-upload
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	packages/api/session-controller/src/commands.ts
#	packages/api/session-controller/src/index.ts
#	packages/api/session-controller/tests/client-contract.client.spec.ts
#	packages/api/session-controller/tests/session-pending-submissions.client.spec.ts
#	packages/client/ui-attachment/src/AttachmentRail.module.css
#	packages/client/ui-chat/src/client/chat/MessageItem.tsx
#	packages/client/ui-conversation/src/client/skeleton/InputBar.tsx
#	packages/client/ui-trajectory/README.i18n.yaml
#	packages/client/ui-trajectory/README.md
#	packages/client/ui-trajectory/README.zh.md
#	packages/extensions/cordis-client-runner/src/client/api-catalog.ts
#	packages/llm/token-meter/src/surface-fold.ts
#	packages/session-query/session-log-export/src/archive.ts
#	packages/session-query/session-log-export/tests/archive.host.spec.ts
2026-09-02 10:29:53 +08:00
Yichen Jiang e7170b05a1 Merge remote-tracking branch 'origin/master' into worktree/deepseek-harness-proxy-config-2f5b4a 2026-09-02 10:28:17 +08:00
Yichen Jiang 93bba8ef67 fix(http-proxy): withhold NODE_USE_ENV_PROXY when the child receives a refused proxy value
`proxyEnvironmentForChild()` hands a child the proxy values the user
exported, including one this package refused — a SOCKS URL kept because
`curl` reads it — and sets `NODE_USE_ENV_PROXY=1` so a child Node honors
them. Node parses `HTTP_PROXY` and `HTTPS_PROXY` under that flag before
running the program and exits on any scheme other than `http:` or
`https:`. So a user with a usable `HTTP_PROXY` and `HTTPS_PROXY=socks4://…`
lost every Node child — stdio MCP servers, subagent CLIs, `npm` in the
bash tool — before its first line, while this process had reported only
that the scheme stayed direct. Measured on Node 24.17: `socks4://`,
`ftp://`, and a malformed value all exit 1; `socks5://` is accepted there
and only there.

The flag is now withheld whenever a value under the names Node parses is
one `isSupportedProxyUrl` refuses. Such a child connects directly, which
is what this process already said about that scheme, and `curl` still
reads the value it was kept for. Node does not read `ALL_PROXY`, so a
refused value there alone changes nothing.

The socks5 case in `install.spec.ts` now asserts the flag absent; the
ALL_PROXY fill case asserts it present; a new case spawns a real child
Node under the overlay for each refused shape and asserts it starts.
2026-09-02 10:27:36 +08:00
Yichen Jiang 6ecdc93901 fix(http-proxy): give children the user's environment under a layered direct policy
A direct policy installed over a proxied one swapped the global
dispatcher but left `process.env` holding the outer install's published
normalization. `proxyEnvironmentForChild()` returns nothing under a
direct policy, and `scrubbedParentEnv()` copies `process.env` as it is,
so a child spawned in that window inherited values no active policy
stood behind: an `HTTPS_PROXY` derived from `HTTP_PROXY` the user never
set, or the loss of a SOCKS value they set for `curl` and this package
had refused.

The direct branch now writes the user's own values — the record the
outermost install keeps — back into `process.env` for the window, and
re-applies the outer install's published values when it ends. An
install underneath that proxied nothing published nothing, so there is
nothing to put back. Publishing and restoring share one `writeProxyEnv`;
the empty-string special case it replaced was unreachable, since a
resolved bypass list always carries the loopback entries and an
accepted proxy URL is never empty.

The nesting is reachable only from tests since the plugin was removed;
the fix keeps the disposer symmetric for whoever layers installs next.
2026-09-02 10:19:23 +08:00
Yichen Jiang 83931a5f3e fix(llm): correct the refusal's recorded rationale
`LlmRuntime.adapterStream` normalizes a thrown `LlmError` into the same error
`finish` the loop routes to `agent/request-error`, so throwing would reach
retry too. The Note claimed otherwise. Yielding is chosen because it reports
the attempt's billed usage first and matches the neighbouring `EMPTY_RESPONSE`
refusal.

The rejection comment repeats the corrected durability wording, and the
assembler's delta-only fallback carries a TODO for the empty name it still
invents for adapters that never close a tool-call block.
2026-09-02 10:08:42 +08:00
Yichen Jiang c44dcb7b85 fix(app-boot): accept the proxy names from the Harness-home .env alone
The proxy guide told users a proxy could live in a project or
`$DSH_HOME` `.env`. It could not: `loadLayeredEnv` refuses the four
proxy names from any discovered file, as it refuses `PATH` and
`NODE_OPTIONS`, and the launch fails with a pointer to `export`.

That refusal is right for the invoking directory's file — it arrives
with a clone, and a repository must not choose where the harness sends
its traffic — and wrong for the user's own `$DSH_HOME/.env`, which
already holds their API key. `readEnvLayer` now accepts `HTTP_PROXY`,
`HTTPS_PROXY`, `ALL_PROXY`, and `NO_PROXY` from the directory that is
the Harness home, and nowhere else. `DSH_HOME` is itself bootstrap-only,
so no `.env` can relocate the exemption; the CA and TLS names in the
same group stay refused everywhere, since they change what is trusted
rather than where traffic goes. A project `.env` that sets a proxy name
still fails the launch, and its message now names the home file as the
second way out. Launching from inside the home directory reads that one
file as the project layer; the exemption follows the directory.

The seven existing refusal cases all write to the project layer and
pass unchanged. Four new cases cover the home layer accepting both
casings below an exported value, the home layer still refusing
`SSL_CERT_FILE`, the project layer's new message, and the same-directory
launch. The guide, both package READMEs, and the two Agent Notes that
stated the old rule now state this one.
2026-09-02 10:04:59 +08:00
Yichen Jiang e91c28d3fd fix(llm): cover the malformed tool-call path and correct its records
The `MALFORMED_TOOL_CALL` JSDoc claimed nothing durable is written, but the
loop appends an `assistant/chunk` for every yielded chunk; only the assistant
message and tool result are withheld. The bounded-recovery Note still listed
a five-code transient set, and neither Note linked the other.

A keyless `malformed-tool-call-retry` scenario now records the refusal, the
retry, and the absence of a `tool/call` for the failed attempt. A translator
case pins that an already closable block also withholds its `block-end`.
2026-09-02 10:01:56 +08:00
Yichen Jiang 2795940323 docs(http-proxy): state the shipped library, not the retired plugin
Review found the package's prose still describing a plugin that an
earlier revision removed, and three factual slips about behavior.

- policy.ts, install.ts, install.spec.ts, and the Agent Note named a
  `Config` surface, a `cordis.yml` source, a mountable plugin, and a
  `plugin.spec.ts` that no longer exist; each now describes the
  environment-only resolution the launcher actually runs.
- `NO_PROXY=example.com` bypasses `api.example.com` as well — the matcher
  accepts the host and every subdomain under it, and a leading `.` or
  `*.` means the same thing. The guide, README, and JSDoc claimed a bare
  entry matched only the exact host, which would let a reader believe a
  subdomain was proxied when it went direct.
- A rejection diagnostic names the variable and never its value, so no
  username is shown; the guide said the username was shown with the rest
  masked. The README's source map claimed a "redaction" step that does
  not exist.
- The `node:https` worker placeholder was added for a `node:http` agent
  factory this PR later removed; nothing imports `node:https` now, so the
  stub, its VFS mapping, and its test return to their state on master.
2026-09-02 09:43:47 +08:00
Yichen Jiang 96cbd8d9e6 fix(llm): refresh web and packed-fixture expectations for the new retry code
Adding `MALFORMED_TOOL_CALL` to the default retryable set changes two
expected outputs the session snapshot lane does not own: the shipped Web
composition's inline snapshot, and the canonical packed layout of the
refreshed `empty-response-retry` fixture.
2026-09-02 09:36:54 +08:00
Tianyi Cui 9424841d68 test(snapshot): retain failed reasoning projection 2026-09-02 04:46:35 +08:00
Tianyi Cui 343a20fb6f refactor(snapshot): remove dead fixture path plumbing 2026-09-02 04:46:02 +08:00
Tianyi Cui f693946509 test(snapshot): roll corpus forward to format v2 2026-09-02 04:18:52 +08:00
Tianyi Cui eb7c290b22 fix(session): retain reachable v2 stream settlements 2026-09-02 04:17:44 +08:00
Tianyi Cui 0670239db2 chore(deps): classify session stream helpers 2026-09-02 04:00:33 +08:00
Tianyi Cui f30896394c test(web): restore HMR build artifacts 2026-09-02 04:00:33 +08:00
Tianyi Cui 7e5b72ceee fix(session): harden embedded assistant streams 2026-09-02 04:00:33 +08:00
Tianyi Cui f99b06eaed feat(session)!: embed assistant streams in format v2 2026-09-02 04:00:01 +08:00
Tianyi Cui 0bb7bba015 fix(session): close live assistant framing races 2026-09-02 03:49:17 +08:00
Tianyi Cui 30e045dfad feat(agent): emit live assistant stream frames 2026-09-02 03:36:13 +08:00
Tianyi Cui eb56627f36 test(snapshot): retire vanished generation roles 2026-09-02 03:34:52 +08:00
Tianyi Cui 79f27df0dd fix(session): harden migration artifact ownership 2026-09-02 03:34:38 +08:00
Turtle 8b799cd7ac Merge pull request #3266 from deepseek-harness/refactor/session-persistence-handle-seam
refactor(session-persistence)!: handle-based seam with a lifecycle-owned write path
2026-09-02 00:50:53 +08:00
Turtle bec6805d6a refactor(session-persistence)!: handle-based seam with a lifecycle-owned write path
The persistence seam is now create/open/stat/list returning per-session
SessionHandles (read/append/flush/close); every log read and write flows
through the owning handle. The seam package exports only the service and
handle contracts, consumer-visible errors, and pure durable-data
validation helpers; each backend owns its complete storage runtime, and
the shared contract suites pin equivalent observable behavior. The
backend routes published sessions' live events by id into the active
write handle; agent-loop only acquires, seeds, and closes the handle.
Resume appends interruptedTurnClosers through its write handle;
session-query owns the revision-keyed cold cache. Legacy-only surfaces
are removed in the same swap: locate/readRaw/supportsRawArtifacts, the
legacy event-shape read migration, zstd torn-frame salvage,
DSH_SESSION_JSONL, and hook transcript_path population; a torn final
zstd frame is discarded whole; the session-list cold blank probe returns
on stat metadata (eventCount derived from the last physical row,
sizeBytes). The WebUI ZIP export serializes the logical log from a read
handle, so both backends export identically.

Refs #3245
2026-09-01 23:19:02 +08:00
Yichen Jiang a1271a4903 fix(llm): keep streamed tool-call identity across empty deltas
A continuation SSE delta that repeats a tool call's `id` or `name` as an
empty string — or as `null`, which some OpenAI-compatible gateways send —
erased the identity established by the call's first delta. The assembled
block reached the loop with an empty name and failed as `unknown tool ""`,
and the empty `callId` persisted into `tool/result`, which the session
reader refuses on reopen.

`acceptIdentity` accepts only a non-empty string, so a repeated empty or
null field means "no update". A tool call still missing `id` or `name` at
`[DONE]` ends the response with the new retryable `MALFORMED_TOOL_CALL`
code instead of closing an unusable block.
2026-09-01 22:22:51 +08:00
Tianyi Cui d1521ea783 feat(session)!: add released format migration 2026-09-01 22:12:21 +08:00
Yichen Jiang 0d99bd0489 docs: regenerate the module graph without the telemetry proxy edge
Reverting telemetry to its own transport dropped the package's dependency
on the proxy library, and the generated graph still recorded that edge.

The gate that catches this is `verify-module-graph`, which runs in
`check:ci:static` and not in `doc-sync`; the revert was checked with the
latter alone.
2026-09-01 21:59:50 +08:00
Yichen Jiang 13daefe073 revert(session-telemetry-otel): leave telemetry on its own transport
Telemetry was the only call site this PR could not cover without changing
the SDK transport underneath it, and both ways of doing that cost more
than the channel is worth.

Routing an `http.Agent` needs Node's `proxyEnv`, added in 22.21 and 24.5
— inside the engines range, so three supported runtimes stayed direct
anyway, and the proxy package had to keep a `createNodeHttpAgent` export
for a path that only sometimes worked. Replacing the transport with the
SDK's `fetch` delegate covered every runtime but has no compression,
while the shipped `base` bundle enables gzip and a realistic OTLP batch
is 6.4x smaller with it; keeping both meant gzipping at the serializer,
which put transport code inside a telemetry plugin.

Telemetry is the one outbound channel whose loss costs the user nothing:
no tool, model request, or session depends on it, and an export that
cannot connect is already dropped silently. A user behind a mandatory
proxy is left where they were rather than regressed.

`src/index.ts`, `otel.spec.ts`, and `tsconfig.json` return to their state
on master; the package keeps only a dev dependency on the proxy library.
`egress.spec.ts` inverts: it installs a policy and asserts the fake proxy
saw nothing, so an SDK upgrade that moved the exporter onto `fetch` would
surface as a failing test rather than silently routing telemetry.
2026-09-01 21:51:29 +08:00
Yichen Jiang b518286735 fix(session-telemetry-otel): keep gzip on the fetch transport
The previous commit moved the OTLP exporter to the SDK's `fetch` delegate
and refused `exporter.compression` at load, on the belief that nothing
shipped enabled it. `packages/bundle/base/cordis.patch.yml` does, so the
refusal broke every test that boots the shipped bundle — the snapshot,
e2e, and Windows observational jobs all failed on that one load error.

Dropping gzip was the wrong trade anyway: a realistic OTLP batch measures
6.4x smaller with it, so trading it for proxy support would have charged
every deployment to fix one. The `fetch` transport has no compression
hook, but serialization is the seam before the body reaches it — the
plugin now gzips there and declares `Content-Encoding` itself.

`keepAlive` and `httpAgentOptions` have no such seam, since they
configure a connection pool `fetch` does not expose, so those two stay
refused at load rather than accepted and ignored. `compression` is typed
as the two values this package can actually apply rather than the SDK's
wider enum, and a third value fails loud at load.
2026-09-01 21:42:09 +08:00
Yichen Jiang bdd294dc47 Merge remote-tracking branch 'origin/master' into worktree/deepseek-harness-proxy-config-2f5b4a 2026-09-01 21:21:22 +08:00
Yichen Jiang 8470ddef1d refactor(http-proxy): converge the proxy API on four functions
The package exported six functions, four of them shaped by one SDK's
transport each: a dispatcher factory, a `node:http` agent factory, a
proxy-URL lookup, and a policy accessor. Review asked whether the call
sites could converge instead of the package growing an export per SDK.

They could, and each removal took a whole shape with it:

- The OTLP exporter moves to the SDK's `fetch` delegate, retiring
  `createNodeHttpAgent`. Its Node-version floor goes too: `proxyEnv` on
  an `http.Agent` needs 22.21 or 24.5, inside the engines range, so
  telemetry was direct on 22.19, 22.20, and 24.0-24.4. The cost is
  `compression`, a Node-transport option; the plugin now refuses it,
  `keepAlive`, and `httpAgentOptions` at load instead of ignoring them.
- `web-fetch-http` builds its own address-pinning agent under an
  annotated `proxy-exempt:` exemption, retiring `createDispatcher`.
  Pinning is per-request state a process-wide dispatcher cannot hold.
- E2B reads `route.proxy`, retiring `proxyUrlFor`.

What remains is `installProxyFromEnvironment`, `proxyRouteFor`,
`proxyEnvironmentForChild`, and `clearedProxyEnv` — one per way a caller
can need the policy. Installation absorbs resolution and diagnostic
reporting, which no caller needed apart.

`proxyRouteFor` also closes a defect the old accessor made expressible:
`web-fetch-http` read the policy to decide whether to pin, then read it
again to build a transport, so an unmount between the two returned a
direct, unpinned agent for a URL the first read had cleared as proxied.
A route carries the answer and the transport that answer assumed.

Every egress spec now installs through `installProxyFromEnvironment`, so
no test asserts a policy object a real launch could not produce.
2026-09-01 21:15:04 +08:00
Turtle 6ce0b6cce8 fix(issue-management): write Start date through Issue fields 2026-09-01 21:01:36 +08:00
mektpoy b57cc33421 docs(goal): re-record README bilingual pairing 2026-09-01 20:04:06 +08:00
mektpoy 33fa98b3c2 fix(goal): fence pause to the dropped attempt ref 2026-09-01 19:58:52 +08:00
creatixchu 590a8e220a docs(attachment): record generic file behavior 2026-09-01 16:11:43 +08:00
creatixchu e9b7ed0aab test: cover generic file submission flows 2026-09-01 16:11:43 +08:00
creatixchu a1144c4950 feat(ui-attachment): unify mixed attachment presentation 2026-09-01 16:11:43 +08:00
creatixchu bafa6ae11d feat(conversation): stream files through submission lifecycle 2026-09-01 16:11:43 +08:00
creatixchu 8a0ff3aff8 feat(session-controller): admit files across command flows 2026-09-01 16:11:43 +08:00
creatixchu 65d2015b09 feat(attachment): store and project generic files 2026-09-01 16:11:43 +08:00
Chinesezjc d2954806de fix(snapshots): project read-image-attachment-path fixture into canonical packed layout 2026-09-01 15:19:37 +08:00
Chinesezjc a23c3dd64e Merge branch 'origin/master' into feat/toolcard-image-result 2026-09-01 14:45:24 +08:00
Dudu-0223 1149d47e9a test(tools): update team catalog expectation 2026-09-01 14:22:50 +08:00
Dudu-0223 040d73871b feat(agent-team): unify messages on steer 2026-09-01 14:22:50 +08:00
mektpoy 29ce849738 fix(goal): abort the live turn on host-initiated pause 2026-09-01 13:56:36 +08:00
Yichen Jiang f878545358 Merge remote-tracking branch 'origin/master' into worktree/deepseek-harness-proxy-config-2f5b4a
Master moved 212 commits. Conflicts were eight `package.json` and nine
`tsconfig.json` files, all dependency-and-reference unions: master dropped the
`runtime-diagnostics/invariants` reference across packages while this branch
added `util/http-proxy`. The lockfile, `tsconfig.base.json`, and the module
graph were regenerated rather than merged by hand.

Master also brought `verify-package-invariants`, which rejects an empty
invariant companion. This package's companion was empty by design, so it is
gone with its publication wiring — the export, the `files` entry, the project
reference, the `dsh-invariants` peer, and the test. Master did the same across
`util/`. The README carries the reason sentence that gate requires.

Carried in the same commit, because the review arrived while the merge was open:
`e2bApiUrl` moves out of the `dsh-e2b` entry into `src/api-url.ts`. Code Entropy
flagged it as a public name with no consumer outside its own package; the seam
keeps its URL-precedence test, which is worth having directly — getting that
order wrong hands a proxy the control-plane traffic and its API key.
2026-09-01 13:39:50 +08:00
Chinesezjc d13d0a4b86 ci: re-trigger workflow after dropped push event 2026-09-01 11:53:19 +08:00
Chinesezjc 6e5ed52aed fix(ui-tool): address review wording and JSDoc accuracy on the image card 2026-09-01 11:43:26 +08:00
Chinesezjc 666bd48eae fix(ui-tool): scope the image-card path fallback to nested calls; repair merge-broken docs and snapshot fixtures 2026-09-01 11:40:21 +08:00
Yichen Jiang b9153cbc19 Merge remote-tracking branch 'origin/master' into worktree/deepseek-harness-proxy-config-2f5b4a
# Conflicts:
#	packages/session/session-telemetry-otel/package.json
2026-09-01 11:15:18 +08:00
Yichen Jiang c62d6f3a44 refactor(net): make the proxy a util library with six functions
Review asked why this is a plugin and why it exports so much. The design note
this branch shipped answered the second question itself — "a pure resolution
function plus an installation function" — and the code drifted to seventeen
exports and a Cordis plugin nobody approved or mounted.

The plugin is gone. Transport policy has one answer per process: nothing to
swap, and no scope narrower than the process to give one. Its `Config` was also
the only supplier of a configuration branch, so resolution now reads the
environment and nothing else — `mode`, the config-sourced fields, and the
`config` policy source were unreachable the moment the plugin left.

Four exports nothing outside the package used are internal again, and
`currentProxyPolicy` answers with the direct policy instead of `undefined`, so
`DIRECT_POLICY` no longer needs a public face. Nine functions remain, one per
way a caller can need the policy; two is not reachable with six consumer seams.

The package moves to `util/`. The note claimed a dependency on `undici`
disqualified it from that group; the charter governs harness dependencies, not
external ones, and the process note that says so predates this branch. The real
blocker was the harness dependency: resolution needed one method of
`LaunchEnvironmentSnapshot`, so it names a structural `EnvLookup` and the
launcher passes its snapshot unchanged. `net/` is dissolved.

Dropping the group's line from the repository layout also returns `AGENTS.md`
to its original ceiling, so the raise the merge needed is reverted.
2026-09-01 11:01:05 +08:00
pku-xht 2660635e63 fix(shell): preserve stderr on provider failure 2026-08-31 20:05:37 +08:00
pku-xht fc19a0a3fa fix(subprocess): clarify provider failures and scope polling 2026-08-31 19:26:08 +08:00
Chinesezjc 56ca8af0ee feat(ui-tool): render the image card for nested read_image calls 2026-08-31 18:14:08 +08:00
Chinesezjc 5bb2c46453 Merge branch 'master' into feat/toolcard-image-result 2026-08-31 17:11:15 +08:00
pku-xht 6d49ac2ef6 fix(subprocess): align runner bindings with current types 2026-08-31 15:37:14 +08:00
pku-xht fb00331cfa Merge master into subprocess native containment 2026-08-31 15:24:49 +08:00
pku-xht 5e3eaea742 refactor(subprocess): keep runner error bindings one-shot 2026-08-31 15:22:12 +08:00
pku-xht 8bb19f8f7f fix(subprocess): close containment review findings 2026-08-31 14:36:13 +08:00
Yichen Jiang 43afef8576 fix: settle what the master merge broke
`AGENTS.md` sat at exactly its 1950-word ceiling on master, so the one line this
branch adds to the repository layout — a new top-level package group — cannot
fit at any length: even a one-word description overflows. The description is
condensed to five words and the ceiling raised by ten, the smallest change that
keeps every package group listed. Omitting only `net/` from a list that names
every other group was the alternative.

One new test drove an IPv4-mapped literal through a full fetch. An IPv6 literal
sends `resolvePublicAddresses` looking for a NAT64 prefix before it refuses
anything, and that is a real DNS query — 5s under load, 6ms here, which is why
it passed alone and timed out in the full suite. The three IPv4 cases already
prove the branch end to end without touching the network, so the mapped form is
asserted on the predicate instead.
2026-08-31 13:07:21 +08:00
Yichen Jiang 44a9687bbe Merge remote-tracking branch 'origin/master' into worktree/deepseek-harness-proxy-config-2f5b4a
# Conflicts:
#	apps/cli/package.json
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/e2b/e2b/package.json
#	packages/llm/llm-deepseek/package.json
#	packages/llm/llm-pi-ai/package.json
#	packages/test-support/session-snapshot/package.json
#	packages/workflow/workflow-worker-thread/package.json
#	pnpm-lock.yaml
2026-08-31 12:58:59 +08:00
Yichen Jiang 6de470e61b fix(net): keep this machine off the proxy, and refuse a literal the checks reject
Review found `127.0.0.2` routed through the proxy. The bypass list carries four
literal loopback entries because that is all a consumer reading an environment
can match, and `proxyForUrl` matched only those — leaving the rest of
`127.0.0.0/8`, `0.0.0.0`, and the IPv4-mapped spellings routed through a proxy
that could then reach them. Loopback is now recognised structurally, which a
list entry cannot express; the published entries stay for the environment
readers.

The same review case exposed a wider one. `web_fetch` skips its address checks
on a proxied hop, because the proxy resolves the origin — but a literal needs no
resolution, so the skip bought nothing and let a proxy on this machine reach
every private range those checks refuse, `169.254.169.254` included. A literal
the checks would refuse now takes the validated path, where the existing
refusal already covers it.

Tests that proved a tunnelled hop used a loopback origin, which no policy can
route through a proxy any more. They name a host only the proxy can answer for
instead — closer to what a proxied request actually looks like.

The user guide promised the proxy carried every outbound request including
telemetry. It carries neither on an older Node, nor anything a model-authored
script sends, so the promise is narrowed and the exceptions listed. A password
in a proxy URL reaching every tool DSH runs is documented there too: it is how
the variable already behaves, and worth knowing before putting one in.
2026-08-31 11:57:40 +08:00
Chinesezjc 3137b33ba9 ci: redirect Node compile cache to data-volume runner temp 2026-08-29 18:51:06 +08:00
Chinesezjc a4d4404708 feat(ui-tool): render read_image results as the image
A settled top-level `read_image` call printed its raw attachment object as
literal text in the tool card — `{"type":"image","attachment":{…}}` —
instead of the image, because no presentation metadata told a client card
how to present the reference and the tool-card layer had no image concept.

Host: `read_image` declares an `output.presentationMeta` persisting
`{ path }` only. The attachment reference deliberately lives in the
settled result content — the single record a `tools/post-execute`
replacement rewrites — not in `meta`; the id is opaque and
provider-owned, checked for existence only.

Client: `imageCardModel` derives the card from the call head, the meta
path, the result's own image block, and a shape-matched envelope. ToolRow
gains an `image` card slot; the `read_image` toolview declares the
Tool-owned `tool.call.images` slot as its child and dispatches the
gallery through it. ui-chat down-threads the session-authorized loader
(`ChatNodeOwnerProps.loadImage`), so the tool layer supplies only derived
references plus the loader and never imports an attachment
implementation; ui-attachment fills the slot with its message gallery
renderer. The card keeps the envelope text below the gallery for the
no-attachment-plugin deployment. An image-bearing tool registers a keyed
toolview; the generic fallback keeps its flattened text. `read_image`
joins the read variant with its own locale title key; both rows share
`read-family-row.tsx`.

Verification: `read-image.spec.ts` (metadata projection, envelope by
shape, reference narrowing, real-execution round trip, rejection
branches incl. non-digest ids), `image-card.client.spec.tsx` (derivation,
row render site dispatching the slot, keyed registration with the
child-slot declaration, empty-slot fallbacks, media-type enum), keyless
snapshots (`read-image-gif` added; read-image/-dimension/-reencode
updated to the `{path}` meta), five injected-defect negative controls,
and a demo GIF recorded from this PR's head through the official
image-capable model.
2026-08-29 17:41:05 +08:00
pku-xht 976456db8e Merge master to adopt Flash E2E coverage 2026-08-29 17:39:31 +08:00
pku-xht 93c11689e7 fix(subprocess): address containment review findings 2026-08-29 15:44:13 +08:00
Yichen Jiang b239db6aeb test(net): assert the proxy-name contract on a platform that folds case
The Windows coverage lane failed on four cases that assume `http_proxy` and
`HTTP_PROXY` are separate variables. They are one variable there: `process.env`
is case-insensitive, and the launch snapshot folds names for the same reason. A
scenario built on "the user set only the lowercase name" cannot exist.

Two of them assert a contract rather than a spelling, so they now hold either
way: what reaches a child for a scheme the user named is the user's own value
and never the derived one, and a nested install carries the active policy's
value rather than the outer install's published one. Both read over the pair of
names instead of one.

The other two are about the case distinction itself. Neither can hold on a
folded environment, so each asserts what that platform does instead of skipping:
the later entry wins where a preference cannot be expressed, and a diagnostic
names the spelling resolution asked for. Both were verified against the folding
arm rather than reasoned about.
2026-08-29 13:37:29 +08:00
Yichen Jiang 03d2c54db1 test: start every suite from an environment with no proxy
A developer's Clash and a CI runner's squid both export HTTP_PROXY and its
siblings. Now that the harness honors them, an ambient value decides test
outcomes: this PR has already recorded a proxy's 502 page as a snapshot's
expected output, and let a runner's own export stand in for "what the user
exported" in an assertion about inherited names.

A Vitest setup file clears the proxy names before any suite runs, wired into
every configuration that declares a setup. Real-API e2e is cleared too: before
proxy support existed every request connected directly and that suite passed, so
direct is the environment it is known to work in.

`NODE_USE_ENV_PROXY` cannot be cleared this way — Node samples the proxy
environment at process start — and the module says so. A proxy application never
exports it, and the eight names one does export are fully handled: with all of
them set, the affected suites pass.

The wiring is what regresses, so that is what the test pins. Configurations are
discovered rather than listed, because the web suites carry no setup today and a
hand-written list would let one of them gain a setup without gaining this one.

`plugin.spec.ts` kept its own copy of the eight names to guard against the
machine; it never sets a proxy variable itself, so the setup replaces that
entirely. `install.spec.ts` had one assertion waiting on a DNS miss with no
deadline, which timed out once under load.
2026-08-29 13:17:12 +08:00
Yichen Jiang 2a73128d78 docs(net): describe the worker seam as it is, not as a mechanism that exists
`installGlobalProxy` claimed each worker thread calls it with a policy its host
passed through `workerData`. Nothing does: the two workers this repository ships
evaluate model-authored scripts and are deliberately left without a proxy URL
that may carry credentials.
2026-08-29 13:17:12 +08:00
Yichen Jiang 4623c68e70 perf(scripts): parse only the files the dispatcher gate can find a violation in
`agentBindings` now walks the whole tree to reach a dynamic `import('undici')`,
which pushed the repository-wide scan past the 5s default under the coverage
lane's instrumentation.

Both violations name one of two words in source: an agent construction needs a
binding from the undici module, and the option is a property called
`dispatcher`. Skipping a file that mentions neither leaves 21 of 1597 files to
parse, so the scan runs in ~60ms instead of ~500ms — well clear of the timeout
even instrumented.
2026-08-29 13:17:12 +08:00
Yichen Jiang cfc9b3bdef fix(net): route by the policy, and give a child the routing its parent has
Second review pass on the outbound proxy work.

The installed dispatcher was undici's EnvHttpProxyAgent, which reuses the HTTP
proxy for `https:` whenever no HTTPS proxy is present. That is exactly the state
this package resolves after refusing a SOCKS or malformed URL the user named for
`https:`, so the scheme the diagnostic reported as direct was tunnelled anyway.
The dispatcher is now an Agent whose per-origin factory calls `proxyForUrl`, so
routing and `proxyForUrl` cannot disagree by parsing the same list twice.

`childProxyEnv` returned only the names the user exported, which left a child
Node direct whenever the proxy came from `ALL_PROXY` or from cordis.yml — Node's
`NODE_USE_ENV_PROXY` reads neither — and stripped the merged loopback bypass so
the child sent its own localhost traffic to the proxy. A scheme the user named
in either casing still reaches the child exactly as written; one they named in
neither now carries the resolved value, and the bypass list is always the merged
one.

A nested install (the plugin mounted over the launcher's policy) recorded the
outer policy's published values as the user's, then cleared the record on
disposal, so every later child inherited the normalization instead. The record
now belongs to the outermost install and is restored, not dropped.

`web_fetch` read the active policy twice — once to skip address pinning, again
inside the transport — so a disposal landing between the two reads produced an
unpinned direct connection to a host nothing validated. One snapshot now decides
both.

Also: the node:http proxy test asserted a route the engines range does not always
have, and the gate could not see undici bound through `await import('undici')`,
the form this repository actually uses.
2026-08-29 13:17:12 +08:00
Yichen Jiang 52e39cd783 test(net): clear the ambient proxy before asserting what a child inherits
The case builds a user environment and asserts a child receives it verbatim,
so a runner that exports its own proxy supplied half the "user" values and
decided the assertion.
2026-08-29 13:17:12 +08:00
Yichen Jiang e6dbf85f6c fix(net): address review — containment, opt-out, and syntax-aware discovery
The workflow worker no longer receives proxy configuration: it executes the
model-authored script body, and a proxy URL may carry credentials. A child
process now inherits the values the user exported rather than this process's
normalization, so a SOCKS proxy set for curl survives and no HTTPS_PROXY is
invented. `mode: 'off'` installs a direct dispatcher instead of recording a
policy the global dispatcher ignores, and the environment snapshot is taken
before any write so Windows restores the user's values.

E2B picks its proxy from the control-plane URL the SDK will really call, the
OTLP agent honors `exporter.keepAlive`, and a scheme whose own value was
refused stays direct instead of borrowing another scheme's proxy.

verify-no-bare-dispatcher parses the TypeScript AST as scripts/AGENTS.md
requires; it immediately found the `{ dispatcher }` shorthand the regex missed.
2026-08-29 13:17:12 +08:00
Yichen Jiang aa0ed35ebc test(snapshot): isolate a replayed dsh from the machine's proxy environment
A replay must not depend on the runner's network policy, the same reason it
pins its home and sessions root. The harness now honors the proxy environment,
so a runner exporting one sent the web-fetch scenario's fixture request to a
proxy that could not resolve the fixture host and recorded that proxy's error
page. Clear the proxy names in both test-support spawners, from the one list
dsh-http-proxy owns.
2026-08-29 13:17:12 +08:00
Yichen Jiang ca20b9af11 test(llm): cover the DeepSeek and pi-ai request paths with egress tests
Both adapters' inference requests were argued from a code read and, for
DeepSeek, from one product smoke. Drive each shipping adapter at an
unresolvable endpoint through a fake proxy instead, and cover pi-ai's provider
stream rather than only its model discovery.
2026-08-29 13:17:11 +08:00
Yichen Jiang 35bc2d1d45 fix(webworker): register a node:https placeholder for the proxy agent factory
The VFS packer sweeps module requests statically, so dsh-http-proxy's agent
factory made the preview image unpackable: it names node:https for the SDKs
that post through Node's core HTTP modules, a path the worker never takes.
Mock it the way node:net is mocked rather than hiding the request.
2026-08-29 13:17:11 +08:00
Yichen Jiang ec82e3e3ee test(net): assert the child and worker proxy seam by Node version
NODE_USE_ENV_PROXY reaches Node 24.0+ and 22.21+, while engines admits 22.19.
Assert the direct connection on an older runtime instead of only the proxied
one, so the seam is executable rather than prose.
2026-08-29 13:17:11 +08:00
Yichen Jiang 545e2ad914 feat(net): route every outbound request through the configured proxy
Node's built-in fetch ignores HTTP_PROXY, so every harness request connected
directly regardless of what the user exported. Resolve one policy from the
launch environment and install it as undici's global dispatcher, then wire the
four surfaces a global dispatcher cannot reach: web_fetch's pinned transport,
the OTLP exporter's node:http agent, the E2B SDK's own proxy option, and the
environment a child process or worker thread is given.

Each outbound call site carries an egress test that drives its real code path
through a fake proxy; that measurement is what found the OTLP and E2B gaps.
2026-08-29 13:17:11 +08:00
pku-xht aaa5117ebd fix(subprocess): preserve literal spawn error stacks 2026-08-29 13:08:43 +08:00
pku-xht c0e7b98169 test(subprocess): preserve optional spawn error keys 2026-08-29 13:02:36 +08:00
pku-xht 13f3b2c172 fix(subprocess): match native spawn error semantics 2026-08-29 12:13:30 +08:00
pku-xht 60dd357a02 fix(subprocess): preserve native spawn error shape 2026-08-29 11:36:27 +08:00
pku-xht 1760649ba7 refactor(subprocess): derive native owner state 2026-08-29 11:28:33 +08:00
pku-xht a416b13eb5 fix(subprocess): preserve Windows search miss errors 2026-08-29 10:28:44 +08:00
pku-xht 5aab793045 fix(subprocess): preserve clean Windows range settlement 2026-08-29 09:08:34 +08:00
pku-xht 6e7b152de7 fix(subprocess): preserve native runner contracts 2026-08-29 07:57:59 +08:00
pku-xht 23af4410f6 fix(subprocess): resolve source runner loader absolutely 2026-08-29 06:14:15 +08:00
pku-xht a825b8d042 fix(subprocess): close native containment contract gaps 2026-08-29 05:56:29 +08:00
pku-xht 40279aea17 fix(subprocess): preserve native runner stdio 2026-08-29 00:03:12 +08:00
pku-xht 635c35991c test(subprocess): type Linux exec mock 2026-08-28 22:38:18 +08:00
pku-xht a0bc2ea803 fix(subprocess): preserve native runner launch semantics 2026-08-28 22:34:09 +08:00
pku-xht aca5c0cb2b fix(subprocess): release Windows runner stdio owners 2026-08-28 21:29:09 +08:00
pku-xht 32b2b24099 fix(subprocess): close runner stdio handles 2026-08-28 20:30:11 +08:00
pku-xht 8096aba953 Merge remote-tracking branch 'origin/master' into codex/subprocess-native-containment 2026-08-28 19:55:24 +08:00
pku-xht 8ef28f76c0 fix(subprocess): preserve Windows runner spawn semantics 2026-08-28 19:55:16 +08:00
pku-xht 9aecbad9dd fix(subprocess): keep runner worker-loadable 2026-08-28 19:16:34 +08:00
pku-xht b65575442d Merge origin/master into codex/subprocess-native-containment 2026-08-28 18:34:22 +08:00
pku-xht a95f0b368f fix(subprocess): contain escaped descendants with native owners 2026-08-28 18:15:49 +08:00
pku-xht c302bedc3a test(subprocess): defer fake runner disconnect 2026-08-27 02:37:00 +08:00
pku-xht ef0815db7f chore(subprocess): document disconnect recheck 2026-08-27 01:33:06 +08:00
pku-xht 1250b41054 docs(subprocess): clarify Windows runner disconnect 2026-08-27 00:57:21 +08:00
pku-xht 81257defd2 fix(subprocess): preserve clean Windows runner close 2026-08-27 00:41:59 +08:00
pku-xht 07408ff0f1 fix(subprocess): preserve failed teardown state 2026-08-26 23:43:15 +08:00
pku-xht 3caa9e4f5a fix(subprocess): retain failed cleanup ownership 2026-08-26 22:16:20 +08:00
pku-xht aa4d80c0a9 Merge origin/master into codex/subprocess-native-containment 2026-08-26 20:05:15 +08:00
pku-xht 166004a6a8 fix(subprocess): preserve Windows startup errors 2026-08-26 20:01:10 +08:00
pku-xht 6a34a0dd4b fix(subprocess): isolate Linux native target group 2026-08-26 19:00:40 +08:00
pku-xht 215c8c8132 fix(subagent): wait for real startup evidence 2026-08-26 18:51:14 +08:00
pku-xht 20f04373c8 Merge commit 'bd88d2ee9f08b3c3aba8c06df527a91d8b76b51d' into codex/subprocess-native-containment
# Conflicts:
#	packages/e2b/subprocess-e2b/README.i18n.yaml
#	packages/e2b/subprocess-e2b/README.md
#	packages/e2b/subprocess-e2b/README.zh.md
#	packages/subprocess/README.i18n.yaml
#	packages/subprocess/README.md
#	packages/subprocess/README.zh.md
#	packages/subprocess/subprocess-local/README.i18n.yaml
#	packages/subprocess/subprocess-local/README.md
#	packages/subprocess/subprocess-local/README.zh.md
#	packages/subprocess/subprocess/README.i18n.yaml
#	packages/subprocess/subprocess/README.md
#	packages/subprocess/subprocess/README.zh.md
#	packages/subprocess/win32-process/README.i18n.yaml
#	packages/subprocess/win32-process/README.md
#	packages/subprocess/win32-process/README.zh.md
2026-08-26 15:25:12 +08:00
pku-xht cf6f25d283 fix(subprocess): keep native runner private 2026-08-26 14:10:08 +08:00
pku-xht 678cfdfdb4 Merge commit '0c177e17a23692d018a79bae59ac9a2db6eba59c' into codex/subprocess-native-containment
# 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
#	examples/acp-agent/tests/snapshots/cordis-inspect-jsdoc/input.json
#	examples/acp-agent/tests/snapshots/cordis-inspect-jsdoc/session.jsonl
#	packages/bundle/acp-app/package.json
#	packages/examples/jsonrpc-demo/src/packaged-bin.ts
#	packages/subagent/subagent-acp/src/run.ts
#	packages/subagent/subagent-acp/tests/subagent-acp.spec.ts
#	packages/subprocess/subprocess-local/README.i18n.yaml
#	packages/subprocess/subprocess-local/README.md
#	packages/subprocess/subprocess-local/README.zh.md
#	pnpm-lock.yaml
#	scripts/smoke-python-runtime.py
2026-08-25 23:22:25 +08:00
pku-xht ff413cfe5e fix(subprocess): align async pid evidence 2026-08-25 22:24:20 +08:00
pku-xht 26969588b7 fix(subprocess): address native containment review findings 2026-08-25 21:51:22 +08:00
pku-xht 8e9bac4a27 fix(subprocess): align native containment contract 2026-08-25 20:06:00 +08:00
pku-xht ae77bc0b2f fix(subprocess): defer native wait allocation 2026-08-22 09:18:31 +08:00
pku-xht df00bb9c44 test(subprocess): make stream EOF checks causal 2026-08-22 08:58:18 +08:00
pku-xht da042b8e10 test(subprocess): cover native settlement edges 2026-08-22 08:46:33 +08:00
pku-xht eb17028720 fix(subprocess): preserve post-start runner failures 2026-08-22 08:23:34 +08:00
pku-xht b3fcca9598 refactor(subprocess): remove synthetic abort race 2026-08-22 08:00:30 +08:00
pku-xht 63df2b31a7 docs(subprocess): document runner lifecycle helpers 2026-08-22 07:58:00 +08:00
pku-xht 71e27e4667 fix(subprocess): close native lifecycle gaps 2026-08-22 07:35:51 +08:00
pku-xht bde6a9a041 test(subprocess): keep validation assertions explicit 2026-08-22 06:51:45 +08:00
pku-xht 7228c821b7 refactor(subprocess): centralize stream settlement 2026-08-22 06:40:12 +08:00
pku-xht 923f919b49 test(subprocess): remove Windows cwd recursively 2026-08-22 06:22:13 +08:00
pku-xht 610ed618e9 fix(subprocess): release Windows target cwd 2026-08-22 06:04:54 +08:00
pku-xht 6e1b8eda77 fix(subprocess): preserve runner result boundary 2026-08-22 05:30:09 +08:00
pku-xht 0c80f9e7a1 test(subprocess): align native evidence with plan 2026-08-22 05:05:31 +08:00
pku-xht b6dc88be51 fix(subprocess): preserve forced Linux outcomes 2026-08-22 04:59:36 +08:00
pku-xht df8e3d7c37 fix(subprocess): settle pre-start Windows runner failures 2026-08-22 04:58:31 +08:00
pku-xht 3acb847442 fix(subprocess): preserve clean spawn failure settlement 2026-08-21 23:32:27 +08:00
pku-xht fa8b83816e fix(subprocess): defer native handshake allocation 2026-08-21 23:03:59 +08:00
pku-xht 4997fb7706 Merge master into native containment 2026-08-21 23:00:57 +08:00
pku-xht e2de9667d3 Merge master into native containment 2026-08-21 22:50:27 +08:00
pku-xht f72ce2299a fix(subprocess): keep native Job ownership in runner 2026-08-21 22:49:56 +08:00
pku-xht a17c5822b5 Merge master into native containment
# Conflicts:
#	packages/subprocess/win32-process/package.json
#	scripts/check-workspace-constraints.ts
2026-08-21 22:10:22 +08:00
pku-xht 153f1579e1 refactor(subprocess): restore native containment baseline 2026-08-21 22:08:49 +08:00
pku-xht ee1a933e82 Merge remote-tracking branch 'origin/codex/subprocess-native-containment' into codex/subprocess-native-containment 2026-08-21 13:06:42 +08:00
pku-xht ac69b1e0c4 fix(subprocess): decouple Windows target stdio 2026-08-21 12:56:34 +08:00
Chinesezjc 32f369c3a0 test(subprocess): widen Windows stdout-end race budget to 5s
The native Windows containment tests expect the stdout stream to end
shortly after the direct target exits, but 1s was too tight under the
Windows CI runner's cold-start and process-teardown jitter. Use a 5s
bounded race so the assertion still proves EOF eventually arrives
without flaking on slow runner startup.
2026-08-21 11:57:52 +08:00
pku-xht 60999be602 test(shell): remove stale lint suppression 2026-08-21 11:19:37 +08:00
pku-xht 5b215932f8 fix(subprocess): hand off Windows process observation 2026-08-21 11:18:43 +08:00
pku-xht b03e52fab0 refactor(subprocess): simplify Windows runner settlement 2026-08-21 10:20:24 +08:00
pku-xht ea7de60840 fix(subprocess): keep Windows Job ownership in parent 2026-08-21 09:51:21 +08:00
pku-xht e70405847c fix(subprocess): complete runner resource release 2026-08-21 08:37:50 +08:00
pku-xht f913c813d2 fix(subprocess): harden managed-range cleanup 2026-08-21 08:21:33 +08:00
pku-xht 43b093a502 fix(subprocess): close runner pipe handles 2026-08-21 08:08:10 +08:00
pku-xht 889cbd45f1 fix(subprocess): order runner stdio shutdown 2026-08-21 07:49:15 +08:00
pku-xht 975afc9e47 fix(subprocess): release Windows runner stdio 2026-08-21 07:36:08 +08:00
pku-xht 36db13dfb3 fix(subprocess): require verified range settlement 2026-08-21 07:20:43 +08:00
pku-xht 3f2f381209 docs(subprocess): align provider-owned termination semantics 2026-08-21 06:20:25 +08:00
pku-xht c7d228c737 test(subprocess): make Windows EOF proof deterministic 2026-08-21 05:58:53 +08:00
pku-xht bf5a8e42a3 fix(subprocess): keep shared handle semantics provider-neutral 2026-08-21 05:42:12 +08:00
pku-xht e6bc1f2e1d fix(subprocess): close managed launch gaps 2026-08-21 05:08:36 +08:00
pku-xht 7fec86d6a1 refactor(subprocess): derive runner execution plane 2026-08-21 03:25:17 +08:00
pku-xht 2c0ebebdf8 test(subprocess): type close interleaving fixture 2026-08-21 03:00:48 +08:00
pku-xht 63b038e469 fix(subprocess): preserve close snapshot state 2026-08-21 02:59:09 +08:00
pku-xht 81374783d3 fix(subprocess): close native runner lifecycle gaps 2026-08-21 02:57:53 +08:00
pku-xht 97e0c9607d test(subprocess): cover native probe fallback 2026-08-21 01:55:20 +08:00
pku-xht 273c2847e5 fix(subprocess): support packaged native runner 2026-08-21 01:17:12 +08:00
pku-xht 1fc04feb77 fix(subprocess): close native platform CI gaps 2026-08-20 23:59:55 +08:00
pku-xht 21820b6816 test(subprocess): cover async scope failures 2026-08-20 23:47:19 +08:00
pku-xht 60c729250e test(subprocess): preserve Windows job descendant 2026-08-20 23:34:13 +08:00
pku-xht 436f9e9686 fix(subprocess): preserve native failure semantics 2026-08-20 23:24:22 +08:00
pku-xht 6df3ef4f97 refactor(subprocess): pass runner pid to liveness probe 2026-08-20 22:46:49 +08:00
pku-xht f6a56d4882 test(subprocess): align native platform fixtures 2026-08-20 22:41:03 +08:00
pku-xht b25e790e36 test(subprocess): cover runner liveness polling 2026-08-20 22:37:52 +08:00
pku-xht 0f3db79902 docs(subprocess): record native systemd evidence 2026-08-20 22:32:06 +08:00
pku-xht b9c0028f95 fix(subprocess): launch systemd scopes without pipe mode 2026-08-20 22:28:30 +08:00
pku-xht eb60d74155 fix(subprocess): harden native range settlement 2026-08-20 22:16:24 +08:00
pku-xht 8b81d77d54 refactor(subprocess): use mode as fallback warning latch 2026-08-20 20:58:33 +08:00
pku-xht a160bd55fc Merge PR1 into native containment 2026-08-20 20:38:46 +08:00
pku-xht ad44ba547a test(subagent-acp): explain fallback warning coexistence 2026-08-20 20:35:08 +08:00
pku-xht 2ee78dd576 Merge commit '10ba2cf9aed8aaf7198bf4a12e1773e1c5dfa627' into codex/subprocess-native-containment 2026-08-20 20:14:03 +08:00
pku-xht 6532fff458 test(subagent-acp): allow provider fallback warning 2026-08-20 20:02:57 +08:00
pku-xht a7b64e24ee Merge PR1 into native containment 2026-08-20 20:01:20 +08:00
pku-xht cd1a8552f7 Merge codex/subprocess-win32-process-primitives into codex/subprocess-native-containment 2026-08-20 19:29:33 +08:00
pku-xht e9c095ab4b Merge codex/subprocess-win32-process-primitives into codex/subprocess-native-containment 2026-08-20 19:18:42 +08:00
pku-xht 1ada79af81 test(subprocess): cover settled scope waits 2026-08-20 18:58:36 +08:00
pku-xht 700812811e Merge codex/subprocess-win32-process-primitives into codex/subprocess-native-containment 2026-08-20 18:45:37 +08:00
pku-xht 7185a62d58 fix(subprocess): harden native runner lifecycle 2026-08-20 18:41:30 +08:00
pku-xht d778e83b2b fix(subprocess): route fallback warning through logger 2026-08-20 17:38:01 +08:00
pku-xht 4c164cd163 fix(subprocess): close native containment CI gaps 2026-08-20 17:29:22 +08:00
pku-xht 884cd6be70 Merge codex/subprocess-win32-process-primitives into codex/subprocess-native-containment
# Conflicts:
#	packages/subprocess/win32-process/package.json
2026-08-20 16:27:21 +08:00
pku-xht 894f6aeb8a fix(subprocess): contain escaped descendants with native owners 2026-08-20 16:26:19 +08:00
4872 changed files with 104845 additions and 39629 deletions

No files matched your search

+2 -2
View File
@@ -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/README.md
README.md: ae8e4724d610c97d74910d7dec5c95af69e93281
README.zh.md: 8cecc7068d9efc5e2ebb78d2301d03633f70f137
README.md: 8bf1adf875b54eb4580b4d189dfeed07c9f671c0
README.zh.md: ff9bdb358d584d4f4ad0aea295c31d8d8fff9376
+1 -1
View File
@@ -20,7 +20,7 @@ The active lifecycle tree is the working inventory: browse its lifecycle/class f
## Classification
Each Agent Note belongs to one path-encoded class from the closed set in `scripts/agent-note-tree.ts`; the classification gate rejects other folders. Adding a class requires updating the canonical set and this section. See the [classification Agent Note](implemented/process/2026-06-20-agent-note-classification.md).
Each Agent Note belongs to one path-encoded class from the closed set in `scripts/agent-note-tree.ts`; the classification gate rejects other folders. Adding a class requires updating the canonical set and this section.
| Class | What it covers |
|---|---|
+1 -1
View File
@@ -22,7 +22,7 @@
## 分类
每份 Agent Note 属于 `scripts/agent-note-tree.ts` 中封闭集合里的一个路径编码类别;分类门禁拒绝其他文件夹。新增类别需要同时更新规范集合与本节。见[分类 Agent Note](implemented/process/2026-06-20-agent-note-classification.zh.md)。
每份 Agent Note 属于 `scripts/agent-note-tree.ts` 中封闭集合里的一个路径编码类别;分类门禁拒绝其他文件夹。新增类别需要同时更新规范集合与本节。
| 类别 | 覆盖范围 |
|---|---|
@@ -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-06-11-runtime-arg-validation.md
2026-06-11-runtime-arg-validation.md: 22283c76719a26f733a8125bf263810d53a92c3c
2026-06-11-runtime-arg-validation.zh.md: f748b7e01b233edb8b3303898cc339dfacd16967
@@ -1,6 +1,7 @@
# Agent Note: Runtime arg validation at the model boundary
Status: implemented
Archived: 2026-09-04
English | [中文](2026-06-11-runtime-arg-validation.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 模型边界处的运行时参数校验
Status: implemented
Archived: 2026-09-04
[English](2026-06-11-runtime-arg-validation.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-06-11-structured-error-taxonomy.md
2026-06-11-structured-error-taxonomy.md: a5c1c6e6120eefd3bc96090cfa4536fb83afa796
2026-06-11-structured-error-taxonomy.zh.md: 54a937c5595aa5645e4cc0f66a6d1a2efc232588
@@ -1,6 +1,7 @@
# Agent Note: Structured error taxonomy
Status: implemented
Archived: 2026-09-04
English | [中文](2026-06-11-structured-error-taxonomy.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 结构化错误分类体系
Status: implemented
Archived: 2026-09-04
[English](2026-06-11-structured-error-taxonomy.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-06-17-filesystem-capability-seam.md
2026-06-17-filesystem-capability-seam.md: a0c898c1d127a7828037b3a59d04ff73c82e31ba
2026-06-17-filesystem-capability-seam.zh.md: 0442333a0a7cbc4fcae0f4b02db1700ce6aafc9e
@@ -1,6 +1,7 @@
# Agent Note: Filesystem capability seam — ctx.fs, local backend, and model-facing filesystem tools
Status: implemented
Archived: 2026-09-04
English | [中文](2026-06-17-filesystem-capability-seam.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 文件系统能力 seam——ctx.fs、本地后端与面向模型的文件系统工具
Status: implemented
Archived: 2026-09-04
[English](2026-06-17-filesystem-capability-seam.md) | 中文
@@ -1,6 +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-30-approval-panel-command-cap.md
2026-07-30-approval-panel-command-cap.md: 0bfdc2d00fa4a0f9fa9ee71400d6f3cc2350e617
2026-07-30-approval-panel-command-cap.zh.md: a086888b12c0164b931019f4d73102bd11bccf4b
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md
2026-06-18-agent-lifecycle-and-ownership-contracts.md: 012346d9e5b8bf4fd661423b3c398e93e513659d
2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md: 4f8aaac32dfa3d84a449f12441c23371f1a3a27d
@@ -1,6 +1,7 @@
# Agent Note: Agent lifecycle and ownership contracts
Status: implemented
Archived: 2026-09-04
English | [中文](2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Agent 生命周期与所有权约定
Status: implemented
Archived: 2026-09-04
[English](2026-06-18-agent-lifecycle-and-ownership-contracts.md) | 中文
@@ -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-18-shared-persistence-write-coordinator.md
2026-06-18-shared-persistence-write-coordinator.md: a61ceb9b2197a6dd8ed86c1c971373a2706607aa
2026-06-18-shared-persistence-write-coordinator.zh.md: 777d5f5972ac1096c2e3434f9e0ac5aec27e8c26
2026-06-18-shared-persistence-write-coordinator.md: 5c324f2c0c2b951f664bcf92725a36c4975fd3a1
2026-06-18-shared-persistence-write-coordinator.zh.md: 51ef76189cb9276214bf05bbd1dbd8e3755daa35
@@ -1,6 +1,7 @@
# Agent Note: Shared persistence write coordinator
Status: implemented
Archived: 2026-08-31
English | [中文](2026-06-18-shared-persistence-write-coordinator.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 共享持久化写入协调器
Status: implemented
Archived: 2026-08-31
[English](2026-06-18-shared-persistence-write-coordinator.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-06-20-branded-ids.md
2026-06-20-branded-ids.md: 3078ebc7035c8c5a86c7a743a0452b0ebddf6c7d
2026-06-20-branded-ids.zh.md: 3a7d7c319c9fc14724af306b8c601afa759a18e7
@@ -1,6 +1,7 @@
# Agent Note: Branded IDs everywhere they belong
Status: implemented
Archived: 2026-09-04
English | [中文](2026-06-20-branded-ids.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 在所有应有之处使用 branded ID
Status: implemented
Archived: 2026-09-04
[English](2026-06-20-branded-ids.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-06-30-bash-stdin-env-trusted-plugin-api.md
2026-06-30-bash-stdin-env-trusted-plugin-api.md: b9883c88d091e6e932da7c65b8b7fe4d107c0fa4
2026-06-30-bash-stdin-env-trusted-plugin-api.zh.md: 884b83de21243e27fa39f7840adfffebc398a9b0
@@ -1,6 +1,7 @@
# Agent Note: stdin + extra env on the bash seam
Status: implemented
Archived: 2026-09-04
English | [中文](2026-06-30-bash-stdin-env-trusted-plugin-api.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 在 bash seam 上支持 stdin 与额外 env
Status: implemented
Archived: 2026-09-04
[English](2026-06-30-bash-stdin-env-trusted-plugin-api.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-02-fs-per-session-cwd.md
2026-07-02-fs-per-session-cwd.md: 81dafda9ba71bd2746926e8baa0f4eaf76748429
2026-07-02-fs-per-session-cwd.zh.md: aa05ed41615f29d580595a66d4743d4baf02b1a9
@@ -1,6 +1,7 @@
# Agent Note: Resolve filesystem paths against the caller's session cwd
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-02-fs-per-session-cwd.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 相对文件系统路径按调用方的会话 cwd 解析
Status: implemented
Archived: 2026-09-04
[English](2026-07-02-fs-per-session-cwd.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-05-subagent-provider-lifecycle-events.md
2026-07-05-subagent-provider-lifecycle-events.md: a15c3e6faee993902547174fe9ea235d07d9ec2f
2026-07-05-subagent-provider-lifecycle-events.zh.md: 49e55a3b148775ed7e676b5f55058ef1427a86c6
@@ -1,6 +1,7 @@
# Agent Note: Subagent provider-lifecycle events — `subagent/provider-added` / `subagent/provider-removed`
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-05-subagent-provider-lifecycle-events.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Subagent 提供方生命周期事件——`subagent/provider-added` / `subagent/provider-removed`
Status: implemented
Archived: 2026-09-04
[English](2026-07-05-subagent-provider-lifecycle-events.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-06-tool-result-retention-library.md
2026-07-06-tool-result-retention-library.md: 5ac8547036ed0b45ec6e55e6fb213a98b7c3df8f
2026-07-06-tool-result-retention-library.zh.md: b18fdd60f529f9e6df6b8fc7e3c90f9a39e65fc8
@@ -1,6 +1,7 @@
# Agent Note: Tool result retention library
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-06-tool-result-retention-library.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 工具结果保留库
Status: implemented
Archived: 2026-09-04
[English](2026-07-06-tool-result-retention-library.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-12-scoped-layers-store.md
2026-07-12-scoped-layers-store.md: d3060696ef54c8d06cd0724179dec49682c721e1
2026-07-12-scoped-layers-store.zh.md: f5482a5a76724128fb445fbd7c21a2f61b8634c1
@@ -1,6 +1,7 @@
# Agent Note: Shared scoped-layer storage
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-12-scoped-layers-store.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 共享作用域分层存储
Status: implemented
Archived: 2026-09-04
[English](2026-07-12-scoped-layers-store.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-15-llm-model-catalog-and-acp-selection.md
2026-07-15-llm-model-catalog-and-acp-selection.md: c5f6644d4746a8a962e7ab843493fda3862a8c0a
2026-07-15-llm-model-catalog-and-acp-selection.zh.md: 539f2f9a2f9d3d7b48b3ecabca4b401e32c5702c
@@ -1,6 +1,7 @@
# Agent Note: Advisory LLM catalogs and per-session ACP model selection
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-15-llm-model-catalog-and-acp-selection.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 建议性 LLM 目录与 ACP 会话级模型选择
Status: implemented
Archived: 2026-09-04
[English](2026-07-15-llm-model-catalog-and-acp-selection.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-15-lsp-capability-seam.md
2026-07-15-lsp-capability-seam.md: 3cce6eb3c7d8afef53aa675440c7eea1e990721d
2026-07-15-lsp-capability-seam.zh.md: c424a794a6662a655565dde6337c49543c5a8085
@@ -1,6 +1,7 @@
# Agent Note: LSP capability seam and model-facing query tool
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-15-lsp-capability-seam.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: LSP 能力 seam 与面向模型的查询工具
Status: implemented
Archived: 2026-09-04
[English](2026-07-15-lsp-capability-seam.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-15-replay-token-meter-service.md
2026-07-15-replay-token-meter-service.md: 1e6832f1bd049a9568b3af3b925211f0665de288
2026-07-15-replay-token-meter-service.zh.md: 6d00d5e1511aa66818689ccec7d4b023c291f9aa
@@ -1,6 +1,7 @@
# Agent Note: Replay token meter service
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-15-replay-token-meter-service.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 回放式 token 计量服务
Status: implemented
Archived: 2026-09-04
[English](2026-07-15-replay-token-meter-service.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-17-local-spill-startup-cleanup.md
2026-07-17-local-spill-startup-cleanup.md: c9567cab8b1193b9ea6dbc0ad3fae2bc18af9656
2026-07-17-local-spill-startup-cleanup.zh.md: 97f6d641ab7e09da401c5632804f6e27ad78d850
@@ -1,6 +1,7 @@
# Agent Note: One-shot startup cleanup for local spill files
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-17-local-spill-startup-cleanup.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 本地 spill 文件的一次性启动清理
Status: implemented
Archived: 2026-09-04
[English](2026-07-17-local-spill-startup-cleanup.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-package-owned-invariant-service.md
2026-07-19-package-owned-invariant-service.md: 6ebdd0edbe04766280fb9aae7067ba861b2ce010
2026-07-19-package-owned-invariant-service.zh.md: dde72faed7249d64b939aaca1bc5d452eeed7bde
@@ -1,6 +1,7 @@
# Agent Note: Package-owned invariant service contract
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-19-package-owned-invariant-service.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 包拥有的不变式服务约定
Status: implemented
Archived: 2026-09-04
[English](2026-07-19-package-owned-invariant-service.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-20-todo-event-ownership.md
2026-07-20-todo-event-ownership.md: 3dfcd604393d05265eb895fa50647338830bd38f
2026-07-20-todo-event-ownership.zh.md: 8dabf8f0cde4ad8af325b00eb1be9d7b7011233f
@@ -1,6 +1,7 @@
# Agent Note: todo event types belong to their producer
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-20-todo-event-ownership.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: todo 事件类型归其生产方所有
Status: implemented
Archived: 2026-09-04
[English](2026-07-20-todo-event-ownership.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-22-unified-send-and-coalesced-user-messages.md
2026-07-22-unified-send-and-coalesced-user-messages.md: d2e39f4efd122d9e0dbb45a082779afa2ff42941
2026-07-22-unified-send-and-coalesced-user-messages.zh.md: 37c43fcb7bfa81b177e8ed00876e913e3ddf6ad6
@@ -1,6 +1,7 @@
# Agent Note: Unify agent delivery on send(target × wakeup) and coalesce injected context into user/message
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-22-unified-send-and-coalesced-user-messages.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 将 agent 投递统一到 send(target × wakeup) 并把注入的上下文合并进 user/message
Status: implemented
Archived: 2026-09-04
[English](2026-07-22-unified-send-and-coalesced-user-messages.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-23-toolview-dissolution.md
2026-07-23-toolview-dissolution.md: d84255f697886556a46c0511aa89f2c4bfd886d8
2026-07-23-toolview-dissolution.zh.md: 9ae339361193a9b97f7bba44904af0c01e7f3fa0
@@ -1,6 +1,7 @@
# Agent Note: Toolview dissolution — tool rows are per-view keyed slots
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-23-toolview-dissolution.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: toolview 溶解——工具行即 per-view keyed slot
Status: implemented
Archived: 2026-09-04
[English](2026-07-23-toolview-dissolution.md) | 中文
@@ -1,6 +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/architecture/2026-08-04-credentials-yaml-and-user-environment-layer.md
2026-08-04-credentials-yaml-and-user-environment-layer.md: 44bdea243671093b34a6338ed1c95bf25bcc78f4
2026-08-04-credentials-yaml-and-user-environment-layer.zh.md: 4d2893c57bfdf8bbd1529cc0ba8336dbc3ecd233
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md
2026-07-24-adapter-owned-reasoning-effort-capabilities.md: f5c240145dc7f405f8bc1f66b6b5f7f68991eb80
2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md: 81994d4908bd9531cc7db35634bf768372ace1d7
@@ -1,6 +1,7 @@
# Agent Note: Adapter-owned reasoning effort capabilities
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 适配器持有的推理强度能力
Status: implemented
Archived: 2026-09-04
[English](2026-07-24-adapter-owned-reasoning-effort-capabilities.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-25-web-command-surfaces-and-assembly.md
2026-07-25-web-command-surfaces-and-assembly.md: bfb7d2697a979efc8101581d42f4ab223d1b1e97
2026-07-25-web-command-surfaces-and-assembly.zh.md: d81f70403d22efb2203bbe221a45035fc3d6503f
@@ -1,6 +1,7 @@
# Agent Note: Web command business surfaces and assembly (ui-commands / ui-skill / ui-subagent)
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-25-web-command-surfaces-and-assembly.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Web 命令业务面与装配(ui-commands / ui-skill / ui-subagent)
Status: implemented
Archived: 2026-09-04
[English](2026-07-25-web-command-surfaces-and-assembly.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-25-web-input-machine-and-slash-pipeline.md
2026-07-25-web-input-machine-and-slash-pipeline.md: b6d485d495717770ebb5148880b3c8c1cb23b948
2026-07-25-web-input-machine-and-slash-pipeline.zh.md: 69ed9a40f4dd9a316f147e3077c9167e1ee46eeb
@@ -1,6 +1,7 @@
# Agent Note: Web input state machine, composer slots, and the slash pipeline (ui-conversation input / ui-input-trigger)
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-25-web-input-machine-and-slash-pipeline.zh.md)
@@ -67,8 +68,8 @@ skill/@subagent references skip the placeholder + occurrence identity chain —
- PickOutcome gains a `{text}` arm; the new scoped bail event `slash/input-insert-text` `{text, span}` (the same contract as the other three: draftRev CAS, returning true ⟺ an actual rewrite); facade.insertText goes through setDraft concatenation — zero machine changes.
- Sources get an optional `lexicon?(session)` hook: a synchronous hot-snapshot name roster, with `undefined` = data not warm — zero decoration, never triggering a fetch (the render path stays synchronous and side-effect-free); the paired optional `subscribeLexicon?(session, listener)` hook is the invalidation channel for rolls that change after warm (catalog settles, children spawn/exit). The controller aggregates the rolls into its `lexicon` snapshot store (re-polling on each source notification); sources registered after scope birth are warmed and folded in via the service's live-controller broadcast.
- `decorations.scanTextRefs`: a word-boundary scan of the draft (`/name`, `@name` at line start / after whitespace; `x/name` never hits) against the roster; a hit becomes a `TextRefNode` entity in the Lexical tree (the claim decoration has precedence on the leading-token seat — [the Lexical composer note](2026-08-20-web-composer-lexical-editor.md)); an edit breaking the match shape reverts the entity to plain text.
- Sending is the literal text (no more `<skill>` serialization); on the bubble side MessageItem decorates both shapes (the legacy `<skill>` tag + plain-text tokens).
- `decorations.scanTextRefs`: a word-boundary scan of the draft (`/name`, `@name` at line start / after whitespace; `x/name` never hits; a `/name` token also ends at whitespace or the draft end — the whitespace-bounded shape of the host skill gesture, so `/nfs-hg/xxx` is a path and `/plan。` is prose; the sent-text projection `projectUserText` in ui-primitives applies the same shape) against the roster; a hit becomes a `TextRefNode` entity in the Lexical tree (the claim decoration has precedence on the leading-token seat — [the Lexical composer note](2026-08-20-web-composer-lexical-editor.md)); an edit breaking the match shape reverts the entity to plain text.
- Sending is the literal text (no more `<skill>` serialization); on the bubble side `projectUserText` decorates a plain-text `/name` token only when the same step logged a `skill-invocation` injection for that name — ui-chat's `SkillNameProjector` attaches the step's injected names to the direct message Node, the way the recall projector attaches session labels — so `/123` or a stray `/word` stays plain; a command-input bubble (ui-goal) names its executed command the same way and renders the token as a `command` chip; `@name` tokens still decorate by shape.
- Decoration reactivity: the shell subscribes to the controller's lexicon store and re-scans the document on each roll change, so a roll that settles after the scope-birth prewarm lights existing draft tokens up without any menu interaction or unrelated re-render.
### Per-session provide contributions and the private keyboard surface
@@ -1,6 +1,7 @@
# Agent Note: Web 输入状态机、composer slot 与 slash 流水线(ui-conversation input / ui-input-trigger)
Status: implemented
Archived: 2026-09-04
[English](2026-07-25-web-input-machine-and-slash-pipeline.md) | 中文
@@ -67,8 +68,8 @@ skill/@subagent 引用不走占位符 + occurrence 身份链——纯文本引
- PickOutcome 增 `{text}` arm;新 scoped bail 事件 `slash/input-insert-text` `{text, span}`(与另三个同约定:draftRev CAS、返回 true ⟺ 实际改写);facade.insertText 走 setDraft 拼接,机器零改动。
- source 可选 `lexicon?(session)` 钩子:同步热快照名录,`undefined` = 数据未热——零装饰、永不触发 fetch(渲染路径保持同步无副作用);配对的可选 `subscribeLexicon?(session, listener)` 钩子是名录在 warm 之后仍会变化(目录 settle、子代生灭)时的失效通道。controller 把各名录聚合进自己的 `lexicon` 快照 store(每次 source 通知重拉);scope 出生后才注册的 source 由服务广播给活 controller,补 warm 并并入名录。
- `decorations.scanTextRefs`:词边界扫描 draft(行首/空白后的 `/name`、`@name`,`x/name` 永不命中)对照名录,命中即成为 Lexical 树中的 `TextRefNode` 实体(claim 装饰对行首 token 席位有优先权——见 [Lexical composer note](2026-08-20-web-composer-lexical-editor.zh.md));编辑破坏匹配形状时实体还原为普通文本。
- 发送即原文(不再 `<skill>` 序列化);气泡侧 MessageItem 双形状装饰(legacy `<skill>` 标签 + 纯文本 token)。
- `decorations.scanTextRefs`:词边界扫描 draft(行首/空白后的 `/name`、`@name`,`x/name` 永不命中;`/name` token 还必须止于空白或 draft 末尾——与宿主 skill gesture 同样以空白为界,因此 `/nfs-hg/xxx` 是路径、`/plan。` 是普通文本;ui-primitives 中已发送文本的投影 `projectUserText` 采用同一形状)对照名录,命中即成为 Lexical 树中的 `TextRefNode` 实体(claim 装饰对行首 token 席位有优先权——见 [Lexical composer note](2026-08-20-web-composer-lexical-editor.zh.md));编辑破坏匹配形状时实体还原为普通文本。
- 发送即原文(不再 `<skill>` 序列化);气泡侧 `projectUserText` 只在同一步骤记录了该名字的 `skill-invocation` 注入时才装饰纯文本 `/name` token——ui-chat 的 `SkillNameProjector` 把该步骤注入的 skill 名挂到直接消息节点上,与 recall 投影挂会话标签的方式相同——因此 `/123` 或随手敲的 `/词` 保持普通文本;指令输入气泡(ui-goal)以同样方式指明其已执行的指令,把 token 渲染为 `command` chip;`@name` token 仍按形状装饰。
- 装饰响应性:shell 订阅 controller 的 lexicon store,每次名录变化重扫全文档,scope 出生预热后才 settle 的名录会直接点亮已有 draft token,无需菜单交互或无关重渲染。
### 每会话供数贡献与键盘私面
@@ -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-26-job-registry-seam.md
2026-07-26-job-registry-seam.md: d1a8cfb7bc4f1a8e313dfa8d59a5d0e5f8106190
2026-07-26-job-registry-seam.zh.md: 1624a410407d8e6ac8cc85a6fe1480e0867eef6d
@@ -1,6 +1,7 @@
# Agent Note: The job registry is a capability seam (`dsh-jobs` / `dsh-jobs-local`)
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-26-job-registry-seam.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 任务注册表是一个能力 seam(`dsh-jobs` / `dsh-jobs-local`)
Status: implemented
Archived: 2026-09-04
[English](2026-07-26-job-registry-seam.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-26-packed-chunk-rows-by-default.md
2026-07-26-packed-chunk-rows-by-default.md: c230c1f1faf5e597321654ebd01d60fae725f518
2026-07-26-packed-chunk-rows-by-default.zh.md: e354efdf6bb68c02f30dc17c8d4ba17a495b61bd
@@ -1,6 +1,7 @@
# Agent Note: Make packed chunk rows the default JSONL layout
Status: implemented
Archived: 2026-09-01
English | [中文](2026-07-26-packed-chunk-rows-by-default.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 将打包分片行设为默认 JSONL 布局
Status: implemented
Archived: 2026-09-01
[English](2026-07-26-packed-chunk-rows-by-default.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-26-subprocess-seam.md
2026-07-26-subprocess-seam.md: bd8cba2197a56acef2ab12e9b43e254fbc744ee5
2026-07-26-subprocess-seam.zh.md: ba23649e9e68f578bdc9ba26a026981d0afe981f
@@ -1,6 +1,7 @@
# Agent Note: The subprocess service is its own seam under the bash executors (`dsh-subprocess` / `dsh-subprocess-local`)
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-26-subprocess-seam.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 进程服务是 bash 执行器之下的独立 seam(`dsh-subprocess` / `dsh-subprocess-local`)
Status: implemented
Archived: 2026-09-04
[English](2026-07-26-subprocess-seam.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-27-dispose-ladder-to-consumer.md
2026-07-27-dispose-ladder-to-consumer.md: 7e1b189c1d3a32c6f812bba5d5f06f7a6a89c29b
2026-07-27-dispose-ladder-to-consumer.zh.md: 6c61cad5d4a62c5c976894f72d0ff5e9c69184bc
@@ -1,6 +1,7 @@
# Agent Note: The dispose ladder belongs to its consumer, not the subprocess seam
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-27-dispose-ladder-to-consumer.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: dispose 阶梯归其消费方所有,而非 subprocess seam
Status: implemented
Archived: 2026-09-04
[English](2026-07-27-dispose-ladder-to-consumer.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-28-directory-picker-capability-seam.md
2026-07-28-directory-picker-capability-seam.md: e2f3312b7429078eb81cba62ab1727e71fe67b74
2026-07-28-directory-picker-capability-seam.zh.md: 41a05febe58c353242cc389e20bbf84b3620b7c9
@@ -1,6 +1,7 @@
# Agent Note: A capability-discriminated directory-picker seam for the web-GUI host
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-28-directory-picker-capability-seam.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: web GUI 宿主的能力可辨识目录选择 seam
Status: implemented
Archived: 2026-09-04
[English](2026-07-28-directory-picker-capability-seam.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-28-user-settings-seam.md
2026-07-28-user-settings-seam.md: 75fef5ed976d80acb4e26133c2b98d8504042121
2026-07-28-user-settings-seam.zh.md: 9797e5a3288a7709f3541784778c514890015410
@@ -1,6 +1,7 @@
# Agent Note: user-settings seam (`ctx.settings`) and the file provider
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-28-user-settings-seam.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 用户设置 seam(`ctx.settings`)与文件提供方
Status: implemented
Archived: 2026-09-04
[English](2026-07-28-user-settings-seam.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-29-package-regrouping.md
2026-07-29-package-regrouping.md: 7073d868fe73f75477cf9a6fa2c5f7c425d014a8
2026-07-29-package-regrouping.zh.md: b33ecf1600ce9c9796e932c14c5df9782bb3a94b
@@ -1,6 +1,7 @@
# Agent Note: Regroup packages/ by measured clustering
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-29-package-regrouping.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 按实测聚类重新划分 packages/ 分组
Status: implemented
Archived: 2026-09-04
[English](2026-07-29-package-regrouping.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-29-request-level-llm-config-credentials.md
2026-07-29-request-level-llm-config-credentials.md: dda5cd6710ad432a25bce1214078098f4e797559
2026-07-29-request-level-llm-config-credentials.zh.md: e521920586c8fe9d3a498e0369d1693096562973
@@ -1,6 +1,7 @@
# Agent Note: request-level LLM configuration and the credential seam
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-29-request-level-llm-config-credentials.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 请求级 LLM 配置与凭据 seam
Status: implemented
Archived: 2026-09-04
[English](2026-07-29-request-level-llm-config-credentials.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-30-adapter-owned-max-token-defaults.md
2026-07-30-adapter-owned-max-token-defaults.md: 30b1840a9ff80092609698e63d061a7d82503e5d
2026-07-30-adapter-owned-max-token-defaults.zh.md: 770c61ce1514fa8e16d4cbabed4dd97b5b7b40fb
@@ -1,6 +1,7 @@
# Agent Note: Adapter-owned max-token defaults
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-30-adapter-owned-max-token-defaults.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 适配器持有的最大 token 默认值
Status: implemented
Archived: 2026-09-04
[English](2026-07-30-adapter-owned-max-token-defaults.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-30-client-locale-full-rollout.md
2026-07-30-client-locale-full-rollout.md: 381a0ed642d7452cb4be2c9a755bf33c120cba76
2026-07-30-client-locale-full-rollout.zh.md: 81ae013e86c6ecb608a15c3664c5203233e27e40
@@ -1,6 +1,7 @@
# Agent Note: Full client copy rollout onto the typed locale seat
Status: implemented
Archived: 2026-09-04
English | [中文](2026-07-30-client-locale-full-rollout.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: client 文案全量接入 typed locale 席位
Status: implemented
Archived: 2026-09-04
[English](2026-07-30-client-locale-full-rollout.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-30-command-row-copy-contract.md
2026-07-30-command-row-copy-contract.md: e5f1828e433015a1381ae4f7951c518bb6040107
2026-07-30-command-row-copy-contract.zh.md: 7efe1aa65ddd992e64807e229b1da682f5bc320b
Loaded 100 of 4872 files, more files were not shown because too many files have changed in this diff. Show more