Compare commits

...
Author SHA1 Message Date
Yichen Jiang 86a402200d Merge pull request #6301 from deepseek-harness/worktree/release-dsh-0.2.1-alpha.4
release: [email protected]
2026-10-15 20:22:44 +08:00
Tianyi Cui 7f338ce3be Merge pull request #6272 from deepseek-harness/fix/codex-partial-answer-phase
fix(subagent-codex): accept the partial_answer agent message phase
2026-10-15 20:13:11 +08:00
imccyu f2235d6c02 release(dsh): 0.2.1-alpha.4 2026-10-15 20:00:58 +08:00
ZiyaZhang e480bda8d2 fix(subagent-codex): call the payload the selected answer, not the final one
Address the ds-review-bot round on #6272: the README summary, completion
notice, token effect, and Known Limitations lines no longer call the
payload the final answer; the empty-result error reads "without an
answer"; the ordering spec also interleaves commentary; the partial_answer
branch cites its upstream source.
2026-10-15 01:44:26 -07:00
Yudong Han e44061c934 Merge pull request #6264 from deepseek-harness/fix/tool-exit-badge
fix(ui-tool): show command exits in neutral inline capsules
2026-10-15 16:41:15 +08:00
yudshj 39d3849452 refactor(ui-tool): separate Host exit parsing fix 2026-10-15 16:23:48 +08:00
Yichen Jiang 0a11184ac3 Merge pull request #6261 from deepseek-harness/worktree/model-reasoning-level-config-2a9bbb
feat(models): edit reasoning levels of custom model API models
2026-10-15 16:21:44 +08:00
yudshj 174c08563f test(snapshot): refresh nullable terminal exit descriptor 2026-10-15 16:08:44 +08:00
yudshj e8488f6b41 fix(shell): preserve missing exit codes in terminal presentation 2026-10-15 15:57:11 +08:00
Yichen Jiang a31a992113 Merge pull request #6267 from deepseek-harness/worktree/sad-jemison-fa352d
test(goal): disarm the seeded goal in the Loader e2e
2026-10-15 15:53:26 +08:00
Yichen Jiang 7d654c9d8a fix(models): drop the reasoning switched-off hint 2026-10-15 15:53:08 +08:00
yudshj 95e76236bf refactor(ui-tool): isolate exit badge and cover long descriptions 2026-10-15 15:46:03 +08:00
Yichen Jiang b542292bf9 fix(models): read reasoning levels from the pi-ai schema
The reasoning-level editor hardcoded pi-ai's seven levels, so a level a
pi-ai upgrade adds would be missing from the page and a stored key outside
the list would be dropped by the next edit. The levels now come from the
llm-pi-ai namespace schema, the key union of reasoningEfforts, read the
way protocolChoices reads the protocols, and travel explicitly from the
Models section and the provider editor through the model list to each row.
A stored key the schema does not list keeps its row and stays selectable.
The reasoning control now appears wherever that list is non-empty instead
of being inferred from a missing catalog provider.
2026-10-15 15:31:54 +08:00
yudshj 97a833471f fix(ui-tool): reserve inline space for exit capsules 2026-10-15 15:02:29 +08:00
Yichen Jiang 63e99ee2bf test(goal): disarm the seeded goal in the Loader e2e
The goal domain e2e runs over the shipped headless profile, whose base
bundle mounts goal-round-driver. GoalService.create() arms the goal the
fixture seeds, so the driver queued round 1 when the task turn went idle
and the test's headless driver disposed the context mid-round. The
assertions held only while the aborted round's turn/end missed the log
before disposal; an extra await in the agent loop's pre-step path (#6024)
let it land and the test failed deterministically.

Disarm the goal right after creating it. Activation is process-local, so
the persisted goal/change snapshot is unchanged and the driver starts no
round. Also assert a single turn/start, which records a started round
even when disposal aborts it before its turn/end is persisted.
2026-10-15 14:56:55 +08:00
Yichen Jiang a0a04158f8 fix(models): keep reasoning edits with their model and mirror pi-ai refusals
The reasoning-level editor kept the levels it switched off, its row order,
and typed text in component state, while the model list keys rows by
position, so deleting a row handed that state to the next model: turning
the survivor's switch on wrote the deleted model's levels into it. The
editor now renders only from the model; rows follow the stored order,
switching on always starts from the defaults, and only the focused field
keeps its typed text until the field is left.

The reasoning check moves out of the shared model validator into the two
cards whose rows edit it, so DeepSeek and catalog routes are untouched,
and it now mirrors every pi-ai refusal: a valueless field, a missing value
on a level besides off, and an empty value. A refused value marks its
field, and leaving that field repairs it with the level name.

The Providers guide now points custom model API users to the page before
the YAML, and both package READMEs describe the new behavior.
2026-10-15 14:53:56 +08:00
winewill fa13ef7a66 Merge pull request #6227 from deepseek-harness/fix/windows-installer-file-locks
fix(desktop): retry Windows installer directory locks and report failures
2026-10-15 14:37:39 +08:00
winewill 58c8cef7dc Merge pull request #6262 from deepseek-harness/build/desktop-test-branches
feat(desktop): 支持 test 分支打包并中文化 Actions 表单
2026-10-15 14:22:24 +08:00
yudshj 00f897b048 fix(ui-tool): show command exits in neutral inline capsules 2026-10-15 14:20:22 +08:00
ZiyaZhang 08d57291ad fix(subagent-codex): accept the partial_answer agent message phase
Codex app-server 0.162 adds `partial_answer` to the agentMessage phases
(stable answer text that later assistant output or tool calls may follow).
The wire treated every phase other than final_answer, commentary, and null
as fatal, so one such message failed the whole delegation. Record the
latest partial answer and select final, then partial, then unphased text;
unknown phases still fail the run. The pinned @openai/codex 0.153.4 payload
never emits the phase, so behavior with the shipped binary is unchanged.
2026-10-14 23:10:35 -07:00
winewill 29221675a2 fix(desktop): clarify source rejection and isolate Git fixtures 2026-10-15 14:03:50 +08:00
Yichen Jiang 02d25c695e docs(models): clarify the reasoning Off copy and level reset rule
The help tooltip now says that Off needs no value but keeps and sends a
value already written in the configuration, matching the disabled field
that shows it. Both READMEs add the rule that a custom value carries over
only between two thinking levels, so changing a row to or from Off resets
it. The Models settings e2e header comment is rewrapped.
2026-10-15 13:54:27 +08:00
Yichen Jiang 034f2cf8bd Merge pull request #5935 from deepseek-harness/worktree/command-delete-as-whole-21017f
feat(web): claim slash commands as atomic composer chips
2026-10-15 13:42:27 +08:00
winewill 61059baf61 feat(desktop): allow repository branches for test packaging 2026-10-15 13:39:28 +08:00
Yichen Jiang 6f8b55f3eb fix(web): restore a claimed command chip after reload
The persisted draft now records the leading command chip's claim token
(DraftSnapshot.command). Restoring the draft asks the trigger pipeline's
new resolveClaim, which polls the optional InputTriggerSource.matchClaim
hook: the command source awaits its catalog and answers only a
leadingInput claim, never opening a popup, running an action, or
executing the command. The input rebuilds the chip once the claim
resolves, only at the revision the restore produced and merged into the
seed's history entry; otherwise the literal token stays and Enter still
adjudicates it.
2026-10-15 13:18:01 +08:00
Yichen Jiang f61d9982f8 feat(models): edit reasoning levels of custom model API models
A model row on a hand-declared pi-ai route now edits its reasoningEfforts
from the Models settings page instead of only through cordis.patch.yml.
A switch turns the field on or off; when on, each row pairs a level
select with the API value sent for it, which defaults to the level name.
Off only turns reasoning off, so its value field is disabled and a value
already stored for it is kept. Saving refuses a list without a level
besides off, and a help tooltip beside the label explains the values.
Catalog routes and the DeepSeek card are unchanged.

Refs #6260
2026-10-15 12:56:11 +08:00
Yudong Han 755c52fd77 Merge pull request #6096 from deepseek-harness/fix/office-operation-guidance
fix(office): 回复不嵌入已删除预览,PDF 导出不查找阅读器
2026-10-15 12:23:26 +08:00
imccyu 5026df8fd1 Merge pull request #6250 from deepseek-harness/worktree-optbundles
feat(webworker): offer optional bundles in the preview and fetch lazy chunks on demand
2026-10-15 12:17:34 +08:00
yudshj dc9119c00b Merge remote-tracking branch 'origin/master' into pr6096-merge
# Conflicts:
#	packages/skill/skill-office/package.json
2026-10-15 12:04:01 +08:00
imccyu 6e43ad6bb1 Merge pull request #6164 from deepseek-harness/fix/subprocess-linux-probe-once
fix(subprocess-local): probe Linux native containment once and support systemd before v254
2026-10-15 11:32:27 +08:00
imccyu 18a22f73b2 Merge pull request #6228 from deepseek-harness/worktree-versionmismatch
feat(client-modules): prompt to reload when the host release changes
2026-10-15 11:31:54 +08:00
imccyu 93d2ad2d25 feat(webworker): boot the preview from the shipped profile and fetch lazy chunks on demand
The packer images the web template bundles, every optional bundle, and an installation manifest instead of a dumped composition, and the Worker boots that profile through app-boot like dsh web. Package-local lazy client chunks move into content-addressed archives that the VFS fetches on first asynchronous read; client-modules reads chunks asynchronously.

The Worker replaces node-addon-require-builtin with Node v24.18.0 internal-module interfaces and reports Node 24, so plugin metadata, the Cordis Loader, and HMR reach one cascaded loader backed by the Worker loader. Resolution failures carry Node error codes, the empty load cache lets HMR apply profile changes, and every optional bundle switches on and off live. Platform stubs throw ERR_FEATURE_UNAVAILABLE_ON_PLATFORM.
2026-10-15 11:30:45 +08:00
Turtle 15c245f2d8 Merge pull request #5633 from deepseek-harness/turtle/plugin-market-generator
feat(plugin-market-generator): add a reference index generator
2026-10-15 05:57:24 +08:00
turtle1999 14abe9543c feat(plugin-market-generator): record the source repository and parse options with commander
Copy each plugin's manifest repository as its web page and package
directory, converting shorthands and Git URLs with hosted-git-info. Parse
options and generate help with commander.
2026-10-15 05:37:54 +08:00
turtle1999 434dc116f0 feat(plugin-market-generator): add a reference index generator
Generate a validated format-1 plugin market index from a list of npm package
names and https Git repository URLs, without running package code.

- List every non-deprecated npm bundle version, and Git versions at release
  tags and the default branch, each with its engines.dsh range.
- Read display fields, keywords, homepage, and icons the way DSH reads
  installed plugins; inline small icons up to the format's 32 KiB limit.
- Cache results per immutable input and rewrite output only when it changes.
2026-10-15 05:37:54 +08:00
turtle1999 ed92c867ed feat(plugin-market): name the plugin and version in a Discover install
A Discover install passes the entry's localized title and version with its
spec. Every install dialog screen names the plugin and version, and shows the
spec, such as a pinned git+https URL, below in smaller monospace text.
2026-10-15 05:37:44 +08:00
turtle1999 b227127d62 fix(plugin-market): keep the Installed tab panel and list the markets bundle under More
The Installed tab panel now wraps its loading, unavailable, and empty states.
Custom plugin markets joins the bundles the More page holds back until the
profile enables them, and the repository field and its directory rule are
documented.
2026-10-15 05:37:44 +08:00
turtle1999 ab3bb74550 feat(plugin-market): carry a plugin's source repository
Indexes may give each plugin an optional repository: the web URL of its
source repository and the package directory inside it. The Discover entry
page links it as Source code, and the plugin_market tool returns it.
2026-10-15 05:37:44 +08:00
turtle1999 3de3a977e0 feat(plugin-market): add the Custom plugin markets bundle and Discover tab
Read configured plugin market indexes on the Host, search them with fuzzy
multilingual matching, and install a chosen version from the Plugins page.

- dsh-plugin-market-index validates format-1 indexes and builds install
  arguments; inline icons are capped at 32 KiB.
- The pluginMarket service fetches configured http(s) URLs, parses bodies in
  a Worker Thread, caches documents, and pages filtered, ordered results with
  installation status and engines.dsh compatibility.
- Discover is an opt-in experimental bundle; the Plugins page gains a
  plugins.tab slot and confirmed installs.
- The plugin_market tool lists indexes, plugins, and versions for Creator mode.
- Plugin compatibility reads engines.dsh before DSH peer dependencies.
2026-10-15 05:37:44 +08:00
imccyu bf1a2bf69c fix(inspector): serve the Client bootstrap while the Inspector Worker starts
A Client plugin loaded after the page starts fetches its bootstrap once. The Host now registers that route before starting the Worker and answers once the Worker is ready, so enabling Developer Tools on a running page opens the bottom DevTools without a reload. A failed start answers 503.

When the platform cannot run the Worker (ERR_FEATURE_UNAVAILABLE_ON_PLATFORM), the Host warns once and stays active with only the 503 bootstrap route; serve-static and open load after the Worker starts. Every other startup failure still fails the fiber.
2026-10-15 03:56:26 +08:00
imccyu 22c51728ed fix(dependencies): check experimental packages under the published dependency policy
verify-package-dependencies now covers every packages/*/* manifest, experimental included, and reads each package's tsdown build entries so Worker and child-process entries count as Host runtime sources. Experimental Client packages no longer declare browser and type relationships as peers.
2026-10-15 03:56:26 +08:00
imccyu b77cc1c0f2 feat(gates): reject module-scope await in package sources
Package modules that other code imports must not suspend evaluation at module scope. A syntax-aware gate scans packages/*/*/src and excludes only executables (a shebang or a package bin target). The SenseVoice worker, the SSH helper entry, and the Inspector worker entry now run an explicit main().
2026-10-15 03:56:25 +08:00
imccyu ba090a4b59 fix(ui-settings-general): focus Not now when the release prompt opens 2026-10-15 02:26:28 +08:00
imccyu a7a40f93d9 fix(client-modules): compare host releases before parsing the graph 2026-10-15 01:35:28 +08:00
imccyu f52abc04fa feat(client-modules): apply no plugin update from another host release 2026-10-15 00:51:20 +08:00
imccyu da5e23e8e8 refactor(subprocess-local): decide Linux containment in a testable selector
The provider's Linux decisions now live in LinuxScopeSelector, a state machine
over injected observations: the deep probe, the user-manager listener, the
manager confirmation, and the systemd-run binary identity. Each decision
carries its reason and probe trigger, the runtime logs it at debug level, and
table-driven scenarios cover every transition.

- A positive verdict probes again when the systemd-run found through PATH
  changes device, inode, size, or modification time, so an in-place upgrade
  past v254 cannot reuse options that no longer keep argv literal.
- The listener is read before the probe, so a manager that starts during a
  failed probe counts as a new listener.
- The kernel socket table is decoded as UTF-8, matching runtime directories
  outside ASCII.
- LinuxScopeNotStartedError drops its unused code field.
2026-10-15 00:51:05 +08:00
imccyu 71de43d8ee fix(subprocess-local): probe Linux again after a scope never starts or a new manager listens
A cached positive verdict let a hung user manager that still listens fail every
later command, and a cached negative verdict ignored a manager that started
later until the provider restarted.

- A scope launch whose bootstrap never consumed its launch request now fails
  with LinuxScopeNotStartedError, and the runtime clears the verdict it
  launched under, so the next eligible spawn probes again and records the
  fallback when that probe fails. A generation counter keeps launches from a
  superseded probe from forcing another probe.
- After a negative verdict, the runtime records the /proc/net/unix listener on
  $XDG_RUNTIME_DIR/systemd/private and probes again only when a different
  listener, meaning a new manager instance, appears.
2026-10-15 00:14:50 +08:00
07akioni 7ba5e3a01f Merge pull request #6197 from deepseek-harness/07akioni/desktop-environment-telemetry
feat(telemetry): attach cached desktop environment to product events
2026-10-14 21:29:33 +08:00
Yichen Jiang 571902028a Merge pull request #6241 from deepseek-harness/worktree/sync-dsh-0.2.1-alpha.3-to-master
release(dsh): sync 0.2.1-alpha.3 back to master
2026-10-14 21:15:15 +08:00
Yichen Jiang 5d7d13289c test(web): decouple plugin snapshots from release versions 2026-10-14 20:59:15 +08:00
Yichen Jiang 853b1d3609 Merge master into DSH 0.2.1-alpha.3 synchronization branch 2026-10-14 20:34:43 +08:00
winewill c7ab529c34 fix(desktop): preserve recovery paths in installer dialogs 2026-10-14 20:11:41 +08:00
winewill 06e5024577 fix(desktop): bound expanded directory failure details 2026-10-14 19:58:21 +08:00
imccyu 514e8893b5 test(subprocess-local): harden the socket-table checks and state their scope
The real-socket test rejects on a listen error instead of hanging, the table
fixture comment names the accepted-connection row it models, and the remaining
linux-scope module mocks provide confirmLinuxManager. The README notes that
the socket-table read matches only listeners in the same network namespace and
costs time proportional to the table size.
2026-10-14 19:53:13 +08:00
Yichen Jiang 2fbf4359b8 Merge pull request #6234 from deepseek-harness/worktree/release-dsh-0.2.1-alpha.3
release(dsh): 0.2.1-alpha.3
2026-10-14 19:48:55 +08:00
imccyu ac5a3e336c test(ui-settings-general): read the release prompt inject face without an unknown cast 2026-10-14 19:39:47 +08:00
winewill dcc8df8320 fix(desktop): preserve reported recovery state and label retry attempts 2026-10-14 19:38:42 +08:00
Yichen Jiang 36acfb1e88 release(dsh): 0.2.1-alpha.3 2026-10-14 19:38:37 +08:00
imccyu c97f840c89 fix(subprocess-local): confirm the user manager from its listening socket
systemd closes the private listening socket on shutdown without unlinking its
path, so the socket file outlives a manager stopped in place. The fast path now
reads /proc/net/unix, where the kernel lists a bound socket only while a
process holds it open, and accepts the manager only when a process listens on
$XDG_RUNTIME_DIR/systemd/private; otherwise the systemctl query decides. The
scope startup error names an unreachable manager as the cause, and the spawn
test again asserts that Windows launches never reach the fallback.
2026-10-14 19:34:14 +08:00
Yichen Jiang 02128b3a31 Merge pull request #6218 from deepseek-harness/worktree/release-vendor-0.2.1-alpha.3
release(vendor): prepare alpha.2 packages for DSH 0.2.1-alpha.3
2026-10-14 19:28:00 +08:00
Yichen Jiang 7c8cbea696 release(vendor): cordis 4.0.5-alpha.2, cosmokit 1.8.6-alpha.2, group 1.0.5-alpha.2, hmr 1.0.20-alpha.2, include 1.0.10-alpha.2, loader 1.0.6-alpha.2, logger-console 1.0.5-alpha.2, schemastery 3.18.5-alpha.2, timer 1.1.7-alpha.2 2026-10-14 19:22:48 +08:00
imccyu 055c7d7a74 fix(subprocess-local): confirm the user manager before each cached Linux scope launch
Without a per-spawn check, a user manager that stops after a positive probe,
such as after a logout without lingering, made every later scope launch fail.
Each eligible spawn now confirms the manager: its socket file at
$XDG_RUNTIME_DIR/systemd/private disappears when the manager stops, so its
presence answers with one stat; otherwise the restored systemctl --user show
query decides and the spawn falls back while it fails. A crashed or hung
manager that leaves its socket file still fails the scope launch with the
existing restart hint.
2026-10-14 19:14:29 +08:00
winewill fae05edca7 test(desktop): share retry trace reads with the installer 2026-10-14 19:13:46 +08:00
imccyu 7c9e54b3ef feat(client-modules): prompt to reload when the host release changes 2026-10-14 19:11:22 +08:00
imccyu f12bf31c4a docs(notes): record the host release change refresh prompt 2026-10-14 19:10:48 +08:00
winewill 14819e2eb4 fix(desktop): retry Windows installer directory locks and report failures 2026-10-14 19:08:02 +08:00
winewill fe3966734c Merge pull request #6212 from deepseek-harness/build/desktop-approval-summary
feat(desktop): show complete publication approval summary
2026-10-14 18:57:31 +08:00
imccyu c218e79102 docs(subprocess-local): name the systemd 236 floor for --collect
The probe always passes --collect, which systemd-run rejects before v236, so those hosts use the fallback regardless of the --expand-environment=no retry.
2026-10-14 18:05:02 +08:00
Dudu-0223 4e4ac0eae8 Merge pull request #6208 from deepseek-harness/topic/agent-team-prompt
feat(agent-team): simplify team availability prompt
2026-10-14 17:55:36 +08:00
imccyu d73ad23353 fix(subprocess-local): name the recovery when a cached Linux scope fails to start
With the probe cached for the provider lifetime, a user manager that stops
after a positive probe makes every later scope launch fail. The startup error
now says to restart the provider to probe native containment again. The README
no longer lists older user-systemd among fallback hosts and notes the second
probe attempt for a systemd-run that rejects --expand-environment=no.
2026-10-14 17:50:29 +08:00
Ziya 075ebbb9f3 Merge pull request #6179 from deepseek-harness/ziya/builtin-plugin-preview-20261014
feat(plugins): 规范内置配图并补充双语语音示例
2026-10-14 02:46:15 -07:00
imccyu 39874e62ba docs(subprocess-local): state the provider-lifetime Linux probe and its cost
The README says the provider also keeps a failed or timed-out first probe and
names the user manager as reachable rather than live, since it is checked once.
The probe cache documents why no later spawn repeats the probe, and the spawn
test now starts two Windows commands to match its per-spawn Job recheck title.
2026-10-14 17:32:15 +08:00
ZiyaZhang d6e3df155e chore(plugins): preserve original preview work on the adopted frontend implementation 2026-10-14 02:25:24 -07:00
imccyu 0fffa2432a fix(subprocess-local): support systemd before v254 for native scopes
systemd-run before v254 rejects --expand-environment=no, so the scope probe
always failed and those hosts used the weaker fallback. Its scope mode never
expands argv, so the probe retries without the option only when systemd-run
reports it as unrecognized, and scope launches reuse the probed options.

systemctl before v252 rejects --kill-whom. Use --kill-who, the older
spelling, which newer systemctl accepts as an unambiguous prefix.
2026-10-14 17:24:14 +08:00
imccyu 404e64b435 fix(subprocess-local): probe Linux native containment once per provider
Every Linux spawn() and spawnTerminal() ran a synchronous spawnSync probe
before launching the command: the full systemd-run scope probe until it first
succeeded (a failed verdict was never cached), then a systemctl manager recheck.
spawnSync blocks the host event loop until the probe exits, so hosts without a
usable user manager paid the full probe on every grep, glob, and shell command.

Keep the first verdict, positive or negative, for the provider lifetime and
drop the per-spawn manager recheck.
2026-10-14 17:24:14 +08:00
ZiyaZhang c1269a8f75 feat(plugins): standardize built-in previews and illustrate voice input 2026-10-14 02:19:42 -07:00
winewill 1bd032be88 fix(desktop): align approval links with normalized upload destinations 2026-10-14 17:10:19 +08:00
Turtle 4b3cb7629e Merge pull request #6206 from deepseek-harness/feat/builtin-plugin-preview-hardcoded
feat(plugin-manager): show a built-in feature preview for the badge skill
2026-10-14 17:07:10 +08:00
winewill 24d73cae8d feat(desktop): show complete publication approval summary 2026-10-14 16:57:28 +08:00
ZiyaZhang ade9979185 fix(plugins): restrict feature previews to bilingual built-in SVGs 2026-10-14 01:57:03 -07:00
imccyu a941635df3 Merge pull request #5945 from deepseek-harness/worktree/client-control/operator-connect
feat(connection): scope the connect handshake to one operator
2026-10-14 16:56:53 +08:00
turtle1999andZiyaZhang a2141868de fix(plugin-manager): reset a failed preview by source instead of a key
Co-authored-by: ZiyaZhang <[email protected]>
2026-10-14 16:55:21 +08:00
turtle1999andZiyaZhang aac50c7923 docs(notes): record the built-in plugin feature preview decision
Co-authored-by: ZiyaZhang <[email protected]>
2026-10-14 16:41:59 +08:00
Dudu-0223 a04b8ef7e2 feat(agent-team): simplify team availability prompt 2026-10-14 16:36:16 +08:00
turtle1999andZiyaZhang 7fcaf07051 feat(plugin-manager): show a built-in feature preview for the badge skill
Plugin Manager hardcodes feature previews by package name, like its
experimental bundle lists, instead of reading a package manifest field.
The DSH badge skill bundle shows an English or Chinese illustration
below its description. Client bundles embed imported SVG, PNG, and
WebP files as data URLs through the shared tsdown preset, which
replaces the account package's own asset loader.

Co-authored-by: ZiyaZhang <[email protected]>
2026-10-14 16:22:56 +08:00
07akioni 04c9489065 fix(telemetry): handle native metadata edge cases and scalar failures 2026-10-14 16:10:40 +08:00
Yichen Jiang fedaed7139 Merge pull request #6190 from deepseek-harness/worktree/conversation-hero-options
feat(web): add the New Session options slot
2026-10-14 15:57:04 +08:00
lsdsjy 328584875a Merge pull request #6184 from deepseek-harness/fix/shared-account-avatar
fix(account): 共享头像加载结果并在打开设置时重试
2026-10-14 15:47:50 +08:00
ZiyaZhang 34252e34d0 docs(plugins): define built-in feature preview guidelines 2026-10-14 00:27:53 -07:00
07akioni 4dee41f4bc feat(telemetry): attach cached desktop environment to product events 2026-10-14 15:23:58 +08:00
Tianyi Cui d0286d55d5 Merge pull request #5934 from deepseek-harness/docs/cordis-cleanup-audit
docs(cordis): audit cleanup dependency lifetimes as P0
2026-10-14 15:14:19 +08:00
CreatixChu f9c634d092 Merge pull request #4456 from deepseek-harness/feat/experimental-dsh-cua
feat(cua): 支持 macOS 原生 Computer Use
2026-10-14 14:57:42 +08:00
ZiyaZhang 37dbd15e0c feat(plugins): localize optional feature previews 2026-10-13 23:55:11 -07:00
lsdsjy 3df5eca5df Merge master into fix/shared-account-avatar 2026-10-14 14:47:18 +08:00
Yichen Jiang 3f1d5dfcfa feat(ui-conversation): add the New Session options slot
conversation.hero.options seats compact Session options at the right end of
the New Session row, after the workspace and agent-preset controls. It is a
session-scoped list slot rendered only while a Session exists, so plugins can
add choices such as a worktree toggle without displacing the shipped controls.
2026-10-14 14:45:32 +08:00
creatixchu 5da34fb5ae test(cua): cover capability projection on every platform 2026-10-14 14:45:14 +08:00
imccyu c233ca3df5 fix(typert): recognize Cordis Context across built copies 2026-10-14 14:44:01 +08:00
imccyu 1d0ff1d2e4 test(snapshot): let inspect fixture receive events 2026-10-14 14:44:01 +08:00
imccyu b679a3aa32 docs(typert): include Peer interaction participation in type excerpt 2026-10-14 14:44:01 +08:00
imccyu fd1b8bd095 test(gateway): supply interaction mode for stream Peer fixture 2026-10-14 14:44:01 +08:00
imccyu 10672c4c24 Integrate Peer interaction scope with Remote access 2026-10-14 14:44:01 +08:00
imccyu d3de1613b6 Bundle shared Clients separately for browser and Node 2026-10-14 14:44:00 +08:00
imccyu 88ee3d2961 test(connection): cover operator lifecycle failures and update fixtures 2026-10-14 14:44:00 +08:00
imccyu 0f7ac58213 feat(connection): isolate API operators without changing browser identity 2026-10-14 14:44:00 +08:00
imccyu 30d48c4d49 test(client): share dynamic import bundle fixture 2026-10-14 14:44:00 +08:00
imccyu e137ebaaa1 Build shared Client bundles independently for Node and browser 2026-10-14 14:43:59 +08:00
lsdsjy 2a7ba15ee1 fix(account): 同步头像渲染失败并完善恢复验证 2026-10-14 14:37:22 +08:00
lsdsjy b2ea1d1b71 Merge pull request #6169 from deepseek-harness/fix/account-failure-stderr
fix(account): 账号接口仅失败时输出 stderr 日志
2026-10-14 14:24:37 +08:00
creatixchu aeada33774 test(cua): verify window listing invalidates stale image coordinates 2026-10-14 14:18:51 +08:00
lsdsjy d0b0bfcd79 fix(account): 保持取消静默并合并失败诊断 2026-10-14 14:11:13 +08:00
ZiyaZhang fb752c7763 style(plugins): refine badge feature illustration 2026-10-13 23:07:32 -07:00
lsdsjy 521c7c000f fix(account): 共享头像加载结果并在打开设置时重试 2026-10-14 14:06:32 +08:00
creatixchu 43391ef048 fix(cua): use the supported Zod issue type 2026-10-14 14:06:10 +08:00
creatixchu bde699d225 test(cua): refresh prompts after syncing master 2026-10-14 13:57:05 +08:00
creatixchu 220cd03bea Merge master into macOS CUA 2026-10-14 13:51:30 +08:00
creatixchu 12b3fa5304 test(cua): verify readable errors within PTC exception output 2026-10-14 13:35:45 +08:00
creatixchu 8ed497a02d test(cua): pin readable validation errors and coordinate guidance 2026-10-14 13:33:35 +08:00
creatixchu b01b889632 fix(cua): report readable argument errors and clarify coordinate targets 2026-10-14 13:32:36 +08:00
lsdsjy cb18185c9d Merge pull request #5532 from deepseek-harness/fix/bonus-notice-onboarding
fix(account): 延后赠金通知并隔离身份补齐通知
2026-10-14 13:27:37 +08:00
ZiyaZhang e527c04663 feat(plugins): support optional feature previews in bundle details 2026-10-13 22:22:43 -07:00
winewill 7ebaa991e9 Merge pull request #6172 from deepseek-harness/build/desktop-manual-publish
feat(desktop): publish retained packages independently of packaging
2026-10-14 13:21:44 +08:00
lsdsjy 5102f4f715 fix(account): 保留浏览器赠金通知并补齐身份订阅说明 2026-10-14 13:17:17 +08:00
Turtle 88d90d5883 Merge pull request #6122 from deepseek-harness/turtle/ask-question-exclusive-1fa495b41a5b
fix(ui-user-questions): show one selection when a single-select custom field is focused
2026-10-14 12:44:05 +08:00
Turtle bae0b78718 Merge pull request #5860 from deepseek-harness/turtle/stop-reason-visible-6a05d9dbbed1
fix(ui-chat): show a stopped notice for turns interrupted by a DSH stop
2026-10-14 12:41:24 +08:00
Turtle 6e765e5fed Merge pull request #6167 from deepseek-harness/turtle/workspace-cancel-adds-8a3aebe529b2
fix(directory-picker-native): ignore macOS panel selection on cancel
2026-10-14 12:36:54 +08:00
Turtle 56c5cf84a1 Merge pull request #6170 from deepseek-harness/turtle/rescue-profile-overwrite-2aaffdd2f31b
Make --from-default-profile replace an existing custom profile
2026-10-14 12:35:08 +08:00
Magolor 7110b615eb fix(llm): 生成提供方元数据并显示凭据检测状态 (#6106)
* fix(llm): generate provider metadata and clarify credential hints

* fix(settings): shorten credential hints and mark detected sources in green

* fix(llm): verify staged provider metadata and document regeneration

* fix(provider-metadata): reconcile authentication hints and key controls

* test(user-text): calibrate ratio headroom across unmatched workloads

* test(gates): include provider metadata in hygiene expectations

* fix(models): hide authentication hints for entered keys
2026-10-14 12:29:31 +08:00
winewill ce64289dbd fix(desktop): validate publication dispatch and package job identity 2026-10-14 12:22:27 +08:00
Turtle 6bf5668e79 Harden profile replacement against case aliases and Windows rename errors
Reject case variants of shipped profile names, detect a concurrent winner by
the target's state instead of errno, warn instead of failing when staging
cleanup fails after a successful replacement, and cover the restore paths with
deterministic tests. Update the profile Agent Note, reference recovery path,
and upgrade-guide migration steps.
2026-10-14 12:12:52 +08:00
winewill 60084a5b59 feat(desktop): publish retained packages through manual dispatch 2026-10-14 12:10:00 +08:00
Turtle 8843c37e37 Make --from-default-profile replace an existing custom profile
Repeated rescue runs such as `dsh rescue --from-default-profile web` failed
because the target profile already existed. The option now assembles a fresh
template copy in a staging directory, moves it over the target, and deletes the
previous profile; a failed move restores it.
2026-10-14 11:56:17 +08:00
TurtleandMagolor d3b465da91 Credit review by @Magolor
Co-authored-by: Magolor <[email protected]>
2026-10-14 11:54:57 +08:00
lsdsjy c9d56d5073 fix(account): 仅在账号接口失败时输出 stderr 日志 2026-10-14 11:52:55 +08:00
Turtle 570c52d202 fix(directory-picker-native): ignore macOS panel selection on cancel
NSOpenPanel keeps its current directory in URLs after Cancel, so a cancelled pick added a workspace. Read the selection only on an OK response.
2026-10-14 11:28:50 +08:00
lsdsjy 6514255930 Merge origin/master into fix/bonus-notice-onboarding 2026-10-14 11:20:42 +08:00
creatixchu 7bfefd3118 test(cua): record unread paste failure and observed recovery 2026-10-14 11:13:03 +08:00
creatixchu e587c71600 test(cua): exercise paste recovery before closing fixture transport 2026-10-14 11:11:36 +08:00
creatixchu 688137b0a2 refactor(cua): derive screenshot metadata from protocol schema 2026-10-14 11:09:42 +08:00
creatixchu 537a1f5047 docs(cua): explain unread paste recovery and foreground evidence 2026-10-14 11:09:20 +08:00
creatixchu 0f83b644c8 fix(cua): bound clipboard consumption waits with actionable failure 2026-10-14 11:08:00 +08:00
Yichen Jiang 2182e3ad09 Merge remote-tracking branch 'origin/master' into worktree/command-delete-as-whole-21017f
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-10-14 10:58:07 +08:00
imccyu a2486e8243 Merge pull request #6160 from deepseek-harness/worktree-listperf
perf(session): speed up @ session candidates and session listing
2026-10-14 10:52:25 +08:00
imccyu d1f4261356 Merge pull request #6158 from deepseek-harness/worktree-foldmidscroll
fix(ui-chat): fold next-message work details on one frame clock
2026-10-14 10:52:10 +08:00
ZiyaandZiyaZhang ecebe2a2b3 fix(plugin): clarify DSH badge skill descriptions in English and Chinese (#6156)
* fix(plugin): clarify DSH badge skill descriptions

* fix(plugin): remove redundant badge attribution explanation

---------

Co-authored-by: ZiyaZhang <[email protected]>
2026-10-13 19:51:03 -07:00
imccyu a6e9071b82 fix(ui-chat): continue batch members from their current size
A revealing row that ran on its own CSS transition and was then taken
over by a batch entered the landing twice: the measured starting layout
held the height it had already reached, and the growth amount added its
full height again while the batch restarted it from zero. The extra
height raised the tail target above the real floor and stayed as bottom
room. Rows revealed while a batch ran kept their own transitions and were
taken over this way by the next batch.

- A row that starts revealing while a batch runs waits at zero size like
  a held closing row; the next flush drives it in a batch or starts its
  own transition when nothing closes.
- A batch continues every member from its current size: closing rows
  shrink from the height they have now, and revealing rows grow from the
  height they reached, so only the remaining growth enters the landing.
2026-10-14 03:38:35 +08:00
imccyu 57fa64db18 fix(ui-chat): fold rows that close mid-batch in the next batch
A row that started closing while a fold batch ran kept its own CSS
transition and outlived the batch. During that window following moved to
the floor while reclaimBelow held still, so the bottom room was followed
in full instead of being consumed by the content that arrived, and it
stayed under the reader afterwards.

- A row that closes while a batch runs keeps its size without a
  transition until the batch settles; the next batch starts at once and
  drives it. Without a driver at that flush the held row finishes at once.
- A batch takes over a closing row at its current size and finishes a
  row that has no size left.
- The tail landing reads the committed layout when it finishes: it lands
  at the larger of the target and the real floor and keeps only the room
  that target needs.
2026-10-14 03:13:00 +08:00
imccyu 7f7940f0e2 fix(ui-chat): address second review on single fold motion
- A tail request counts only for closing rows that can start a batch,
  using the same membership rule as the batch, and detaching clears it.
- A batch keeps the reader landing while reading movement awaits
  sampling, so an unsampled scroll away from the tail is not undone.
- Reader scrolling during a reader landing moves the reference row's
  recorded position, so the final correction keeps only layout changes.
- The blank-area matrix releases a partly opened world, fails a case on
  cleanup errors, mounts only the provider catalog for the Turn that fails
  before its model call, names its gap as a layout gap, and labels the
  steering case as a no-fold control.
- The note records the pending-sampling rule and the opacity of a row
  that joins the travelling set after fading.
2026-10-14 01:53:16 +08:00
imccyu 33c37200f8 perf(token-meter): keep only system prompts in the context breakdown state
contextBreakdown kept one entry per retained surface node, so its
checkpoint grew with the message count (7.13 MB across 836 local Sessions,
up to 103 KB for one) and every cached Session listing validated it. The
state now holds the surviving system prompts, one surface total, and at
most one shadow-price claim. Appends add their price; a replacement
subtracts the adjacent compaction/summary or compaction/prune price and
drops the system prompts its shadowedSeqs name; a system-prompt rewrite
subtracts the retained prompt price. Other unmetered replacements fold at
zero delta, as in contextPressure. State version 6 discards positional
rows. Folding all 836 local logs with both versions gives identical
figures after every event; retained state drops to 110 KB.
2026-10-14 01:32:16 +08:00
imccyu 768473d755 perf(session-reference): resolve label services once per candidate listing
Every `@` candidate query labeled each listed Session through three
service lookups, and each lookup and method read through a Cordis service
proxy allocates wrappers, so the labeling step grew with the Session count.
The resolver now resolves sessions, projections, and the projection cache
once per call, indexes attached Sessions in one map, and binds
cachedSnapshot once for cold Sessions.
2026-10-14 01:32:15 +08:00
imccyu 6aa157a05a perf(session-persistence-jsonl): bound listing reads with a shared concurrency limit
list(), the root encoding check, and historical corpus fingerprints read
project directories, Session directories, headers, and stats one at a time.
On a network filesystem every listing paid the summed round trips. These
reads now run through one p-limit limiter per backend (listConcurrency,
default 3), shared by concurrent listings; results and the first reported
failure keep the sequential order.
2026-10-14 01:32:14 +08:00
imccyu 06829b67b6 test(web): bound the fold matrix's live-Turn waits
The queued and steer cases held the model call at a global call index and
waited without bounds, so any shifted or missing call stalled the case
until the 240 s test timeout. The hold now targets the first call in the
case's Session that streams the case's marker text, every wait has an
explicit timeout whose error lists the observed calls and the Session's
latest events, scroll settling is bounded, and the cases use the web
lane's default timeout.
2026-10-14 00:51:05 +08:00
imccyu 25a69605ad fix(ui-chat): address review on single fold motion
- A tail request counts only while a fold batch runs or is scheduled,
  so rows still closing on CSS transitions cannot strand own input.
- A reader-content-still landing adds the reader's own scrolling between
  frames to the position it keeps still.
- A newer tail request that takes over a running batch recomputes which
  closing rows travel with the content.
- Symmetric cancel and resume guards; Set-based travelling bookkeeping.
- The blank-area matrix holds the subagent continuation route for child
  sends, writes per-frame evidence only on failure, and labels the parent
  message case as a no-fold control.
- The group-tree note now links the single fold motion for input without
  an echo on this page.
2026-10-14 00:32:00 +08:00
imccyu a4426261ab fix(ui-chat): fold next-message work details on one frame clock
Folding on the next message reserved the whole closing height as bottom
room and kept scrollTop whenever the input had no transcript echo on this
page: a message from another tab, a queued message delivered after the
previous Turn, or a send from a subagent child in the right Sidebar. A
reader below the fold was left on an empty viewport.

Every batch of closing rows now runs on the viewport's frame-clock driver.
It lands at the tail for this client's own input or a following reader and
otherwise keeps the reader's content still, installing only the room the
landing lacks. Subagent child sends register a local echo and pass its
request id to subagents.prompt, so the child's recorded message retires it.
2026-10-14 00:31:59 +08:00
imccyu 0af3e0dbc3 Merge pull request #6090 from deepseek-harness/worktree-remoteaccess
feat(remote-access): carry caller principals on peers and gate remote methods
2026-10-14 00:27:05 +08:00
imccyu b632f50330 docs: regenerate cordis catalogs 2026-10-14 00:02:56 +08:00
imccyu 529706d163 fix(remote-access): drop buffered events on revoke, filter search, declare workspace file resources 2026-10-13 23:55:05 +08:00
imccyu 7e335ee608 style(remote-access): wrap the request args JSDoc 2026-10-13 23:13:36 +08:00
imccyu 0c4a7e3e8c fix(api-gateway): resolve access resources from typert-validated arguments 2026-10-13 23:03:16 +08:00
imccyu a18488955d docs: sync subsystem docs and regenerate catalogs 2026-10-13 23:03:15 +08:00
imccyu b967475c66 feat(client-ui): add remote access hooks 2026-10-13 23:01:38 +08:00
imccyu 2640d3df82 feat(api): resolve endpoint resources and filter lists by access 2026-10-13 23:01:38 +08:00
imccyu d7bd68ee7a feat(remote-access): add rbac policies and gate non-owner calls and events 2026-10-13 23:01:37 +08:00
imccyu 9c6374909b feat(typert): declare remote method and event resources 2026-10-13 23:01:37 +08:00
imccyu d6e408d957 feat(session-controller): record non-owner principals on user message sources 2026-10-13 23:01:37 +08:00
imccyu f6316536ea feat(client-connection): carry caller principals on explicit peers 2026-10-13 23:01:37 +08:00
imccyu f6e4b5026c docs(notes): record peer principals and rbac remote access 2026-10-13 23:01:37 +08:00
imccyu 3203ee3393 Merge pull request #5607 from deepseek-harness/feat/hmr-stale-package-reload
feat(hmr): replace plugins whose package files changed during profile recomposition
2026-10-13 22:36:27 +08:00
turtle1999 879ad372ac feat(hmr): replace plugins whose package files changed during profile recomposition
With HMR, installing, enabling, disabling and removing bundles take effect live. Each profile recomposition compares
the loaded modules below the profile directory and its linked targets with disk, stops the plugins whose files
changed, and recomposes the profile through app-boot's recomposeProfile(): the rows the next generation drops are
removed first, the latest runtime resolution is published once, and the generation is applied and judged. Afterwards
HMR evicts the modules below the mappings the recomposition dropped.

- app-boot: recomposeProfile(); PluginPackages.resolution; ResolutionRestartRequired; the resolver accepts in-place
  version changes and relinks, and relocates Node's cached link real paths.
- plugin-manager: with HMR, installBundle refuses an installed package (already-installed), so an upgrade is a
  removal and an installation; every restart-required result carries a restartReason; removal uses the registry the
  package was installed from.
- ui-plugin-manager: the Official Update removes and then installs; restart prompts name their reason.
2026-10-13 22:15:57 +08:00
creatixchu 0cca141695 test(cua): pin foreground paste guidance 2026-10-13 21:41:50 +08:00
creatixchu ef12e53d58 docs(cua): require foreground paste for ChatGPT and Codex 2026-10-13 21:40:17 +08:00
creatixchu ec85b94309 test(cua): update screenshot object guidance snapshots 2026-10-13 21:33:05 +08:00
creatixchu e5b0b492d8 fix(cua): preserve screenshot format and dimensions in object API 2026-10-13 21:30:47 +08:00
ZiyaandZiyaZhang 9f5bc9669b fix(schedule): 简化自动化任务标题,去除时间与执行备注 (#6105)
* fix(schedule): keep timing and execution notes out of task titles

* fix(schedule): avoid repeating task title guidance

* fix(schedule): keep title guidance examples in English

---------

Co-authored-by: ZiyaZhang <[email protected]>
2026-10-13 05:38:34 -07:00
creatixchu ac0a449378 test(cua): expect screenshot pixels in shared loader output 2026-10-13 19:51:34 +08:00
creatixchu 6e554ab609 docs(cua): describe encoded screenshot results consistently 2026-10-13 19:49:21 +08:00
creatixchu 6e9db1ba17 test(cua): wait for overlay hit testing and retain successful hover replay 2026-10-13 19:24:15 +08:00
creatixchu 57bd5e5438 test(cua): cover pointer-transparent overlays and record input decisions 2026-10-13 19:18:42 +08:00
Turtle 2b302a1814 Merge pull request #6058 from deepseek-harness/turtle/plugin-enable-redundant-override
fix(plugin-manager): drop profile switches the bundles already imply
2026-10-13 19:16:41 +08:00
creatixchu ff1864c6cf fix(cua): retain other window mappings during scoped observations 2026-10-13 19:07:22 +08:00
creatixchu 06e671f143 fix(cua): complete coordinate serialization and projection references 2026-10-13 19:02:50 +08:00
creatixchu 5658751da0 feat(cua): map screenshot pixels and optional relative coordinates 2026-10-13 18:59:05 +08:00
creatixchu fd3868adc6 feat(cua): reveal alternate hover UI before moving the system pointer 2026-10-13 18:21:50 +08:00
creatixchu 379ad9d485 fix(cua): use mouse hit testing for system hover 2026-10-13 18:17:11 +08:00
Yichen Jiang 6e82f79e95 Merge pull request #6125 from deepseek-harness/ui/pin-more-plugins-to-main-list
fix(web): 在「更多」页开启的实验性插件固定到插件主页列表
2026-10-13 17:59:36 +08:00
Wenlu Wang 18be29bfbe Merge pull request #6055 from deepseek-harness/fix/user-text-benchmark-sampling
test(benchmarks): stabilize user-text timing samples
2026-10-13 17:42:27 +08:00
winewill f094f04c96 Merge pull request #6116 from deepseek-harness/build/desktop-cos-publish
feat(desktop): 支持原机器产物复用与审批式 COS 发布
2026-10-13 17:42:10 +08:00
Yudong Han a29f5ee1e3 Merge pull request #6108 from deepseek-harness/fix/empty-response-text
fix(llm): 保留跨协议完整历史并过滤 DeepSeek 请求空文本
2026-10-13 17:11:43 +08:00
turtle1999 e776e2b3d2 refactor(plugin-manager): pass the profile to writePluginEnabled 2026-10-13 17:09:18 +08:00
winewill e637eecaa9 test(desktop): cover channel and source packaging inputs 2026-10-13 16:58:18 +08:00
lsdsjy fc17ae9145 Merge pull request #5381 from deepseek-harness/feat/web-account-login
feat(web): 在 Web UI 开放 DeepSeek 账号登录
2026-10-13 16:33:49 +08:00
Turtle 8013c1cd07 Merge pull request #6121 from deepseek-harness/turtle/credentials-unknown-key-4538f7b4e481
fix(credentials-local): ignore unknown top-level keys with a warning
2026-10-13 16:29:09 +08:00
Yichen Jiang f98cfe3cf3 Merge pull request #6126 from deepseek-harness/fix/macos-directory-picker-edit-menu
fix(directory-picker-native): install the macOS panel's Edit menu
2026-10-13 16:23:30 +08:00
TurtleandLegGasai b4f3f60ced Credit review by @LegGasai
Co-authored-by: LegGasai <[email protected]>
2026-10-13 16:17:11 +08:00
winewill fdbe2bce47 feat(desktop): separate update channels and confirm releases before approval 2026-10-13 16:14:41 +08:00
dsh-portal[bot] f31da59d83 fix(directory-picker-native): install the macOS panel's Edit menu
The macOS chooser ran AppleScript's `choose folder`, whose panel belongs to an
osascript helper that has no application menu. A native panel resolves
⌘C/⌘V/⌘A/⌘X as main-menu key equivalents rather than as behavior of the
focused field editor, so Go to Folder, Search, and Tags could not be pasted
into even though the panel's own ⌘⇧G worked.

Run one JXA script that installs the standard Edit menu and then opens
NSOpenPanel with the previous configuration; untargeted items let AppKit
enable them against the responder chain that owns the panel's field editor.
The prompt stays argv data, and a cancel now prints an empty line, so the
stderr "User canceled" sniffing and its helper are gone.

The README pair re-records its consistency record for the two edited sections.
2026-10-13 16:11:06 +08:00
lsdsjy 32f81a511b test(web): use account menu in workspace hover tests 2026-10-13 16:06:53 +08:00
Turtle acaed1b782 docs: regenerate config catalog 2026-10-13 15:49:34 +08:00
yudshj 5ba6b2da82 test(llm): 空文本历史真实 API 用例固定使用官方根地址
与同文件其他真实 API 用例一致,boot() 不再接受 baseURL 参数,
该用例不再读取 DEEPSEEK_BASE_URL。
2026-10-13 15:49:00 +08:00
lsdsjy 2009b90d7e Merge remote-tracking branch 'origin/master' into feat/web-account-login
# Conflicts:
#	apps/web/tests/sidebar-terminal.e2e.ts
2026-10-13 15:48:48 +08:00
Yichen Jiang a611c4e891 Merge pull request #6117 from deepseek-harness/ui/header-actions-band-order
fix(web): 页头操作区顺序改为 预设 → 子智能体 → 后台任务
2026-10-13 15:39:01 +08:00
Turtle 004aa05085 fix(credentials-local): keep foreign big integers exact and cover reload warnings
Re-serializing a document with a foreign integer beyond 2^53 no longer rounds it;
the reload warning is tested; the GITLAB_TOKEN test no longer depends on the host
environment; README and JSDoc describe the tolerated top-level keys.
2026-10-13 15:37:16 +08:00
Turtle 7e36650116 docs(ui-user-questions): state the custom-row focus rule literally 2026-10-13 15:36:04 +08:00
dsh-portal[bot] 60328899e5 fix(web): pin a plugin enabled on the More page to the main plugins list
Switching on an experimental bundle from the More page left it only on
that page, so a plugin the profile had enabled was missing from the main
Experimental plugins group. Both lists now read one order over the
offered bundles: the main list holds the always-held ones plus the
held-back ones the profile enabled, and a pinned bundle keeps its
More-list position. A bundle's details opened outside the lists return to
the list that shows it.
2026-10-13 15:34:36 +08:00
Turtle 8e413612c8 fix(credentials-local): ignore unknown top-level keys with a warning
An unknown top-level key such as GITLAB_TOKEN no longer fails boot; it stays
on disk, resolves nothing, and is reported by name in a warning.
2026-10-13 15:20:44 +08:00
Turtle 279302b762 fix(ui-user-questions): keep a focused single-select custom row unselected while an option is chosen 2026-10-13 15:20:37 +08:00
Ruilin Geng 854e3871d0 Merge pull request #4643 from deepseek-harness/subagent-agent-presets
feat(subagent): select and restore presets for spawned agents
2026-10-13 15:17:29 +08:00
dsh-portal[bot] a6207eae63 fix(ui-subagent): order the header band preset, subagent catalog, background tasks
The root-session descendant-count dropdown registered at order -30, which put
it ahead of the preset label at the start of the header actions band. Order 10
places the catalog between the preset label (-10) and background tasks (20),
after Team navigation (-20), and off the list slot's default 0 that unordered
registrations share.

The web e2e assertion and header golden that pin these contributors' relative
order move with it.
2026-10-13 14:44:37 +08:00
winewill 6e629a5ef0 fix(desktop): preserve publish diagnostics and interrupted recovery 2026-10-13 14:20:45 +08:00
Dudu-0223 37be39704c docs: refresh subagent config catalog source location 2026-10-13 14:15:14 +08:00
Dudu-0223 b9958b901b Merge master into subagent-agent-presets and resolve integration conflicts 2026-10-13 14:10:56 +08:00
winewill 04d46c1912 fix(desktop): use native shells for cross-platform publication 2026-10-13 14:01:39 +08:00
winewill d156ee31a0 feat(desktop): publish retained packages through approved COS workflow 2026-10-13 13:59:01 +08:00
Dudu-0223 ea5ae3a7ef Merge pull request #6098 from deepseek-harness/fsy/team-runtime-context
fix(agent-team): inject identity through required runtime context
2026-10-13 13:56:54 +08:00
LogosVeritas 9f68f9be4a Merge pull request #6032 from deepseek-harness/feature/minimal-compact-image
Enable image reading and automatic context compaction in Minimal GUI and SDK profiles, with /compact in the GUI and per-tool filesystem configuration. Include image-budget recovery, cancellation handling, documentation, and updated runtime snapshots.
2026-10-13 13:56:25 +08:00
yudshj f12fa3bad1 fix(office): keep render replies and PDF checks within available files
- office-render: report inspection results in text and never link or embed
  removed previews. Desktop and Web replies otherwise embed deleted preview
  images, because their file-reference guidance encourages inline images.
- office-export-pdf: validate with the command result, nonempty output, and
  %PDF- signature; do not search for PDF readers unless the user requests
  deeper checks. The bundled runtime has none, so the old conditional made
  the model probe system Python and command-line tools.
- Assert that the PDF export e2e does not probe PDF reader tools.
- Replace stale "structural checks" wording in the Desktop Office plugin
  JSDoc and the skill package description.
2026-10-13 13:55:17 +08:00
yudshj 30aa47281d fix(llm): 保留原始协议历史并验证跨协议无损往返 2026-10-13 12:58:08 +08:00
Dudu-0223 85259d7cfd docs(agent-team): clean up identity review feedback 2026-10-13 12:51:29 +08:00
yudshj c368939151 fix(llm): 修复响应转换产生空文本及旧会话重放失败 2026-10-13 12:26:21 +08:00
creatixchu 1571086a3b test(cua): retain the PTC transcript and clean up its helper 2026-10-13 12:13:12 +08:00
creatixchu 18ed46b1aa test(cua): seed the PTC replay and isolated helper 2026-10-13 12:10:57 +08:00
LogosVeritas 2de77d0339 test(snapshot): stabilize minimal compaction estimates 2026-10-13 12:10:16 +08:00
creatixchu ba1c62f8e7 test(cua): record direct native results through Node PTC 2026-10-13 12:10:12 +08:00
creatixchu 4377e0a998 fix(cua): retain serializable screenshot reference fields 2026-10-13 12:02:14 +08:00
creatixchu 89d018e296 fix(cua): use the public attachment admission export 2026-10-13 12:00:34 +08:00
creatixchu 4203741099 refactor(cua): use native Harness tool results and attachment admission 2026-10-13 11:59:14 +08:00
fz 565bf3c3d7 Merge pull request #6079 from deepseek-harness/feat/page-font-size-shortcuts
feat(web): add desktop font size shortcuts
2026-10-13 11:49:09 +08:00
creatixchu 46fcc3fd55 docs(cua): include the native Chinese reference in the package 2026-10-13 11:33:41 +08:00
creatixchu ac9eebafdf test(cua): raise and observe the selected native hover window 2026-10-13 11:31:09 +08:00
creatixchu 5ae8ba49db docs(cua): remove the superseded native text reference 2026-10-13 11:29:54 +08:00
kingwl 49c92c889d test(benchmarks): await sample cleanup and clarify timing reports 2026-10-13 11:29:00 +08:00
creatixchu b332bcfb7d docs(cua): publish native helper reference as Markdown 2026-10-13 11:28:54 +08:00
creatixchu 8a7f941112 fix(cua): make hover use persistent system-pointer movement 2026-10-13 11:25:19 +08:00
LogosVeritas b560423995 fix(minimal): configure tools and complete image offload recovery 2026-10-13 11:25:18 +08:00
Dudu-0223 44d41c9473 test(agent-team): refresh direct inbox identity snapshots 2026-10-13 11:20:53 +08:00
LogosVeritas 4703022ad6 Merge remote-tracking branch 'origin/master' into feature/minimal-compact-image 2026-10-13 11:19:17 +08:00
creatixchu 8304d5dee0 test(cua): activate the explicit system-hover fixture before observation 2026-10-13 11:19:07 +08:00
creatixchu 366c6409c8 fix(cua): use ordinary mouse events for system-pointer hover 2026-10-13 11:18:12 +08:00
kingwl 5d074a3f89 test(benchmarks): stabilize user-text timing samples 2026-10-13 11:17:51 +08:00
creatixchu 2a798a91e0 test(cua): cover fresh-window hover with explicit system input 2026-10-13 11:15:45 +08:00
creatixchu 4ff8889e06 fix(cua): retain the mouse-movement event number for hover 2026-10-13 11:14:03 +08:00
Dudu-0223 219be197c9 fix(agent-team): inject member identity through required runtime context 2026-10-13 11:12:49 +08:00
creatixchu 4fbf4889f9 fix(cua): correct native test completion message 2026-10-13 11:12:21 +08:00
creatixchu 02bbff61b6 test(cua): keep hover regressions independent of keyboard focus 2026-10-13 11:11:58 +08:00
fz 59b63f4ced Merge origin/master to include Azure native auth fix 2026-10-13 11:11:02 +08:00
creatixchu 9781ac0fda test(cua): isolate AppKit hover verification from keyboard scenarios 2026-10-13 11:08:46 +08:00
creatixchu 17c253ce7e feat(cua): support explicit system-pointer hover for AppKit tracking 2026-10-13 11:06:15 +08:00
Yichen Jiang 7a27ac50aa Merge pull request #6095 from deepseek-harness/worktree/hotfix-azure-native-auth
fix(llm-pi-ai): align Azure provider IDs with pi-ai 1.1.0
2026-10-13 11:03:04 +08:00
creatixchu b899807dc3 test(cua): verify native tracking areas and hover replay 2026-10-13 11:02:52 +08:00
creatixchu 2c4339bb60 test(cua): cover hover target rejection and continuous interaction 2026-10-13 11:01:39 +08:00
Turtle ead3556a04 Merge pull request #6054 from deepseek-harness/fix/subagent-no-sleep-wait
fix(prompt,goal): end the turn while waiting on subagents and read line ranges with read
2026-10-13 11:00:00 +08:00
LogosVeritas 591ed98f08 test(minimal): align CLI and Python runtime expectations 2026-10-13 10:58:09 +08:00
creatixchu 4a74e17e7b feat(cua): preserve hover across observations and popup interaction 2026-10-13 10:57:19 +08:00
Dudu-0223 c6f60e68f0 Merge pull request #6008 from deepseek-harness/fix/subagent-depth-awareness
fix(subagent): announce exhausted delegation depth
2026-10-13 10:55:07 +08:00
Yichen Jiang 23a542fcfa fix(llm-pi-ai): align preview and settings with the Azure provider ID 2026-10-13 10:51:10 +08:00
Yichen Jiang 27800fcd40 fix(llm-pi-ai): use the Azure provider ID for native auth 2026-10-13 10:36:52 +08:00
LogosVeritas 00a007d833 Merge branch 'master' into feature/minimal-compact-image 2026-10-13 10:32:01 +08:00
fz 5d84c56d84 refactor(web): share font shortcut bindings and order actions 2026-10-13 10:23:43 +08:00
fz 3ea4f4baa3 Merge remote-tracking branch 'origin/master' into feat/page-font-size-shortcuts
# Conflicts:
#	apps/web/tests/expected/plugin-manager/header-responsive.expected.md
#	apps/web/tests/plugin-manager.e2e.ts
2026-10-13 10:13:38 +08:00
Magolor 5249d9a4ce fix: prefer saved credentials and use environment keys in headless (#5483)
* ui: show locked API key environment reference

* fix(ui-settings-models): skip unused pi-ai credential reference

* fix(ui-settings-models): show active provider auth source

* test(llm): cover provider auth check failures

* docs(ui-settings-models): clarify active provider authentication

* test(web): update model key copy snapshots

* fix(ui-settings-models): clarify native authentication source hint

* fix: address PR 5483 review feedback

* docs(llm): state empty auth lookup behavior

* fix: refresh auth hints with credential snapshots

* fix: require credential refresh revision

* test: cover auth status projection

* fix: refresh catalog and browser expectations after rebase

* fix: keep auth status projection internal and explicit

* fix: preserve credential source checks with signed-in account rows

* test: pin Models authentication instead of inheriting host keys

* fix: prioritize stored credentials across providers

* fix: use one environment fallback hint

* docs: refresh credential contract

* docs: refresh config catalog

* test: align provider hint verification

* fix: use provider-native auth hints and endpoints

* fix: cover oauth-capable provider auth hints

* fix: show canonical endpoint defaults

* fix: avoid misleading endpoint fallback

* fix: label catalog endpoint defaults

* fix: shorten auth hints with hover details

* fix: clarify native auth resolution

* test: align DeepSeek endpoint hint

* fix: pair help button corner shape

* fix: address credential precedence review

Record the stored-credential precedence in a superseding Agent Note and
an upgrade guide, and align the credentials subsystem page, package
READMEs, and JSDoc with the order file > launch env > $cwd/.env >
$DSH_HOME/.env.

Report each pi-ai route's catalog endpoint and native-auth environment
names through the provider directory, check the names against the
installed pi-ai resolvers, and remove the llm/checkAuth and credential
describe operations that no Models page code calls.

Restore the route-derived key reference and the home expansion that
reads the home directory only for a leading ~.

* fix: clarify model authentication guidance

* fix: explain native provider OAuth requirements

* fix: keep authentication guidance method neutral

* fix: show credential reference source in model editor

* fix: use environment authentication in headless profile

* fix: validate headless authentication and current provider metadata

* test: retain authentication guidance coverage with account catalog updates

* test: retain writable Models credentials with the pinned environment
2026-10-13 10:10:06 +08:00
imccyu 5cf7ac9c44 Merge pull request #5897 from deepseek-harness/worktree/client-control/unified-remote-info
feat(typert): unify Remote definitions with lazy method info
2026-10-13 02:35:24 +08:00
imccyu b67cf4d381 test(web): verify plugin header wrapping by intrinsic fit 2026-10-13 01:44:18 +08:00
imccyu 29249a4a83 fix(typert): distribute indexed constraints across unions 2026-10-13 01:43:19 +08:00
imccyu 7ee6da0039 docs(typert): refresh strict input bilingual pairing 2026-10-13 00:58:01 +08:00
imccyu 2e56caee96 fix(typert): enforce strict named dictionary index constraints 2026-10-13 00:53:01 +08:00
imccyu 557e4137bf fix(typert): leave Node client bundling to operator layer 2026-10-13 00:53:01 +08:00
imccyu c36c077c5d docs: correct Gateway Config source reference after rebase 2026-10-13 00:53:00 +08:00
imccyu b769d1ce7a docs(typert): correct Remote metadata references 2026-10-13 00:53:00 +08:00
imccyu bd91a4a570 fix(typert): inject zod into remote metadata factories 2026-10-13 00:53:00 +08:00
imccyu e6278de7cc docs(typert): label the note's illustrative fences as text
The eight snippets in this note are before/after sketches: two import the
Remote source modules this change deletes, and the rest are fragments without
their surrounding context. They were never type-checked, yet each one counted
against the repository-wide opt-out ratio, which now sits above the 50% ceiling
that `doc-typecheck:contracts-ready` enforces.

Label them as text so the ceiling reflects blocks that could be checked.
2026-10-13 00:53:00 +08:00
imccyu d4d904bc4f fix(typert): resolve the file-upload types subpath in host analysis
The Typert host program analyzes packages/api/session-controller/src/commands.ts
on a clean checkout, where only tsconfig paths resolve
@deepseek-ai/dsh-client-file-upload/types; without the mapping the dependency
policy gate fails with TS2307.
2026-10-13 00:52:59 +08:00
imccyu 902df58ded refactor: scope this branch to generated Remote artifacts
The caller-connection work — forwarded-event opt-in, physical socket
ownership, and the Node/MCP artifact-only consumer fixture — moves to a
stacked PR on top of this one. This branch now changes only how Remote
definitions are generated (Typert artifacts, lazy method info,
consumer-selected input strictness, tool-schema projection) and how the
existing Registry consumes them.
2026-10-13 00:52:59 +08:00
imccyu ae8d417dcf refactor(typert): name the tool-schema projection for its owning standard 2026-10-13 00:52:59 +08:00
imccyu d5bf4b348a refactor(remote): drop unrelated churn from the metadata change 2026-10-13 00:52:58 +08:00
imccyu 570520862d refactor(typert): let consumers select input schema strictness 2026-10-13 00:52:58 +08:00
imccyu efdaa86fb8 feat(typert): unify Remote definitions with lazy method info 2026-10-13 00:52:58 +08:00
turtle1999 5a107fdef5 fix(plugin-manager): keep anchors and comment placement when pruning switches 2026-10-13 00:50:54 +08:00
fz cd5d5bc7bd test(web): await sidebar collapse before measuring plugin header 2026-10-13 00:50:08 +08:00
imccyu 27fd3c8b80 Merge pull request #6062 from deepseek-harness/feat/sidebar-session-watermark
feat(ui-workspace): fold sidebar sessions with a monotonic watermark
2026-10-13 00:45:17 +08:00
fz 0f0b30b3aa Merge remote-tracking branch 'origin/master' into feat/page-font-size-shortcuts 2026-10-13 00:44:27 +08:00
fz 0c6968b649 feat(web): adjust desktop font sizes together 2026-10-13 00:21:55 +08:00
imccyu d6e26edbec Merge pull request #6075 from deepseek-harness/worktree-messageindep
refactor(ui-chat): place Chat rows by group-tree position
2026-10-13 00:06:01 +08:00
Yifffan 6eaa595fdb Merge pull request #6073 from deepseek-harness/feat/adaptive-ui-and-skills
feat(skills): 新增自适应客户端规范(Skill),并适配插件页与自动化任务页页头
2026-10-12 23:52:49 +08:00
fz 8096e18504 feat(web): add desktop conversation font size shortcuts 2026-10-12 23:34:02 +08:00
imccyu fecf123858 docs(conversation): explain how a Chat Node chooses its group-tree position
Add a placement table to the Definition section: which `groupTree`
position a Chat Node declares for an opening human input, another Turn
input, a Turn notice outside folding, an independent folded row, and
ordinary process content, with links to the contract and the built-in
positions, and a pointer to `exclusive` claims.
2026-10-12 23:21:32 +08:00
imccyu 0b28bc80a7 fix(ui-chat): narrow input payloads before reading echo identities
`observedInputs` now reads every `input`-position Node, and a Node's
payload is not guaranteed to be an object. Check the payload and its
`source` before reading the composer `rpcId`, so an input Node without a
message payload no longer throws while pending echoes are matched.
2026-10-12 23:21:32 +08:00
imccyu 9a78e752b1 test(ui-chat): pin the input position order and a later-anchored Turn control
The position-order case includes `input`. A Turn without opening input
whose control anchors after a position-less row still renders the control
before the group that holds that row.
2026-10-12 23:21:32 +08:00
imccyu 8f5139b2c8 docs: complete the exclusive-claim contract and group-tree pointers
State in the `exclusive` JSDoc and the Conversation reference that the
claimed target's fallback does not run and that a fallback's own claim
has no effect. Reword the `input` position as the Turn's opening input
and separate the finalized-answer exemption from position-less
`assistant-step` rows. Point both package READMEs at the claim and the
group-tree positions.
2026-10-12 23:21:32 +08:00
imccyu c373b2958d test: cover exclusive matches and group-tree positions
Assembler cases cover a claim in either registration order and on live
append, other targets and target-less Definitions, the skipped fallback,
and both dispatch failures. Chat grouping cases split the step run by
position regardless of kind and regroup on a position change; the late
reply produces one Chat Node through a real assembler.
2026-10-12 23:21:32 +08:00
imccyu 2c16fb10e5 docs: record exclusive matches and migrated group-tree positions
Add the exclusive Conversation matches Agent Note; bring the group-tree
note up to the `input` position and the migrated kind lists, and the
timed-question note up to claim-based reply deduplication. Pair the
Chinese Conversation reference and Chat grouping README with the
English updates.
2026-10-12 23:21:31 +08:00
imccyu 5dbc298ed1 refactor(ui-chat): place Chat rows by group-tree position
Chat grouping, whole-Turn folding, and Turn-input detection read each
Node's declared `groupTree` position instead of the `INDEPENDENT` and
`TURN_PROCESS_INDEPENDENT_KINDS` kind lists and the user/steering/
turn-trigger checks. `ChatGroupTree` gains an `input` position between
`exchange` and `turn`; the built-in Definitions declare the positions
their kinds had, so built-in rows keep their placement.

The late question reply claims its message on the Chat target, so the
generic message Definition no longer projects a duplicate trigger and
grouping drops the message-id aggregation. Its placement is unchanged.
2026-10-12 23:21:31 +08:00
imccyu 533299e6ab feat(ui-conversation): let a Definition claim an event on its target
A match result may set `exclusive: true`. The assembler evaluates every
match of an event before accepting any, so a claim is independent of
registration order: other Definitions of the claimed target build no
Context for the event and the target's fallback does not run, while
Definitions of other targets and target-less Definitions still receive
it. Two claims on one target, or a claim without a target, throw.
2026-10-12 23:21:23 +08:00
Yif 9e62c1c229 fix(web): restore the plugin header subtitle row to its flex layout
The responsive change had moved `.pageIntro` off flex, which put the information
icon 1.06px off the subtitle's vertical centre and failed the existing geometry
assertion in `plugin-manager.e2e.ts`. Restore the flex row and the button's
`flex: none`, which keeps the 4px gap and the centring. The header still wraps
its action group onto another line, which is what this change is for.

Pin the wrap threshold in both header scenarios. Each records whether the action
group sits beside or below the heading, the plugin scenario asserts the wide and
narrow sides explicitly, and the plugin scenario launches its own scaffold so an
install task left by an earlier test cannot move the threshold between runs.
2026-10-12 23:15:20 +08:00
Yudong Han 4dff4b07f0 Merge pull request #6042 from deepseek-harness/fix/office-docx-check-scope
fix(office): 移除内置 checker 并限制 Word 无关检查
2026-10-12 22:50:11 +08:00
Yif 5a52b980e5 feat(skills): keep the mobile input keyboard closed by default
Add the eighth rule to the responsive client UI standard: on mobile, do not
raise the input keyboard automatically unless it is explicitly intended.
2026-10-12 22:33:05 +08:00
yudshj 232f86dadc docs(office): drop the checker upgrade guide
Bundled Office resource files are internal implementation, so removing
check_office.py breaks no supported surface.
2026-10-12 22:29:24 +08:00
turtle1999 5a7cb94149 fix(ui-workspace): address watermark review
- Compute each group's baseline watermark once per render.
- Skip the row-motion reset when folding drops no raised watermark.
- Document that the watermark is a row count that a reorder can outrun, and
  that any unmount of the grouped tree resets it; pin both in tests.
- Cover raise-to-current, keep-after-leaving, and fold reset in the keyless
  Web folding scenario.
2026-10-12 22:28:05 +08:00
Yif 89c4652add feat(web): reflow the automation tasks header at narrow widths
The page header keeps the title at its natural width and moves the New action
onto another line once the two no longer fit, so a narrow content column never
splits the title across lines.

Register the new browser scenario in both web programs: the host aggregate owns
files that boot the host spine, and the client-registered app project excludes
them.

The scenario asserts the title stays on one line, the action separates when the
column narrows, and focus survives the change.
2026-10-12 21:56:15 +08:00
Yif ee558c82d7 feat(web): reflow the Plugins page header at narrow widths
The page header wraps its action group onto another line when the title and the
actions no longer fit together, so the title keeps its width and the actions keep
their labels on one line. The information button follows the subtitle text
instead of a flex row, which keeps it beside the copy at every width.

Cover the header in the plugin-manager browser scenario: the action group stays
inline when it fits, moves below when it does not, keeps its labels on one line,
stays inside the header, and retains focus across the change.
2026-10-12 21:56:08 +08:00
Yif ebe725081c feat(skills): add the responsive client UI standard
Add `.agents/skills/dsh-responsive-ui`, the repository standard for adapting
client surfaces to narrow available widths: the 390 CSS px acceptance minimum,
the order in which space and information yield, text truncation, titles,
icon-only controls, mobile hover behaviour, mobile tooltips, and focus
retention across width changes.

Link it from `dsh-client-ui-ux` so the existing client UI/UX guidance routes to
the new standard.
2026-10-12 21:56:01 +08:00
Yifffan 9055e29891 Merge pull request #5172 from deepseek-harness/ui/plugin-placeholder-default-name
fix(ui): 修复会话操作间距、悬停交互与任务菜单层级
2026-10-12 21:38:13 +08:00
Yichen Jiang 3f14041b03 Merge pull request #6051 from deepseek-harness/worktree/pi-ai-1.1.0
feat(llm-pi-ai): adopt pi-ai 1.1.0 and Azure provider rename
2026-10-12 21:35:06 +08:00
Yichen Jiang f9febc7e7f test(web): wait for terminal burst delivery and rendering 2026-10-12 21:22:59 +08:00
turtle1999 c3b0492876 docs(module-graph): record the goal round driver's subagent dependency 2026-10-12 21:13:08 +08:00
turtle1999 d99d8afa43 fix(goal): start goal rounds only after progressing descendants settle
The subagent guidance tells the model to end its turn while it waits for
delegated results. With an armed goal, the round driver would then queue a
new round at every idle point, spending the round budget while the agent
only waits. The driver now joins the agent's progressing descendants
through the optional subagent service before it reserves a round, and stops
waiting when the plugin unloads.
2026-10-12 20:56:21 +08:00
Yichen Jiang 40f9bccd78 Merge remote-tracking branch 'origin/master' into worktree/pi-ai-1.1.0
# Conflicts:
#	apps/desktop/tests/prepare-runtime-patches.spec.ts
2026-10-12 20:56:10 +08:00
turtle1999 7df3c41ec9 feat(ui-workspace): fold sidebar sessions with a monotonic watermark
Each Workspace shows a contiguous prefix of its Sessions up to a watermark.
The watermark rises to cover running, waiting, unread-completion, and
current Sessions within the first 50 rows, and to a search reveal target at
any row. It never falls on its own; Show more raises it past 50, and Show
less or folding (including an ancestor) resets it.
2026-10-12 20:36:18 +08:00
winewill 3a7e896206 Merge pull request #6053 from deepseek-harness/build/macos-runner-service
build: macOS runner service and optional notarization
2026-10-12 19:42:46 +08:00
ZiyaZhang 5dec056c79 test(web): settle insertion before selecting composer text 2026-10-12 04:41:19 -07:00
turtle1999 5b4cb3dd4d fix(plugin-manager): drop profile switches the bundles already imply 2026-10-12 19:28:12 +08:00
ZiyaZhang 1d36cd5a3c test(web): wait for selection notification before blur 2026-10-12 04:26:22 -07:00
winewill 1379394224 fix: verify and number unnotarized macOS artifacts 2026-10-12 19:11:01 +08:00
Wenlu Wang 8c5e325f2d Merge pull request #5995 from deepseek-harness/perf/macos-dmg-lzma
perf(desktop): compress macOS DMGs with LZMA
2026-10-12 18:38:26 +08:00
creatixchu 6e40f80d05 test(web): await terminal output after burst delivery 2026-10-12 18:12:52 +08:00
Yichen Jiang 7b8eef3954 test(llm-pi-ai): avoid model-specific Azure assertions 2026-10-12 18:09:54 +08:00
turtle1999 7a881e944a fix(prompt): end the turn instead of sleeping on subagents and read line ranges with read
The subagent guidance now tells the model to end its turn when only waiting
for delegated results remains, since each result starts a new turn. The read
guidance names sed, head, and tail alongside cat and covers line ranges.

The compaction-output-reserve and compaction-summary-headroom context windows
grow by 40 tokens to keep their triggers between the history and its
condensed replacement.
2026-10-12 18:09:15 +08:00
kingwl 01283f1fdd perf(desktop): compress macOS DMGs with LZMA 2026-10-12 18:06:00 +08:00
ZiyaZhang 77483f61d9 fix(subagent): respect optional runtime context suppression 2026-10-12 03:04:08 -07:00
creatixchu a7f0247ada test: wait for native fragments and terminal burst delivery 2026-10-12 18:03:21 +08:00
winewill a98c6aae78 build: manage macOS runner service and optional notarization 2026-10-12 18:01:44 +08:00
lsdsjy 385f7b3140 test(web): await terminal input delivery before screen assertion 2026-10-12 18:00:53 +08:00
Yif a7aeae3e81 test(web): expect workspace tooltips to coexist with details 2026-10-12 18:00:43 +08:00
lsdsjy cdb779b70f Merge remote-tracking branch 'origin/master' into feat/web-account-login 2026-10-12 17:55:27 +08:00
lsdsjy d37fc91915 test(web): wait for account menu in collapse timing 2026-10-12 17:55:24 +08:00
yudshj f44cfa7813 fix(office): name PowerPoint and Excel scripts for their task
PowerPoint and Excel tasks in PTC mode wrote inspect.py, which shadows the
standard library and forces a delete-and-retry step. Apply the Word naming
rule to both skills, listing the libraries each one imports.
2026-10-12 17:51:44 +08:00
creatixchu 3a8df502e0 test(build): assert Windows glob omission without hiding partial builds 2026-10-12 17:50:31 +08:00
creatixchu 5831f5a3cf test(build): exercise workspace glob resolution through tsdown 2026-10-12 17:48:47 +08:00
creatixchu d629b0fd9f fix(build): normalize Windows workspace package globs 2026-10-12 17:46:09 +08:00
Yichen Jiang ab64b70d3f fix(llm-pi-ai): sync desktop patch policy and Azure snapshots 2026-10-12 17:46:06 +08:00
creatixchu 30b47e05f8 fix(cua): await fixture IPC closure and restore workspace seed 2026-10-12 17:44:14 +08:00
creatixchu 900a0b2df9 fix(cua): isolate native fixture services and repair platform CI checks 2026-10-12 17:39:24 +08:00
Yichen Jiang d79f13a4d4 feat(llm-pi-ai): adopt pi-ai 1.1.0 and Azure provider rename 2026-10-12 17:33:47 +08:00
yudshj fa740a581a fix(office): restore Word creation guidance and guard direct package writes
- Restore the office-docx new-document example from master. #6040 concerns
  edits, and no Word creation case covers its removal.
- Tell direct package writers to copy each member once into a new ZIP;
  python-docx, python-pptx, and openpyxl all reopen packages with duplicate
  members without error.
- Anchor the script-name assertion so hyphenated names such as edit-docx.py,
  which shadow no module, do not fail the Word e2e.
2026-10-12 17:31:53 +08:00
creatixchu 29893262a0 Merge master into CUA platform foundation 2026-10-12 17:26:05 +08:00
Yichen Jiang 3aa8872e67 Merge pull request #6027 from deepseek-harness/worktree/web-terminal-duplex
feat(web): carry terminal input over duplex streams
2026-10-12 17:13:57 +08:00
winewill 7ba14bcc72 Merge pull request #6037 from deepseek-harness/build/macos-self-hosted-packaging
build(macos): add self-hosted signed packaging workflow
2026-10-12 17:11:18 +08:00
lsdsjy 384d6d67a6 fix(web): 处理登录 PR 评审意见
- 未导航的空白登录页在 Host 完成后关闭
- 文档改为描述应用生效配色,并补充普通浏览器 device_info 与非回环来源限制
- 新增 Web e2e 覆盖账号菜单登录全流程
2026-10-12 16:55:30 +08:00
lsdsjy 8ee22c3668 feat(web): 在 Web UI 开放 DeepSeek 账号登录
撤销 f5e548b5af6 对 Web 的门控:账号菜单、设置中的账号页、首启登录步骤和额度提示在 Web 与 Desktop 上同样挂载,左下角菜单与 Desktop 一致(设置/意见反馈/登录)。

Web 以 login_source=web 与页面自身 origin 发起授权,点击时预开标签页并在拿到授权地址后带上主题跳转;失败、过期或取消时关闭该标签页,弹窗被拦截时仍可复制链接。Platform 页面、Desktop 首启引导和设备信息读取仍只在 Desktop 可用。
2026-10-12 16:54:49 +08:00
Yif 1f11e46e70 fix(ui): retain hover continuity through active cards 2026-10-12 16:43:40 +08:00
Yif 6b32843970 Merge master and repair SDK and job test integration 2026-10-12 16:41:44 +08:00
Dudu-0223 410244be7e Merge pull request #6035 from deepseek-harness/feat/team-interrupt-config
feat(agent-team): allow disabling the interrupt tool
2026-10-12 16:22:13 +08:00
Yichen Jiang 8e4fb1b18d Merge pull request #5120 from deepseek-harness/worktree/deepseek-account-models-ba9235
feat(llm): serve DeepSeek account models from the account listing with version gating
2026-10-12 16:20:43 +08:00
yudshj fb2a554cd3 refactor(office): remove the bundled structural checker 2026-10-12 16:07:23 +08:00
yudshj 2fe9783f55 fix(office): limit Word content validation to the edited content 2026-10-12 16:07:23 +08:00
Yichen Jiang 3d6e1b811b Merge remote-tracking branch 'origin/master' into worktree/web-terminal-duplex 2026-10-12 16:06:21 +08:00
Yichen Jiang 88788a5cb4 Revert "test(web): relax prose and JSON benchmark ratio limits"
This reverts commit 5de802071c9a2ecfcb009f4696ce8a87dc6fff79.
2026-10-12 16:06:16 +08:00
Yichen Jiang 759b9af6ff Merge remote-tracking branch 'origin/master' into worktree/deepseek-account-models-ba9235 2026-10-12 16:04:39 +08:00
Yichen Jiang 3a04f2d430 Merge pull request #6045 from deepseek-harness/fix/sdk-resume-jsonl-import
fix(sdk): import JSONL persistence as a plugin namespace in resume tests
2026-10-12 16:03:44 +08:00
turtle1999 5e9f1340d3 fix(cordis): align audit evidence and SDK test with current provider 2026-10-12 15:46:03 +08:00
Yichen Jiang 9ca2e48f9b test(web): relax prose and JSON benchmark ratio limits 2026-10-12 15:45:58 +08:00
Yichen Jiang 98229a47ea fix(sdk): import JSONL persistence as a plugin namespace in resume tests
#5938 turned @deepseek-ai/dsh-session-persistence-jsonl into a function
plugin without a default export, while the SDK resume spec from #5988
still default-imported it. Typecheck failed with TS1192 and the spec's
six cases mounted an undefined plugin, which kept the coverage, snapshot
and Windows build checks red for every pull request.
2026-10-12 15:44:38 +08:00
fz bed5d76406 Merge pull request #6036 from deepseek-harness/fix/plugin-manager-log-lifetime
fix(plugin-manager): close pnpm logs when preparation fails
2026-10-12 15:43:07 +08:00
turtle1999 288d1be7aa chore: merge master and retain Cordis cleanup guidance 2026-10-12 15:40:31 +08:00
turtle1999 59aec39e45 docs(cordis): address lifecycle audit review feedback 2026-10-12 15:33:39 +08:00
ZiyaZhang 2998eb0311 Merge master and fix depth-limit snapshot CI 2026-10-12 00:25:05 -07:00
Yichen Jiang 0bcacef96e docs: add upgrade guides for the account model catalog and pi-ai discovery
Users of v0.2.1-alpha.2 who saved an account catalog through the Models
page editor must move single-model changes into modelOverrides, because
a models field now stops llm-deepseek-account at load. pi-ai routes that
name a missing credential now list no models.
2026-10-12 14:53:34 +08:00
Yichen Jiang 9b77d375e6 docs(llm): state account override bounds, prerelease gating and catalog order
The account README now says that a prerelease orders below its release,
that listed capabilities do not bound an override, that an override for
a refused unknown model is checked once the model becomes available, and
that an account whose listed models are all refused shows the generic
empty state. resolveAdapterOptions documents that resolved models keep
the input order, which the account catalog relies on.
2026-10-12 14:53:30 +08:00
Yichen Jiang 62615b6aaf fix(llm): report a timed-out DeepSeek account listing as TIMEOUT
The listing deadline now comes from dsh-timeout and carries
MODEL_LISTING_TIMEOUT, so a listing that misses modelsTimeoutMs fails
with TIMEOUT and "timed out after <n> ms" instead of ABORTED. Rescope
and disposal aborts keep reporting ABORTED.
2026-10-12 14:53:22 +08:00
Yichen Jiang 54a7bdec23 fix(translator): read the account route's model overrides instead of its removed catalog
The account route no longer accepts a models catalog, so paid Flash
translation compares Account modelOverrides (Official keeps models) when
it checks that the owner's model configuration is unchanged before
dispatch. The paid fixture and the Web e2e serve the account GET /models
listing instead of configuring models on the account entry.
2026-10-12 14:53:15 +08:00
winewill de64badf0c Merge pull request #6039 from deepseek-harness/fix/windows-dialog-flicker
fix(desktop): prevent Windows dialog dismissal flicker
2026-10-12 14:21:25 +08:00
fz e75e13313c Merge pull request #5531 from deepseek-harness/fix/5520-job-session-timestamps
fix(jobs): persist owned lifecycle timing in sessions
2026-10-12 14:15:56 +08:00
Turtle f34e5cc59b Merge pull request #5938 from deepseek-harness/fix/persistence-disposal-order
fix(session): retain JSONL resources through provider-triggered teardown
2026-10-12 14:14:36 +08:00
Yif 1a882b5a78 fix(ui): share hover dwell across workspace and session rows 2026-10-12 14:11:45 +08:00
Yichen Jiang c319824f2b Merge origin/master into worktree/web-terminal-duplex 2026-10-12 14:07:25 +08:00
Yichen Jiang 5538b790c6 fix(web): bound terminal uplink and preserve final output 2026-10-12 13:54:11 +08:00
Yif d1e0b5e089 Merge master and simplify session hover interactions 2026-10-12 13:50:57 +08:00
winewill 4fe2381cb5 fix(desktop): release Windows modality before destroying dialogs 2026-10-12 13:46:22 +08:00
Yudong Han 278e479af8 Merge pull request #5054 from deepseek-harness/feat/office-render-tools
feat(office): split authoring and operation skills for progressive loading
2026-10-12 13:39:10 +08:00
winewill dd6a6f56b5 build(macos): persist CI signatures outside checkout 2026-10-12 13:35:45 +08:00
yudshj a9864e1aba test(office): normalize Desktop skill resource path expectation 2026-10-12 13:24:01 +08:00
Dudu-0223 8583f7f120 test(agent-team): keep interrupt regression coverage in unit tests 2026-10-12 13:16:48 +08:00
winewill ff3dfc9be6 build(macos): add self-hosted signed packaging workflow 2026-10-12 13:08:09 +08:00
yudshj efcc129820 Merge master and remove automatic nested skill injection 2026-10-12 13:07:43 +08:00
fz ae0da9482d test(jobs): record lifecycle in persistent PTC replay 2026-10-12 13:07:37 +08:00
fz 634d7e96dc fix(plugin-manager): close pnpm logs when preparation fails 2026-10-12 13:05:37 +08:00
fz 88a0be8486 Merge master after separating plugin-manager fix 2026-10-12 13:04:25 +08:00
Dudu-0223 10dfc10216 docs(agent-team): keep interrupt configuration documentation minimal 2026-10-12 12:59:17 +08:00
fz e51226401f refactor(jobs): split unrelated plugin-manager log fix 2026-10-12 12:57:13 +08:00
yudshj b8b254a6d3 test(office): refresh PTC headers from master 2026-10-12 12:55:32 +08:00
winewill a993a97c69 Merge pull request #6026 from deepseek-harness/docs/desktop-packaging-guides
docs(desktop): separate packaging signing and publishing guides
2026-10-12 12:54:55 +08:00
Dudu-0223 ecafa412ac feat(agent-team): allow disabling the interrupt tool 2026-10-12 12:53:44 +08:00
yudshj b6fc04f403 Merge latest master into Office progressive skills 2026-10-12 12:50:33 +08:00
yudshj bfcc6d50d0 refactor(office): remove command launchers and shell compatibility changes 2026-10-12 12:45:09 +08:00
Yichen Jiang c6f3639b5e docs(web): align terminal duplex documentation 2026-10-12 12:44:06 +08:00
LogosVeritas 444692d1ca feat(preset): add image reading and compaction to sdk-minimal
Reuse read_image and automatic compaction in the standalone profile without
adding SDK slash-command handling. Update profile guidance, upgrade steps,
and startup and recorded-session coverage.
2026-10-12 12:11:18 +08:00
winewill a0a3ce4f84 docs(desktop): fix migrated references and duplicate anchors 2026-10-12 12:06:58 +08:00
LogosVeritas 110ef57123 test(preset): cover manual compaction in minimal mode 2026-10-12 12:02:27 +08:00
LogosVeritas f15091a922 feat(preset): enable image reading in minimal mode 2026-10-12 12:02:27 +08:00
LogosVeritas 5b784ecbc3 feat(preset): enable automatic and manual compaction in minimal mode 2026-10-12 12:02:26 +08:00
yudshj 88f5ed353e refactor(office): keep skill API and carrier composition unchanged 2026-10-12 11:57:13 +08:00
Yichen Jiang 3a0f4976ad feat(llm): log DeepSeek account listing loads and failures to the console
Product profiles mount no console exporter for ctx.logger, so the
listing failure warning never surfaced. The account route now writes
each loaded listing, the first failure of a failing streak with the
catalog it falls back to, and hidden listing entries to the console
under the [llm-deepseek-account] tag, as the account Platform plugin
does. Hidden entries are logged once per listing on every path, not
only during model discovery.
2026-10-12 11:46:34 +08:00
winewill a73843f33c Merge remote-tracking branch 'origin/master' into docs/desktop-packaging-guides 2026-10-12 11:45:49 +08:00
Yichen Jiang 13751513c0 docs(web): remove internal terminal transport upgrade guide 2026-10-12 11:43:19 +08:00
Turtle e17e6f5c60 Merge pull request #5975 from deepseek-harness/turtle/remote-mux-heartbeat-1689ca09e33b
fix(api-gateway): count mux traffic as heartbeat liveness
2026-10-12 11:38:36 +08:00
Turtle ebae734b2b Merge pull request #5970 from deepseek-harness/turtle/image-tool-card-5f766ae62765
Show read_image path and size under the image
2026-10-12 11:33:50 +08:00
Yichen Jiang dd21f9d1b5 fix(llm): fix the account listing endpoint and name the current version
The account route always reads /models at the Messages origin; the
modelsURL option is removed so a configuration cannot point the listing
elsewhere. Model refusals now report "current version is <version>"
instead of "this build is", since users usually run a downloaded release
rather than a local build, and override diagnostics name the built-in
catalog instead of the build.
2026-10-12 11:32:37 +08:00
imccyu d0749e9f6b Merge pull request #6023 from deepseek-harness/worktree/local-gates
perf(gates): speed up local hooks, typecheck, documentation gates, and tests
2026-10-12 11:26:31 +08:00
Yichen Jiang 6cc19b22f6 Merge pull request #5460 from deepseek-harness/worktree/sleepy-grothendieck-64df7b
fix(session): reuse blank Sessions under the requested preset
2026-10-12 11:25:43 +08:00
Yichen Jiang 5379996fcb feat(web): carry terminal input over duplex streams 2026-10-12 11:18:43 +08:00
Yichen Jiang 10e87ed2d8 docs(session): drop the session.create blank reuse upgrade guide
The session.create change is not perceptible to users: its only caller is the
Web client that ships in the same release. Remove the guide and the
cross-reference added to the New Session upgrade guide.
2026-10-12 11:13:28 +08:00
Yichen Jiang 2a3d143eaa Merge remote-tracking branch 'origin/master' into worktree/sleepy-grothendieck-64df7b
# Conflicts:
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
2026-10-12 11:07:34 +08:00
winewill 28de983ef5 docs(desktop): separate packaging signing and publishing guides 2026-10-12 11:07:18 +08:00
imccyu c38a9e6111 fix(typert): classify build-output guard paths by native real path
The analyzer normalizes its root with fs.realpathSync, which keeps a
Windows 8.3 short name such as RUNNER~1 in the runner's TEMP, while
TypeScript reports module-resolution results through
fs.realpathSync.native, which expands it. The guard compared the two
spellings, found the resolved lib/ declaration outside the workspace,
and let a missing alias through on Windows. It now canonicalizes the
root and every file with realpathSync.native and reports paths spelled
under the caller's root; the guard specs also run with the workspace
root spelled through a directory link.

Refs #5852
2026-10-12 11:06:56 +08:00
imccyu ad43b1f7da docs: state that the documentation aggregate cap applies in CI
doc-sync, test:docs, hygiene, and check:all run at most 8 gates in CI as
well; the constant, the development guide, and the Agent Note now say so.
The Note also states that the source-only Typert guard rejects unresolved
workspace imports, so a missing alias fails before or after host-src.

Refs #5852
2026-10-12 11:06:56 +08:00
imccyu a99cf28864 test(docs): pin the repository-reference prefix search
uniquePrefixMatch is exported and covered for unique, shared, last,
exact, absent, and empty cases, and a fixture repository with two commits
whose names share a seven-digit prefix shows that the shared prefix is
accepted while a longer unique prefix is rejected.

Refs #5852
2026-10-12 11:06:56 +08:00
imccyu 5222ef2751 fix(typert): reject unresolved workspace imports in source-only generation
rejectBuildOutputs caught a missing paths alias only when the package's
lib/types already existed. On a tree whose packages are not yet compiled,
as when host-typert runs beside host-src on a clean checkout, the import
resolved to nothing and checkDiagnostics: false hid it. The guard now also
fails when a face program cannot resolve an import of a workspace package,
found through its node_modules link, and names the paths entry derived
from the package's exports types condition.

Refs #5852
2026-10-12 11:06:56 +08:00
imccyu 8a6c68fc34 docs: state review-requested invariants and current command names
gen-doc-graphs states that its probe memo patches the system and needs a synchronous, non-nested caller; the typecheck graph comments why host-check does not wait for host-typert; the API gateway guide names the CI build lanes as the bundling Typert path; and the build-split Note marks its host-libraries measurement as superseded by host-contracts.

Refs #5852
2026-10-12 11:06:56 +08:00
imccyu fbcb8b0306 docs(notes): record the local gate speed-ups
The new Agent Note records why type checks generate Typert declarations
without bundling, why pre-commit leaves third-party notices to the test
lane, how the local worker budget is chosen, and how the documentation
gates and type-model.spec avoid repeated work, with the measurements and
the evidence that outputs stay the same. Notes whose facts these changes
superseded now describe the source-only Typert step and the test-lane
ownership of notices freshness.

Refs #5852
2026-10-12 11:06:55 +08:00
imccyu 703c8f659c perf(docs): prefetch CLI help concurrently and memoize doc-graph probes
gen-cli-help launched its twelve source-mode dsh --help processes one
after another, each spending most of its time waiting on profile boot
I/O; they now start concurrently within the default worker budget, each
with its own temporary DSH_HOME, and the existing comparison consumes
them in the original order. gen-doc-graphs memoizes ts.sys file, directory,
realpath, and directory-listing probes for one run. Generated pages are
byte-identical; CLI help drops from about 52 s to 7 s and doc graphs from
about 47 s to 33 s.

Refs #5852
2026-10-12 11:06:54 +08:00
imccyu 67b875a5bf perf(docs): list each repository directory once per file walk
uniqueRepoFiles read every directory once per pattern and ** level and
resolved every file with realpath. One walk now lists each directory
once across patterns, resolves only paths reached through symbolic
links, and lets doc refs skip non-leading lib directories, whose files
it always excluded. markdown wrap, doc refs, and package paths return
the same file lists with about half the directory reads.

Refs #5852
2026-10-12 11:06:53 +08:00
imccyu 1e24617aad perf(docs): parse each Markdown document once in documentation gates
markdown links parsed anchor targets twice more and probed existence
without a cache; translation pairing reparsed every document after link
normalization and globbed four times; the README model-experience and
limitations checks parsed each README three times; type equivalence
parsed all 1,835 documents; Session format references reparsed each pair
four times. Each gate now parses a document once: links and anchors come
from one tree, pairing reuses the original tree when every rewritten
destination keeps the block structure and falls back to a full reparse
otherwise, the README checks share one tree, a text prefilter skips
documents that cannot hold a source-equivalence fence, and the
persistence renderer passes its trees on. Outputs are byte-identical on
the repository, and seeded faults are reported identically.

Refs #5852
2026-10-12 11:06:53 +08:00
imccyu 6fbfbb044e test(typert): run type-model.spec against an in-memory workspace
Each of the 61 cases copied the fixture onto disk and ran a full analysis
whose four TypeScript programs reloaded the DOM library, @types/node, and
zod v4; about 22,000 file-system probes per analysis dominated on a
network filesystem. The spec now mocks the node:fs calls the analyzer
makes and the ts.sys host for an in-memory workspace, stubs zod and
@types/node except in the Emitter case that runs real zod, drops the DOM
library from the fixture, and shares the pristine analysis read-only.
The file drops from about 316 s to 15 s with the same 61 cases and
assertions; the snapshot's external zod path no longer names a pnpm
store version.

Refs #5852
2026-10-12 11:06:52 +08:00
imccyu 989a52d427 build(hooks): stop regenerating third-party notices on pre-commit
Browser inputs make every package source file a generator input, so the
pre-commit job ran the 16-second generator on nearly every commit while
few commits change its output. gen-third-party-notices.spec.ts already
asserts the committed bytes in the test lane, including the required
node 24 / coverage pull-request lane, and names the regeneration command
when they are stale. The generated preamble, the notices decision, and
the development guide now describe that ownership.

Refs #5852
2026-10-12 11:06:51 +08:00
imccyu a8fd8da98a perf(docs): resolve repository-reference candidates with one object listing
verify-repository-references asked git cat-file for each of about 26,000
abbreviated hexadecimal candidates, which took 135 s on a network
filesystem. One --batch-all-objects listing (about 1.2 million objects,
0.6 s) now feeds an in-memory prefix search; a candidate still counts
only when its prefix names exactly one available object and that object
is a commit. The gate drops from 166.8 s to 15.7 s, and both
implementations classify 27,050 real and synthetic candidates
identically.

Refs #5852
2026-10-12 11:06:50 +08:00
imccyu ed7bf8cc42 perf(gates): cap local default worker counts
os.availableParallelism() reports host CPUs rather than a container's
CPU quota (256 against a 64-CPU quota here), so local defaults spawned
255 Vitest forks (55 GiB peak RSS) and oversubscribed every scheduler.
scripts/parallelism.ts keeps the CPU count in CI and caps other runs at
12, or 48 for Vitest forks and the local coverage budget; documentation
and hygiene aggregates run up to 8 gates instead of 4. Explicit
DSH_GATE_CONCURRENCY, DSH_OXLINT_THREADS, DSH_COVERAGE_MAX_WORKERS, and
--maxWorkers still win.

Refs #5852
2026-10-12 11:06:50 +08:00
imccyu 04af9a1df7 perf(build): generate Typert contracts without bundling for typecheck and lint
Type checks only need Host declarations and Typert-generated
declarations, but typecheck, lint, lint:fix, doc-typecheck, and the CI
typert-contracts gate rebuilt the whole Host tsdown pass, Desktop bundle
included, to obtain them. A source-only scripts/generate-typert.ts now
runs the same generator and artifact writer as the tsdown plugin, beside
Host package compilation: Typert reads only sources once the missing
@deepseek-ai/dsh-client-file-upload/types path alias exists, and
rejectBuildOutputs fails the pass when a workspace lib/ declaration
enters its program. typecheck runs as a build.ts scope that checks both
aggregates in build mode after their own face compiles.

Refs #5852
2026-10-12 11:06:49 +08:00
imccyu d8d942c82a Merge pull request #6020 from deepseek-harness/worktree-chatflow2
fix(ui-chat): keep notice-woken Turns in the human exchange
2026-10-12 11:00:20 +08:00
winewill b35ef84914 Merge pull request #5952 from deepseek-harness/build/windows-ci-presets-signing
build(windows): add machine presets and EV-signed Actions packaging
2026-10-12 10:48:21 +08:00
Yichen Jiang ad23ec9c3f Merge remote-tracking branch 'origin/master' into worktree/deepseek-account-models-ba9235
# Conflicts:
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/client/ui-model-selection/README.i18n.yaml
#	packages/client/ui-model-selection/README.md
#	packages/client/ui-model-selection/README.zh.md
#	packages/client/ui-model-selection/src/client/ModelSelect.tsx
#	packages/client/ui-model-selection/src/client/locales.ts
#	packages/client/ui-model-selection/tests/model-select.client.spec.tsx
#	packages/client/ui-settings-models/README.i18n.yaml
#	packages/client/ui-settings-models/README.md
#	packages/client/ui-settings-models/README.zh.md
#	packages/client/ui-settings-models/src/client/ModelsSection.tsx
#	packages/client/ui-settings-models/src/client/ProviderEditor.tsx
#	packages/client/ui-settings-models/tests/components.client.spec.tsx
#	packages/llm/llm-deepseek-account/README.i18n.yaml
#	packages/llm/llm-deepseek-account/README.md
#	packages/llm/llm-deepseek-account/README.zh.md
#	packages/llm/llm-deepseek-api-key/README.i18n.yaml
#	packages/llm/llm-deepseek-api-key/README.md
#	packages/llm/llm-deepseek-api-key/README.zh.md
#	packages/llm/llm-deepseek-api-key/src/index.ts
#	packages/llm/llm-deepseek-api-key/tests/discovery.spec.ts
#	packages/llm/llm-deepseek/README.i18n.yaml
#	packages/llm/llm-deepseek/tests/account-routing.spec.ts
#	packages/llm/llm-deepseek/tests/runtime.spec.ts
#	pnpm-lock.yaml
2026-10-12 10:40:30 +08:00
imccyu 7526c914c4 test(scripts): refresh the translation prompt snapshot for the exchange term
The assembled translation prompt embeds docs/i18n/terminology.md, so the
new exchange row changes the recorded request.
2026-10-12 10:35:06 +08:00
imccyu 453a79206c fix(ui-chat): address review on notice-woken exchanges
Share locationCoordinates between the Chat Builder and GroupTreeSegments,
find the last opening Turn with a loop instead of spreading every key,
and pass the resolved Location through chatNode so message Nodes resolve
it once. The notice e2e now waits for observable barriers (each Step's
row, the notice Turn's start, the notice row) instead of fixed sleeps,
asserts the settled tail through polling plus a later-frame recheck
instead of one absolute blank threshold, and fails on console warnings.
Record exchange in the terminology table and keep Goal Round in English.
2026-10-12 10:35:05 +08:00
imccyu c62f26aaa1 fix(ui-chat): keep notice-woken Turns in the human exchange
Under "On next message" folding, a Turn woken by a notice (settled
subagent, goal round, schedule, background job) advanced the bottom Turn
and folded the finished Turn without an own-input driver, so the generic
fold room left a following reader looking at blank space.

Chat Nodes now declare a group-tree position (`groupTree`, ordered
`exchange` > `turn` > `process`). Human input claimed in Step 1 marks its
Turn as opening an exchange; notices and later steering carry no
position. `GroupTreeSegments` splits the loaded Turns at opening Turns,
and `bottomSource` covers the whole latest exchange, so notice-woken
Turns no longer fold earlier ones while the next human message folds the
exchange through the own-input path. Only `exchange` is read today; the
`turn` and `process` positions are reserved for the existing kind lists.
2026-10-12 10:35:05 +08:00
fz 77dca95039 Merge pull request #5988 from deepseek-harness/feat/sdk-resume-session
feat(sdk): add explicit persisted session resume
2026-10-12 10:34:04 +08:00
imccyu 743560522b Merge pull request #6013 from deepseek-harness/worktree-fixsystemprompt
fix(web): keep process-specific values out of the system prompt
2026-10-12 02:23:32 +08:00
imccyu 0f95e16315 Merge pull request #5824 from deepseek-harness/feat/user-text-secret-mask
feat(ui-secret-mask): mask credentials in sent user text
2026-10-12 02:18:12 +08:00
imccyu 94d4007bfd docs(ui-secret-mask): document exported format constants and methods 2026-10-12 02:05:16 +08:00
imccyu 1681948e3f refactor(ui-secret-mask): split formats, lazy tables, masks, and the scanner into modules 2026-10-12 01:58:06 +08:00
imccyu 30e31bd762 docs(ui-secret-mask): re-record README translation pairing 2026-10-12 01:43:59 +08:00
imccyu 2b229d4c0e fix(web): address review round on harness dev context
- WebServer.port reads number | undefined instead of masking the unbound
  listener with an assertion; tests that dial it narrow the bound port.
- LegacyPrompt stays module-private; the web-app type import is a
  devDependency only, since the emitted declarations never reference it.
- Copy: --public-url help names runtime context again, the public
  deployments guide, web-app JSDoc, Config.publicUrl consumers, the Agent
  Note matching rule, and three Known Limitations in the package README.
2026-10-12 01:42:45 +08:00
imccyu 035d78d4c8 fix(ui-secret-mask): confine key-block mask searches to the block 2026-10-12 01:24:38 +08:00
imccyu 993b13571b fix(ui-secret-mask): lint-clean indexed reads and add the English note 2026-10-12 01:13:11 +08:00
imccyu a93958c7d0 feat(ui-secret-mask): mask credentials in sent user text 2026-10-12 00:46:21 +08:00
imccyu ba1a9356db fix(web): advertise one Web GUI URL through the webApp service
The web-runtime row provides webApp.getAdvertisedUrl(): the row's
configured publicUrl, otherwise the listener origin. harness-dev-context
reads it instead of webStartup.publicUrl, so a profile override of
publicUrl reaches the model as it already reaches DSH_WEB_URL and the
startup URL. The new package no longer injects webServer or webStartup,
and the startup flag provider returns to its master behavior.
2026-10-12 00:34:29 +08:00
imccyu adfa92bca1 fix(web): address review on harness dev context
- WebServer exposes getOrigin() instead of an origin getter, and it fails
  loud before listen binds a port.
- The earlier Web-surface paragraph is a frozen literal, so later guidance
  edits cannot stop earlier Sessions from matching; the projection reads a
  prompt version with the loop's single-text-block rule.
- web-app drops its unused dsh-system-prompt dependency and stale
  prompt-section wording in its description, README, patch comment,
  --public-url help, and the round-trip test title.
2026-10-11 23:25:24 +08:00
imccyu b10a605e6b test(web): add harness dev context lines to recorded web sessions
Each recorded runtime-context snapshot with optional contexts gains the
tokenized checkout and Web GUI URL lines, matching the refresh output of
the code-language scenario, where only that message changed. The
minimal-preset snapshot suppresses optional context and stays unchanged.
2026-10-11 23:25:22 +08:00
imccyu f885016322 test(web): refresh code-language session for harness dev context 2026-10-11 23:25:22 +08:00
imccyu fc2ef643fb docs: regenerate package, module, and seam catalogs for harness-dev-context 2026-10-11 23:25:21 +08:00
imccyu ab560474a2 test(web): tokenize harness dev context lines in recorded sessions 2026-10-11 23:25:21 +08:00
imccyu d5b48ad0ba docs(graphs): classify the webStartup service 2026-10-11 23:25:20 +08:00
imccyu 36779dcf09 fix(web): keep process-specific values out of the system prompt
The harness checkout path and Web GUI URL now reach the model as runtime
context from the new dsh-harness-dev-context plugin, so a process started
on another port, checkout, or installation no longer rewrites a Session's
logged system prompt. A Session whose prompt already embeds the earlier
value-bearing paragraphs keeps them verbatim through a host-only session
projection.

dsh-host-webserver gains WebServer.origin and bindUrlHost(); web-app keeps
only DSH_WEB_URL, the startup URL, and the browser handoff, and its root
declares the webStartup service type. app-boot drops
addHarnessSourceSection and HARNESS_SOURCE_SECTION.
2026-10-11 23:25:19 +08:00
creatixchu f7d8ac7140 Merge current master build updates into CUA platform foundation 2026-10-11 23:17:19 +08:00
imccyu 9cac4beb05 Merge pull request #6005 from deepseek-harness/worktree-tsprofile
perf(build): parallelize build, split build:artifacts/build:check, and cut tsdown and client check time
2026-10-11 23:03:37 +08:00
imccyu f6b0c5af59 build: rename build:src and build:test to build:artifacts and build:check
build:artifacts produces every artifact, including the tsdown bundles,
the Desktop bundle, and Web, so naming it after sources undersold it;
build:check checks scripts, benchmarks, and website code besides tests.
The build.ts scopes, aggregate step ids, the Python builder flag
(--build-artifacts), workflows, callers, docs, and the build-split Agent
Note follow the new names. The note also records the naming
alternatives.

Refs #5852
2026-10-11 22:16:47 +08:00
imccyu 1a8448ad27 docs: say which build command to run when, and drop the upgrade-guide aside
- docs/development.md gains a situation-to-command table for build:src,
  build:test, build, typecheck, lint and doc-typecheck (Chinese pair
  updated).
- Note A states the typertPlugin() compatibility facts without discussing
  an upgrade guide.

Refs #5852
2026-10-11 19:43:49 +08:00
ZiyaZhang 42db4b8541 fix(subagent): expose exhausted delegation depth in runtime context 2026-10-11 04:37:57 -07:00
creatixchu d0c550823b docs(cua): align platform references and placeholder structure 2026-10-11 19:24:51 +08:00
creatixchu ef3375780b fix(build): select package manifests for workspace bundles 2026-10-11 19:21:07 +08:00
creatixchu f65cb889b8 refactor(cua): separate shared execution from macOS provider 2026-10-11 19:18:02 +08:00
imccyu f0460bab4c docs(notes): record final build measurements and address review wording
- Note B: final medians of two interleaved samples (build 317.1 -> 169.1 s,
  build:src developer view -51.6%, lint prerequisite 159.8 -> 90.9 s), the
  CI lanes that run the parallel build, and their concurrency settings.
- Both notes: medians with sample counts instead of raw sample lists.
- Note A: why the typertPlugin() hook changes need no upgrade guide; final
  serial stage times.
- Typert Remote note: the top-level build now runs the scripts/build.ts
  step graph; build:lib and build:lib:host keep their remaining callers.
- docs/development.md agreement fix; packages/client/AGENTS.md rule 8 names
  the manifest globs the gate checks.

Refs #5852
2026-10-11 19:16:57 +08:00
imccyu 1e6deb4f16 test(typert): place the worker fixture on a real package leaf
verify-package-paths reads root-relative packages/* strings in tests and
rejected the fixture's packages/generator, which names the real
packages/typert/generator leaf in the wrong group. The fixture now mirrors
that layout.

Refs #5852
2026-10-11 18:50:25 +08:00
imccyu f34c3a1ce2 docs(notes): record the lossless build speed-ups and the build command split
- 2026-10-11-lossless-build-speedups: the React type packages declared only
  at the root, the five Typert discovery/worker changes with the transform
  filter, and the client tsdown preset manifest read; each item states its
  purpose, change, measured effect, why outputs are unchanged, and its
  trade-offs.
- 2026-10-11-build-src-test-split: build:src / build:test / build, the
  dependency graph and scheduling, callers and CI lanes, which command
  detects which error, measurements, and the intentional trade-offs.
- 2026-10-05-pr-artifact-typechecks: one-line adjustments where this change
  replaces --artifacts-only with build:src and renames the Python flag.

Refs #5852
2026-10-11 18:19:23 +08:00
imccyu 129c915498 build: split build:src and build:test, and schedule build in parallel
pnpm run build ran every step in one serial chain, including the two
noEmit aggregate programs (tests, scripts, benchmarks, website) that no
artifact step consumes, so the Host aggregate check alone delayed tsdown by
about 66 s.

- build:src (scripts/build.ts --scope src) builds every artifact in the
  existing order and writes the client build record; it replaces the
  removed --artifacts-only flag and the libraries CLI mode.
- build:test (--scope test) type-checks only the Host and Client aggregate
  programs with tsc -p, concurrently, without compiling references or
  checking prerequisites.
- build runs both as one dependency graph through run-gates' new
  runAggregate: each aggregate check starts once its face's packages are
  compiled, and Client compilation stays after the Host bundle that writes
  the Typert /remote declarations. DSH_GATE_CONCURRENCY=1 serializes it;
  DSH_GATE_FAIL_FAST=1 stops the remaining steps at the first failure.
  Passing steps print one PASS line (DSH_GATE_VERBOSE=1 shows their output).
- PR artifact builds (e2e, release, preview, Node 22 compatibility) and the
  Python builder (--build-src) use build:src; dev:web and dev:desktop use
  build:src. test:*, bench, typecheck and the required consumer/Windows
  lanes keep the complete build.
- lint, lint:fix, doc-typecheck and the Typert contracts gate prepare with
  host-libraries (Host package compilation + Host bundle) instead of
  build:lib:host; their own checks never read the aggregate root or the
  Desktop bundle.

Parallel and serial build produce byte-identical lib/, Web dist and client
build record; a test-only type error fails build and build:test while
build:src passes.

Refs #5852
2026-10-11 18:19:23 +08:00
imccyu e4410b2764 perf(client): read each tsdown preset's own package manifest
The client tsdown presets found a package's own manifest by name: a glob of
every packages/*/*/package.json, parsed until the name matched. tsdown's
native config loader imports each package config without module cache, so
the module-level cache never hit and all 82 configs repeated the glob
(40-125 ms each) synchronously on tsdown's main thread, where it delayed
every other package build. It was 34.5% of the client pass's main thread.

- clientBundle, staticLinked and clientLibrary take the package directory
  (import.meta.dirname at every call site) and read <dir>/package.json
  once; the package name, loader id and externals come from that manifest.
- A missing, unreadable or nameless manifest throws an actionable error.
- The glob, the name search and the module-level caches are removed.

tsdown client pass 12.78 s -> 8.73 s (median of 3 interleaved runs each,
-31.7%); all 11,566 lib outputs byte-identical; all 82 configs resolve the
same externals and banners.

Refs #5852
2026-10-11 18:19:23 +08:00
imccyu 1c6078dca6 perf(build): declare React type packages only at the workspace root
TypeScript builds a synthetic signature for every JSX intrinsic element and
computes a module specifier for @types/react (index and jsx-runtime) per
importing file. computeModuleSpecifiers visits every symlinked location of
that file and scans all 491 tsconfig paths for each; pnpm gave 65 packages
their own node_modules/@types/react link. Client test-aggregate Check
followed 26.9 + 0.494 * N seconds for N locations.

- Remove @types/react and @types/react-dom from all 67 workspace manifests
  and declare them once in the root devDependencies; packages keep declaring
  the react and react-dom they import (ui-slots gains react).
- verify-package-dependencies rejects either package in any workspace
  manifest and requires the root declaration, so a new package cannot add
  the link back.
- packages/client/AGENTS.md states the rule.

Client aggregate Check 59.1 s -> 26.5 s; the 76 client-only package
projects 54-57 s -> ~44 s wall. File set (2,613) and diagnostics unchanged.

Refs #5852
2026-10-11 18:19:21 +08:00
imccyu c1a4ce0117 perf(typert): discover declared contributors only and generate off the bundler thread
The Host tsdown pass ran Typert synchronously inside the first package's
writeBundle, blocking every other workspace build's JavaScript hooks for
about 12 s. Discovery dominated that time: it expanded the Host aggregate's
2,064 include entries, parsed all 362 referenced tsconfigs (Client ones
included), and walked 322 packages although only 28 declare a Typert export.

- Select packages by their manifest exports before any source walk.
- Parse face aggregates without expanding their file lists.
- Parse package tsconfigs lazily, only for analyzed packages; tsc -b keeps
  validating every referenced tsconfig.
- Resolve the workspace root as the nearest ancestor holding both
  tsconfig.host.json and packages/.
- Run workspace generation in a Worker Thread started at the first
  buildStart; writeBundle awaits it once and fails the build with
  TypertWorkerError on any worker failure.
- Filter the decorator transform hook by id so only TypeScript modules
  cross into JavaScript.

tsdown host median 22.6 s -> ~10 s; all 743 hashed lib outputs are
byte-identical except the generator's own bundle.

Refs #5852
2026-10-11 18:16:20 +08:00
creatixchu e9bc3bdb37 fix(cua): align package version with master 2026-10-11 18:00:39 +08:00
creatixchu 5ea72ef0d2 fix(cua): satisfy typed lint and expose fixture failures 2026-10-11 17:58:53 +08:00
creatixchu b9de05d1c4 test(cua): include experimental package in release inventory 2026-10-11 17:55:48 +08:00
creatixchu 1b781d683b Merge master into feat/experimental-dsh-cua 2026-10-11 17:54:24 +08:00
Yichen Jiang 5e3b3509b8 Merge remote-tracking branch 'origin/master' into worktree/command-delete-as-whole-21017f
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.md
#	packages/client/ui-conversation/README.zh.md
2026-10-11 17:11:17 +08:00
imccyu 9cb2041b29 Merge pull request #5979 from deepseek-harness/messageslot
refactor(web): compose message and text-transform content
2026-10-11 15:23:08 +08:00
Yichen Jiang 8df7465cf8 Merge pull request #6002 from deepseek-harness/worktree/fix-chat-fold-growth-timing
test(web): control frames in concurrent fold scenarios
2026-10-11 15:03:23 +08:00
Yichen Jiang 38a3e05380 Merge pull request #6001 from deepseek-harness/worktree/python-release-github-large-trial
ci(python): use larger GitHub macOS runners for releases
2026-10-11 14:51:47 +08:00
Yichen Jiang 1e7ca3ebe9 test(web): control frames in concurrent fold scenarios 2026-10-11 14:50:49 +08:00
imccyu 60a4c8e077 fix(web): make whitespace trimming linear and polish content contracts 2026-10-11 14:18:10 +08:00
Yichen Jiang 1d0ede8c3a ci: trial larger GitHub macOS runners for Python releases 2026-10-11 14:00:17 +08:00
imccyu f66d19b078 refactor(web): reconcile user text with cached forward candidates 2026-10-11 12:52:06 +08:00
imccyu ed629da5da fix(web): trim unused user text features and cover rendering 2026-10-11 02:03:27 +08:00
imccyu a46d5b143f refactor(web): separate image slots by domain 2026-10-11 01:04:23 +08:00
CreatixChu 983f2a0116 Merge pull request #5035 from deepseek-harness/feat/persistent-ptc
feat(ptc): 支持遵循沙箱策略的 persistent-in-memory 执行
2026-10-10 22:52:46 +08:00
imccyu 14bee91fac test(web): refresh complete queued question reply snapshot 2026-10-10 22:47:34 +08:00
imccyu ba452cf919 docs: mark message image factory decision implemented 2026-10-10 22:43:55 +08:00
imccyu d6a5aa5cab fix(web): address user text CI checks and coverage 2026-10-10 22:43:55 +08:00
imccyu 40c6a37ad0 test(web): adapt user content fixtures to text node factories 2026-10-10 22:43:55 +08:00
imccyu bd1b8ad18e fix(test): route user text specs to the client compiler 2026-10-10 22:43:54 +08:00
imccyu 1301b26846 refactor(web): transform user text through business node slots 2026-10-10 22:43:54 +08:00
imccyu b52864330d refactor(web): extract reusable user content factory 2026-10-10 22:43:54 +08:00
imccyu 2c684c51c9 refactor(web): compose native message image factories 2026-10-10 22:43:53 +08:00
imccyu 3daec753f8 Merge pull request #5983 from deepseek-harness/worktree-chatmisc
fix(chat): hide empty reasoning and improve command and file details
2026-10-10 22:39:53 +08:00
Tianyi Cui dd15a5d066 test(ptc): cover provider unload during policy cleanup
Hold cleanup of an older retained process while a newer call is waiting, then unload the provider. Require the pending call to reject after disposal without starting another process.

Validation: 305 focused tests passed, one skipped; persistent.ts, index.ts, and policy-processes.ts have 100% statements, branches, functions, and lines. Removing the shutdown guard makes the new regression fail.
2026-10-10 22:39:34 +08:00
imccyu 68be430f62 fix(chat): handle cancelled folds and concurrent content growth 2026-10-10 22:22:45 +08:00
Tianyi Cui f62483f71f Merge pull request #5990 from deepseek-harness/turtle/worktree-lazy-fetch-d2236b7eb1d9
fix(worktree): disable lazy fetch through GIT_NO_LAZY_FETCH
2026-10-10 22:19:37 +08:00
Tianyi Cui 9d385cd0d9 Merge master into persistent PTC
Preserve the persistent runtime package description with master's alpha.2 version and locale exports. Refresh the two PTC prompt snapshots for the current plan-tool result type.

Validation: full build, 434 focused tests (one skipped), two built-runtime tests, two selected snapshots, package metadata, and all 43 doc-sync checks passed.
2026-10-10 21:55:44 +08:00
Turtleandoraluben 60808a9e99 Credit review by @oraluben
Co-authored-by: oraluben <[email protected]>
2026-10-10 17:20:38 +08:00
imccyu b3a7271720 fix(chat): coordinate visible process folding with input scrolling 2026-10-10 17:15:00 +08:00
imccyu 9f435e1592 fix(chat): show background shell launch commands 2026-10-10 16:05:27 +08:00
imccyu 0d52c0d6a2 fix(chat): align wrapped status and refine preview regression cases 2026-10-10 16:05:27 +08:00
imccyu ed160fa60c fix(chat): hide empty reasoning and improve command and file details 2026-10-10 16:05:26 +08:00
imccyu d6be036d67 Merge pull request #5982 from deepseek-harness/worktree-spacebrowser
feat(ui-workspace): expose session ids and unify toast presentation
2026-10-10 15:25:23 +08:00
fz b1d5671038 refactor(sdk): simplify resume acknowledgement and verify Python restoration 2026-10-10 15:21:40 +08:00
imccyu d0c885d7b7 fix(ui-workspace): share archive toast filter action 2026-10-10 15:13:22 +08:00
imccyu 0dcebe4419 fix(ui-workspace): declare toast registrations explicitly 2026-10-10 14:59:26 +08:00
imccyu 0c72c1cd3e docs(client): allow factories for reusable components 2026-10-10 14:59:25 +08:00
imccyu d5f19c7978 test(ui-chat): narrow restored configuration before loading 2026-10-10 14:50:17 +08:00
imccyu 70050ff276 docs(workspace): sync missing-directory membership reference 2026-10-10 14:50:16 +08:00
Turtle b37bd1f2a1 docs(worktree): scope lazy-fetch guarantee and regenerate config catalog 2026-10-10 14:31:58 +08:00
imccyu 61112eab8f fix(ui-chat): persist work details collapse timing 2026-10-10 14:22:02 +08:00
Turtle b0414b8a98 fix(worktree): disable lazy fetch through GIT_NO_LAZY_FETCH
--no-lazy-fetch exists only in Git 2.45+, so older Git exited 129 before
creating a worktree. The environment variable is also honored by the
2.39.4, 2.40.2, 2.41.1, 2.42.2, 2.43.4, and 2.44.1 maintenance releases.
2026-10-10 14:17:21 +08:00
imccyu 7d14714601 fix(workspace): retain session membership for missing directories 2026-10-10 14:16:42 +08:00
07akioni db0210088b Merge pull request #5570 from deepseek-harness/perf/trim-desktop-unused-assets
perf(desktop): trim Domino tooling and legacy KaTeX font formats
2026-10-10 13:49:38 +08:00
kingwl ea6140cee0 Merge master and resolve integration conflicts for #5570 2026-10-10 13:26:45 +08:00
07akioni 4840909ed8 Merge pull request #5528 from deepseek-harness/refactor/python-runtime-aliases
fix: preserve bundled Python interpreter aliases
2026-10-10 13:23:45 +08:00
fz 4f2fc8935a test(sdk): align replay initialization with request budget 2026-10-10 13:17:43 +08:00
imccyu b2dd2bf75b fix(ui-workspace): copy session id directly from menu 2026-10-10 13:13:47 +08:00
kingwl 2da2a27163 Merge master and resolve integration conflicts for #5528 2026-10-10 13:12:10 +08:00
fz 0bec9479ae feat(sdk): add explicit persisted session resume 2026-10-10 13:08:00 +08:00
Yichen Jiang 75b761f87e Merge remote-tracking branch 'origin/master' into worktree/command-delete-as-whole-21017f
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-10-10 13:02:14 +08:00
07akioni 56bdf15b4f Merge pull request #5685 from deepseek-harness/fix/composer-concentric-corners
fix(web): align statistics, card, and menu radii
2026-10-10 12:57:18 +08:00
imccyu 668b7f9746 fix(ui-workspace): show full session id as selectable text 2026-10-10 11:22:21 +08:00
imccyu f409d99b0c docs(ui-workspace): refresh inline session id pairing 2026-10-10 03:39:51 +08:00
imccyu 3cae1619a5 fix(ui-workspace): place session id copy action inline 2026-10-10 03:33:29 +08:00
imccyu 76d086754a fix(ui-workspace): update toast coverage and generated expectations 2026-10-10 03:11:57 +08:00
imccyu c3ce020b12 refactor(ui-workspace): render notices through keyed toast factory 2026-10-10 02:35:58 +08:00
ZiyaandZiyaZhang c7d61ecc11 fix(i18n): 补充内置插件中文文案并精简清单展示 (#5506)
* fix(i18n): add Chinese names and descriptions for built-in plugins

* fix(i18n): keep built-in plugin localization metadata-only

---------

Co-authored-by: ZiyaZhang <[email protected]>
2026-10-09 17:18:26 +00:00
imccyu 8423a388ec fix(ui-workspace): unify shortcut fork toast notifications 2026-10-10 00:59:01 +08:00
imccyu 38c700f08e feat(ui-workspace): view and copy session id from menu 2026-10-10 00:29:01 +08:00
yudshj 839033f993 fix(office): align runtime smoke and cross-platform coverage 2026-10-10 00:01:52 +08:00
yudshj f81494ce83 Merge remote-tracking branch 'origin/master' into codex/pr5054-refactor 2026-10-09 23:56:18 +08:00
yudshj 1f01ad6410 refactor(office): simplify test setup and verify progressive workflows 2026-10-09 23:38:09 +08:00
Tianyi Cui 926a2c1610 Merge pull request #5958 from deepseek-harness/architecture-review-docs
docs: give architecture review rules a per-artifact home
2026-10-09 23:24:34 +08:00
yudshj 310596f4aa refactor(office): trim unused skill metadata and launcher input forwarding 2026-10-09 23:05:26 +08:00
imccyu 1a83d013f5 docs: raise the root AGENTS.md ceiling for the standing orders
The root file passes the 1,960-word ceiling on the branch alone but exceeds it
once master's newest standing order is merged in, which is what `node 24 /
static` reports. Raise the ceiling to 2,080 and update the documented target in
the same change, per the "a too-low ceiling is a budget bug" rule.
2026-10-09 23:04:58 +08:00
imccyu 32aba5ea37 docs: address review comments on the rules directory
- package-surface: split the two plugin forms (a function plugin named-exports
  the Loader four, a service plugin default-exports its class), keep Host
  Service Definition exports and the Client `/client` export discipline, replace
  the wrong example that quoted live production code, state that the static
  client libraries and `packages/util/*` are closed to new members, and drop
  census numbers that rot on the next package.
- client-components: use the real Slot API — the inject face with the reserved
  `hooks` compartment, the parent's derived `renderSlot`, `registerFactory`
  scope declarations with local components at `renderFactorySlot` — drop the
  string seat, pass the injected `useResource` explicitly with a protocol key,
  and describe persistence as the spec's framework-run `persist` key.
- conversation-and-session: rewrite the reasoning example on the real
  `conversation.chat.reasoning.body` seat and the published `reasoning.content`
  Factory, and drop status annotations and future-tense spec-speak.
- remote-and-api: scope the JSON requirement to the wire payload so
  `@Remote({ mode: 'stream' })`, lookup arguments, and a trailing `AbortSignal`
  stay valid; drop a leaked Chinese parenthetical from the English page.
- general: measure through `benchmarks/` (`test:bench`, `check:ci:bench`,
  `test:bench:memory`) instead of an invented command, state the baseline
  without presuming a hook, and drop a leaked exception line.
- api-gateway: link the Remote and API rules instead of restating them.
- development.zh and AGENTS: drop an orphan anchor and widen the standing
  order's trigger to the directory's scope.

The earlier "retired routing skill" claim was wrong and is dropped: that skill
was never committed, so the diff deletes nothing under `.agents/skills/`.
2026-10-09 23:03:57 +08:00
imccyu 73dbbb751c docs: give architecture review rules a per-artifact home
Move `docs/defensive-patterns.md` into `docs/defensive-patterns/`, one page per
artifact plus a README router, and state each rule as its requirement, the
condition a reviewer judges it by, its boundary and approver, and a correct and
a wrong example.

- `general.md` (the moved page): the existing bug-class rules plus timing,
  value representation, shared-state ownership, decentralization, performance
  evidence, and migrations.
- `package-surface.md`, `remote-and-api.md`, `client-components.md`,
  `conversation-and-session.md`: the review requirements for those artifacts,
  linking type definitions and semantics to `docs/subsystems/` instead of
  restating them.
- `README.md`: the habits behind the rules and the route from artifact to page.
- `dsh-code-review` reads the owning pages before judging a diff; the
  `dsh-architecture-discipline` routing skill is retired in favour of the
  directory, and every inbound reference is repaired.
- Chinese counterparts, pairing records, and the documentation tier table are
  updated together.
2026-10-09 23:03:56 +08:00
kingwl 51ca4f0787 Merge master and refresh Chat README pairing 2026-10-09 19:51:29 +08:00
winewill 5feeb15c81 docs(desktop): document accepted packaging runner risks 2026-10-09 19:34:26 +08:00
Yichen Yan 23c29d067a fix(web): persist authenticated browser preferences on the Host (#4201)
* Persist authenticated browser preferences through the Host
* test(settings): cover recovery and remote preference refresh
* test(settings): read Host preferences from a fresh browser context
* test(settings): verify remote ConfigForm refresh at plugin entry
2026-10-09 19:27:00 +08:00
Turtle e0b1ba7412 fix(api-gateway): count only queued downlink writes as liveness
A write that completes at once only reached the local send buffer, so
counting it delayed dead-peer detection until that buffer filled. Only a
write that waited in the full buffer now resets the count, and the
connection owns all three activity signals.
2026-10-09 19:24:14 +08:00
yudshj 908763515e refactor(office): run Python checker directly 2026-10-09 19:20:22 +08:00
winewill 34c034e03b fix(desktop): keep preset cache maintenance independent of signing secrets 2026-10-09 19:17:41 +08:00
yudshj 379f9cd47b feat(office): add progressive skills and direct dsoffice commands 2026-10-09 19:14:55 +08:00
Turtle 898ed6d192 fix(api-gateway): count mux traffic as heartbeat liveness
A congested remote.mux link can hold the Pong behind data frames, so the
Host terminated sockets that were still moving data and the Client then
reconnected and resent. Any received frame or completed downlink write now
resets the missed-heartbeat count.
2026-10-09 19:08:58 +08:00
winewill c7921dbf0f fix(windows): address preset preparation and review findings 2026-10-09 18:42:22 +08:00
kingwl a0d31a9f27 fix(web): restore master composer geometry 2026-10-09 18:38:13 +08:00
Yifffan fddd704c7f Merge pull request #5969 from deepseek-harness/design/official-plugin-icons-safe-area
style(web): unify official plugin artwork and add drawing skill
2026-10-09 18:10:26 +08:00
07akioni 2dd43a3ef0 Merge pull request #5565 from deepseek-harness/fix/prune-desktop-shell-build-files
desktop: prune shell source maps and build caches
2026-10-09 18:07:28 +08:00
TurtleandYifffan 7add03d235 Credit review by @Yifffan
Co-authored-by: Yifffan <[email protected]>
2026-10-09 18:01:44 +08:00
Yif 71947ec3fa fix: address artwork review and separate UX reference coverage 2026-10-09 17:58:18 +08:00
07akioni 27667dcf33 Merge master and refresh desktop README pairing for #5565 2026-10-09 17:57:26 +08:00
07akioni deb90c38e6 Merge pull request #5576 from deepseek-harness/fix/desktop-dependency-alignment
perf(deps): align desktop dependencies and share client libraries
2026-10-09 17:52:53 +08:00
07akioni 50cec2dcbf Merge pull request #5559 from deepseek-harness/fix/prune-non-windows-conpty
Trim Windows ConPTY sources from non-Windows Desktop packages
2026-10-09 17:50:31 +08:00
07akioni 614d7d7ef3 Merge pull request #5563 from deepseek-harness/perf/onboarding-lossless-webp
perf(client): encode onboarding illustrations as lossless WebP
2026-10-09 17:49:04 +08:00
Turtle 00c482e271 Show downscale facts and localize the read_image size line
Name the original size when the store downscaled the image, keep repeated
whitespace in the path, localize the Chinese size line, and gate the card
on the envelope separately from collecting extra text.
2026-10-09 17:39:28 +08:00
07akioni d743267388 Merge pull request #5946 from deepseek-harness/release-0.2.1-alpha.2
release(dsh): 0.2.1-alpha.2
2026-10-09 17:31:32 +08:00
Turtle 4a9979cea0 Show read_image path and size under the image
The expanded read_image row no longer repeats the file name above the
image or prints the raw <path>/<type>/<content> envelope below it. It now
shows the full recorded path and each image's WxHpx and byte size in the
small code font; text appended by post-execute hooks stays visible.
2026-10-09 17:26:04 +08:00
Yif 64d56a968c fix(plugin): order badge package resources for workspace constraints 2026-10-09 17:24:39 +08:00
Yif 6c9f26ec48 style(web): unify official plugin artwork and add drawing skill 2026-10-09 17:00:38 +08:00
Turtle 5876567dfc Merge pull request #5915 from deepseek-harness/turtle/exp-badge-align-42f8ebeac170
fix(web): align and localize Auto review permission option
2026-10-09 16:50:08 +08:00
07akioni 65b8b7e853 Merge pull request #5557 from deepseek-harness/fix/prune-python-runtime-tests
Prune NumPy/pandas upstream tests from bundled Python runtimes
2026-10-09 16:48:52 +08:00
Tianyi Cui b9863a9e28 fix(ptc): cancel pending runs when Session policy changes
Register calls before awaiting prior process cleanup. Carry policy cancellation into both Node execution modes and retain each admission until its call settles. Track persistent calls during provider disposal as well.

Cover unchanged-mode temporary escalation and policy changes that return to the original mode while cleanup is pending. Document the admission guarantee.

Validation: 308 focused tests passed, one skipped; both changed source files have 100% coverage. Two built-runtime smokes, two selected Session snapshots, all 43 doc-sync gates, and typed lint passed.
2026-10-09 16:43:56 +08:00
07akioni 78be1e5e46 Merge master into fix/prune-python-runtime-tests 2026-10-09 16:37:22 +08:00
Yudong Han 18643292ae Merge pull request #5369 from deepseek-harness/fix/python-wheel-size-5250
fix: download optional Python runtime resources explicitly
2026-10-09 16:32:27 +08:00
07akioni d911abce6b Merge pull request #5523 from deepseek-harness/refactor/desktop-pnpm-dedupe
refactor(desktop): deduplicate bundled pnpm
2026-10-09 16:31:58 +08:00
kingwl 9c8d8efd22 Merge origin/master into fix/composer-concentric-corners 2026-10-09 16:30:47 +08:00
Yichen Jiang f20a0190ba Merge remote-tracking branch 'origin/master' into worktree/command-delete-as-whole-21017f
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-10-09 16:24:05 +08:00
kingwl dd87b0f82b fix(web): preserve composer spacing and compact statistics corners 2026-10-09 16:23:06 +08:00
Ruilin Geng 5f3c7b98e2 Merge pull request #4945 from deepseek-harness/fix/4931-composer-focus
fix(client): preserve cursor and selection on composer whitespace clicks
2026-10-09 16:22:17 +08:00
creatixchu aa5da68de6 docs(cua): describe the future package group without a stale path 2026-10-09 16:19:54 +08:00
kingwl 226ae8d2fd Merge master and resolve integration conflicts for #5576 2026-10-09 16:14:10 +08:00
imccyu 311fc54705 Merge pull request #5955 from deepseek-harness/fix-chat-height-reset
fix(ui-chat): reset layout on mode changes and running session returns
2026-10-09 16:13:23 +08:00
kingwl db5c4aaab9 Merge master and resolve integration conflicts for #5523 2026-10-09 16:12:44 +08:00
creatixchu 97b884e841 docs(cua): state the Windows promotion condition 2026-10-09 16:12:01 +08:00
Tianyi Cui 70d443903c test(ptc): reproduce policy changes before process launch
Add a parameterized admission regression for per-call and persistent-in-memory execution. Change the Session policy synchronously after submitting the runtime call and require cancellation before spawn.

The two new cases intentionally fail on the reviewed PR #5035 head: execution succeeds with danger-full-access after the Session becomes read-only. The 47 existing host-protocol and policy-process tests pass. No production changes.
2026-10-09 16:10:40 +08:00
gengruilin 18678f4851 Merge origin/master into fix/4931-composer-focus 2026-10-09 16:10:14 +08:00
Yichen Jiang ba41fbdf1d Merge pull request #5949 from deepseek-harness/worktree/fix-model-catalog-visibility
fix(models): hide unconfigured models and unavailable selection IDs
2026-10-09 16:09:53 +08:00
creatixchu 6dba7799b4 docs(cua): keep provider references in experimental group 2026-10-09 16:09:36 +08:00
Turtle a1a43cbb4e test(web): restore access mode after narrow Auto check; clarify EXP docs 2026-10-09 16:07:04 +08:00
yudshj 0616cbc77b test: keep locale regression commands ASCII on Python 3.10 2026-10-09 16:06:27 +08:00
Turtle e7c4ef0426 fix(web): raise Auto review icon A by 0.4px 2026-10-09 16:03:26 +08:00
fz 61fa9c0bab docs(jobs): correct job wait migration guidance 2026-10-09 16:01:29 +08:00
winewill 5801fae7dc fix(windows): recreate empty runner checkout before actions start 2026-10-09 16:01:20 +08:00
Yichen Jiang e03a21166d test(models): update unavailable selection browser flow 2026-10-09 15:58:42 +08:00
winewill 370a272bb1 fix(windows): reset runner checkout without traversing dependency junctions 2026-10-09 15:57:20 +08:00
yudshj 4fd85be130 fix: validate optional Python resources and isolate downloads 2026-10-09 15:52:59 +08:00
imccyu 7ee4b46782 fix(ui-chat): reset layout on mode changes and running session returns 2026-10-09 15:51:46 +08:00
creatixchu 2fac8a2ec4 fix(cua): follow updated PTC launch configuration 2026-10-09 15:49:16 +08:00
creatixchu c36a40656b refactor(cua): move native provider into experimental 2026-10-09 15:46:42 +08:00
creatixchu 17bfa6fd3c Merge updated persistent PTC into native CUA 2026-10-09 15:43:43 +08:00
Turtle 29b89df1b8 feat(web): add Auto review shield-A permission icon 2026-10-09 15:40:16 +08:00
Turtle 84f6a99514 Merge pull request #5942 from deepseek-harness/turtle/plan-mode-reject-33e1a9fe3ad2
fix(plan-mode): end the turn when the user dismisses a plan review
2026-10-09 15:28:21 +08:00
winewill 8ac0f9b7f5 fix(windows): keep local preset auto versions independent of upload settings 2026-10-09 15:26:28 +08:00
creatixchu 6ae7312582 test(permissions): restore synchronous preset event order 2026-10-09 15:25:51 +08:00
Dudu-0223 4cf1a3a2ca Merge pull request #5923 from deepseek-harness/subagent-preset-composition
refactor(subagent): compose new children through presets
2026-10-09 15:24:36 +08:00
winewill 373aec3d30 build(windows): add machine presets and signed CI packaging 2026-10-09 15:18:56 +08:00
creatixchu b02eff33f2 chore(types): remove retired sandbox test assertion baseline 2026-10-09 15:14:56 +08:00
Ziya f197d71940 Merge pull request #5921 from deepseek-harness/fix/voice-input-component-labels
fix: localize voice input component names and descriptions
2026-10-09 00:14:36 -07:00
07akioni e2c410ef84 release(dsh): 0.2.1-alpha.2 2026-10-09 15:13:40 +08:00
turtle1999 dfca3c3c6f fix(session): use namespace exports for JSONL persistence plugin 2026-10-09 15:10:49 +08:00
creatixchu 99f5750092 docs(ptc): use explicit launch configuration in persistent setup 2026-10-09 15:10:40 +08:00
creatixchu 42cf8c5ee0 Merge remote-tracking branch 'origin/master' into codex/ptc-review-policy
# Conflicts:
#	apps/desktop/tests/ptc-runtime.spec.ts
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/ptc-runtime/ptc-runtime-node/README.i18n.yaml
#	packages/ptc-runtime/ptc-runtime-node/README.md
#	packages/ptc-runtime/ptc-runtime-node/README.zh.md
#	packages/ptc-runtime/ptc-runtime-node/src/index.ts
#	packages/ptc-runtime/ptc-runtime-node/src/launch.ts
#	packages/ptc-runtime/ptc-runtime-node/tests/launch.spec.ts
2026-10-09 15:10:13 +08:00
creatixchu f6251a2dbf test(ptc): remove awaits from synchronous permission callers 2026-10-09 15:08:06 +08:00
creatixchu 9b9630e6d8 fix(ptc): preserve standalone runtime composition 2026-10-09 15:07:42 +08:00
creatixchu f660432b37 test(ptc): record synchronous policy changes before cleanup 2026-10-09 15:06:25 +08:00
creatixchu 31783b2845 test(ptc): align policy cleanup fixtures with typed APIs 2026-10-09 15:04:17 +08:00
creatixchu 4138fd1912 fix(ptc): simplify registered cleanup settlement 2026-10-09 15:02:58 +08:00
creatixchu 244ca73755 fix(ptc): keep policy cleanup waits inside PTC 2026-10-09 15:02:01 +08:00
Turtle 0155017b73 fix(plan-mode): exit plan mode only on approval in plan guidance
A dismissed review now returns a successful exit_plan_mode result, so
the plan policy must not treat any success as leaving plan mode. Also
update the user-facing description of a dismissed review.
2026-10-09 14:58:20 +08:00
Yichen Jiang 02f5423070 fix(models): hide unconfigured DeepSeek models and unavailable selections 2026-10-09 14:56:27 +08:00
Yichen Jiang 510cd4cdcc fix(web): cover every deletion path in two-step chip deletion
Decide the command chip's selecting step on deletion input events as well
as the character-deletion command, so iOS ranged deleteContentBackward no
longer removes the chip in one press. A selected chip now clears only
after a keydown that produced no character deletion, which keeps platform
shortcuts such as macOS Ctrl+H working.

A failed command submission settles to the leading chip like every other
transition, so submit-settled no longer carries the draft. The claim event
reuses the same handler. The seat rule runs as chip and paragraph
transforms instead of walking the whole document on every update.

Document the reload limitation under Known Limitations and assert that a
chip ending its block does not grow the composer.
2026-10-09 14:52:21 +08:00
Ziya 640e28cd94 feat(web): reorganize plugin settings and add experimental catalog page (#5922)
Group built-in settings before optional and installed plugins, and open the full experimental catalog on a separate page.

Preserve detail navigation and unsaved configuration when installation finishes, and use the visible More label as the accessible name.
2026-10-08 23:42:56 -07:00
turtle1999 f6eb0c39f0 docs(review): invoke Cordis audit during code review 2026-10-09 14:42:07 +08:00
ZiyaZhang 799fede7bc fix: align speech recognition service terminology 2026-10-08 23:41:37 -07:00
Turtle 18a4bc4093 fix(plan-mode): end the turn when the user dismisses a plan review
Choosing "Request changes" on a plan review rejected the question, and
exit_plan_mode turned that into a failed tool result asking the model to
stop. The loop then spent one more model request only to have the model
wait. A dismissed review now returns { approved: false } and concludes the
turn, so the user's next message starts the following request.
2026-10-09 14:39:43 +08:00
ZiyaZhang e3909dcc6e Merge master into fix/voice-input-component-labels 2026-10-08 23:35:20 -07:00
Dudu-0223 540607cf2a test(web): register fork reminder snapshot in host compiler 2026-10-09 14:35:18 +08:00
Dudu-0223 194b985f13 test(subagent): reuse Web preset pins for fork reminders 2026-10-09 14:34:00 +08:00
creatixchu b17c74a0e7 test(cua): refresh capture recovery session replay 2026-10-09 14:31:41 +08:00
Yichen Jiang aad5ab5067 Merge pull request #5937 from deepseek-harness/worktree/fix-stale-build-workspaces
feat(build): add make clean shortcut
2026-10-09 14:30:15 +08:00
creatixchu 7a015d6562 test(cua): record request-local capture busy recovery 2026-10-09 14:29:00 +08:00
fz 3d89cded59 refactor(jobs): remove launcher shutdown registry 2026-10-09 14:21:29 +08:00
turtle1999 9eda3a064a docs(cordis): explain yielded disposal workaround 2026-10-09 14:15:37 +08:00
turtle1999 22d0bd19a3 fix(session): preserve JSONL persistence default plugin import 2026-10-09 14:10:52 +08:00
winewill d16abc2745 Merge pull request #5898 from deepseek-harness/build/windows-ci
build(windows): add manual installer CI and harden Desktop runtime patches
2026-10-09 14:06:31 +08:00
Dudu-0223 256b8f828d test(subagent): cover inherited schedule tools and address review 2026-10-09 14:05:07 +08:00
creatixchu 1ad84ece93 fix(cua): bound socket backpressure and allow AX cancellation to settle 2026-10-09 14:05:03 +08:00
imccyu d6692ac626 Merge pull request #5305 from deepseek-harness/worktree-flownew
feat(web): 增加工作过程收起时机实验开关
2026-10-09 14:03:54 +08:00
Yichen Jiang d3454a1aa3 chore(build): limit PR to the make clean shortcut 2026-10-09 14:01:12 +08:00
creatixchu 258a0f65e7 fix(cua): finish shared socket cleanup without waiting for timers 2026-10-09 13:57:05 +08:00
ZiyaandZiyaZhang 398f3f7ee3 fix(web): 弱化并左对齐思考翻译切换按钮 (#5911)
* fix(web): soften and align the reasoning translation toggle

* fix(web): scope translation toggle styles explicitly

---------

Co-authored-by: ZiyaZhang <[email protected]>
2026-10-09 05:57:02 +00:00
turtle1999 4d9047be2d fix(session): retain JSONL resources through provider-triggered teardown 2026-10-09 13:46:43 +08:00
Yichen Jiang 0b5671d956 fix(build): exclude stale package directories from workspace bundles 2026-10-09 13:46:34 +08:00
yudshj 305021fcd6 fix: preserve Linux SEA layout and stable snapshot references 2026-10-09 13:46:00 +08:00
turtle1999 2075717e2f docs(cordis): audit cleanup dependency lifetimes as P0 2026-10-09 13:42:52 +08:00
Yichen Jiang 98d93db18f feat(web): claim slash commands as atomic composer chips
A claimed command is now a CommandChipNode on the draft's leading seat
instead of styled literal text. The submit machine follows the chip: it
holds the claim while the chip leads the document, releases it when the
chip is deleted or displaced, and re-enters claimed when history
restores the chip. Deleting at the chip's edge takes two steps: the
first Backspace or Delete selects the chip, the next removes it.

The claim-token decoration transform and the text-reference precedence
rule are removed with the literal token.
2026-10-09 13:38:12 +08:00
creatixchu 6539baeda5 test(cua): cover shared capture cancellation and connection cleanup 2026-10-09 13:35:49 +08:00
imccyu 37d9dadd4e fix(ui-chat): retain fold surplus as bottom space 2026-10-09 13:35:20 +08:00
imccyu 9db5308d9b fix(ui-chat): combine fold displacement with input following 2026-10-09 13:35:19 +08:00
imccyu f1dcb15b9c fix(ui-chat): tolerate subpixel rounding at the content floor 2026-10-09 13:35:18 +08:00
imccyu 7a504ac3e0 fix(ui-chat): settle fold following and apply review cleanups 2026-10-09 13:35:18 +08:00
imccyu bde4bc78a6 fix(ui-chat): avoid pathological flow selector matching 2026-10-09 13:35:17 +08:00
imccyu 00d9dd1b81 fix(ui-chat): preserve flow layout through slot anchors 2026-10-09 13:35:16 +08:00
imccyu a0a9aef5ec feat(ui-chat): add independent collapse timing and viewport-scoped flow 2026-10-09 13:35:16 +08:00
yudshj 1b8532b7c2 fix: keep Python executable packaging inside the deployed closure 2026-10-09 13:34:56 +08:00
creatixchu 1e67f8da60 feat(cua): share native helper across Agent connections 2026-10-09 13:29:45 +08:00
Turtle 039fe73c55 Merge pull request #5917 from deepseek-harness/docs/error-handling-style
docs: define error handling responsibilities and failure guarantees
2026-10-09 13:28:43 +08:00
07akioni 544fe59fbd Merge pull request #5909 from deepseek-harness/07akioni/electron-44-7-addon-019
chore(deps): upgrade Electron, electron-builder, and native loader
2026-10-09 13:26:18 +08:00
Yudong Han ea4f2d2929 Merge pull request #5929 from deepseek-harness/fix/sensevoice-vad-onset-clipping
fix(speech-to-text-sensevoice): restore the onset a cold VAD drops
2026-10-09 13:17:10 +08:00
turtle1999 1875ec4ab8 docs: keep error handling guidance concise and clarify ownership 2026-10-09 13:09:59 +08:00
winewill f10cfbad34 docs(desktop): clarify Windows runner routing and pending builds 2026-10-09 13:00:41 +08:00
Yudong d6042ca0d7 fix(speech-to-text-sensevoice): restore the onset a cold VAD drops
Silero cannot back-date the first segment of a cold detector, so it
reports a start index several frames after speech actually began. Every
recording therefore lost its opening audio: measured across 50
utterances the median loss was 102 ms and the worst 230 ms — a full
syllable, which surfaced as dropped leading words ("麻烦把发票…" →
"把发票…", "用 Python…" → "写一个 Python…").

Only the first segment is affected; later segments aligned within 3 ms
because the detector retains history by then. Tuning cannot fix it:
lowering minSpeechSeconds from 0.25 s to 0.05 s left the median loss at
110 ms, and lowering the threshold to 0.2 still lost up to 174 ms while
risking false triggers.

Restore the dropped onset from the recording itself, bounded by the new
vadOnsetPaddingSeconds (default 0.3 s, zero disables). Measured on the
same corpus with identical DSH settings, this recovers the full no-VAD
accuracy and in the technical domain exceeds it, since segmentation also
trims silence:

  语料        条件     无VAD    VAD丢起音  VAD+回填   改善
  audio      clean   12.50%    16.33%    12.50%   23.5%
  audio      noisy10 17.74%    19.15%    17.94%    6.3%
  audio_tech clean   10.34%    15.65%     9.81%   37.3%
  audio_tech noisy10 25.73%    30.50%    26.26%   13.9%

Inference cost is unchanged (2.6 s vs 2.6 s on both clean corpora).
2026-10-09 12:51:54 +08:00
TurtleandYifffan e9292ba398 fix(web): show Auto review EXP only in menu options
Co-authored-by: Yifffan <[email protected]>
2026-10-09 12:23:02 +08:00
Dudu-0223 17016e16ee test(subagent): share parent schemas in snapshot header 2026-10-09 12:12:34 +08:00
Dudu-0223 648ab5167e refactor(subagent): compose new children through presets 2026-10-09 12:12:02 +08:00
yudshj 89f35fe2e9 fix: download optional Python runtime resources explicitly 2026-10-09 12:06:50 +08:00
Turtle 35f1a46a01 test(web): refresh Auto review trigger goldens and docs 2026-10-09 12:05:56 +08:00
ZiyaZhang bbfdcae84c fix: localize voice input component metadata 2026-10-08 21:01:06 -07:00
turtle1999 4c8d377a23 docs: define error handling responsibilities and failure guarantees 2026-10-09 11:51:51 +08:00
winewill 9ae9df9976 build(windows): route manual packaging to dedicated self-hosted runner 2026-10-09 11:47:29 +08:00
Yichen Jiang 15c10e0e87 Merge pull request #5064 from deepseek-harness/worktree/ssh-helper-binaries
feat(ssh): ship standalone helper runtimes for Linux and macOS
2026-10-09 11:46:00 +08:00
creatixchu a08b54b818 test(cua): pin screenshot failure diagnostics in replay 2026-10-09 11:43:44 +08:00
Turtle 18fd3d06c4 fix(web): align and localize experimental permission mode 2026-10-09 11:42:28 +08:00
creatixchu 705a96eefe feat(cua): trace screenshot phases and retain failure diagnostics 2026-10-09 11:40:45 +08:00
Yichen Jiang d6a699591b Merge remote-tracking branch 'origin/master' into worktree/sleepy-grothendieck-64df7b
# Conflicts:
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/api/session-controller/README.i18n.yaml
#	packages/extensions/cordis-client-runner/tests/api-catalog.client.spec.ts
2026-10-09 11:38:51 +08:00
07akioni c944c38944 docs(deps): explain coupled Electron and addon release exemptions 2026-10-09 11:37:56 +08:00
Yichen Jiang f7661e8a05 docs(session): record arrival order, logged restore presets, and idempotent select
Update the blank reuse Agent Note and the writer acquisition note for the
review fixes: arrival-order claims with directory checks before preset
resolution, restoration from the logged preset, latest-connection coalescing,
and the registry select that leaves an already composed blank unchanged.
2026-10-09 11:29:32 +08:00
Yichen Jiang 5087220bea fix(preset): keep a blank Session that already runs the selected preset
The Creator entry names cordis in its session.create request, and its chip may
still select cordis when the Session list updates before the new projection
arrives. select recomposed and logged unconditionally, so that race appended a
second agent-preset/selected record and announced tools/change again. select
now leaves a blank Session that records the preset and runs its current
revision unchanged; a replaced definition still recomposes and logs. The
Creator Web scenario pins a single selection record.
2026-10-09 11:29:26 +08:00
Yichen Jiang 3c1e357132 fix(web): join only the latest Workspace connection and restore logged presets
Keep one Workspace navigation options type: StartSessionOptions now carries
agentPreset, and openWorkspace and connectWorkspace take its preset field.
A connection joins the latest in-flight connection to its Workspace only when
both name the same preset, so a superseding request always reaches the Host,
and the map is keyed by the branded WorkspaceId instead of a composite
string. The fresh New Session path no longer accepts a preset it would drop.
Restoring a saved blank reloads that Session's projections first, because
listed values are cached hints that can lag the log after an unclean exit.
The New Session upgrade guide points to the session.create reuse guide.
2026-10-09 11:29:17 +08:00
Yichen Jiang 1b8a55116e fix(session): claim named Sessions in arrival order before resolving presets
session.create resolved the requested preset before queueing on the named
identity, so a later request whose preset resolved first could run first, and
an undeclared preset masked the directory conflict the README promises.
Queue first, check the named Session's directory and ownership, then resolve
the preset inside the queue, and report the preset each request left the
Session running instead of reading it after the queue moved on. The no-roster
conflict message now names its actual cause.
2026-10-09 11:29:04 +08:00
07akioni 4a3333b90c chore(deps): upgrade electron-builder to 26.17.0 2026-10-09 11:28:07 +08:00
07akioni a33f16057c chore(deps): upgrade Electron to 44.7.0 and native loader to 0.1.9 2026-10-09 11:22:14 +08:00
Yichen Jiang ef46c7ae77 docs(ssh): clarify executable helper deployment decisions 2026-10-09 11:15:33 +08:00
imccyu 68d37a3755 Merge pull request #5904 from deepseek-harness/messageslot
refactor(web): compose reasoning content through a shared slot factory
2026-10-09 10:40:50 +08:00
imccyu 7dce22d2f2 fix(test): name the reasoning fixture render result type 2026-10-09 02:08:05 +08:00
imccyu 9018cf697d fix(test): preserve reasoning slot types in fixtures 2026-10-09 02:01:58 +08:00
imccyu 70caea2ee3 style(test): align reasoning fixtures with lint rules 2026-10-09 01:59:37 +08:00
imccyu 6576ff5bf1 test(web): align translation replay with plugin-owned controls 2026-10-09 01:57:14 +08:00
imccyu a561924313 test(web): migrate reasoning fixtures and refresh slot catalogs 2026-10-09 01:56:26 +08:00
imccyu 3385180b9b refactor(web): compose reasoning content through a shared slot factory 2026-10-09 01:43:17 +08:00
Tianyi Cui 0454b67568 Merge pull request #5902 from deepseek-harness/fix/stable-conversation-titles
fix(session-title): keep adequate conversation titles unchanged
2026-10-09 00:24:22 +08:00
Dudu-0223 a9afe76200 feat(subagent): select and restore presets for spawned agents 2026-10-09 00:13:17 +08:00
Ziya 76a60e0f0c Merge pull request #5891 from deepseek-harness/ux/reasoning-translation-toggle
fix(web): 简化思考原文与译文切换入口
2026-10-08 09:10:35 -07:00
Tianyi Cui 353fe00d63 refactor(session-title): separate provider model strategies 2026-10-08 23:37:11 +08:00
ZiyaZhang cbd64a0abf fix(web): address reasoning toggle review feedback 2026-10-08 07:31:13 -07:00
creatixchu a61dccbd36 fix(cua): align package version with synchronized workspace 2026-10-08 22:15:20 +08:00
creatixchu 51e563d502 test(cua): refresh replay after parent synchronization 2026-10-08 21:55:43 +08:00
creatixchu e74ba9b712 fix(cua): adapt replay fixtures to session working directories 2026-10-08 21:53:13 +08:00
creatixchu 4431c95da1 Merge feat/persistent-ptc into feat/experimental-dsh-cua 2026-10-08 21:49:23 +08:00
ZiyaZhang 1d37aabe99 fix(session-title): preserve adequate conversation titles 2026-10-08 06:37:56 -07:00
creatixchu 6344383228 test(ptc): refresh web permission and tool instruction snapshots 2026-10-08 21:28:28 +08:00
ZiyaZhang 20d7713049 fix(web): match reasoning toggle typography and color 2026-10-08 06:16:31 -07:00
creatixchu 433742a828 test(workflow): cover unconfined execution under full access 2026-10-08 21:15:05 +08:00
creatixchu fdb60edc33 test(workflow): type the evaluated guest completion value 2026-10-08 21:12:33 +08:00
creatixchu c2434286d1 test(workflow): provide the guest import loader in REPL coverage 2026-10-08 21:11:03 +08:00
creatixchu 834a77108d test(ptc): cover preset contention and REPL workflow expressions 2026-10-08 21:09:46 +08:00
creatixchu af930836ba test(ptc): refresh mode-switch snapshot tool descriptions 2026-10-08 21:05:40 +08:00
fz e493fd40dc fix(jobs): use short UUIDs for visible job ids 2026-10-08 21:04:58 +08:00
creatixchu b7dbd7bb03 Merge master into feat/persistent-ptc 2026-10-08 20:58:22 +08:00
ZiyaZhang 42da4c1b58 test(web): verify reasoning header alignment and sticky container 2026-10-08 05:57:48 -07:00
Turtle 8af3b410f2 Merge pull request #5900 from deepseek-harness/fix/shell-activity-timeout-diagnostics
test(subprocess): name the observed activity in shell-activity timeouts
2026-10-08 20:57:04 +08:00
turtle1999 50496cc19e test(subprocess): address review on the activity timeout message
Use the package's own `SubprocessTerminalActivity['state']` instead of a derived
alias, label the samples as `state:revision` so a reader cannot mistake the
suffix for a count, name the summariser's bound as a group count, and state only
the two observables the prompt count supports.

Refs #5755
2026-10-08 20:46:37 +08:00
涂轶翔 2ec781bf7c Merge pull request #5887 from deepseek-harness/feature/session-compatibility-policy
Allow reviewed same-version Session schema changes
2026-10-08 20:40:59 +08:00
turtle1999 bce796c337 test(subprocess): name the observed activity in shell-activity timeouts
An activity poll that times out reports only "unknown" or "Matcher did not
succeed in time". The Linux standby has failed that way twice, at different
polls, and the log shows nothing about what `inspect()` read, which returns
`unknown` for several distinct conditions.

Every activity poll now records the state and revision it samples and counts the
prompts printed while it waits, so a timeout names both. Repeated samples
collapse and the printed list is bounded. Timeouts, intervals and expectations
are unchanged, and where the poll budget equals the test budget the test timer
can still preempt this message.

Refs #5755
2026-10-08 20:29:12 +08:00
Yixiang Tu fad2076073 Clarify recorded compatibility decisions and review output 2026-10-08 20:26:57 +08:00
Yixiang Tu de4a771c72 Simplify same-version acknowledgements to explicit decisions 2026-10-08 20:26:57 +08:00
Yixiang Tu 1d6128d77e Correct V4 record compatibility review guidance 2026-10-08 20:26:57 +08:00
Yixiang Tu b2a93b6307 Accept todo identifiers in persistence review evidence 2026-10-08 20:26:57 +08:00
Yixiang Tu 5c5b51257a Allow reviewed same-version Session schema changes 2026-10-08 20:26:57 +08:00
Turtle fd78c948a5 Merge pull request #5551 from deepseek-harness/turtle/request-extension-fail-bc456a3d035d
fix(llm): keep request-extension failures from blocking model requests
2026-10-08 20:23:32 +08:00
Turtle bd097552fd Merge pull request #5868 from deepseek-harness/fix/snapshot-title-event-wait-diagnostics
test(ci): retain snapshot wait and coverage worker-exit diagnostics
2026-10-08 20:19:09 +08:00
TurtleandLegGasai 19102a4306 Credit review by @LegGasai
Co-authored-by: LegGasai <[email protected]>
2026-10-08 20:11:20 +08:00
Yichen Yan f7aad52bc5 Merge pull request #5087 from deepseek-harness/yyc/web-native-https
feat(web): 支持原生 HTTPS 监听
2026-10-08 20:03:04 +08:00
fz 7af8741513 Merge origin/master into fix/5520-job-session-timestamps 2026-10-08 20:02:49 +08:00
turtle1999 e2766698df fix(coverage): keep attributing a worker exit that raced a teardown
An unexpected fork exit can close the worker's channel under a send, which
Vitest reports as a runner-level worker error instead of the clean exit. It
then tears the worker down before the ChildProcess exit event, and
DiagnosticForkWorker treated that teardown as an orderly shutdown: it cleared
the observer and marked the exit expected, so the coverage log lost the pid,
file, code and signal it exists to report.

A worker error observed before a stop now keeps the observer, and a stop
requested after that error no longer marks the exit as expected.

Vitest reports one such exit either as the clean exit path or as a
runner-level worker error, so the spec accepts both forms and compares the
record against whichever appeared.

Refs #5813
2026-10-08 19:59:17 +08:00
winewill 4db01bb5ca docs(desktop): consolidate CI build version guidance 2026-10-08 19:57:49 +08:00
Yichen Yan ac080346f0 Support native HTTPS Web listeners 2026-10-08 19:49:01 +08:00
Yichen Yanandliukx0205 4f8e70f936 Support concrete Web listener bind addresses (#3979)
Co-authored-by: liukx0205 <[email protected]>
2026-10-08 19:48:56 +08:00
Turtle 2a4b025743 Merge pull request #5630 from deepseek-harness/turtle/plugin-market-index-format
docs(notes): propose plugin market index format
2026-10-08 19:48:16 +08:00
imccyu b492219bd2 Merge pull request #5508 from deepseek-harness/worktree-waitmigration
feat(session): guard migration in sidebar fork and subagent catalogs
2026-10-08 19:47:55 +08:00
turtle1999 39821cdc67 Merge remote-tracking branch 'origin/master' into fix/snapshot-title-event-wait-diagnostics 2026-10-08 19:45:16 +08:00
winewill 8ce963bd29 fix(desktop): address Windows packaging review findings 2026-10-08 19:26:40 +08:00
Yichen Jiang c17df5dbac Merge pull request #5895 from deepseek-harness/worktree/fix-deepseek-v4-1-flash-name
fix(llm-deepseek): correct V4.1 Flash display name
2026-10-08 19:12:13 +08:00
winewill d7f7fc6095 Merge origin/master into build/windows-ci 2026-10-08 18:57:37 +08:00
winewill 2f4dbc0fa9 build(windows): add manual installer CI and scope desktop runtime patches 2026-10-08 18:54:47 +08:00
Yichen Jiang 042b4e8258 fix(llm-deepseek): correct V4.1 Flash display name 2026-10-08 18:53:59 +08:00
Yichen Jiang 64c47c6306 test(client): update the inspect catalog's uiWorkspace signatures
openWorkspace and connectWorkspace accept NewSessionOptions, so the Client
Cordis inspect catalog spec pinned outdated signatures and failed both
coverage lanes. Declare openWorkspace on one line so the generated catalog
signature carries no collapsed line breaks, regenerate the catalog, and pin
the new signatures.
2026-10-08 18:52:32 +08:00
Yichen Yanandliukx0205 cb9a590c86 Support concrete Web listener bind addresses
Co-authored-by: liukx0205 <[email protected]>
2026-10-08 18:25:43 +08:00
Yichen Yan d394af8ee8 Merge pull request #4200 from deepseek-harness/yyc/web-directory-picker-reviewed
fix(web): use in-page directory picker for trusted remote hosts
2026-10-08 18:25:38 +08:00
涂轶翔 abd3380a52 Merge pull request #4934 from deepseek-harness/feat/pi-ai-087
feat(llm-pi-ai): support in-history system prompts and tool updates
2026-10-08 18:18:18 +08:00
creatixchu f8f0abda80 fix(sandbox): await execution effect disposal 2026-10-08 17:57:07 +08:00
creatixchu 046d722c14 fix(ptc): preserve caller context across process control callbacks 2026-10-08 17:45:18 +08:00
Yichen Jiang d7f96a2731 docs(session): add the session.create blank reuse upgrade guide
session.create now reuses a named Session only while it is a reusable blank,
runs the requested or default preset, and creates a new Session otherwise.
Record the migration for JSON-RPC clients and Client plugins that name a
sessionId, including the removed session/writer-held result and the
existingPreset detail.
2026-10-08 17:43:02 +08:00
Yichen Jiang 5a461467db Merge remote-tracking branch 'origin/master' into worktree/sleepy-grothendieck-64df7b
# Conflicts:
#	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
2026-10-08 17:39:59 +08:00
creatixchu 87013959f8 test(ptc): pin cancellation replay and resource cleanup branches 2026-10-08 17:25:50 +08:00
_Kerman 0a447b374e Merge pull request #5888 from deepseek-harness/xtr/fix-trajectory-request-lifecycle
fix(web): align trajectory request lifecycle states
2026-10-08 17:12:39 +08:00
creatixchu ee15e104d2 test(ptc): verify cleanup recovery and scoped execution admission 2026-10-08 17:10:55 +08:00
Yixiang Tu ce7f8338e4 refactor(llm-pi-ai): minimize context conversion changes 2026-10-08 17:07:06 +08:00
fz 4837be0d55 test(jobs): refresh team inbox lifecycle snapshots 2026-10-08 17:06:54 +08:00
creatixchu 209684aaae fix(ptc): retain per-call cleanup until process exit is observed 2026-10-08 17:05:07 +08:00
fz 5e6b0a5c53 Merge origin/master into fix/5520-job-session-timestamps 2026-10-08 16:56:04 +08:00
creatixchu 49f7919762 test(ptc): cover policy changes during nested tool execution 2026-10-08 16:55:32 +08:00
ZiyaZhang 1f87f2561d fix(web): simplify reasoning translation controls 2026-10-08 01:50:30 -07:00
_Kerman 98ee943f86 test(web): register retry request snapshot inventory 2026-10-08 16:48:40 +08:00
imccyu dc22e172f4 feat(session): show header migration status before expansion 2026-10-08 16:47:45 +08:00
imccyu fb1b6a33ba test(session): cover migration-safe forks and projection reads 2026-10-08 16:45:26 +08:00
imccyu c1df683f8c feat(client): guide migration-required forks and subagent discovery 2026-10-08 16:45:26 +08:00
imccyu a2dd724c60 feat(session): expose format status and defer frontend-triggered migration 2026-10-08 16:45:25 +08:00
imccyu ba28ceb9e4 docs(session): describe explicit history preparation and migration guidance 2026-10-08 16:45:25 +08:00
fz 932a19b0f9 test(web): use returned ids for background job scenarios 2026-10-08 16:44:25 +08:00
creatixchu 6885d662d2 refactor(ptc): move mode-change coordination into sandbox policy 2026-10-08 16:43:00 +08:00
Dudu-0223 ea0980dab4 Merge pull request #5247 from deepseek-harness/refactor/agent-team-direct-steer
refactor(agent-team): send messages directly to Agent inboxes
2026-10-08 16:42:56 +08:00
Yixiang Tu 46164dfb2b refactor(llm-pi-ai): delegate system message placement to pi-ai 2026-10-08 16:38:58 +08:00
_Kerman 162691e356 test(web): keep request lifecycle checks in one scenario 2026-10-08 16:34:18 +08:00
_Kerman 9bdd420512 fix(web): distinguish retry history from request failure 2026-10-08 16:33:49 +08:00
_Kerman 543834a9f4 refactor(web): simplify trajectory timing types 2026-10-08 16:33:37 +08:00
fz 6ce8654ff6 fix(terminal): retain background job ids under small result caps 2026-10-08 16:30:21 +08:00
Dudu-0223 deda23bf69 Merge master into refactor/agent-team-direct-steer 2026-10-08 16:29:44 +08:00
turtle1999 6d48506ef1 docs(plugin-market): define optional metadata keywords 2026-10-08 16:25:58 +08:00
_Kerman 8d488a66ac Merge pull request #5680 from deepseek-harness/xtr/fix-agent-shutdown-lifetime
fix(agent-loop): preserve Agent resources during shutdown
2026-10-08 16:23:37 +08:00
fz 54c13688a8 fix(jobs): use one durable job id and ordered shutdown 2026-10-08 16:17:52 +08:00
Dudu-0223 12b8066c28 Merge pull request #5885 from deepseek-harness/fix/team-send-tool-receipt
fix(agent-team): omit message IDs from send tool results
2026-10-08 16:10:36 +08:00
Yixiang Tu b133fb9286 test(llm-pi-ai): record conversation update session replay 2026-10-08 16:06:06 +08:00
_Kerman 1637954fe3 test(agent-loop): cover scoped cancellation during Web shutdown 2026-10-08 16:05:36 +08:00
_Kerman 37c2fa40ac fix(web): align trajectory request lifecycle states 2026-10-08 15:56:09 +08:00
Yixiang Tu b9bdd924f4 fix(llm-pi-ai): preserve all system messages across model capabilities 2026-10-08 15:52:06 +08:00
kingwl f02b10d90e Merge master into fix/composer-concentric-corners
Reconcile README translation records and refresh the moved schedule test reference and validation command.
2026-10-08 15:45:33 +08:00
Dudu-0223 5cec0b792a fix(agent-team): omit message IDs from send tool results 2026-10-08 15:38:45 +08:00
Turtle cdf2f4c4b6 Merge pull request #5839 from deepseek-harness/turtle/revert-preset-insert-80a9ec3a652f
revert(plugin): drop preset-scoped profile patches; ship optional tools as global Host rows
2026-10-08 15:36:24 +08:00
winewill aa4bea82ff Merge pull request #5879 from deepseek-harness/fix/desktop-test-auth-popup
fix(desktop): 测试鉴权弹窗默认关闭并支持本地启用
2026-10-08 15:32:03 +08:00
Dudu-0223 3e373fd785 Merge pull request #5883 from deepseek-harness/fix/sdk-general-persona
fix(sdk): remove the default coding-agent persona
2026-10-08 15:25:55 +08:00
imccyu 0f4549c64d Merge pull request #5849 from deepseek-harness/fix/cordis-brand-constructor-export
perf: cut host type-check and Typert lookup cost, with checker-explicit declarations
2026-10-08 15:23:06 +08:00
winewill 6846934b98 fix(desktop): address auth popup review and startup test isolation 2026-10-08 15:19:23 +08:00
creatixchu 614f16560f docs(ptc): refresh permission lifecycle dependency graph 2026-10-08 15:18:14 +08:00
_Kerman bff2d40dee fix(agent-loop): keep shutdown ownership local to the loop 2026-10-08 15:13:50 +08:00
TurtleandTurtle 6827dd0b41 docs: align optional bundle and new session guidance
Co-authored-by: Turtle <[email protected]>
2026-10-08 15:12:00 +08:00
creatixchu e9a0e41aa0 test(ptc): cover sandbox launch failures and refresh retained execution snapshot 2026-10-08 15:09:25 +08:00
Yichen Jiang facdc69808 Merge remote-tracking branch 'origin/master' into worktree/ssh-helper-binaries
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	docs/subsystems/ssh.i18n.yaml
#	package.json
#	packages/ptc-runtime/ptc-runtime-node/README.i18n.yaml
#	packages/ssh/README.i18n.yaml
#	packages/ssh/ssh/README.i18n.yaml
#	packages/ssh/ssh/package.json
#	pnpm-lock.yaml
#	scripts/build-exe-for-python-sdk.ts
#	scripts/verify-package-readme-model-experience.ts
2026-10-08 15:06:19 +08:00
creatixchu 80b42178c5 fix(ptc): keep admission closed through owner disposal 2026-10-08 15:05:04 +08:00
winewill 38e3791463 docs(desktop): record Host-independent shell configuration ownership 2026-10-08 15:04:49 +08:00
Yichen Jiang 4ed24b4861 test(web): follow fresh New Session and Creator creation requests
Master now creates a fresh Session for a plain New Session, and the Creator
entry names its preset in the session.create request instead of a separate
agentPresets.select call. Wait for that request in the Creator scenario and
count the startup blank in the outdated-cache scenario.
2026-10-08 15:04:47 +08:00
Dudu-0223 f5b72041bf fix(sdk): inherit the general agent persona 2026-10-08 15:04:06 +08:00
Yichen Jiang bb0296a0e5 Merge pull request #5480 from deepseek-harness/worktree/input-command-concatenation-bug-5ed14e
fix(web): stop claim token decoration from looping on boundary input
2026-10-08 15:01:49 +08:00
creatixchu 6a6105dc1b fix(ptc): preserve tool execution identity during cancellation 2026-10-08 14:59:28 +08:00
kingwl 0bfc4b97f2 Merge master and resolve integration conflicts for #5576 2026-10-08 14:57:40 +08:00
creatixchu e3a92c9de5 fix(ptc): confine persistent memory and isolate temporary approvals 2026-10-08 14:57:36 +08:00
Yichen Jiang d0eb70425e Merge remote-tracking branch 'origin/master' into worktree/sleepy-grothendieck-64df7b
# Conflicts:
#	.agents/notes/implemented/architecture/2026-09-17-process-local-blank-sessions.i18n.yaml
#	.agents/notes/implemented/architecture/2026-09-18-declarative-agent-presets.i18n.yaml
#	.agents/notes/implemented/architecture/2026-09-18-declarative-agent-presets.md
#	.agents/notes/implemented/architecture/2026-09-18-declarative-agent-presets.zh.md
#	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
#	packages/api/session-controller/README.i18n.yaml
#	packages/client/ui-agent-preset/src/client/index.ts
#	packages/client/ui-agent-preset/tests/apply.client.spec.ts
#	packages/client/ui-workspace/README.i18n.yaml
#	packages/client/ui-workspace/README.md
#	packages/client/ui-workspace/README.zh.md
#	packages/client/ui-workspace/src/client/index.ts
#	packages/client/ui-workspace/src/client/navigation.ts
#	packages/extensions/cordis-client-runner/src/client/api-catalog.ts
2026-10-08 14:55:44 +08:00
kingwl f94df9baae Merge master and resolve integration conflicts for #5559 2026-10-08 14:55:10 +08:00
kingwl fec46cd89e Merge master and resolve integration conflicts for #5570 2026-10-08 14:54:56 +08:00
Dudu-0223 e3c0599a47 Merge master into refactor/agent-team-direct-steer 2026-10-08 14:54:48 +08:00
Yixiang Tu e5145c4b04 test(llm-pi-ai): align conversation updates with current Anthropic protocol
Keep the pi-ai version supplied by master and validate inline tool definitions while retaining system-prompt and historical tool updates.
2026-10-08 14:52:16 +08:00
Yichen Jiang b6d0ee3d03 Merge remote-tracking branch 'origin/master' into worktree/input-command-concatenation-bug-5ed14e 2026-10-08 14:46:55 +08:00
Yixiang Tu 5209845a7d test(cli): cover pi-ai Kimi prompt and tool updates through the headless profile 2026-10-08 14:38:55 +08:00
Yixiang Tu 86fea5561e fix(llm-pi-ai): anchor all-deferred Anthropic tool updates with a placeholder
pi-ai sends Anthropic tool changes natively only when the initial tool list
has an active declaration. When every projected declaration is deferred,
prepend a non-deferred DeferredToolPlaceholder instead of failing the request.

Document the placeholder, the catalog-owned update capabilities, and the
image role limit as separate README entries.
2026-10-08 14:38:55 +08:00
Yixiang Tu 82f08a0ae9 docs(llm-pi-ai): state conversation update placement directly 2026-10-08 14:38:55 +08:00
Yixiang Tu 3cde24b5f5 test(llm-pi-ai): cover conversation update serializer paths 2026-10-08 14:38:55 +08:00
Yixiang Tu 321417988b test(agent-loop): assert pi-ai system transcript messages 2026-10-08 14:38:55 +08:00
Yixiang Tu 1ca5832919 feat(llm): support pi-ai conversation prompt and tool updates 2026-10-08 14:38:55 +08:00
winewill e8226b2a84 fix(desktop): require local opt-in for test authentication popups 2026-10-08 14:38:27 +08:00
creatixchu 801861b95e Merge latest master benchmark report updates 2026-10-08 14:29:46 +08:00
creatixchu c658cba99a fix(ptc): align working-directory setup and snapshots after master merge 2026-10-08 14:26:08 +08:00
Turtle 67c2fc749b Merge pull request #5865 from deepseek-harness/turtle/bench-artifact-upload
ci(bench): publish the scaled benchmark report as an artifact
2026-10-08 14:21:01 +08:00
creatixchu bc2bd61f6f Merge master into feat/persistent-ptc 2026-10-08 14:17:51 +08:00
_Kerman a5f0419217 test(agent-loop): follow the managed subagent activation API
Master removed `backgroundMode` and the `run_in_background` argument, so
every delegation starts a managed activation. Mount the working-directory
owner SubagentRuntime injects and the JSONL persistence root the spawn
provider requires, and synchronize on the child's cancellation, which the
parent teardown or the manager drain raises instead of a parent-only cause.
2026-10-08 13:05:22 +08:00
imccyu c687fe9185 perf(typert): memoize per-file registration and path normalization
The Typert workspace pass scans the analyzer's symbol table, and every
symbol asked `registrationForFile`/`packageNameForFile` for its owning
package. Both looked up the real path and then scanned every registration
with `isWithin`, and `isWithin` re-ran `path.resolve` through `realPath`
for both arguments on each call. A CPU profile of the host pass put
17.0 s of the 30.9 s sampled in that scan, almost all of it in
`realPath`/`resolve`/`existsSync`.

The registration set and the analyzer's face are fixed for the analyzer's
lifetime, so each source path's answer cannot change: memoize both
lookups per analyzer. `resolve` depends only on the requested path and the
process working directory, so memoize the normalization step too; the
existing canonical-path cache keeps its "existing paths only" rule.

tsdown host pass, interleaved A/B: 39.89/37.18 s -> 25.70/25.06 s.
Isolated generator phase: discover 8.69/8.59 s -> 7.33/7.44 s,
generate 17.19/16.96 s -> 4.21/4.21 s. Every emitted `typert.*` file
hashes identically before and after each run.
2026-10-08 13:03:43 +08:00
_Kerman e2cc73552f Merge remote-tracking branch 'origin/master' into xtr/fix-agent-shutdown-lifetime 2026-10-08 12:55:20 +08:00
_Kerman 9228e7eb99 docs: regenerate config catalog and event matrix after source line shifts 2026-10-08 12:55:17 +08:00
fz 2be7329142 fix(jobs): preserve lifecycle order and headless settlement 2026-10-08 12:47:48 +08:00
Yudong Han 647b2b5f3b Merge pull request #5729 from deepseek-harness/feat/voice-input-device
feat(voice-input): select microphone with native input level
2026-10-08 12:28:15 +08:00
Turtleandtianyicui ac94051a22 Credit review by @tianyicui
Co-authored-by: tianyicui <[email protected]>
2026-10-08 12:27:45 +08:00
Turtle 2fdb9870df fix(ui-chat): explain the interrupted stop in localized copy without the code chip 2026-10-08 12:11:48 +08:00
Ziya bb5a418654 Merge pull request #5866 from deepseek-harness/fix/subagent-image-intake-5757
fix(ui-conversation): restore subagent image paste and drop
2026-10-07 21:08:20 -07:00
yudshj 57d829f9b2 fix(voice-input): keep device level active on page 2026-10-08 12:00:37 +08:00
turtle1999 188880962d test(snapshot): retain title and event wait timeout diagnostics
waitForTitleAfterTurnEnd and waitForEventAfterTurnEnd now name the session,
expected record, and deadline when the deadline passes before the first log
harvest settles, and keep the vi.waitFor failure as cause. Previously they
surfaced Vitest's generic 'Timed out in waitFor!', which failed the title
diagnostic spec on the macOS Sandbox lane at master 090348e4.

The title diagnostic spec uses isolateDiagnosticTimeout like its siblings,
replacing the Windows-only 5s timeout.

Refs #5631
2026-10-08 11:58:06 +08:00
imccyu 7241a0c59a Merge pull request #5726 from deepseek-harness/fix/inspector-eventsource-abort
fix(inspector): keep observed fetch Requests reachable so caller aborts reach native fetch
2026-10-08 11:56:12 +08:00
turtle1999 0e7e2ceb19 ci(bench): warn on a missing benchmark report and document the artifact
The upload warns instead of silently ignoring missing files, and the spec
pins the upload after the benchmark step. benchmarks/AGENTS.md and the
report Agent Note now name the artifact CI publishes.

Refs #5840
2026-10-08 11:55:08 +08:00
kingwl 594d89973f Merge master and resolve integration conflicts for #5565 2026-10-08 11:47:35 +08:00
kingwl 9a5e9485d7 Merge master and resolve integration conflicts for #5557 2026-10-08 11:45:32 +08:00
kingwl 5ebd7ac8d6 Merge master and resolve integration conflicts for #5528 2026-10-08 11:43:58 +08:00
kingwl 2e29d08896 Merge master and resolve integration conflicts for #5563 2026-10-08 11:42:51 +08:00
kingwl e2e3211303 Merge master and resolve integration conflicts for #5523 2026-10-08 11:42:09 +08:00
Turtle 830e298a04 fix(ui-chat): summarize interrupted turns as stopped and pin the notice in a web snapshot 2026-10-08 11:37:51 +08:00
fz 12dee990e1 test(web): refresh job lifecycle replay fixtures after master sync 2026-10-08 11:36:04 +08:00
ZiyaZhang 6796616f30 fix(ui-conversation): restore subagent image paste and drop 2026-10-07 20:34:57 -07:00
Turtle 47fa8e8b1a Merge pull request #5639 from deepseek-harness/turtle/agent-team-status-e1e8f04e4663
fix(workflow-run): keep background workflow runs running after their step closes
2026-10-08 11:33:35 +08:00
turtle1999 a646dabbe9 ci(bench): publish the scaled benchmark report as an artifact
The node-24-bench job uploads benchmarks/.dsh-report after the benchmark
step, including when a budget assertion fails, so the report the Vitest
globalSetup renders survives the runner. #5838 deferred this step because
the authoring token had no workflow scope.

Refs #5838
2026-10-08 11:32:17 +08:00
yudshj e77e4bb005 fix(voice-input): use native input device selector 2026-10-08 11:30:49 +08:00
Turtle 4c93974d9b Merge pull request #5838 from deepseek-harness/turtle/benchmark-scaling-report-64158244ab21
test(bench): add scaled machine and memory-pressure benchmark report
2026-10-08 11:25:05 +08:00
Turtleandturtle1999 7facb1cf65 fix(llm): log repeated request-extension warnings once
Extension failures, unreadable package identities, a blocked session-log
upload, and degraded Messages replay recur on every request. Log the first
occurrence per field, route, module, or blocking event instead.

Co-authored-by: turtle1999 <[email protected]>
2026-10-08 11:24:00 +08:00
gengruilin c4e820e25f Merge origin/master into fix/4931-composer-focus 2026-10-08 11:22:34 +08:00
_Kerman 9ec9aebca5 test(cordis): cover cross-fiber adoption of a plain effect disposer 2026-10-08 11:22:34 +08:00
_Kerman 5578ecf655 refactor(session-projection): return the exact change-feed disposer 2026-10-08 11:22:31 +08:00
_Kerman d6340cc088 refactor(agent-loop): declare the lifecycle disposer before its user 2026-10-08 11:22:28 +08:00
_Kerman aaf01e8182 refactor(agent-loop): share teardown failure aggregation 2026-10-08 11:22:13 +08:00
fz 36e2402364 test(jobs): refresh PowerShell lifecycle snapshot after master sync 2026-10-08 11:17:31 +08:00
Turtle 3121a4b5da fix(ui-chat): show a stopped notice for turns interrupted by a DSH stop 2026-10-08 11:14:35 +08:00
Turtle 0aed8de976 fix(llm): keep request-extension failures from blocking model requests
Request-extension fields are auxiliary. A contributor whose preparation
throws is now logged and omitted while the other fields are still sent,
and a post-2xx acceptance failure is logged without failing the request.
Package inventory is best effort: a named manifest without a version, or
a bare package whose manifest is missing or unreadable, reports version
"unknown" instead of failing preparation.
2026-10-08 11:10:56 +08:00
Turtle 3377602a4f fix(llm): name the contributor failure in request-extension errors
A failing request-extension contributor surfaced only
'DeepSeek request extension preparation failed'; the cause stayed on
LlmError.cause, which the turn failure record and retry notice drop.
Append the cause chain to preparation and acceptance messages.
2026-10-08 11:09:16 +08:00
Turtle d83cdfafd6 Merge pull request #5760 from deepseek-harness/turtle/image-viewer-windows-e0e1e6a26a6b
fix(client): keep the image lightbox clear of the Windows caption
2026-10-08 11:04:04 +08:00
fz 1dd1098cdf Merge latest master font settings after job timing validation 2026-10-08 11:03:39 +08:00
fz 672b384eea Merge master into job lifecycle timing and refresh owned fixtures 2026-10-08 11:02:16 +08:00
Turtle 1c29d96067 test(bench): describe cases, measure storage share, and model core counts
Every recorded case states what it measures and which user scenario it
affects, shown on hover in the report. Endpoints whose workers report
process CPU time default to the measured non-CPU share and busy
parallelism; the Session corpus worker now reports CPU time per
endpoint. Machine profiles carry logical CPU counts, and the page
shows each default share with its source and can reset overrides.
2026-10-08 10:52:34 +08:00
Turtle 29f6cceb0d Merge pull request #5328 from deepseek-harness/turtle/configurable-fonts-13764c079ba3
feat(client): configure text, code, and terminal fonts independently
2026-10-08 10:50:43 +08:00
yudshj 847945a6fb fix(voice-input): refresh device labels and reveal overflowing names 2026-10-08 10:48:48 +08:00
yudshj d005b5edfd test(voice-input): cover injected selection and unavailable preview 2026-10-08 10:48:48 +08:00
yudshj 5aa153281f fix(voice-input): preserve unavailable microphones across hot-plug 2026-10-08 10:48:48 +08:00
yudshj 2d0360870c feat(voice-input): select microphone with menu-only input levels 2026-10-08 10:48:48 +08:00
Turtle b4443d4a90 Merge pull request #5768 from deepseek-harness/turtle/button-hover-shape-f946572b0faa
fix(web): match Windows caption hover radius across sidebar states
2026-10-08 10:34:15 +08:00
Turtle 6a7549037c Merge pull request #5765 from deepseek-harness/turtle/task-panel-occlusion-042a27be126e
fix(ui-jobs): keep the background job list above the right sidebar
2026-10-08 10:26:54 +08:00
Turtle 849e9ebd8d feat(client): configure text, code, and terminal fonts and sizes independently
The General font-size row gains a More font settings disclosure that expands
a font field for each of text, code, and the sidebar terminal, plus code
(10-16 px) and terminal (10-20 px) size steppers. Font lists are normalized,
stored in the ui-theme namespace, embedded by the boot script, and placed
ahead of each role's built-in stack; the code size moves the code typography
tokens; the terminal applies font and size live and refits without replacing
the shell. ThemeRuntime adopts Host sections only after its own writes settle.

Refs #5217
2026-10-08 10:26:16 +08:00
Turtle 1bc11bdba8 Merge pull request #5783 from deepseek-harness/turtle/highlight-blocking-ccc7ca395ecb
fix(web): leave overlong source lines uncolored
2026-10-08 10:24:16 +08:00
turtle1999 5b00e30678 Merge remote-tracking branch 'origin/master' into fix/inspector-eventsource-abort 2026-10-08 10:22:22 +08:00
Turtle bb9b26cdc6 Merge pull request #5652 from deepseek-harness/turtle/trajectory-state-1125dc1155f8
fix(trajectory): report streaming requests and running compactions as pending
2026-10-08 10:20:27 +08:00
Turtle ddd15a1ffe Merge pull request #5841 from deepseek-harness/turtle/memory-pressure-bench-4bc6543c10da
test(bench): rerun memory-sensitive benchmarks under 4 GiB and 8 GiB caps
2026-10-08 10:13:55 +08:00
Yichen Yan e31b85159a fix(web): use browser directory picking for remote trust 2026-10-08 09:56:20 +08:00
imccyu 3b2f7aaf7c perf(session): narrow the surface fixture return types
Two fixture helpers in surface.spec.ts returned ': SessionEvent', a
declaration-merge-extensible mapped union. Spreading such a value (the
rejection cases build '{ ...event, data: ... }') materialises an anonymous
union per fixture, and the following 'as SessionEvent' casts then compare
union against union, which dominates the root type-check program.

Return the single variant each helper actually builds, spelled as the
canonical indexed access SessionEvent<'system/message'> /
SessionEvent<'user/message'>, drop the casts that only existed because data
was a union, and trim the comment of the member count that drifts with every
declaration merge.

Measured on the host build: check 110.9 s -> 84.6 s (median, -23.7 %),
wall -17 % to -24 %; fixture types alone (clean buildinfo, root program):
check 53.4/45.8 s (Extract alias) vs 45.3/49.1 s (indexed access).
2026-10-08 06:59:00 +08:00
Tianyi Cui 03ef39e31f Merge pull request #5792 from deepseek-harness/worktree/full-shell-command-details
fix(client): reveal full shell commands and background call details
2026-10-08 05:32:28 +08:00
imccyu 6164a85dad fix: keep brand constructors and negative type tests unambiguous
Two declaration forms relied on a checker binding a name the permissive way:

- cordis-host-runner declared 'export function CordisDynamicPluginId'
  alongside 'import type { CordisDynamicPluginId }' of the branded type, so
  the call sites resolved through the type-only import. Export the four
  constructors under separate local names; the public names, JSDoc and the
  type names in signatures are unchanged, and the typert signature metadata
  keeps the original type names.
- views-type-chain.client.spec.tsx spread one slots.register call over three
  lines, which lets a checker anchor the rejected overload on the argument
  line instead of the call line, outside the @ts-expect-error directive.
  Keeping the call on one line keeps the negative assertion effective.
2026-10-08 01:37:05 +08:00
Tianyi Cui fc532df69f Merge pull request #5847 from deepseek-harness/worktree/deps-20261007-actions-final
chore(ci): update third-party GitHub Actions
2026-10-07 23:45:02 +08:00
Tianyi Cui 5d41a61cfd Merge branch 'worktree/deps-20261007-telemetry' into worktree/deps-20261007-actions-final 2026-10-07 23:27:17 +08:00
Tianyi Cui b11af342fe fix(telemetry): expose only supported exporter options 2026-10-07 23:25:35 +08:00
Tianyi Cui cdbb78d39d fix(ci): use the compatible pnpm setup action on Intel macOS 2026-10-07 23:17:10 +08:00
Tianyi Cui 54988d6238 chore(deps): update the OpenTelemetry release family 2026-10-07 22:28:27 +08:00
Tianyi Cui 59bd530aaf chore(deps): update GitHub Actions to mature release tags 2026-10-07 22:28:27 +08:00
Tianyi Cui a3f6957db4 docs(client): correct subscription dependency comments 2026-10-07 22:27:29 +08:00
Tianyi Cui c7a00f27f1 chore(deps): update compatible transitive security fixes 2026-10-07 22:25:12 +08:00
Tianyi Cui 6157b57cf0 Merge pull request #5837 from deepseek-harness/worktree/deps-20261007-protocol-image
chore(deps): update protocol and image security dependencies
2026-10-07 22:04:25 +08:00
Turtle a8e9e9b546 fix(plugin): address review on the preset-patch revert
Let a title provider replace one that is still draining, so switching the
titles bundle during an in-flight request no longer leaves no provider.
Omit group container rows from bundle inventories, since they have no
plugin entry to switch. Drop the obsolete preset-target product-use case,
fix the Claude Code row id example, and refresh stale Agent Note text.
2026-10-07 21:27:38 +08:00
Turtle 59fd47e451 test(bench): reject swap-enabled cgroups and record the memory-limit decision 2026-10-07 21:20:08 +08:00
Turtle 51e2e5630f test(bench): rerun memory-sensitive benchmarks under 4 GiB and 8 GiB cgroup caps 2026-10-07 21:04:13 +08:00
Turtle 9baa8bc8fe test(bench): scale storage share per endpoint and record the report decision
Session restore and projection run after the file closes, so they use
no storage share; the page keeps one share per endpoint. Record the
repeat projection-list budget, drop the post-GC page heap from the
memory view, remove the unused profile group, and add the owning
Agent Note.
2026-10-07 20:58:13 +08:00
Turtle b173f3e2a2 revert(plugin): drop preset-scoped profile patches; ship optional tools as global Host rows
Remove the `{ preset, insert }` / `{ preset, id, ...override }` profile patch
operation added in #5773, together with the app-boot compiler and reload drain,
config-editor filtering, plugin-manager preset row inventory and retained-module
removal checks, the read-only preset rows on the Plugins page, and the
agent-preset-registry row identities that served them.

Session search, Ralph, persistent terminals, Codex, and Claude Code bundles now
insert ordinary Host rows whose tools register in the global tool layer, like the
earlier optional bundles. Every preset, including minimal, sees them, and toggling
a bundle updates live Agents without new composition generations.
2026-10-07 20:46:37 +08:00
Turtle 12c33f6d0c test(bench): add scaled machine and memory-pressure report
Record budgeted benchmark endpoints and peak memory, and render a
self-contained interactive report that rescales measured times to
reviewed laptop and cloud profiles by single-thread CPU rating and
default-disk latency, and compares peaks with 4 GB and 8 GB of
available memory.
2026-10-07 20:42:30 +08:00
Tianyi Cui 1150a874fc chore(deps): update protocol and image security dependencies 2026-10-07 19:07:44 +08:00
Tianyi Cui 5ce5963fd6 chore(deps): update website rendering libraries 2026-10-07 18:50:53 +08:00
Tianyi Cui 5f1cc26416 chore(deps): update client rendering and state libraries 2026-10-07 18:50:53 +08:00
Tianyi Cui ddede8b36e test(inspector): align the workspace Vite expectation 2026-10-07 18:48:32 +08:00
Tianyi Cui e99d38af9d chore(deps): update source and build tools 2026-10-07 18:08:01 +08:00
Tianyi Cui a2501d0779 Merge pull request #5828 from deepseek-harness/worktree/deps-20261007-test-tools
chore(deps): update test and lint dependencies
2026-10-07 18:07:52 +08:00
Tianyi Cui b931f1f9f7 Merge pull request #5713 from deepseek-harness/worktree/session-title-reasoning-20261005
fix(llm,session-title): configure prepared calls from model capabilities
2026-10-07 18:02:41 +08:00
Tianyi Cui b8d9f3aadf fix(deps): retain Node 22 for wildcard type dependencies 2026-10-07 17:56:01 +08:00
Tianyi Cui cee3672b73 chore(deps): retain a mature publint detector dependency 2026-10-07 17:03:12 +08:00
Tianyi Cui eff2f8a92b chore(deps): update test and lint dependencies 2026-10-07 16:57:54 +08:00
Tianyi Cui 9203a58677 chore(deps): update Python build and validation dependencies 2026-10-07 16:42:04 +08:00
Tianyi Cui 5969359dc4 chore(deps): update mature runtime utilities 2026-10-07 16:41:17 +08:00
Tianyi Cui c56fdb023e refactor(llm): configure prepared calls with explicit controls 2026-10-07 16:10:26 +08:00
Tianyi Cui 36f12b6f6e Merge pull request #5800 from deepseek-harness/worktree/ptc-providers/remove-both
refactor(tools)!: remove unused mixed tool presentation
2026-10-07 15:34:35 +08:00
Tianyi Cui 86b9b9c017 Merge pull request #5820 from deepseek-harness/worktree/sdk-dynamic-fixture-isolation
test(python): isolate dynamic tool snapshot inputs
2026-10-07 15:33:13 +08:00
Tianyi Cui a06d137463 Merge pull request #5812 from deepseek-harness/worktree/local-bundle-registry
feat(scripts): serve locally built Official bundles from a loopback registry
2026-10-07 15:28:19 +08:00
Tianyi Cui 6e894e4bea fix(llm-replay): reject undeclared minimum efforts 2026-10-07 14:37:09 +08:00
Tianyi Cui ffb88d331e feat(llm): resolve minimum reasoning during call preparation 2026-10-07 14:33:23 +08:00
Tianyi Cui 0f36dcb014 test(cli): report a rehearsal stage and a stalled operation's blocker
The packed rehearsal now names each stage on the child's stdout and bounds the
manager's removal, so an operation that never settles reports the profile lock
and the still-live pnpm process instead of only a test timeout. That evidence
located pnpm 11.7.0 leaving its worker pool alive after a short-circuit return
(pnpm issue 12297, fixed in 11.23.0 and carried by this stack's base).

Three attempts to keep pnpm off that path — a private pnpm store, installing
both bundles before removing either, and pre-declaring the profile's age
exemptions — did not change the outcome, so none of them remain.
2026-10-07 14:07:28 +08:00
Tianyi Cui b99a2c147f fix(scripts): address review findings in the local bundle registry
- The summary lists only the catalog roots as installable specs; the other 29
  archives stay in the run manifest, where the installer resolves them itself.
- Only a pnpm entrypoint receives pnpm's arguments, a catalog root counts as a
  required edge for platform admission, and a signal that stops packing reports
  the interrupted exit instead of an exception.
- The packed rehearsal names the Agent SDK's musl artifact on musl hosts again,
  and its comments match what the fixture does.
- The cache test registers its pnpm children for termination, and a new case
  keeps one profile and its real lockfile: pnpm refuses a new run's URL with
  ERR_PNPM_TARBALL_URL_MISMATCH until the stale resolution is cleared with
  pnpm's own `pnpm clean --lockfile` remedy, which the desktop README now
  documents for same-version iteration.
2026-10-07 14:07:28 +08:00
Tianyi Cui c26b658e61 test(cli): keep the packed rehearsal's primary failure visible
The teardown asserted the Web process's SIGTERM exit inside `finally`, so a
body failure was reported as a shutdown timeout instead of itself. The
assertions now run only when the body passed, the earlier failure is rethrown
after teardown, and the listener readiness became a named step that no longer
clones the release pack coordinator's listen idiom.
2026-10-07 14:07:28 +08:00
Tianyi Cui eac927e143 test(scripts): cover preparation cancellation and an abandoned client
Both are failure paths the registry owns: a signal that stops packing must
report as a cancellation rather than as a pack failure, and a client that
disconnects mid-tarball must not stop later requests. execa reports the first
either as a resolved canceled result or as a thrown error, so the packing step
now names both.
2026-10-07 14:07:27 +08:00
Tianyi Cui 73d853a9ae feat(scripts): serve locally built Official bundles from a loopback registry
A packaged application installs an Official on-demand bundle as
`name@<running DSH version>`, and the plugin manager asks a custom registry
alone, so the unsigned test DMG cannot install a locally built provider before
its release reaches npm: each packed manifest still names the rest of the
repository by version, and ordinary bundle tarballs therefore resolve against
a registry that does not have them yet.

`pnpm run dev:bundle-registry` validates the Official catalog and the workspace
inventory, builds the official artifacts, packs the catalog's complete local
dependency closure with the release families' own payload and manifest checks,
records the run in `dist/test-bundles/<run-id>/bundle-registry.json` as its
completion marker, and only then serves it from 127.0.0.1 on an allocated port
under a fresh namespace. Repository-owned names are answered from this run or
refused locally; third-party packages keep npm's real metadata and bytes
through a fixed redirect. The run publishes nothing, changes no global
npm/pnpm configuration, and leaves DMG packaging untouched.

The packed installer rehearsal now installs that closure into an isolated
profile with no `file:` override, checkout link, ignore list, or scoped
registry standing in for a package the registry should answer, and it asserts a
transitive repository package served only by this run.
2026-10-07 14:07:27 +08:00
Tianyi Cui c4bda67252 test(python): own dynamic tool fixture instructions and homes 2026-10-07 14:06:44 +08:00
Tianyi Cui 1daf451d00 test(python): own dynamic tool fixture instructions and homes 2026-10-07 14:05:42 +08:00
Tianyi Cui 19d36f602b test(python): isolate dynamic tool snapshots from log export 2026-10-07 13:53:19 +08:00
Tianyi Cui 86cc92949d test(python): isolate dynamic tool snapshots from log export 2026-10-07 13:52:17 +08:00
Tianyi Cui a46412bd53 fix(scripts): keep Python runtime deployment isolated and deduplicated 2026-10-07 13:51:48 +08:00
Tianyi Cui 44dd60de91 test(native): pin the packing fixtures to the repository pnpm version
The fixture workspaces declare packageManager, so corepack resolves that
version when pack-release runs pnpm pack inside them; leaving 11.7.0 there
would exercise the version this change replaces.
2026-10-07 13:24:57 +08:00
Tianyi Cui 5529a5014a fix(ci): skip the verification install when rebuilding Linux node-pty
pnpm 11.28.5 runs verifyDepsBeforeRun before a script, so `pnpm run install`
inside the installed node-pty directory first installed node-pty's own
dependencies into the package and ran its `prepare` build. Both reached the
packaged payload: the SEA blob then carried a node-gyp tree and tripled pkg's
file records, and postject aborted while injecting it. The step now runs the
package's install script alone, as it did with pnpm 11.7.0.
2026-10-07 13:10:09 +08:00
Tianyi Cui b9bea234ce fix(plugin-manager): record ignored build scripts reported by a non-interactive pnpm
pnpm writes allowBuilds placeholders for blocked dependency scripts only when
it can prompt, so a managed run that always captures output left
pendingBuilds empty and the approval flow could not offer anything. The failed
run's own report is the surviving record: the profile policy now records those
names, which keeps approval, persistence, and the wildcard and decision guards
unchanged.
2026-10-07 12:58:25 +08:00
Tianyi Cui 4260fd2451 fix(scripts): keep the Python runtime payload out of its own deploy root
pnpm's legacy deploy links the deployed project into the target's node_modules
when the target sits inside that project. Materializing that link copies the
payload into itself and fails with ERR_FS_CP_EINVAL, which broke the
release-shaped Python runtime matrix on Linux and Windows. The staged payload
never carries the project source, so the staging tree's owner drops the entry
and leaves the deploy root's files alone.
2026-10-07 12:58:25 +08:00
Tianyi Cui 28c74ba0e8 Merge branch 'master' into worktree/pnpm-11.28.5-20261007 2026-10-07 12:54:30 +08:00
Tianyi Cui 800ae866ca Merge pull request #5815 from deepseek-harness/test/web-cot-toggle-flake-20261007
test(web): bound plugin switch waits by the profile write chain
2026-10-07 12:53:40 +08:00
Tianyi Cui d9f6afebb1 chore(deps): update the pinned pnpm to 11.28.5
pnpm 11.7.0 can finish its work, print `Done in Xs`, and then never exit
(pnpm/pnpm#12297, pnpm/pnpm#13617): finishWorkers() clears the worker pool
reference, and a later worker API call recreates a pool that is never
finished, so idle worker threads keep the event loop alive. The upstream fix
(pnpm/pnpm#13226) shipped in 11.23.0, and 11.25.0 fixed the hoisted-linker
rename race as well.

The hang surfaces in this repository as a packed-profile rehearsal that runs
`pnpm remove` through the plugin manager and then waits for the test deadline,
holding the profile write lock for the whole time.

Bump packageManager and devDependencies.pnpm in the root, the pinned pnpm in
apps/desktop, and the native/system packageManager; relock; exempt the fresh
package manager from the release-age window; follow the development guide
pair.
2026-10-07 12:36:35 +08:00
Tianyi Cui c13e225301 test(web): budget the remaining plugin switch writes
Review found the same Host profile write plus inventory reload chain still
uncovered in worktree-opt-in.e2e.ts, and still written as 10_000 literals in
plugin-manager.e2e.ts. Both now use PLUGIN_TOGGLE_SETTLE_MS, the README keeps
only the convention, and the constant's JSDoc names the store's load() as the
reader that republishes the switch.
2026-10-07 12:28:36 +08:00
Tianyi Cui 530c4d67aa test(web): bound plugin-card switch polls by the profile write chain
A plugin-card switch republishes `aria-checked` only after the Host writes
the profile and the panel re-reads its inventory. That chain measured
0.5-0.8 s on an idle host and 2.0-4.8 s across 32 samples in a 16-worker
lane, so Vitest's 1-second `expect.poll` default truncated it and failed
the switch assertions of the CoT translation scenarios in CI.

Every poll that follows a plugin-card switch click now passes the shared
PLUGIN_TOGGLE_SETTLE_MS budget; assertions, retries, and product code are
unchanged.
2026-10-07 12:11:03 +08:00
Tianyi Cui 147d2c1e5d Merge pull request #5799 from deepseek-harness/worktree/macos-unsigned-packaging
feat(desktop): support local unsigned macOS DMG packaging
2026-10-07 09:28:36 +08:00
Tianyi Cui 4b3c366501 chore(desktop): print the DMG path after packaging 2026-10-07 08:40:14 +08:00
Tianyi Cui aab45939de Merge pull request #5802 from deepseek-harness/worktree/fix-idle-submission-ci
test(web): stabilize idle submission handoff waits
2026-10-07 08:33:50 +08:00
Tianyi Cui aeb166c42e test(ptc): refresh ordinary snapshots without extra retention 2026-10-07 03:53:15 +08:00
Tianyi Cui 73b5769da2 test(web): preserve handoff failures through cleanup 2026-10-07 03:02:36 +08:00
Tianyi Cui 8c24036e20 test(web): stabilize idle submission handoff waits 2026-10-07 02:47:10 +08:00
Tianyi Cui 2604a4b13a feat(desktop): make local macOS packaging configuration-free 2026-10-07 02:42:09 +08:00
Tianyi Cui 0853aeb0ee feat(desktop): support local unsigned macOS DMG packaging 2026-10-07 02:08:30 +08:00
Tianyi Cui 88311637f8 fix(client): focus only overflowing command text 2026-10-07 02:04:33 +08:00
Tianyi Cui e8b9e119da fix(client): reveal full shell commands and background call details 2026-10-07 02:04:33 +08:00
Tianyi Cui 9b9496b692 Merge pinned master 8c23c111 into remove-both 2026-10-07 02:00:34 +08:00
Tianyi Cui 4359d3ee17 refactor(tools): remove mixed tool presentation 2026-10-07 01:57:57 +08:00
Tianyi Cui 41ede2f572 Merge pull request #5775 from deepseek-harness/worktree/official-plugins/on-demand
feat(plugin): offer official bundles through on-demand installation
2026-10-07 01:48:54 +08:00
Tianyi Cui 30204f967d test(plugins): refresh final official catalog expectations 2026-10-07 01:26:01 +08:00
Tianyi Cui c6a560a784 test(plugins): omit unavailable catalog targets in strict fixtures 2026-10-07 01:26:01 +08:00
Tianyi Cui f7e5b6d354 fix(plugins): install official source bundles from the running checkout 2026-10-07 01:26:01 +08:00
Tianyi Cui c9c721ea61 test(plugins): reflect protected translation bundle removal 2026-10-07 01:26:01 +08:00
Tianyi Cui 8b5527b8da fix(plugins): preserve Web and Desktop identities on managed native bundles 2026-10-07 01:26:01 +08:00
Tianyi Cui 56e18d70bb docs(subagent-codex): align selected child directory description 2026-10-07 01:26:00 +08:00
Tianyi Cui ddbf39cbcb fix(build): retain on-demand dependency lock and event references 2026-10-07 01:26:00 +08:00
Tianyi Cui e9a68b2484 fix(plugin): clarify on-demand recovery and preserve package diagnostics 2026-10-07 01:26:00 +08:00
Tianyi Cui 258d7e65b7 test(plugin): refresh install dialog update guidance 2026-10-07 01:26:00 +08:00
Tianyi Cui e91a77a899 test(plugin): align native bundle fixtures and publication manifests 2026-10-07 01:26:00 +08:00
Tianyi Cui c329e8fb14 test(plugin): include on-demand entries in configuration inventory 2026-10-07 01:26:00 +08:00
Tianyi Cui f0bc032abc test(plugins): install official bundles from isolated packed artifacts 2026-10-07 01:26:00 +08:00
Tianyi Cui f730199b94 test(plugin): classify on-demand composition and document mock events 2026-10-07 01:26:00 +08:00
Tianyi Cui 2aa95755f1 test(plugin): replay native subagent bundle delivery through PTC 2026-10-07 01:26:00 +08:00
Tianyi Cui a453218aff fix(plugins): retain unreadable official catalog entries 2026-10-07 01:26:00 +08:00
Tianyi Cui c135bdf483 test(plugin): refresh official discovery browser and API evidence 2026-10-07 01:26:00 +08:00
Tianyi Cui 8ed0b530ed feat(plugins): offer official bundles through on-demand installation 2026-10-07 01:26:00 +08:00
Tianyi Cui f57c88f792 fix(workspace): preserve drafts and await newly created session views 2026-10-07 01:22:06 +08:00
Tianyi Cui e14182df7b test(plugins): refresh final official catalog expectations 2026-10-07 00:08:26 +08:00
Tianyi Cui 4339a05844 test(plugins): omit unavailable catalog targets in strict fixtures 2026-10-07 00:02:01 +08:00
Tianyi Cui 332a223d20 fix(plugins): install official source bundles from the running checkout 2026-10-06 23:52:33 +08:00
Tianyi Cui 188401cae4 test(plugins): reflect protected translation bundle removal 2026-10-06 23:52:33 +08:00
Tianyi Cui d7c7495e87 fix(plugins): preserve Web and Desktop identities on managed native bundles 2026-10-06 23:52:33 +08:00
Tianyi Cui c0d0768678 docs(subagent-codex): align selected child directory description 2026-10-06 23:50:43 +08:00
Tianyi Cui 811b38e7b7 fix(build): retain on-demand dependency lock and event references 2026-10-06 23:50:43 +08:00
Tianyi Cui ed0376f172 fix(plugin): clarify on-demand recovery and preserve package diagnostics 2026-10-06 23:50:43 +08:00
Tianyi Cui e435dd085a test(plugin): refresh install dialog update guidance 2026-10-06 23:50:43 +08:00
Tianyi Cui 904284d5d0 test(plugin): align native bundle fixtures and publication manifests 2026-10-06 23:50:43 +08:00
Tianyi Cui 6132df901c test(plugin): include on-demand entries in configuration inventory 2026-10-06 23:50:43 +08:00
Tianyi Cui dfa0b337a5 test(plugins): install official bundles from isolated packed artifacts 2026-10-06 23:50:43 +08:00
Tianyi Cui f59c3196bf test(plugin): classify on-demand composition and document mock events 2026-10-06 23:50:43 +08:00
Tianyi Cui 04e120c14c test(plugin): replay native subagent bundle delivery through PTC 2026-10-06 23:50:43 +08:00
Tianyi Cui 4e8ba4795e fix(plugins): retain unreadable official catalog entries 2026-10-06 23:50:10 +08:00
Tianyi Cui a0b1dfc824 test(plugin): refresh official discovery browser and API evidence 2026-10-06 23:50:10 +08:00
Tianyi Cui 72aa4966cd feat(plugins): offer official bundles through on-demand installation 2026-10-06 23:50:10 +08:00
Tianyi Cui 2b0dd1567d fix(plugins): preserve Creator drafts and refresh bundle validation 2026-10-06 23:48:59 +08:00
Tianyi Cui 55dfd3bab1 fix(plugins): narrow optional bundles and create fresh session agents 2026-10-06 23:48:59 +08:00
Tianyi Cui fbb95c0f16 fix(plugin): preserve final pinned composition and browser inventories 2026-10-06 23:48:59 +08:00
Tianyi Cui 07136d1752 fix(plugin): preserve established optional capability selectors 2026-10-06 23:48:59 +08:00
Tianyi Cui 562f63eccd test(plugin): preserve working-directory integration after rebase 2026-10-06 23:48:59 +08:00
Tianyi Cui ee0ead1a61 test(plugin): keep runtime carrier fixed across resolution generations 2026-10-06 23:48:59 +08:00
Tianyi Cui d68ae3bf51 fix(plugin): preserve bundled resource identity in executables 2026-10-06 23:48:59 +08:00
Tianyi Cui 1f8debb552 fix(plugin): validate explicit preset host activation targets 2026-10-06 23:48:59 +08:00
Tianyi Cui 7e65d1119b fix(plugin): preserve scoped identities across inspection consumers 2026-10-06 23:48:59 +08:00
Tianyi Cui d84c8f9a6f fix(plugin): distinguish unevaluated preset row conditions 2026-10-06 23:48:59 +08:00
Tianyi Cui 996007e103 fix(plugin): retain scoped row identity and source diagnostics 2026-10-06 23:48:59 +08:00
Tianyi Cui 652fce6964 test(settings): assert typed configuration output without narrowing 2026-10-06 23:48:59 +08:00
Tianyi Cui 599b9f45d4 fix(plugins): preserve scoped patches during Host edits 2026-10-06 23:48:59 +08:00
Tianyi Cui 15ae753dcd fix(plugin): inspect preset contributions before profile activation 2026-10-06 23:48:59 +08:00
Tianyi Cui b6ef9d5503 fix(plugin): identify retained scoped bundle rows precisely 2026-10-06 23:48:59 +08:00
Tianyi Cui c7c3819729 test(boot): refresh CLI preset patch schema output 2026-10-06 23:48:59 +08:00
Tianyi Cui 55dc8cea67 test(plugin): cover nested preset bundle ownership 2026-10-06 23:48:59 +08:00
Tianyi Cui de27882007 test(plugin): refresh optional bundle inventory and browser evidence 2026-10-06 23:48:59 +08:00
Tianyi Cui 8a9767c25e feat(plugin): validate optional bundle lifecycles and session output 2026-10-06 23:48:58 +08:00
Tianyi Cui 3aa1cab43a feat(plugin): compose optional bundles inside agent presets 2026-10-06 23:48:58 +08:00
Tianyi Cui 4da62dc8f4 test(release): include experimental session search tools 2026-10-06 23:45:22 +08:00
Tianyi Cui c2d528bb6d refactor(experimental): classify optional session search tools 2026-10-06 23:20:51 +08:00
Tianyi Cui aa514ef8f8 test(llm-pi-ai): cover the floor-effort branch the coverage gate rejected
A reasoning route always declares at least one level, so the adapter's
"no floor" path is defensive; the resolver rejects an empty list before any
consumer sees it. Mark that branch with the repo's v8-ignore convention and
state why.
2026-10-06 18:58:38 +08:00
Tianyi Cui 9e36f20675 refactor(llm): report a route's floor effort and let the caller select it
`purpose` is a label for replay and transport metadata, so no adapter should
branch on one caller's value. Exact-model metadata now reports
`reasoning.floorEffort`, the least effort a route accepts, and the title
service selects it for its request. `llm-pi-ai` and `llm-deepseek` dispatch
the effort they receive and no longer recognize `session-title`; the
`minimizeReasoning` field is gone. A route with no registered adapter, such
as the recorded replay lanes serve, reports no floor, so the title request
keeps the adapter default instead of failing before dispatch.

Replaces the `minimizeReasoning` field from the previous commit.
2026-10-06 18:34:32 +08:00
Tianyi Cui 582c9ab7b7 fix(experimental): retain published names and centralize identity policy 2026-10-06 16:42:25 +08:00
Tianyi Cui 5990ccbb4a fix(experimental): align package guidance and platform source ownership 2026-10-06 16:41:35 +08:00
Tianyi Cui 7bc0b972f8 test(experimental): preserve platform and installed-profile coverage 2026-10-06 16:41:34 +08:00
Tianyi Cui 06693ba0d4 test(acp): keep transport fixtures independent of hook bridges 2026-10-06 16:41:04 +08:00
Tianyi Cui b7ed2a5e85 test(experimental): resolve optional fixtures from their owners 2026-10-06 16:41:04 +08:00
Tianyi Cui b48384223a refactor(experimental)!: classify optional packages and move prototypes 2026-10-06 16:41:04 +08:00
Tianyi Cui 8666a77482 Merge pull request #5723 from deepseek-harness/worktree/cot-translation/deepseek
feat(translator): add opt-in native DeepSeek Flash translation
2026-10-06 16:21:46 +08:00
Tianyi Cui 32a561f3a6 refactor(llm): request minimal reasoning without naming a caller purpose
`purpose` is a provider-neutral label for replay and transport metadata, so
an adapter must not branch on one caller's value. `GenerateOptions` gains
`minimizeReasoning`, which any auxiliary caller sets when reasoning would
consume the output budget it reserved for a short visible result; both
shipped adapters dispatch such a request at the least reasoning the model
supports, and `session-title-llm` sets it instead of relying on the
adapter recognizing `'session-title'`. The pasted type in the subsystem
page and the generated Cordis API catalog follow.

Prompted by review: llm-pi-ai must not know about session-title.
2026-10-06 15:47:09 +08:00
Tianyi Cui b98b76c9a5 feat(translator): add opt-in native DeepSeek Flash translation 2026-10-06 15:38:24 +08:00
Tianyi Cui cfc6be809c feat(reasoning): persist opt-in machine translations 2026-10-06 15:36:14 +08:00
Tianyi Cui 8a199f81eb test(session-title): refresh the settlement expectation on the rebased master
Master changed the same recorded scenario, so its title-request line is
regenerated against the current base.
2026-10-06 15:16:17 +08:00
Tianyi Cui 5ff4172224 test(session-title): identify title requests by their own messages
A request body also carries the session log, whose recorded title event
embeds the framed prompt, so a body-wide marker search matches the main
request too; both mocks now read the request's own messages. The headless
scenarios also assert the dispatched cap, which is the base-bundle ceiling
on the 256000-token route and the route override's 1024 in the pi-ai
compatibility scenario. The extraction cases cover asterisks that are not
emphasis.
2026-10-06 15:12:59 +08:00
Tianyi Cui 791d83bbac docs(session-title): state the title request's real rationale and cap source
The lowest-level dispatch keeps reasoning off the title's output ceiling,
not a small cap's visible text, and it deliberately skips the
requested-effort check. The README pair records that the dispatched cap
is the smaller of the configured ceiling and the latest folded
request/header, including the tighter-main-cap and override consequences,
and the accepted-title comment states the deliberate whole-line emphasis
rule.
2026-10-06 15:12:59 +08:00
Tianyi Cui cd37d51092 test(session-title): record the shipped title prompt in the SDK snapshot
The keyless session-title snapshot replays the first-prompt provider, so
its recorded v4 log carries the exact system prompt of the title
request.
2026-10-06 15:12:58 +08:00
Tianyi Cui 37f53cbd45 test(session-title): follow the shipped 4096-token title cap in CLI and Web expectations
Headless stream-json and session expected outputs record the title
request's maxTokens, and every one of them still recorded the previous
base-bundle cap.
2026-10-06 15:12:58 +08:00
Tianyi Cui a6341ae88b docs(session-title): describe the accepted title and the clamped output cap
The README pair states that an accepted result is the first non-empty
line of the model text, with one wrapping emphasis pair removed, and that
the dispatched cap is the smaller of maxOutputTokens and the cap the
routed adapter declares. The pair is re-recorded with both sides.
2026-10-06 15:12:55 +08:00
Tianyi Cui 34622b0985 test(session-title): follow the shipped 4096-token title cap in CLI and Web markers
The headless and Web mock providers recognize a title request by its
max_tokens, which still assumed the previous 256-token base-bundle cap.
The recorded expected outputs carry that cap too and follow with it.
2026-10-06 15:12:55 +08:00
Tianyi Cui 3562e14f28 fix(session-title): widen the shipped title output cap to a runaway ceiling
The prompt asks for a short title, so the cap only stops runaway output:
reasoning a model cannot switch off also counts as output, and 256 tokens
truncated titles on the HFAI gateway. The measured worst title response
was 153 output tokens, so 4096 is about 25 times the observed maximum.
2026-10-06 15:12:55 +08:00
Tianyi Cui 6ec995d49b fix(session-title): keep the first output line and bound the cap by the request
Claude wraps some titles in asterisk emphasis and writes the title, a
blank line, then an explanation when the messages say little. Joining the
text blocks made that explanation part of the saved title. Take the first
non-empty line, drop one emphasis pair around it, and ask the model for a
short best-effort title instead of an explanation.

The dispatched cap is now the smaller of the configured cap and the cap
the session's current main request recorded, so a route the deployment
capped below the shipped ceiling is never asked for more than that cap.
2026-10-06 15:12:55 +08:00
Tianyi Cui a0c7da0444 docs(llm-pi-ai): describe how a session-title off dispatches; order the level helpers
A session-title request dispatches off exactly as a selected off does,
which on protocols that omit the reasoning field leaves the gateway
default in effect. The README now says so instead of implying reasoning
is always switched off. requestReasoningLevel follows the
resolveReasoningLevel it calls and names when it returns no level, and
the Loader composition helper takes provider config and further entries
as separate parameters.
2026-10-06 15:12:55 +08:00
Tianyi Cui 99d22d5e31 test(session-title): follow the shipped 256-token title cap in CLI and Web expectations
Headless stream-json and session expected outputs record the title
request's maxTokens, and the headless and Web mock providers recognize a
title request by its max_tokens. Both still assumed the previous 64-token
base-bundle cap.
2026-10-06 15:12:55 +08:00
Tianyi Cui 067241ae6c test(session-title): assert the pi-ai title request without untyped matchers 2026-10-06 15:12:49 +08:00
Tianyi Cui fabd805bfe fix(session-title): leave reasoning headroom in the shipped title output cap
The base bundle capped title generation at 64 output tokens, sized for a
route that disables thinking. Models whose reasoning cannot be switched
off spend output on it even at their lowest level: on the HFAI gateway,
GPT-6 Sol and GPT-6 Astra used up to 87 and 121 output tokens for
five-word titles at reasoning low, so Sol still finished with max-tokens
on most first prompts. Raise the shipped cap to 256; routes that disable
thinking stop after the title and are unaffected.
2026-10-06 15:12:48 +08:00
Tianyi Cui 80fd1f0b19 fix(llm-pi-ai): dispatch session-title requests at the lowest reasoning level
Session-title calls carry a 64-token output cap and rely on the adapter to
keep reasoning out of it. llm-deepseek maps purpose 'session-title' to
thinking disabled, but llm-pi-ai ignored the purpose, so pi-ai routes sent
title calls at the route's default effort. On HFAI's adaptive-thinking
Claude models (profile reasoning: max) the thinking consumed the cap, the
call finished with max-tokens, and the session kept its fallback title.

The pi-ai adapter now dispatches a session-title request at the model's
lowest supported level: off when the model offers it, otherwise the
lowest declared level. GenerateOptions.purpose documents that obligation
for every adapter.
2026-10-06 15:12:48 +08:00
Dudu-0223 bf1c4e01ba Merge pull request #4394 from deepseek-harness/refactor/subagent
refactor(subagent): unify activations and reuse parent catalog
2026-10-06 15:08:30 +08:00
Tianyi Cui 1103b0277b fix(session): await natural migration verifier worker exit
A successful verifier message was treated as terminal even though the
Worker Thread was still alive. The parent immediately terminated the
worker and detached cancellation, so an error, nonzero exit, or caller
cancellation after that message could be ignored and verification could
resolve successfully.

Keep the first successful response pending until an observed natural exit
with code 0. A missing response or nonzero exit rejects after the worker
has already exited. Error and abort callbacks retain the existing
terminate-and-join path, including its first-error and AggregateError
behavior. The scheduler stays unchanged: its permit remains held until
the verification promise settles, now after successful worker quiescence.
The worker already closes its parent port in finally, so success needs
neither a forced stop nor another protocol message.

Replace success-termination expectations with deterministic message/exit
barriers and cover post-response errors, nonzero exit, cancellation, and
permit handoff. Remove the obsolete hand-written termination thenable and
its retired unknown-assertion baseline entry. Add real source workers for
plain and Zstandard input, and require the built plain-Node migration smoke
to complete with zero termination calls. Document the settlement condition.

Native Windows CI recorded process access violation 0xC0000005 while a
migration fixture was active. Removing unnecessary successful-worker
termination is consistent with that evidence, but this commit does not
claim that the native faulting module or mechanism has been established.
The deterministic regressions prove the lifecycle defect independently;
the next native CI run must assess whether the observed crash recurs.

Validation:
- Original source failed all new message-to-exit regression scenarios;
  the updated focused lifecycle file passes 19 tests with 100% coverage.
- Node 24 owning package: 19 files, 741 passed, 1 skipped; every included
  package source file reaches 100% statements/branches/functions/lines.
- Real source workers passed for none/zstd; built plain-Node smoke passed
  with zero terminate calls and no timeout or process signal.
- Exact Node 22.19 source-mode none/zstd workers naturally exited 0 with
  zero terminate calls, exercising the async Module.register fallback.
- Host TypeScript build, focused lint, no-new-unknown-assertion gate,
  README translation pairing, and all 42 doc-sync gates passed.

Related to #4387 and #4394.
2026-10-06 11:29:17 +08:00
Tianyi Cui a7798a379d Merge pull request #5717 from deepseek-harness/worktree/client-control/cli-help-reference
feat(cli): generate the CLI help reference and add dsh plugin help
2026-10-06 11:11:26 +08:00
Turtle 3e46f68151 docs(web): record the long-line cap's cost and grammar-state effect
Pair the Chinese README, pin the 1,000-unit boundary, and check that
streamed and settled highlighting agree after a skipped line.
2026-10-06 11:09:21 +08:00
Tianyi Cui a33a0d84c6 test: refresh remaining cwd snapshot expectations
The master cwd integration updated the shipped headless profile, but three
current snapshot scenarios merged without textual conflicts and retained
expectations from before the directory service was composed. Full CI
replay found the stale product-subagent-both persona and missing current
working-directory context in the no-message-tool and structured-parent
parent logs; those two scenarios also owned stale child/header sidecars.

Refresh only those three scenarios through the real built headless profile.
Record the required runtime cwd section in their four parent/child V4
logs, remove static cwd text from three prompt sidecars, and include the
new cwd start parameters and working_directory tool in three schema
sidecars. Preserve every model response and event count. No production
code, scenario input, workspace oracle, or historical V0-V3 fixture changes.

Validation: selective refresh passed 3/3. Full DSH_EXAMPLE_MODE=lib pnpm
run test:snapshot passed all 8 files: 197 passed and 2 PowerShell scenarios
skipped. The first full local run selected macOS CPython 3.9.6 and failed
the two Python PTC scenarios; the final full run prepended the existing
CPython 3.12.13 bin directory to PATH, with no runtime or fixture workaround.
SHA256 guards confirmed all 363 retained historical inputs unchanged;
JSON comparison confirmed the four changed logs differ only by cwd context.
2026-10-06 11:09:17 +08:00
Tianyi Cui e0ca375065 Merge pull request #5418 from deepseek-harness/fix/pwsh-prompt-in-repaint-frame-20260929
test(pwsh): verify prompt readiness after scrolling and restart
2026-10-06 11:04:53 +08:00
Tianyi Cui 8f3959a196 Merge branch 'master' into worktree/client-control/cli-help-reference 2026-10-06 10:59:23 +08:00
Turtle a150f22c91 fix(web): leave overlong source lines uncolored
TextMate scanning cost grows superlinearly with line length, so a
generated line of tens of thousands of characters blocked the page for
seconds when the sidebar previewed the file. Lines of 1,000 or more
UTF-16 units now render as one plain run in every highlighted surface.
2026-10-06 10:53:31 +08:00
Tianyi Cui a3cb678875 Merge master current-directory support into subagent activations
Integrate the observed master checkpoint 7ab215e23e5d977aae7eb5d4fb91782d39969dbb without rewriting the earlier published checkpoints. Master adds current-directory events, directory-aware consumers, and retained Git worktrees; its old subagent startup paths overlapped the unified activation implementation.

Resolve directory selection within managed startup after acquiring parent ownership. Preserve the original Session origin while setting each new local child directory, retain persisted directory state on cold resume, and pass a required absolute cwd to external providers. Keep unified local/external ownership, full completion notices, parked-input host completion, SDK wait/error/shutdown behavior, and ACP cancellation semantics. Retain removal of the old in-process driver and continuation managers.

Combine SDK wait with the new directory requests, preserve the new master directory/worktree fixtures, regenerate derived catalogs from the combined sources, and refresh only the four stale prompt/schema sidecars. Preserve every protected historical schema, archived note, catalog-v2 acknowledgement, and recorded predecessor input.

Validation: full build; 59 CI static gates; 855 subagent tests with 100% coverage on changed core/external sources; affected consumer suites including 119 repaired-fixture tests; SDK 11 and headless 16 recorded scenarios; two local headless expected cases; six built nested SDK/ACP cases; lint, strict cast inventory, workspace constraints, and whitespace checks. Native Windows worker diagnostics remain additive and require the next CI run to classify the original crash.
2026-10-06 10:52:35 +08:00
Tianyi Cui 13b4f716e7 test(pwsh): verify prompt readiness after scrolling and restart 2026-10-06 10:41:16 +08:00
Tianyi Cui 9a93c1f0dd Merge pull request #5781 from deepseek-harness/worktree/fix-claude-mods-windows-hold
fix(claude-code-mods): make Blast Radius holds independent of POSIX sleep
2026-10-06 10:34:24 +08:00
Tianyi Cui c042d32d21 Merge pull request #5363 from deepseek-harness/fix/pty-bundled-openconsole
fix(subprocess): back Windows terminals with node-pty's bundled console host
2026-10-06 10:30:24 +08:00
Tianyi Cui cbcbbf8825 fix(claude-code-mods): make Blast Radius holds independent of sleep 2026-10-06 10:20:25 +08:00
Tianyi Cui 6f566013b9 Merge pull request #5742 from deepseek-harness/worktree/working-directory/worktree-checkout-safety
fix(worktree): isolate checkout from Git filters and inherited selectors
2026-10-06 10:18:05 +08:00
Tianyi CuiandChinesezjc 9bc34fa962 ci: reuse reviewed coverage fork exit diagnostics
Repeated native Windows coverage runs stopped a Vitest fork while a JSONL
migration suite was unfinished. Vitest's generic unexpected-exit error
discarded the process exit code and signal, preventing classification of
the failure despite identifying the missing test file from the inventory.

Reuse the public ForksPoolWorker diagnostic implementation and protocol
fixtures from independently reviewed PR #4388, pinned at
77e215ff76711ec75ed8aa08aa5b414780e539ae. The runtime helper is unchanged.
It reports PID, project, worker identity, outstanding file request, code,
and signal before stock Vitest reports the original failure. It clears
ownership only on the typed testfileFinished response, suppresses expected
stop, and leaves cancellation and failure handling with the original pool.

Wire that existing pool into generated coverage partition configs. Keep
the original worker counts, partition scheduling, test timeouts, coverage
thresholds, and failure verdicts. No environment, raw argv, or test object
is serialized. This commit adds diagnostic evidence; it does not claim to
repair the still-unidentified Windows crash. PR #4388 remains the separate
reviewable owner; no duplicate diagnostic framework or PR is introduced.

Adapt the copied fixtures to the current no-new-unknown-assertions rule:
declare the private preload exit function, validate consumed logger fields
with the public logger type, and assign matcher/rejection values to typed
unknown locals without assertions. Add a concise bilingual testing note.

Validation:
- Diagnostic suite: 10 passed, including a real configured Vitest fork
  exiting 23, stock-pool negative control, successful silent shutdown,
  unexpected exit 0, early exit, independent forks, and signal metadata.
- Coverage coordinator suite: 51 passed.
- Targeted lint and focused strict TypeScript check passed.
- pnpm exec tsc -b tsconfig.host.json passed.
- verify-no-unknown-casts passed; 1430 existing assertions unchanged.
- doc-sync passed 40 gates; the two initially failing gates were repaired
  and rerun successfully: doc-typecheck and verify-doc-budgets.
- Translation pairing and git diff --check passed.

Refs #4387, #4388, #4394.

Co-authored-by: Chinesezjc <[email protected]>
2026-10-06 10:17:44 +08:00
Tianyi Cui acf7949db0 test(sdk): replace the cast context with typed runtime services
The cwd regression used a fake Context cast through unknown. Updating its service lookup for descendant shutdown changed the exact legacy assertion fingerprint, which the no-new-unknown-casts CI gate correctly rejected.

Exercise initialize, prompt, and wait with the real Context, Agent registry, Session store, and a scripted LLM adapter. Spy on the real service methods to keep the cwd, reasoning effort, and token-limit assertions. Remove both obsolete unknown assertions and prune only their recorded allowances; do not add or broaden an exception.

Validation: the cwd regression passes; all 54 SDK server tests pass with 100% server coverage. The full check:ci:static aggregate passes 59/59, including the strict unknown-cast inventory. No production behavior changes.
2026-10-06 03:23:56 +08:00
Tianyi Cui c729eb3bc6 test(subagent): preserve the flush result in the failure fixture
The gated final-flush fixture awaited the real flush but dropped its boolean return value. The regression ran correctly under Vitest, but the full Host build rejected the mock against Sessions.flush Promise<boolean>.

Return the real flush result after the gate. This retains the observation order and matches the service signature without a cast or altered production behavior.

Validation: targeted terminal-capture-failure regression passes; the complete build is rerun after this typing correction.
2026-10-06 03:09:06 +08:00
Tianyi Cui d69442b408 fix(sdk): drain descendants before releasing session roots
SDK shutdown disposed its root Agent handles without stopping managed
Activations below those exact roots. The manager owns descendant handles
in a separate context, so an interrupted child with parked input remained
registered after shutdown resolved. Its settlement watcher could then
outlive the SDK root and race later projection teardown.

Close scoped descendant admission and await child-first drain before
releasing root handles or the server adapter. Keep draining limited to the
server's exact root Agents so unrelated parent trees remain live. Collect
drain failures without skipping the existing root/adapter teardown, and
preserve the final single-error or aggregate-error result.

Add real AgentLoop/SubagentRuntime regressions for parked children at
one and two levels, child-first disposal, preservation of an unrelated
parked tree, and descendant/root teardown failure aggregation. Correct an
existing Context.get test stub to return its LLM only for the LLM service.
Document the lifecycle order in the server JSDoc and bilingual README.

Validation: 52 SDK server tests with 100% server.ts statements, branches,
functions, and lines; four final shutdown regressions; host TypeScript
build; full lint; 21 quick documentation checks; staged pairing/diff checks.
Doc-sync passed 41/42 checks; the pre-existing config catalog source link
for subagent-acp/index.ts is stale at base and left to integration refresh.
2026-10-06 03:07:45 +08:00
Tianyi Cui b730d6c0c9 fix(subagent): let parked inboxes stop delaying host completion
Interrupting a local child can preserve unclaimed steering while leaving the Agent idle. Activation residency intentionally continues in that state, but completion barriers joined its result forever. The real SDK server reproduced the hang for both direct children and a nested parked leaf.

Join progressing work and cleanup while retaining parked inboxes and their activation results. Observe local activity and maintenance, external execution, unpublished ownership holds, and materialization; rescan after changes. Recheck resumed Agents after concurrent idle observations. Inbox insertion and ownership publication wake pending observations, so late non-waking injection cannot strand a result wait. Existing descendants remain responsible for their own work; no second state store or polling timer is introduced.

Document that persistent SDK/ACP hosts keep these children available for later wake-up, while headless shutdown discards unclaimed input. Simplify the final settlement recheck to retry changed readiness uniformly. Update generated API and event references from their sources.

Validation: real SDK negative controls fail at both depths on the prior manager with clean teardown; 545 tests pass across 27 files. Manager, local activation, and headless runner each reach 100% statements/branches/functions/lines. Six deterministic races cover revival, preparation publication/rollback, flush-time injection, and late children. doc-sync 42/42, targeted build, lint, and whitespace checks pass.
2026-10-06 03:07:24 +08:00
Tianyi Cui 9b1fc3be05 docs(subagent-acp): refresh the generated configuration source link
Removing the duplicate ACP directory helpers moved its Config declaration by one line. The generated English and Chinese catalogs still referenced the old line, so the exact-source freshness gate rejected the otherwise unchanged configuration.

Regenerate only the affected source links. No configuration fields, defaults, examples, or translated prose change.

Validation: pnpm run gen-config-catalog produced exactly these two link updates; the combined doc-sync run verifies freshness.
2026-10-06 03:06:34 +08:00
Tianyi Cui b023791481 fix(headless): retain live failures without a later terminal
A child completion can wake the parent after its first completed turn. If
that summary cannot append turn/start or turn/end, AgentLoop reports an
agent/error and contains the rejected driver. Whole-agent idleness then
resolves, but the headless runner previously reused the older completed
terminal and exited successfully, sometimes printing the older answer.

Retain failures from the exact owned Agent with the current Session log
offset. Only a later terminal committed by the same Session clears that
failure. After work and persistence drain, fail the run before emitting a
final answer when no such terminal exists. Dispose both observers with
the run. Ordinary durable error outcomes and later successful recovery
continue to use the log's final terminal.

Add real AgentLoop regressions for missing summary start/end commits in
plain and JSON output, ordinary hook failures with and without recovery,
recovery after persistence failures, and unrelated Agent errors. Update
the bilingual exit contract and generated event consumer matrix.

Validation: 106 headless package tests; 100% runner statements, branches,
functions, and lines; 9 focused terminal-failure tests after the typed
append wrapper correction; package TypeScript build; full lint including
host build; 21 quick documentation checks; 42 doc-sync checks; diff check.
2026-10-06 02:53:04 +08:00
Tianyi Cui 1dbbc59d3e fix(subagent): retain local failures without a durable ending
Local activation results were derived only from committed Session events.
When the first turn/end append failed, no ending existed and the result
defaulted to completed. When the first turn/start append failed, the initial
message remained unclaimed and kept the idle activation resident forever.
Both paths emitted agent/error but had no durable terminal to project.

Retain the log offset of the latest exact-Agent live failure on the local
activation. Clear it only when the same Session commits a turn/end at or
after that offset, so a later recovery can supply its own outcome and a
reentrant older terminal notification cannot erase a newer failure. The
child scope owns both observers and removes them with its Agent handle.

Capture error while that live failure remains. Let the failed local
activation settle despite its own unclaimed inbox, while preserving the
existing requirement to wait for owned descendants. Wake its settlement
observer when a live failure changes readiness. No public API, raw Agent
idle semantics, or descendant teardown policy changes.

Add regressions through real local activation creation for first start/end
append failures, recovery by later durable endings, exact-Agent isolation,
and an error emitted reentrantly during an older terminal notification.
Update the bilingual package contract and generated event consumer graph.

Validation:
- Both first-append regressions reproduced before the fix: turn/start
  remained pending; turn/end returned completed instead of error.
- Six focused behavior cases passed after the fix.
- 423 subagent package tests passed; activation.ts and manager.ts reached
  100% statements, branches, functions, and lines under scoped coverage.
- pnpm exec tsc -b packages/subagent/subagent/tsconfig.json passed.
- Focused source/test oxlint and git diff --check passed.
- doc-sync passed 41 gates; its sole stale event-graph failure was corrected
  with gen-doc-graphs, then verify-doc-graphs passed for all seven graphs.
- README translation pairing regenerated and passed the doc-sync check.
2026-10-06 02:46:21 +08:00
Tianyi Cui 5b9dd96963 docs(workflow): clarify local child continuation requirements
Caller delivery changes result ownership, but does not make local workflow children private or remove their continuable catalog entries. The workflow README stated durable discovery without making the message and cold-resume consequences explicit.

Document that resident workflow children accept continuation and that cold continuation requires persistence and Session query. An ephemeral child therefore returns NOT_RESUMABLE after disposal. This describes current supported behavior and does not add fallback storage or a new child mode.

Validation: checked against startActivation, sendMessage, and cold-resume admission; English and Chinese pairing updated. Full doc-sync follows the combined review fixes.
2026-10-06 02:44:37 +08:00
Tianyi Cui 4c8cb2fac6 refactor(subagent-acp): reuse shared working directory resolution
ACP retained a private copy of the external-provider directory helpers after the other providers adopted the shared implementation. The copies differed on absolute-path validation and imposed separate filesystem branches and maintenance.

Use resolveChildCwd and validateConfiguredCwd from the existing subagent package. Preserve configuration-time relative-path resolution, parent workspace inheritance, missing-directory failures, and ACP diagnostic normalization. This deletes the duplicate directory implementation without introducing an abstraction or dependency.

Validation: 85 passing tests across the ACP provider and shared out-of-process helper suites, including real child process cwd, configured overrides, and invalid-directory rejection.
2026-10-06 02:44:10 +08:00
Tianyi Cui 0963845443 test(headless): expect complete child settlement notices
Parent completion notices now always carry the child closing answer, even when the child can send progress messages. Two assembled headless expectations still asserted the removed omission and made the snapshots-and-artifacts CI lane fail.

Require CHILD_RESULT in the settlement assertion and refresh only the owning parent and stream output expectations. Preserve released replay inputs, event ordering, sandbox denial evidence, and the recorded model responses.

Validation: DSH_EXAMPLE_MODE=lib pnpm run test:expected apps/cli/tests/profiles/headless/tests/headless.expected.e2e.ts apps/cli/tests/profiles/headless/tests/subagent-inheritance.expected.e2e.ts (18 passed).
2026-10-06 02:43:31 +08:00
Tianyi Cui 1595e34656 docs(subagent): distinguish execution results from cleanup failure signals
The subsystem result paragraph still said that a parent log records the
final cleanup-failure status and that the result had already been returned.
The manager instead captures the execution result, performs cleanup, sends
that preserved result in the parent notice, and then resolves the public
result. Cleanup failure separately rejects dispose and marks the live
subagent/end event as error.

Correct the bilingual paragraph to name those actual recipients and timing.
Do not imply that the successful execution notice becomes a failed notice,
or change the runtime's independent execution/cleanup outcomes.

Validation: the updated bilingual pair passes. The statement is checked
against finishDisposal/notifySettlement and the existing cleanup-failure
regressions; final documentation gates run before publication.
2026-10-06 02:06:05 +08:00
Tianyi Cui 813c7d2ef8 test(acp): honor the asynchronous content fixture contract
The initial-cancellation regression supplied a synchronous content array to
defineContentToolFixture, whose executor contract requires a Promise of
content blocks. Vitest executes the fixture, but the strict repository
Host build correctly rejects its signature with TS2739.

Return the same blocks through Promise.resolve. Keep the deterministic
stream/output gates and assertions unchanged; do not widen the shared
fixture API merely to accept this one caller.

Validation: the focused initial-cancellation regression passes. The full
Host build is rerun before publication to validate the fixture signature.
2026-10-06 02:00:43 +08:00
Tianyi Cui cbf618845a fix(acp): bind cancellation to the interrupted root activity
Cancelling during the prompt's initial whenIdle() wait could retain its
slot indefinitely. If a child delivered a result while the aborted root
was unwinding, Agent.whenIdle() followed the replacement driver and waited
for the newly autonomous summary. The earlier child-wait recheck could
not help because settlement had not yet reached that child wait.

This is an inherited latent issue: the pre-PR ACP bridge also awaited the
same replacement-following whenIdle() after cancellation. Existing
continuable spawn children could expose it; the unified asynchronous fork
default makes the ordering possible for fork delegations as well.

Give the existing InflightPrompt one cancellation-completion promise,
replacing the local cancellation wake-up and its listener. The private
admission AbortSignal is the cancellation flag instead of duplicated
boolean state. The exact root's emitted status identifies the interrupted
activity's retirement and synchronously adopts that output queue. Later
root work and later output cannot replace the first captured completion.

Record whether cancellation began at public idle. Maintenance has that
public status too, so its next running transition establishes release of
work behind maintenance; the ordinary whenIdle promise provides a
fallback when no transition occurs or plugin disposal detaches observers.
Both observations settle the same promise. Settlement races that promise
against initial idle and child waits, then waits only for the interrupted
activity/output on the cancellation path. No future work is re-cancelled,
child admission remains open, and session close keeps its separate full
quiescence and descendant teardown.

Add two deterministic real-Agent regressions. One gates aborted model
cleanup, previously queued image delivery, and the later autonomous
summary independently. The other gates cancelled maintenance cleanup and
the later summary. Both failed before this fix; both now wait for old work
and output, return cancelled while later work remains gated, and permit a
subsequent ACP prompt to execute another real local delegation. Existing
plugin-disposal tests also verify the idle fallback after observer cutoff.
Update the bilingual ACP semantics and generated event-consumer matrix.

Validation:
- Both focused regressions reproduced pending cancellation before the fix.
- pnpm exec vitest run packages/acp/acp/tests --coverage --coverage.include=packages/acp/acp/src/session.ts --coverage.include=packages/acp/acp/src/index.ts --coverage.reportsDirectory=/tmp/pr4394-acp-owned-cancel-89ec33e5788-consumer-v2
  (150 passed; both changed source files have 100% statements, branches,
  functions, and lines)
- pnpm exec tsc -b packages/acp/acp/tsconfig.json
- pnpm exec tsdown --config-loader native --env.DSH_BUILD_FACE host --filter '@deepseek-ai/dsh-acp'
- DSH_EXAMPLE_MODE=lib pnpm run test:e2e packages/subagent/subagent-dsh-sdk/tests/nested-delegation.e2e.ts -t '^external tasks.*acp'
  (3 passed, 3 unselected)
- Focused lint, named translation pairing, generated graph verification,
  and git diff --check passed.

Independent ACP rereview found no remaining issue, passed seven focused
turn/disposal cases, and verified a prepended idle listener can start a
new hanging root before ACP handles the old idle event without retaining
the cancelled prompt.
2026-10-06 01:55:26 +08:00
Tianyi Cui cfad6ba882 fix(worktrees): isolate inherited attributes and clarify Git content 2026-10-06 01:39:48 +08:00
Tianyi Cui c7e4da483b test(worktrees): replay configured checkout filters 2026-10-06 01:39:48 +08:00
Tianyi Cui 2b6040c40c fix(worktrees): suppress configured checkout filters 2026-10-06 01:39:48 +08:00
Tianyi Cui a1e89dd84d test(gui): include worktrees in official plugin configuration 2026-10-06 01:39:47 +08:00
Tianyi Cui 2481ad8eb6 docs(worktree): keep the capability seam translation paired 2026-10-06 01:39:47 +08:00
Tianyi Cui a1363f7f47 fix(worktree): offer GUI opt-in through official plugins 2026-10-06 01:39:47 +08:00
Tianyi Cui 171cf5d70f fix(experimental): align worktree fixtures and catalogs with current runtime 2026-10-06 01:39:47 +08:00
Tianyi Cui b26f8eadd4 test(experimental): cover worktree portability on Windows 2026-10-06 01:39:47 +08:00
Tianyi Cui d26fe1ab4e fix(experimental): address worktree review findings 2026-10-06 01:39:46 +08:00
Tianyi Cui d299d3b966 test(experimental): verify worktree release and sandbox behavior 2026-10-06 01:39:46 +08:00
Tianyi Cui c67a2d6fdf feat(experimental): create and enter retained Git worktrees 2026-10-06 01:39:46 +08:00
Tianyi Cui 3f280f2566 test(session): preserve validated fixtures after rebase 2026-10-06 01:39:40 +08:00
Tianyi Cui 18a297cb13 Merge latest master credential-recording guidance
Preserve the published 78ae4fc2 integration checkpoint and merge the later master tip separately. This master delta changes only the browser-GIF skill to use the managed DSH credential store through normal application configuration; it changes no product source, schema, or test behavior. The existing credential-provider recording overlay already follows that guidance.
2026-10-06 01:37:30 +08:00
Tianyi Cui 43928bf03f refactor(workspace): remove obsolete mutation path parser 2026-10-06 01:31:52 +08:00
Tianyi Cui ab112b82cd test(mods): canonicalize Windows directory fixtures 2026-10-06 01:31:52 +08:00
Tianyi Cui 7b8d093a9c test(tools): expect nested search presentation metadata 2026-10-06 01:31:52 +08:00
Tianyi Cui f5b7fdcadb docs(system-prompt): align dynamic context evaluation contract 2026-10-06 01:31:52 +08:00
Tianyi Cui 96c4a89a72 docs(system-prompt): sync admission context API references 2026-10-06 01:31:52 +08:00
Tianyi Cui 9c679b21f4 fix(agent-loop): refresh provider context at actual request admission 2026-10-06 01:31:52 +08:00
Tianyi Cui 2489bbba16 test(session): acknowledge metadata and replay corrected directory state 2026-10-06 01:31:52 +08:00
Tianyi Cui 93469a2097 test(session): replay directory consumers through the shipped profile 2026-10-06 01:31:52 +08:00
Tianyi Cui ffd791a110 fix(session): use committed directories in hooks and consumers 2026-10-06 01:31:51 +08:00
Tianyi Cui c7e62c1062 fix(tools): retain nested PTC presentation metadata for historical locations 2026-10-06 01:31:51 +08:00
Tianyi Cui df655fd11e fix(agent-loop): restore runtime context after compaction before request admission 2026-10-06 01:31:51 +08:00
Tianyi Cui caef1d5d5f docs(upgrade): explain current-directory migration 2026-10-06 01:31:51 +08:00
Tianyi Cui 6d0533df47 test(web): refresh directory context and recorded file targets 2026-10-06 01:31:51 +08:00
Tianyi Cui a740b421ef test(web): keep user terminal authority independent of agents 2026-10-06 01:31:51 +08:00
Tianyi Cui e1fe956928 test(sdk): reuse directory fixture mapping for recovery 2026-10-06 01:31:51 +08:00
Tianyi Cui 3fd3aa4e32 test(pwsh): record directory metadata in current fixture 2026-10-06 01:31:51 +08:00
Tianyi Cui c6aad8c433 test(sdk): refresh released runtime directory context outputs 2026-10-06 01:31:51 +08:00
Tianyi Cui befd1590e6 test(acp): keep persona assertion typed 2026-10-06 01:31:51 +08:00
Tianyi Cui 14d9d17e6f test(session): compare retained replay against current cwd outputs 2026-10-06 01:31:51 +08:00
Tianyi Cui 2eb058d887 fix(web): remove retired directory persona templates 2026-10-06 01:31:51 +08:00
Tianyi Cui bad0ce8311 test(session): align global directory tool expectations 2026-10-06 01:31:51 +08:00
Tianyi Cui 03a0165f59 test(compaction): pin synthetic directory context
Seed a fixed POSIX effective directory before the first request and disable ambient instruction discovery in the two pressure fixtures. Preserve the original project and existing output, headroom, retention, and summary limits while keeping shadowed token counts independent of temporary workspace path length.
2026-10-06 01:31:51 +08:00
Tianyi Cui b58cd85574 test(session): repair working-directory integration fixtures
Supply the required directory collaborator to current runtime fixtures, verify absolute result navigation and deployment fallback, and retain the valid V4 working-directory recording instead of the unreleased V3 input that contains a V4-only event.
2026-10-06 01:31:51 +08:00
Tianyi Cui 0c6b1ef7bb fix(session): port directory consumers and fixtures to current runtime 2026-10-06 01:31:51 +08:00
Tianyi Cui f496f4bdcf fix(context): apply session directories to browser MCP launches 2026-10-06 01:27:55 +08:00
Tianyi Cui 1d606f09ea test(subagent): include directory context in settlement fixture 2026-10-06 01:27:55 +08:00
Tianyi Cui d5edd3294b test(context): mount directory provider for deferred guidance 2026-10-06 01:27:55 +08:00
Tianyi Cui 3f35ca7b5b test(session): align fixtures with awaited agent creation 2026-10-06 01:27:55 +08:00
Tianyi Cui b446e2e290 fix(web): start sidebar terminals in the session directory 2026-10-06 01:27:55 +08:00
Tianyi Cui 6f23c5dfd1 fix(session): align rebased documentation and SDK series output 2026-10-06 01:27:55 +08:00
Tianyi Cui 549c0b5e37 docs(session): clarify working directory ownership and migration 2026-10-06 01:27:55 +08:00
Tianyi Cui 7cfb22fc19 test(web): include built-in working directory tool 2026-10-06 01:27:54 +08:00
Tianyi Cui 00419e9db4 test(session): update directory context expectations 2026-10-06 01:27:54 +08:00
Tianyi Cui 52fa01e254 test(session): stabilize directory snapshots across platforms 2026-10-06 01:27:54 +08:00
Tianyi Cui 92713fcdbd fix(session): complete working directory consumers and validation 2026-10-06 01:27:54 +08:00
Tianyi Cui 1c34cd578b fix(workspace): retain canonical targets for produced file mentions 2026-10-06 01:27:54 +08:00
Tianyi Cui 79bd3d8da7 feat(session): centralize working directories and directory context 2026-10-06 01:27:54 +08:00
Tianyi Cui d317f035ad test(completion): cover descendant errors and remove redundant abort replay
The completion coverage audit left two uncovered paths: replaying an ACP
abort that occurred before listener registration, and ignoring an Agent
error from outside the SDK server's owned root sessions.

Remove the redundant ACP abort replay. The private cancelPrompt method
is the sole owner of admissionController.abort(), sets cancelRequested
first, and never resets it. Settlement checks that sticky cancellation
state after its initial idle observation and before awaiting the local
cancelled promise. A pre-listener abort therefore never needs to resolve
that promise; the listener still handles cancellation during child waits.

Add a real local subagent failure regression for SDK ownership. The child
emits agent/error through the normal AgentLoop path and returns an error
result, while the SDK root's wait and a subsequent prompt both complete.
The test also rejects observer warnings, so dropping the ownership guard
fails on the swallowed TypeError rather than merely executing the branch.
No fake Agent identities or private-state mutation are used.

Validation:
- Focused descendant test passed; removing the ownership guard as a
  temporary negative control failed on the unexpected observer error.
- pnpm exec vitest run packages/acp/acp/tests packages/sdk/server/tests packages/subagent/subagent-dsh-sdk/tests --coverage --coverage.include=packages/acp/acp/src/session.ts --coverage.include=packages/sdk/server/src/server.ts --coverage.reportsDirectory=/tmp/pr4394-completion-coverage-00243b2f89e-consumer
  (251 tests passed; measured statements, branches, functions and lines 100%)
- Focused lint and git diff --check passed.

The early-cancellation audit also reproduced a separate initial-idle wait
liveness issue. It is intentionally left for its own authorized follow-up
commit rather than being combined with this coverage change.
2026-10-06 01:27:06 +08:00
Tianyi Cui d49efe8b0f docs(sdk): state the task completion runtime requirement
The SDK subagent provider now uses session/wait to keep a delegated child
runtime alive through nested work. A deployment that explicitly selects an
older dshBin can still initialize and accept a prompt but cannot satisfy
that completion request; it must report an execution failure rather than
silently treating the first idle as success.

State the required operation in the provider's owning failure/recovery
contract and update the current activation upgrade guide to tell users to
upgrade a separately configured runtime with the provider. This adds no
capability negotiation, compatibility fallback, or new runtime behavior.

Validation: upgrade-guide structure/word budget and both bilingual pairs
pass. The requirement matches the provider's direct session/wait request
and the SDK server's explicit unknown-method rejection.
2026-10-06 01:12:59 +08:00
Tianyi Cui 8fd7ff69e3 fix(sdk): reject unrepresented session activity failures
A summary can fail while appending turn/start or turn/end and still leave
the root idle with a stable Session sequence. The SDK wait operation then
returned {}, letting the external provider treat the preceding completed
terminal as the result of the entire task. A listener installed only for
the wait would also miss failures between prompt admission and the wait
request.

Retain one latest live failure on each existing SDK Session record, scoped
to the exact owned Agent. Record the Session's next log offset when the
failure occurs. A turn/end from the exact owned Session clears it only
when that terminal was committed at or after that offset. This preserves
failures raised during terminal publication, keeps ordinary represented
turn errors in the durable outcome, and permits later successful activity
to recover. At stable root/descendant completion, session/wait rejects any
remaining failure. Raw session.status and HarnessSession.run behavior are
unchanged; no generic failure history or new notification is introduced.

Add seven owner-local cases for later start/end failures before and during
wait, subsequent successful prompts, represented errors, and publication
ordering including an undefined thrown value. Six failure cases returned
success before the fix. Strengthen listener teardown coverage to assert
all actual subscriptions are disposed after a disposer fails.

Extend the existing recorded subagent-continuable SDK scenario to exercise
session/wait. It still asserts that run() returns DONE at parent turn 1,
then requires child completion and parent turn 2/idle plus its final
summary to be delivered before the wait response. Bypassing the wait made
that ordering assertion fail. No recorded Session or golden output was
invented or refreshed. Update the protocol/server bilingual READMEs and
regenerate the event-consumer matrix for the new error listener.

Validation:
- pnpm exec vitest run packages/sdk/server/tests/wait.spec.ts before the fix:
  6 failed, 1 passed (the represented-error case)
- pnpm exec vitest run packages/sdk/server/tests/server.spec.ts packages/sdk/server/tests/wait.spec.ts (40 passed)
- pnpm run test:e2e packages/subagent/subagent-dsh-sdk/tests/nested-delegation.e2e.ts packages/subagent/subagent-dsh-sdk/tests/loader-composition.e2e.ts (8 passed)
- DSH_EXAMPLE_MODE=lib pnpm run test:e2e packages/subagent/subagent-dsh-sdk/tests/nested-delegation.e2e.ts packages/subagent/subagent-dsh-sdk/tests/loader-composition.e2e.ts (8 passed)
- pnpm run test:snapshot snapshots/sdk/sdk.snapshot.ts -t 'replays subagent-continuable through dsh --profile sdk' (1 passed, 24 unselected)
- pnpm run doc-sync: Host compile/bundle, doc-typecheck and 40 other gates
  passed; the generated event graph was stale, then regenerated and passed
  pnpm run verify-doc-graphs (all 7 graph docs current)
- pnpm run lint:contracts-ready and focused lint of all changed SDK code
- named translation pairing checks and git diff --check

Independent SDK rereview and 7/7 focused tests found no remaining issue.
The parent task owns unchanged Python advanced/recovery validation on the
combined branch; this commit changes no Python or high-level SDK results.
2026-10-06 01:03:30 +08:00
Tianyi Cui 3e2e7e0b2d test(snapshots): align Mods replay with managed delegation tools
Master adds the claude-code-mods recorded scenario, whose full assembled
prompt and tool-schema pins still describe foreground fork calls and the
removed run_in_background switch. Git merged this new scenario cleanly,
but its actual tool composition uses this PR's managed activation tools,
so CI rejects the stale request header and shared delegation guidance.

Refresh only the scenario's system-prompt and tool-schema pins. Preserve
its Session recording, model replies, Mods behavior, and runtime code.
The expectation remains a strict comparison with the actual shipped tool
assembly; no comparison rule is relaxed.

Validation: the owning lib-mode scenario passes refresh and then strict
replay. The original mismatch is recorded in the current-head snapshots
and artifacts CI job.
2026-10-06 00:59:58 +08:00
Tianyi Cui 29638ccf2d test(workflow): assert caller child membership without parent notices
The two-stage real-stack workflow test still expected an empty parent
catalog after the caller-delivery discovery fix. That obsolete assertion
fails deterministically in both Linux and Windows coverage jobs: the two
local children now correctly leave continuable membership records.

Compare catalog identities and modes with independently observed workflow
agent-start identities. Keep the assertions that neither parent followup
nor steer was called, and that both child Agents reached disposal. This
checks the intended separation between durable discovery and result
notification rather than restoring the old missing-navigation behavior.

Validation: all three workflow integration cases pass. The original empty
catalog assertion is the exact failure in both current-head coverage logs.
2026-10-06 00:59:53 +08:00
Tianyi Cui 57226b392b fix(acp): retain failures without a durable turn ending
A later summary can fail while appending turn/start, before AgentLoop
advances phase.turn. Its agent/error event therefore carries the previous
completed turn number. ACP ignored that matching number and reported the
old completed outcome. A failed turn/end append was also ignored and
returned cancelled despite no cancellation.

Retain every live Agent failure observed while the prompt owns queued
work. A subsequently committed turn/end supersedes that live failure and
provides the authoritative terminal reason. If the start/end append fails,
no terminal event clears the error, so ACP rejects the prompt. Remove the
unused turn-number argument from the bridge callback; numeric equality is
not evidence that a failure has a durable outcome.

Add deterministic regressions for later turn/start and turn/end append
failures after an earlier completed turn. Both failed before this change:
start failure returned end_turn, while end failure returned cancelled.
Normal represented model/turn errors retain their existing error mapping,
and the existing cancellation/recovery cases remain covered. Update the
bilingual ACP behavior documentation.

Validation:
- pnpm exec vitest run packages/acp/acp/tests/turns.spec.ts -t 'rejects a later'
  rejected both pre-fix outcomes (2 regressions reproduced)
- pnpm exec vitest run packages/acp/acp/tests (148 passed)
- pnpm exec tsc -b packages/acp/acp/tsconfig.json
- pnpm run verify-translation-pairing --write packages/acp/acp/README.md
- git diff --check
2026-10-06 00:51:28 +08:00
Tianyi Cui 7304af5738 fix(acp): recheck root completion after output draining
The ACP completion loop previously observed root idle and no children,
then awaited outputTail outside that loop. An autonomous root turn could
start while an earlier image update was blocked in conversion. Turn
correlation adopted the new turn and cleared endReason, but settlement
did not wait for that turn. Releasing the old image therefore returned
cancelled without any cancellation while the root was still running.

Keep committed output delivery inside the normal completion observation.
After output drains, re-read root status and Session sequence before
settling; any new root activity returns to the idle/descendant checks.
Read mutable cancellation and idle state through local observation
functions so each post-await decision uses the current values. Preserve
the separate cancellation path and its prompt output drain.

Add a deterministic regression that blocks the initial image update,
allows the first idle/no-child check, starts a gated autonomous root turn,
and releases the original image. The prompt remains pending until the
later turn completes, then reports end_turn. A subsequent ACP prompt
runs another real local subagent through the shared delegation fixture.
The bilingual README defines work accepted during output draining as
part of the still-open ACP activity interval.

Validation:
- The new focused regression failed before the fix: it observed cancelled
  while the later root turn remained gated.
- pnpm exec vitest run packages/acp/acp/tests (146 passed)
- pnpm exec vitest run packages/acp/acp/tests/turns.spec.ts (39 passed)
- pnpm run test:e2e packages/subagent/subagent-dsh-sdk/tests/nested-delegation.e2e.ts (6 passed)
- pnpm exec tsc -b packages/acp/acp/tsconfig.json
- pnpm run lint:contracts-ready
- pnpm run doc-sync (41 gates passed; doc-typecheck identified an optional
  Agent in the extracted test fixture, corrected with an explicit guard)
- pnpm run doc-typecheck (Host build and all 79 documentation blocks pass)
- pnpm run verify-translation-pairing --write packages/acp/acp/README.md
- git diff --check

Independent rereview confirmed both completion races are fixed and that
an original image-delivery failure remains attributed to the prompt even
when a later root turn has already started.
2026-10-06 00:51:28 +08:00
Tianyi Cui 323ec4db77 fix(acp): release cancelled child waits before new root work
An ACP prompt can be waiting for descendants while its root is idle.
Cancellation aborts that wait and calls agent.cancel(), but a child's
settlement message can wake the root in the next microtask. The wait race
then returns with the root running, causing settlement to enter another
whenIdle() before checking cancelRequested. An unrelated long-running
summary consequently retains the cancelled prompt slot indefinitely.

Recheck cancellation immediately after the descendant wait, before any
new root idle wait. Cancellation stops work present at the cancellation
call and releases that prompt; child messages accepted afterward remain
autonomous work. Do not re-cancel those later turns or drain descendants,
which would either race further wakeups or close future child admission.
Document this cancellation boundary in the bilingual ACP README.

Add a deterministic regression that delivers a child message in the
microtask after agent.cancel(), gates the new root turn, and verifies the
original prompt returns cancelled while that turn is still gated. After
releasing the autonomous turn, a second ACP prompt invokes a real local
subagent activation through a tool and completes without another cancel.
Declare the test's subagent dependency and retain only its workspace
importer change in the lockfile.

Validation:
- The new focused regression failed before the fix: the prompt result was
  undefined while the late root turn remained gated.
- pnpm exec vitest run packages/acp/acp/tests/turns.spec.ts (38 passed)
- pnpm run verify-translation-pairing --write packages/acp/acp/README.md
- git diff --check
2026-10-06 00:51:28 +08:00
Tianyi Cui 45369161cb fix(subagent): report missing activation services before parent authority
A registered provider can be used in a composition without the agents
service. startActivation checked the absent registry against the supplied
parent first, so it reported UNAUTHORIZED instead of identifying the
missing runtime dependency with CONTINUATION_UNAVAILABLE. This misdirected
callers toward parent identity even though no activation manager existed.

Require the manager before checking the live parent. Keep provider lookup,
capability validation, and parent identity enforcement in place; provider
startup still cannot run in an incomplete composition. Document the two
failure conditions in the owning bilingual README.

Validation: the new missing-runtime regression failed with UNAUTHORIZED
before the change and passes afterward. All 51 service tests pass, including
unsupported providers/capabilities and invalid parent identity. The changed
README pair verifies successfully.
2026-10-06 00:46:17 +08:00
Tianyi Cui 50da6f0b16 fix(subagent): await nested task completion across SDK and ACP
The unified delegation tool returns as soon as an activation accepts its
prompt. SDK and ACP child runtimes could therefore reach root idle while
an admitted fork was still running. Both external providers interpreted
that idle edge as successful task completion and disposed the runtime,
returning a waiting message while cancelling the nested work.

Add the opt-in SDK session/wait request for existing SDK-owned sessions.
It waits for root idle, managed descendants, and any resulting root turns,
then requires stable idle state and Session sequence across the final
check. Preserve raw session.status notifications and HarnessSession.run's
receipt-to-next-idle API; only the task-owning SDK provider uses the new
completion operation. Subscribe before prompt admission, validate and
fold queued root events through the FIFO wait response, and retain
accepted partial output on cancellation or transport failure.

Keep ACP prompt ownership through descendant completion and later root
summary turns, including their stop reasons and output-delivery failures.
Race child waiting against the existing prompt cancellation controller;
cancellation releases the prompt without permanently closing descendant
admission or repinning the original model selection onto later turns.
Session close retains child-first descendant teardown.

Add real Loader/profile regressions with a gated nested fork for SDK and
ACP completion, cancellation, and final-summary failure. Add focused
coverage for unknown/malformed wait requests, SDK root summary ordering,
ACP cancellation followed by another prompt, and later-summary image
output draining/failure. Update the five owning bilingual README pairs.

Validation:
- pnpm run build
- pnpm run typecheck
- pnpm exec vitest run packages/subagent/subagent-dsh-sdk/tests/subagent-dsh-sdk.spec.ts packages/sdk/server/tests/server.spec.ts packages/acp/acp/tests/turns.spec.ts (123 tests at initial fix)
- pnpm exec vitest run packages/acp/acp/tests/turns.spec.ts packages/sdk/client/tests/sdk-client.spec.ts (80 tests)
- pnpm exec vitest run packages/acp/acp/tests/turns.spec.ts packages/sdk/server/tests/server.spec.ts (70 tests)
- pnpm exec vitest run packages/acp/acp/tests (144 tests)
- pnpm run test:e2e packages/subagent/subagent-dsh-sdk/tests/nested-delegation.e2e.ts (6 tests)
- DSH_EXAMPLE_MODE=lib pnpm run test:e2e packages/subagent/subagent-dsh-sdk/tests/nested-delegation.e2e.ts (6 tests)
- pnpm run test:docs (21 gates)
- pnpm run doc-sync (42 gates)
- pnpm run lint:contracts-ready
- git diff --check

The unchanged SDK next-idle API remains covered by its existing client
tests; no raw notification or persisted Session event format changes.
2026-10-06 00:26:32 +08:00
Tianyi Cui 6f0174b5a2 fix(subagent): consume accepted input before structured completion
A structured local activation now accepts continuation messages, but its
terminal predicate checked only delegated children. A correction accepted
during the model request could therefore remain in either Inbox queue while
the earlier response committed structured_output. The loop later consumed
the correction, but the terminal tool guard prevented revising the captured
value, so callers could receive the obsolete answer as completed work.

Require both Inbox queues to be empty as well as all owned children to be
released before staging a structured result. Keep input admission closed
from that synchronous staging point through authoritative result policy,
including the enclosing PTC result. Derive this admission state from the
existing staged, pending, and captured records instead of introducing a
second lifecycle controller. Failed results delete their stage and reopen
input; successful capture keeps the existing terminal behavior. Caller-owned
delivery, complete final text, descendant ownership, and cold resume remain
unchanged.

Add deterministic barriers for accepted steering and queued input, and for
Native/PTC post-execute acceptance and rejection. All six new cases failed
against the unchanged runtime for stale results or incorrectly accepted
late input, then passed with the fix. Extend the authored headless structured
scenario to reject answer 41, consume a parent correction, and commit 42.
Its two own schema sidecars also need the current master bash/edit/write
definitions: retaining their previous definitions fails verifyHeaders on
this pinned base. Update the owning bilingual result-admission documentation.

Validation:
- pnpm run build:native-system
- pnpm exec vitest run packages/subagent/subagent/tests/structured.spec.ts
  packages/subagent/subagent/tests/continuation.spec.ts
  packages/subagent/subagent/tests/external-activation.spec.ts (214 passed)
- pnpm run test:snapshot:refresh snapshots/session/headless.snapshot.ts
  -t subagent-structured-parent
- pnpm run test:snapshot snapshots/session/headless.snapshot.ts
  -t subagent-structured-parent (1 selected scenario passed)
- pnpm run test:docs (21 gates passed)
- pnpm run doc-sync (42 gates passed)
- pnpm run lint completed its host build; after correcting test deferred
  generic types, pnpm run lint:contracts-ready passed
- git diff --check
2026-10-06 00:26:32 +08:00
Tianyi Cui b49deaa8ee docs(subagent): require runtime-wide external run identities
SubagentRun.id previously promised uniqueness only within one parent,
but the unified manager indexes every external activation by that id in
one runtime-wide resident map. Publication also checks the live Agent and
Session registries. Two compliant-looking provider results could therefore
collide even when they belonged to different parents.

Document the existing shared Session id namespace across all parents,
providers, and local Sessions. Update the package reference, bilingual
type-equivalent declaration, and the current upgrade guide so custom
providers know to replace parent-local counters with fresh execution ids.
The shipped ACP, DSH SDK, Codex, and Claude Code providers already mint
UUIDs; no runtime mapping or additional retained identity state is needed.

Add a cross-parent collision test through startActivation. It proves that
publication rejects the duplicate, disposes only the new external handle,
leaves the second parent catalog empty, and preserves the first catalog
entry and execution result through normal cleanup.

Validation: all seven external-lifecycle tests pass, as do scoped bilingual
pairing, verify-upgrade-guides, doc-sync, and full lint. Cordis catalog and
inspection-catalog regeneration produces no tracked artifact changes.
2026-10-06 00:25:47 +08:00
Tianyi Cui 4b3c174615 docs(subagent): document the managed activation upgrade
The activation refactor removes tool-subagent configuration keys, changes
the model-visible result from foreground or Job-backed output to an
activation receipt, and removes a published in-process driver package.
Updated package references describe the new behavior but do not tell an
existing deployment or package consumer how to migrate those surfaces.

Add the bilingual v0.2.1-alpha.1 upgrade guide and pairing record. Explain
which cordis.yml keys and tool arguments to remove, how to consume parent
completion notices, when host code should await caller-delivery results,
and how publication changes cancellation ownership. Name the existing
Spawn/Fork providers and prepareContinuable API as the driver replacement
without adding a compatibility adapter or promising a foreground mode.

Validation: verify-upgrade-guides, scoped verify-translation-pairing,
verify-md-links, and doc-sync pass. A temporary runtime probe executed the
guide's exact YAML and TypeScript fences and confirmed the caller result,
catalog membership, and absence of a parent notice. The four existing
parent-result tests pass. The probe was removed after execution.
2026-10-06 00:25:47 +08:00
Tianyi Cui 51f4f1c49e docs(subagent): align residency documentation with activation receipts
The retained continuation decision still claims a public followup method,
a bare MessageId start result, no activation result/cancellation ownership,
and no human Queue/Steer operations. Those statements contradict the current
startActivation receipt and adjacent-Agent/host message operations already
documented in the same record. The subsystem introduction also says the
activation result can settle before cleanup, despite the manager resolving
that result after teardown and notification.

Correct the current realization in the English/Chinese active documents.
Keep the original single-inbox and residency rationale, distinguish accepted
message identity from the activation receipt, and state the actual result
and disposal timing. Do not change implementation, archived decisions,
provider-level result timing, or runtime APIs.

Validation: doc-sync passed 41 gates on the first run. Its remaining pairing
gate found one Chinese README target using the English locale; correct that
target, re-record the pair, and verify both changed pairs successfully.
2026-10-06 00:24:59 +08:00
Tianyi Cui 3d9cd9fa95 Merge pull request #5769 from deepseek-harness/worktree/gif-managed-credentials
docs(gif): document the managed credential source
2026-10-06 00:09:33 +08:00
Tianyi Cui ea00db2509 test(subagent): refresh tool schema pins after master merge
The two subagent scenarios introduced by this PR retain tool-schema pins
from before master's Bash deletion/path guidance and filesystem argument
ordering changes. Their actual runtime behavior and recorded model replies
still replay, but strict assembled request-header comparison now rejects
those stale schema descriptions and required-argument order.

Refresh only the three owning schema-pin files against the merged shipped
profile. Preserve every Session recording, model stream, event reference,
timestamp, prompt, and runtime implementation. This keeps the real header
assertion instead of weakening the normalizer or rolling back master tools.

Validation: both affected headless scenarios pass in refresh mode and then
in strict lib-mode replay; the other 33 selected replays passed unchanged.
2026-10-06 00:05:25 +08:00
Tianyi Cui 2e08462342 docs(gif): use the managed DSH credential store for recordings
The recording workflow currently points only to a repository .env file.
A valid key can instead live in ~/.dsh/.credentials.yaml, so missing
DEEPSEEK_API_KEY and .env do not establish that real-model recording is
blocked.

Name the managed credential source and route it through the existing
credentials-local path override when the recording uses a scratch
DSH_HOME. Preserve application-state isolation and keep secret resolution
inside the normal provider rather than printing or manually extracting
key values. This changes only recording instructions.
2026-10-06 00:04:21 +08:00
Turtle 97fe4720a1 fix(ui-jobs): keep keyboard order and modal layering for the portaled job list
Bridge Tab between the trigger and the portaled list, layer the list
below modal overlays, and wait for the sidebar animation in the e2e.
2026-10-06 00:00:47 +08:00
Turtle e127ed2d6c refactor(client): position the lightbox in a stage below the Windows caption 2026-10-05 23:55:51 +08:00
Turtle d7453dd878 fix(web): match Windows caption hover radius across sidebar states
The collapsed Windows caption toggle and New Session kept a 50% circle after
the unified radius standard moved compact icon buttons to --dsw-radius-sm, so
the toggle's hover fill changed shape when the sidebar collapsed.
2026-10-05 23:55:31 +08:00
Tianyi Cui 9dcc8fa985 Merge master into unified subagent activations
Integrate master 78ae4fc2d4d8ecaebb4b674028f781a358b92cc9 after the four
independent review fixes. Keep this base update separate from those fixes
and from subsequent review changes so the integration is independently
reviewable and the observed-master checkpoint remains preserved.

Retain activation-owned execution, caller-independent local discovery,
and unconditional parent final-answer delivery. Preserve master's preset
scoped scheduling tools and all delegated-child schedule deny rules. Move
the new scheduling regression from the removed driver package into the
surviving subagent package and run it through a real Spawn activation.

Preserve master's removal of runtime invariant plugins, dependencies,
exports, and test mounts. Keep context disposal before fixture directory
cleanup. Combine Python workflow ordering with activation/catalog events
without inventing unsupported source-plane import paths.

Keep all frozen Agent Note archives byte-for-byte identical to master;
do not accept Git's automatic edits to renamed archived notes. Retain
current lifecycle and delivery facts in active documentation, repair its
links, and regenerate catalogs/persistence schemas from merged source.
All 62 master persistence roots remain; only subagent/catalog gains the
PR's external membership extension. Keep master's third-party lock graph
and update only workspace dependency changes.

Validation before this checkpoint: 683 focused tests passed, seven
Windows-only cases skipped; 2,772 archived artifacts verified. Generated
catalog and active-pair checks passed. Fresh artifact build and remaining
build-dependent documentation checks continue before publication.
2026-10-05 23:49:47 +08:00
Tianyi Cui f52167746c fix(subagent): always return closing text in parent notices
A local child can have send_message available and still finish with a plain
text answer or use the tool only for progress. Selecting completion content
from tool availability drops that captured answer and leaves the parent
with a status-only notice. The recorded spawn case already demonstrates
this: its child returns CHILD_OK without calling the available tool.

Remove the includeClosingText policy and pass every captured final text
through the existing text-only notice renderer. Preserve structured
results, safe diagnostics, external continuation wording, and caller-only
result delivery. No delivery ledger or additional lifecycle state is
needed. A child that sends its final answer explicitly may repeat it in the
completion notice; that cost is preferable to making result delivery
depend on model compliance.

Extend the real-loop parent-result regression with an available-but-unused
messaging tool, restore the unconditional lifecycle expectation, and pin
text alongside structured results and diagnostics. The new regression
fails on the prior implementation because CHILD_RESULT_42 is missing.
Update the owning bilingual descriptions and the exact parent notice
content in headless and TypeScript SDK recordings. Keep replay streams,
released generations, and unrelated recorded clocks unchanged.

Validation: 317 focused lifecycle/workflow tests; full build; 26 focused
headless/SDK replays; Python SDK advanced/recovery smoke (unchanged
fixtures); test:docs (20 gates); doc-sync (42 gates); full lint;
git diff --check.
2026-10-05 23:33:51 +08:00
Tianyi Cui 63c1ea3491 fix(subagent): preserve caller-owned local child discovery
Caller delivery previously suppressed both settlement messages and local
catalog membership. Workflows therefore stopped publishing the durable
parent-child edge that the parent header and recursive discovery require.
The workflow panel only opens running members, and the ordinary sidebar
hides subagent Sessions, so completed workflow transcripts had no normal
navigation path even though their logs still existed.

Record every successfully admitted local child in its parent's catalog,
independently of the result recipient. Membership answers which local
Sessions belong to the parent; delivery answers who consumes this activation's
result. Keeping those decisions separate restores completed-child and
descendant discovery without duplicating workflow completion messages or
adding return guidance to caller-owned work. Publication failures retain
the existing rollback transaction for both delivery modes.

These local children intentionally retain the unified continuable mode:
list_agents includes them, the parent catalog opens their transcripts after
reload, and the existing direct-parent controls can cold-resume them. No
one-shot execution path or additional lifecycle state is introduced.
Caller-owned external executions still use their consumer's membership
records because they have no local Session to open.

Update the existing bilingual service/workflow documentation and decision
records, refresh the owning workflow/Ralph/advanced Session recordings and
Python SDK event expectations, and preserve unrelated recorded stream times.

Validation:
- Full repository build passed.
- 443 subagent, workflow-host, and Ralph tests; 14 list_agents tests passed.
- Four focused headless workflow/advanced snapshot refreshes and replays passed.
- Three shipped-Web workflow tests passed, including completed-child catalog
  navigation after reload and the continuable composer.
- Python SDK advanced and scheduler-recovery snapshots refreshed and replayed
  through the built dsh CLI with Python 3.12.
- Three discovery regressions fail with the original catalog exclusion and
  pass after restoring this fix.
- test:docs (20 gates), doc-sync (42 gates), lint:contracts-ready, Host and
  Client TypeScript builds, and git diff --check passed.
2026-10-05 23:32:33 +08:00
Turtle 703340cce9 fix(ui-jobs): keep the background job list above the right sidebar
Portal the session-header job popover to the document body and place it
with useAnchoredPosition, so the clipping center column and the right
sidebar no longer cut off its right edge.
2026-10-05 23:32:22 +08:00
Tianyi Cui 4d9952330f test(snapshots): drop unrelated replay oracle refreshes
Restore six expected-output files to the PR merge-base versions so the
subagent activation refactor does not carry unrelated recording churn.

The persistent-tools SDK notifications contain the same parsed records;
only JSON object key order changed. The multi-turn, empty-response-retry,
error-finish, packed-chunks, and text-turn writer oracles were refreshed
from V3 to V4 representations together with volatile stream clocks and
hook timing. These cases do not exercise the changed subagent behavior.

The snapshot harness explicitly accepts older supported writer oracles
and restores them through the strict Session catalog before comparison.
Keeping the existing outputs retains the same assertions and historical
coverage without rewriting canonical released Session generations.

Validation:
- pnpm install --frozen-lockfile completed.
- pnpm run build passed, including the host addon and runtime artifacts.
- Six focused lib-mode keyless replays passed: SDK multi-turn and
  persistent-tools; headless empty-response-retry, error-finish,
  packed-chunks, and text-turn (2 files; 6 passed, 155 filtered out).
- Parsed persistent-tools protocol records are equal before and after.
- All six files exactly match merge base 8af775c480d73c4692813387622fe16bf8eadf37;
  no canonical Session recordings or production files changed.
- git diff --check passed.
2026-10-05 23:25:23 +08:00
Tianyi Cui 96345b0bcc fix(desktop): preserve mutable Git inputs in packaging tests
Remove the second child_process mock added during subagent integration.
The existing mock already isolates Git from concurrent workspace writes
and reads the fixture's sourceCommit and dirtyFiles controls. The later
factory replaced those controls with a constant commit and clean status,
so the Windows tests could no longer detect changes made while awaiting
packaging confirmation.

Keep the original mock and its fail-loud command handling. This restores
the existing git-head and git-status rejection cases without changing
packaging behavior or adding a second fixture abstraction.

Validation:
- Owning Vitest file: 3 passed, 7 Windows-x64-only cases skipped on macOS.
- Prior isolated duplicate-mock probe: 2 failures with the duplicate,
  2 passes with only the original state-controlled factory.
- Original exact-head Windows CI fails the same two Git-change cases.
2026-10-05 23:23:29 +08:00
Turtle 407d7a1475 fix(client): keep the image lightbox clear of the Windows caption 2026-10-05 23:08:46 +08:00
Tianyi Cui aafc0bfb6b Merge pull request #5735 from deepseek-harness/worktree/ecosystem-declarations
docs(plugin-market): require declared engine ranges and reuse npm metadata
2026-10-05 22:01:52 +08:00
Tianyi Cui f7851b58c0 docs(plugin-market): scope reuse policy and illustrate engine ranges 2026-10-05 21:55:43 +08:00
Tianyi Cui dd4fd530da docs(plugin-market): require declared engine ranges and trim proposal 2026-10-05 21:45:25 +08:00
Tianyi Cui 6bb1c866f1 Merge pull request #5744 from deepseek-harness/worktree/chokidar-write-stability
test(webworker): control Chokidar write stabilization time
2026-10-05 20:47:04 +08:00
Tianyi Cui 5fab7d08d4 docs(plugin-market): clarify enforcement and npm installation identities 2026-10-05 20:42:40 +08:00
Tianyi Cui 74958599a3 test(webworker): restore clocks after abandoned Chokidar tests 2026-10-05 20:25:23 +08:00
Tianyi Cui cecb029374 docs(plugin-market): reuse npm declarations and distribution tags 2026-10-05 20:17:59 +08:00
Tianyi Cui 1e13091f55 docs: preserve instruction meaning and clarify reuse policy 2026-10-05 19:40:15 +08:00
Tianyi Cui 77191a490f docs: require reuse of ecosystem declarations 2026-10-05 19:40:15 +08:00
Tianyi Cui 74b264fc86 test(webworker): control Chokidar write stabilization time 2026-10-05 19:36:18 +08:00
Tianyi Cui 8a7d5014bf Merge pull request #5716 from deepseek-harness/worktree/pr-ci-speed-independent-20261005
perf(ci): reduce repeated compilation without raising concurrency
2026-10-05 19:35:09 +08:00
Tianyi Cui 2de9059b4f Merge pull request #5738 from deepseek-harness/worktree/python-ptc-sandbox
fix(ptc): apply shared sandbox policy to Python execution
2026-10-05 19:29:24 +08:00
Tianyi Cui d7e3746ea1 fix(ptc): preserve Python spawning and CPU soft limits 2026-10-05 19:14:50 +08:00
Tianyi Cui 11a0f85b34 fix(ptc): apply shared sandbox policy to Python execution 2026-10-05 19:14:50 +08:00
Tianyi Cui 973a7fb8e4 Merge pull request #5677 from deepseek-harness/worktree/plugin-session-records-20261004
feat(session): add typed experimental plugin records and catalog
2026-10-05 18:53:22 +08:00
Tianyi Cui a71a21298f Merge pull request #5733 from deepseek-harness/worktree/inventory-order-coverage-20261005
test(llm): pin Loader IDs in inventory order fixtures
2026-10-05 18:47:30 +08:00
Tianyi Cui 9e9a95f8dc perf(ci): start runtime checks within the existing job ceiling 2026-10-05 18:21:54 +08:00
Tianyi Cui 310a9e4de4 docs(test): clarify Loader integer-key enumeration
JavaScript object enumeration moves canonical array-index property keys ahead
of other string keys. Describing every numeric-looking Loader ID as reordered
is too broad: leading-zero and other noncanonical numeric strings remain
ordinary string properties.

Name the exact key category in the inventory fixture's local comment. The
inventory-* IDs exclude every canonical array-index key, and the real Loader
activation, fixture order, output assertions, and production code are unchanged.
This addresses the automatic review's nonblocking terminology clarification.

Validation:
- Type-aware Oxlint passed for the owning inventory.spec.ts.
- git diff --check passed.
- No behavior or test inputs changed, so the already observed 46-test and
  74/74-branch evidence remains applicable.
2026-10-05 18:10:26 +08:00
Tianyi Cui c954a07535 docs(session): separate experimental persistence catalogue 2026-10-05 18:09:01 +08:00
Tianyi Cui 7150c591b4 Merge pull request #5693 from deepseek-harness/worktree/agents-home-instructions-20261005
feat(agent-instructions): load the shared agents-root AGENTS.md
2026-10-05 17:48:28 +08:00
Tianyi Cui 231d5a311e fix(cli): bound CLI help alias discovery and document plugin option placement
`collectCliHelp` stops propagating an alias when it reaches a page
already on the current path, so a `help [command]` row that prints its
parent's help no longer recurses until the stack overflows. `serve|s`
command rows are split into separately collected names.

The CLI reference and upgrade guide describe the forwarded-argument
boundary that Commander applies, including a leading pnpm option, and
args.spec.ts pins that `--profile` placed after a leading pnpm option is
forwarded. Generated pages use the repository's two-line generated
header, and docs/AGENTS.md lists the CLI help among the generated
references.

Refs #4114
2026-10-05 17:45:17 +08:00
Tianyi Cui 75935af1d0 feat(cli): generate the CLI help reference and add dsh plugin help
`scripts/gen-cli-help.ts` runs the source `dsh` launcher with temporary
Harness and Agents homes and captures the launcher, `dsh plugin`, and every
shipped profile's text help (profile names come from `PROFILE_TEMPLATES`).
It recursively discovers subcommands from each page's `Commands:` section,
shows identical alias help once with every invocation, and writes
`docs/cli-help.md`, its Chinese page, and their pairing record. The record
resolves links between the two pages as written, so a first run already
matches `verify-translation-pairing`. `verify-cli-help` checks all three
files and runs as the `cli-help` doc-sync leaf, which the static CI lane
also runs on an unbuilt tree.

`dsh plugin` now owns `-h`/`--help` and reads its own options only before
the forwarded pnpm arguments: `dsh plugin --help` prints its help instead of
failing on the missing `--profile`, while everything after the pnpm command
(including `-h`, `--help`, and `--profile`) reaches pnpm verbatim. A
`--profile` placed after the pnpm command is no longer accepted; the
v0.2.1-alpha.1 upgrade guide covers the migration.

Refs #4114
2026-10-05 17:45:17 +08:00
Tianyi Cui bb405d51fa fix(scripts): normalize plugin record compiler paths 2026-10-05 17:43:56 +08:00
Tianyi Cui cb4407427f test(llm): pin Loader IDs in inventory order fixtures
The parameterized versioned/name-only inventory test reversed plugin arrival
order but left Loader entry IDs random. EntryTree generates hexadecimal IDs
and enumerates its object-backed store with Object.values(). Numeric-only
IDs become JavaScript integer property keys and enumerate before other keys,
so the fixture's declared arrival order did not determine the comparator's
operand order. Both parameter cases could exercise the same orientation
while retaining the correct sorted output, intermittently leaving the right
version's nullish fallback uncovered by the per-file 100% CI gate.

Use the typed root-group update API with fixed non-integer inventory-* IDs
for this fixture. Both requested arrival orders now reach the inventory
collector without integer-key reordering. Keep real Loader imports and
activation, duplicate entries, and the existing output assertions. Explain
the non-obvious identifier requirement locally in the test. Production
sorting, package identity rules, and request fields are unchanged.

A controlled negative uses numeric IDs for versioned entries: all 46 tests
pass, but package source branch coverage is 73/74 (98.64%), with index.ts:186
uncovered exactly as in the observed node 24 coverage failure. The final
non-integer IDs pass the same owning file with 74/74 branches (100%). No
global Math.random interception, retry, timeout, or coverage exception is
introduced.

Validation:
- pnpm install --frozen-lockfile --ignore-scripts installed the existing lockfile.
- pnpm exec vitest run packages/llm/plugin-package-inventory-deepseek/tests/inventory.spec.ts --coverage --coverage.include='packages/llm/plugin-package-inventory-deepseek/src/**/*.ts' --coverage.reporter=text --coverage.reportsDirectory=/tmp/dsh-merge-5719/inventory-negative
  reproduced the controlled coverage failure with 46 passing tests.
- The same command with reportsDirectory=/tmp/dsh-merge-5719/inventory-fixed
  passed 46 tests and 100% statements (80/80), branches (74/74), functions
  (15/15), and lines (68/68) for the package's executable source.
- pnpm --silent run change-scope --base 70996a53b84212db9efafe21a4db3dddd46b47ec
  confirms the sole changed path is the owning inventory.spec.ts.
- git diff --check passed.
2026-10-05 17:43:38 +08:00
Tianyi Cui 9a4a750a05 Merge master into plugin record catalogue 2026-10-05 17:37:23 +08:00
turtle1999 70723f41c8 fix(inspector): key the retained fetch Request on the caller body only
The capture clone shares one source with the caller's body stream, so the
caller key alone keeps the Request reachable on every path, including when
capture has already stopped at its byte limit. Cover that path in the
regression test and document the process-wide --expose-gc flag.

Refs #5614
2026-10-05 17:36:53 +08:00
Tianyi Cui 33b98ec91d test(session): reuse catalogue fixture cleanup 2026-10-05 17:31:08 +08:00
Tianyi Cui 350dbb45df perf(ci): emit benchmark artifacts without repeated type checks 2026-10-05 17:28:27 +08:00
Tianyi Cui 8a93894ef9 perf(agent-instructions): cache previously rendered duplicates
When a visible shared file became a content duplicate, reconciliation emitted
a removal notice and discarded its metadata. Its durable state then remained
remove, while the metadata fast path accepted only candidates without any
previous record. Every subsequent unchanged pass therefore reread the file,
even after a later read had populated the cache. This also affected the path
where an edited earlier winner made an unchanged later file a duplicate.

Retain the still-present duplicate's metadata with the removal's deferred
version update. Pass the already-cached state when removal follows an unchanged
metadata probe, and the newly read state when the duplicate's content changed.
Apply this metadata only when the associated removal survives rendering, using
the existing exact-transition filter; confirmed absence still clears metadata.

Allow both never-rendered candidates and previous removals to skip content reads
when unchanged provider metadata and an earlier kept digest identify the file as
a duplicate. Continue probing metadata. Once the winner changes or disappears,
read and promote the shared file normally, then suppress unchanged follow-ups.
Document the metadata guarantee in the local cache types and bilingual README.
Model-visible messages, source records, ordering, and byte budgets stay the same.

Add four production-plugin regressions covering duplication after either file
changes, then promotion after the winner is edited or deleted. They inspect the
provider's actual content reads across two unchanged passes and require exactly
one shared read for promotion, rather than trusting the context's self-report.

Validation:
- All four new cases failed before the fix because each unchanged pass reread
  the shared file despite unchanged metadata.
- pnpm exec vitest run packages/context/agent-instructions/tests/agent-instructions.spec.ts -t 'caches a removed duplicate': 4 passed after the fix.
- README pairing was rerecorded; git diff --check passed.
- The removal regression narrows its source kind and compares the change as a
  plain typed value; no matcher carrying any is assigned into an expected record.
- Type-aware Oxlint passed for the three affected packages and the new
  metadata-failure fixture; focused cache regressions passed again after the
  assertion correction.
2026-10-05 17:20:30 +08:00
Tianyi Cui 0516f66d83 fix(agent-instructions): preserve groups when hidden candidates fail
A content-deduplicated shared file has no visible change record. If its
metadata became unavailable while the harness-home winner changed or vanished,
the reconciler skipped the failed candidate and still published the winner's
replacement or removal. Guidance that remained in the shared file disappeared
from the model's effective instructions. Content-read failures had the same
partial-group behavior even when metadata probing succeeded.

Rollback the probed candidate group whenever any metadata probe is unavailable
or its bounded content read cannot complete. Include candidates without a
visible predecessor and candidates previously removed as duplicates. Reuse
one rollback operation for proposed messages, deferred version updates,
metadata mutations, and retained digest bookkeeping, so a later successful pass
can reconstruct the complete group independent of cache warmth.

A filesystem path can also appear as a project instruction when the Harness
home is the project root. Releasing observed paths on rollback let that later
alias publish the very content withheld by the failed global group. A transient
failure of the first member also left failed and unvisited paths unreserved.
Factor the existing scope-to-file path calculation and reserve every eligible
member's absolute path for the rest of that pass when its group rolls back.
Project aliases therefore cannot bypass group preservation, without additional
filesystem operations. The shared resolver keeps probing and rollback path
calculations identical. Add metadata, content-read, and one-shot first-member
failure regressions for this supported same-file layout and its recovery.

Keep cancellation propagating to the caller. Keep explicit baseline-budget
exclusions outside observation rollback, because their removals are deliberate
policy decisions. No new session fields, baseline identities, polling, retries,
or process-global state are needed. Clarify the metadata/content and hidden
candidate guarantee in the bilingual README.

Add four real-plugin outage/recovery tests for metadata or content failure while
the retained home file is edited or deleted, plus a cold-cache reconciliation
regression. Add an authored headless session scenario with instance-local
provider failure injection: request two keeps baseline A while shared metadata
is unavailable; request three receives the home B replacement and shared A
addition together after recovery. The fixture restores the provider method on
disposal and asserts the real home/shared files before restoring observation.
Declare its test-only filesystem dependency without changing runtime packages.

Regenerate the persistence catalog's source anchors after the shared path
helper import shifts AgentInstructionSource by one line. Its persisted fields
and SHA-256 type fingerprint remain unchanged; no type acknowledgement or
Session migration is required for a source-location-only update.

Validation:
- All five new regressions failed with the intended partial-group emissions
  before the source fix.
- pnpm exec vitest run packages/context/agent-instructions/tests/agent-instructions.spec.ts -t 'hidden duplicate has|cold global group|unavailable active candidate|unavailable scope': 8 passed.
- pnpm exec vitest run packages/context/agent-instructions: 174 passed.
- The focused authored headless snapshot refresh and replay passed.
- Restoring the early skip for an unavailable hidden candidate makes the
  headless snapshot fail with the premature harness-home replacement.
- README translations were updated together and their pairing rerecorded.
- Three project-alias regressions failed on the initial group rollback fix,
  then passed after reserving failed and unvisited candidate paths.
- pnpm exec vitest run packages/context/agent-instructions/tests/agent-instructions.spec.ts -t 'frozen across a project alias|hidden duplicate has|cold global group|caches a removed duplicate': 12 passed.
2026-10-05 17:20:30 +08:00
Tianyi Cui b981255be6 fix(agent-instructions): keep budget-omitted duplicates excluded
A baseline can deduplicate identical harness/shared instructions before the
byte renderer omits their retained winner. Removing every deduplicated scope
from excludedScopes then made the shared copy eligible on the next unchanged
step. It injected the broader instructions the baseline had deliberately
omitted, contradicting the retained-baseline budget policy. Project sibling
copies had the same problem.

Allow a duplicate to leave the exclusion set only when the included baseline
contains its candidate group and trimmed digest. Match the digest as well as
the group: a different sibling may fit the budget while the duplicate's winner
does not. Use the included files' original content so truncated and empty
represented winners retain their ordinary duplicate-promotion behavior.

Copies of omitted content inherit that omission for the visible baseline.
Duplicates of represented content remain probed and can be promoted when their
winner changes or disappears. Keep both README languages, the existing shared
root decision, and the local result-field documentation consistent with this
rule. No durable event fields or baseline identities change.

Add plugin regressions for identical global copies across repeated steps and
resumes, and an omitted project digest with a different retained sibling. Add
an authored recorded-session scenario that runs the shipped headless profile
with identical 1900-byte global files and a 700-byte budget: its two model
requests retain one project-only baseline and never inject the shared copy.

Validation:
- Both new plugin regressions failed on the reviewed implementation with two
  contexts instead of one, then passed with the fix.
- pnpm exec vitest run packages/context/agent-instructions/tests/agent-instructions.spec.ts -t 'duplicate budget-omitted|different digest fits|content-deduplicated shared|changed shared file': 4 passed.
- pnpm run test:snapshot:refresh snapshots/session/headless.snapshot.ts -t agent-instructions-budget: passed.
- pnpm run test:snapshot snapshots/session/headless.snapshot.ts -t agent-instructions-budget: passed.
- Reverting only src/index.ts to the reviewed head makes that snapshot fail
  with an extra agents-global set and 304 bytes of omitted global content.
- pnpm run test:snapshot scripts/session-snapshot-corpus.corpus.ts: 3 passed.
- Scoped bilingual pairing was rerecorded and verified; git diff --check passed.
2026-10-05 17:20:30 +08:00
Tianyi Cui 052a926704 docs(agent-instructions): align shared-root decision with process homes
The shared-root Agent Note still describes agentsHome as an accepted row field
and gives explicit row configuration precedence. The decision retained those
statements from the configurable-root proposal, although the instruction loader
now exposes neither dshHome nor agentsHome. Maintainers could therefore add an
unsupported row override or mistake the skill provider's root options for the
instruction loader's API.

State that instruction loading resolves the harness home from DSH_HOME or
~/.dsh and the shared agents root from DSH_AGENTS_HOME or ~/.agents. Keep the
shared resolver and its tilde/blank-environment behavior, while distinguishing
dsh-skill-filesystem's retained explicit home fields for its own skill roots.
Update the English and Chinese Decision/Consequences passages together and
record their confirmed pairing hashes. Root order, durable scope keys, and the
other decision rationale are unchanged.

Validation:
- pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-10-05-shared-agents-root-instructions.md
- pnpm run verify-translation-pairing .agents/notes/implemented/architecture/2026-10-05-shared-agents-root-instructions.md: one named pair consistent
- pnpm run verify-agent-note-format: all 276 Agent Notes conform
- git diff --check, scoped to the shared-agents-root-instructions EN/ZH/sidecar triplet: passed
2026-10-05 17:20:30 +08:00
Tianyi Cui 21d0c2e29c feat(agent-instructions): load the shared agents-root AGENTS.md
The user-global instruction scope now reads two roots: $DSH_HOME/AGENTS.md
first, then the shared agents root that other agent tools use
($DSH_AGENTS_HOME, else ~/.agents). Both resolve from the process environment
through @deepseek-ai/dsh-home-paths; no config field is added, because the
stack base (PR #5718) removed the per-row home override.

The two files are candidates of one candidate group: identical trimmed content
renders once from the harness home, an unobservable candidate preserves the
group's last-good state, and reconciliation probes both roots so external
edits, removals, and new files become visible change notices. A candidate
dropped as a duplicate keeps being reconciled, so deleting or changing the
retained candidate promotes it. The harness-home file keeps its recorded
`user-global` scope key; the shared file carries `agents-global`.

A user-global delta states `These user-global instructions apply to all work.`
instead of naming its reconciliation scope, and a project path whose first
component would collide with a user-global scope directory renders with a
leading `.` so it keeps its own scope.
2026-10-05 17:20:30 +08:00
Tianyi Cui d7f0a26447 fix(agent-instructions): enforce process homes for plugin rows
The removed dshHome row key still redirected instruction loading away from
DSH_HOME. Schemastery's non-strict object validator preserves unknown keys,
and resolveConfig forwarded the validated row wholesale to the library
discovery normalizer, which intentionally accepts an already-resolved home.
Removing the public field and schema entry therefore left the old runtime
override active and contradicted the upgrade guide.

Copy only the declared discovery controls when normalizing a plugin row.
Home resolution now follows process policy even when the row retains a stale
dshHome or another undeclared home field such as agentsHome. This allowlist
also applies when the shared-agents-root stack layer adds its internal home
parameter, without widening the deployment-facing configuration.

Keep the exported discovery and baseline-loading helpers' explicit home
parameter: it carries a library owner's already-resolved path, rather than
granting a plugin row its own home. Extend that regression through baseline
loading to preserve this distinction. Document the ignored stale row key in
both package READMEs and refresh their pairing record. No Session format,
candidate ordering, budget, or instruction rendering changes are required.

Add a production Cordis/schema regression that mounts a row with both stale
home keys and checks model-visible baseline and refresh content. Before the
fix, its baseline contained the stale row instruction instead of the process
home instruction. Both stages now use the process home, and the same test
will reject an agentsHome leak after propagation into the upper stack layer.

Validation:
- pnpm exec vitest run packages/context/agent-instructions/tests/agent-instructions.spec.ts -t 'ignores a stale row home'
  failed before the source fix with the intended content mismatch.
- pnpm exec vitest run packages/context/agent-instructions/tests/agent-instructions.spec.ts -t 'ignores a stale row home|uses an already-resolved home'
  passed both focused tests after the fix.
- pnpm exec vitest run packages/context/agent-instructions/tests/agent-instructions.spec.ts
  passed all 157 tests with both stale row keys present.
- pnpm exec tsc -b packages/context/agent-instructions/tsconfig.json passed.
- pnpm run doc-sync passed all 42 gates.
- pnpm run test:snapshot snapshots/session/headless.snapshot.ts -t 'agent-instructions'
  passed the selected recorded-session replay.
- pnpm run verify-translation-pairing --write packages/context/agent-instructions/README.md
  refreshed the bilingual record; doc-sync verified it.
- git diff --check passed.
2026-10-05 17:20:28 +08:00
Tianyi Cui c8e538efa4 fix(agent-instructions): consume the owner-resolved home option
`resolveDiscoveryConfig` accepted `DiscoverOptions.dshHome` but resolved the
home from the environment alone, so a caller passing an already-resolved home
silently received the process home while the option comment claimed otherwise.
It now normalizes the passed value, which keeps the plugin's mount-time
resolution authoritative for discovery and reconciliation. A test pins that an
owner-resolved home wins over `$DSH_HOME`.
2026-10-05 17:20:28 +08:00
Tianyi Cui b603bd924e docs(agent-instructions): correct the home-removal scope and thread one home
Review follow-ups:

- The guide claimed the removed field was the last per-row home override;
  other providers (skill-filesystem, shell-env, credentials-local,
  subagent-dsh-sdk, attachment-local) keep their own fields, so it now states
  that the removal covers the instruction loader, and step 1 also names the
  home-level `$DSH_HOME/cordis.patch.yml` layer.
- `DiscoverOptions` regains an already-resolved `dshHome` that `apply()` passes
  from its mount-time `resolveConfig()`, so baseline discovery and
  reconciliation share one resolution point instead of reading the environment
  separately.
- The package README says the loader reads the process home rather than "the
  same home as sessions, skills, and storage", and the resolver Agent Note
  states what the skill provider's fields actually select.
- `discoverBaselineInstructionFiles` JSDoc no longer lists a removed option.
2026-10-05 17:20:28 +08:00
Tianyi Cui 25f1672095 refactor(agent-instructions): drop the per-row dshHome override
The agent-instructions row accepted `dshHome`, letting one consumer read a
different harness home than sessions, skills, and storage. Home is process
policy: the plugin now resolves `$DSH_HOME`, else `~/.dsh`, through
`resolveDshHome()` from `@deepseek-ai/dsh-home-paths`, and the config field and
the library's explicit-home option are gone.

Tests and both snapshot fixtures pin the home with `vi.stubEnv('DSH_HOME', ...)`
and the harness's existing `DSH_HOME` export instead of row configuration.
`dsh-skill-filesystem` keeps its own `dshHome`/`agentsHome` fields.

The removed cordis.yml key gets an upgrade guide.
2026-10-05 17:20:28 +08:00
Tianyi Cui dd302f718b feat(session): catalogue experimental plugin records 2026-10-05 17:20:26 +08:00
Turtle 7d89563970 Merge pull request #5554 from deepseek-harness/fix/deepseek-extension-preparation
fix(llm): keep plugin package metadata from blocking requests
2026-10-05 17:02:06 +08:00
Tianyi Cui f5dbbd8ea4 Merge pull request #5701 from deepseek-harness/worktree/cot-translation/service
feat(translator): add anonymous Bing and Google translation
2026-10-05 16:35:16 +08:00
turtle1999 d8c5187187 fix(inspector): keep observed fetch Requests reachable so caller aborts reach native fetch
Node's fetch forwards a caller's AbortSignal only while the Request it was
given is reachable. The fetch observer creates that Request locally, so after
garbage collection an abort after response headers no longer cancelled the
body: capture never finished, Network.loadingFinished was never sent, and the
connection stayed open.

Fixes #5614
2026-10-05 16:18:03 +08:00
Tianyi Cui 3b00aebf40 Merge pull request #5721 from deepseek-harness/worktree/long-session-paging-observer-20261005
test(bench): exclude paging locator preparation from timing
2026-10-05 15:27:43 +08:00
Tianyi Cui 537164af0c Merge pull request #5714 from deepseek-harness/worktree/model-form-hydration-flake-20261005
fix(models): prevent stale actions during settings refresh
2026-10-05 15:25:51 +08:00
Tianyi Cui c2a5b56fb5 Merge pull request #5711 from deepseek-harness/worktree/wheel-deflate-comparison-flake-20261005
test(infra): compare wheel bytes without deep matcher traversal
2026-10-05 15:17:45 +08:00
Tianyi Cui c7d3a8397b Merge pull request #5715 from deepseek-harness/worktree/trajectory-locale-readiness-20261005
test(trajectory): await locale readiness in bundle fixture
2026-10-05 15:14:46 +08:00
Tianyi Cui bbbe372f53 fix(ci): validate Python closure before artifact builds 2026-10-05 15:12:53 +08:00
Tianyi Cui b885088946 test(bench): wait for paging controls with isolated clocks 2026-10-05 15:12:09 +08:00
Tianyi Cui 4df4a46ec3 docs(ci): clarify artifact and scheduler dependencies 2026-10-05 14:33:03 +08:00
Tianyi Cui bb9dfc663b test(bench): resolve paging controls before timing 2026-10-05 14:25:49 +08:00
Tianyi Cui be28d4c15c perf(ci): consolidate compatibility startup within one worker 2026-10-05 14:15:56 +08:00
Tianyi Cui e994542a31 test(models): use typed provider failure mock 2026-10-05 13:32:53 +08:00
Tianyi Cui fc072c7a5d perf(ci): bound worker job overlap without extending the critical path 2026-10-05 13:24:31 +08:00
Tianyi Cui c880291a0b fix(models): wait for current snapshot when retrying setup 2026-10-05 13:19:22 +08:00
Tianyi Cui bd20fc56bb fix(models): gate stale provider actions during refresh 2026-10-05 13:09:14 +08:00
Tianyi Cui c621e238e3 fix(test): pass loader URLs on Windows 2026-10-05 13:08:06 +08:00
Tianyi Cui 536aaef0b3 fix(ci): preserve workflow concurrency and portable artifact checks 2026-10-05 12:53:52 +08:00
Tianyi Cui ef29f117da test(trajectory): await locale readiness in bundle fixture 2026-10-05 12:08:10 +08:00
Tianyi Cui 853ad0bb9f perf(ci): remove repeated aggregate compilation and gate work 2026-10-05 12:07:57 +08:00
Tianyi Cui 1fb43c6f78 fix(models): await current snapshot before reopening editors 2026-10-05 11:54:31 +08:00
Tianyi Cui d32ecfe1e4 test(infra): compare wheel bytes without deep matcher traversal 2026-10-05 11:46:52 +08:00
Tianyi Cui d1d560ba4b fix(translator): apply endpoint defaults and bound upstream failures 2026-10-05 11:09:32 +08:00
Tianyi Cui f230806884 Merge pull request #5705 from deepseek-harness/worktree/snapshot-deadline-flakes-20261005
test(snapshot): retain goal and turn-start wait diagnostics
2026-10-05 10:55:24 +08:00
Tianyi Cui ec73ee43b4 Merge pull request #5704 from deepseek-harness/worktree/fix-seeded-history-clock-20261005
test(web): pin seeded history to its fixture day
2026-10-05 10:47:16 +08:00
Tianyi Cui 88796a9c31 Merge pull request #5698 from deepseek-harness/fix/credentials-watcher-close-20261005
fix(credentials,hmr,skills): contain watcher errors that arrive after close
2026-10-05 10:46:23 +08:00
Tianyi Cui dede7b20e2 fix(translator): default anonymous translation to Bing 2026-10-05 10:37:55 +08:00
Tianyi Cui 910f97059f test(snapshot): retain goal and turn-start wait diagnostics 2026-10-05 10:30:04 +08:00
Tianyi Cui 423aad3534 test(web): pin seeded history to its fixture day 2026-10-05 10:27:49 +08:00
Tianyi Cui a790778e8f refactor(watch): name the close promise and keep one mechanism note
Review follow-up: `const closed` beside the boolean `this.closed` reads as the
flag, so name the promise `closing` at every site; the test-side comment
repeated the production mechanism verbatim, so each test keeps only the
ordering assumption its fake encodes.
2026-10-05 10:13:54 +08:00
Tianyi Cui 14e9bf61cb fix(hmr,skills): contain watcher errors that arrive after close
The EPERM path in the Windows coverage failure also matches the HMR
exact-config watcher: it watches the temp harness home with chokidar's
default 2 s write-settle window, and that spec constructs it on the very
directory its afterEach deletes. Apply the same containment to that
watcher and to the skill-filesystem root watcher, the remaining owners
that enable awaitWriteFinish.
2026-10-05 10:12:31 +08:00
Tianyi Cui 7c450b845d Merge pull request #5699 from deepseek-harness/worktree/inbox-timeout-flake-20261005
test(snapshot): retain inbox wait timeout diagnostics
2026-10-05 10:12:18 +08:00
Tianyi Cui a78f0ee85b Merge pull request #5692 from deepseek-harness/worktree/task-relative-clock-flake-20261005
test(schedule): pin task-page relative time assertions
2026-10-05 10:06:25 +08:00
Tianyi Cui 3d03717a0e docs(translator): register model effects and generated package list 2026-10-05 10:00:30 +08:00
Tianyi Cui f1250c6e36 feat(translator): add anonymous Google and Bing translation service 2026-10-05 09:55:25 +08:00
Tianyi Cui 3a221c87e3 fix(scripts): find plugin record calls spelled with legacy octal escapes
A sloppy-mode .cjs or .js file can spell the name as '\141ppendPluginRecord',
which TypeScript decodes to appendPluginRecord, but the prefilter only
removed the backslash and skipped the file. The prefilter now decodes a
legacy octal escape as TypeScript does, taking three digits only after
0 to 3, so the value stays within 0o377. The spec rejects two spellings
that use three-digit octal escapes, and tests the decoder itself for
the digit limit, which no spelling of the name, whose letters are all
0o1xx, can exercise.
2026-10-05 09:55:14 +08:00
Tianyi Cui f9719330db Merge pull request #5697 from deepseek-harness/worktree/fix-dev-tools-reload-20261005
test(web): await Session restoration before preset menu checks
2026-10-05 09:55:11 +08:00
Tianyi Cui 8a532bc5a5 test(schedule): remove stale wall-clock drift comment 2026-10-05 09:51:35 +08:00
Tianyi Cui df41b7cd2d fix(credentials-local): contain watcher errors that arrive after close
chokidar's close() drops every listener while a scheduled write-settle poll
can still run. That straggler stats a document the home teardown is
deleting, which Windows reports as EPERM, and an 'error' emission with no
listener is rethrown as an uncaught exception: the whole coverage
partition fails while every test file passes.

Re-attach the provider's error listener across the close so the straggler
stays inside the provider, and make it a no-op after disposal.
2026-10-05 09:38:53 +08:00
Tianyi Cui 22f034bd76 test(snapshot): retain inbox wait timeout diagnostics 2026-10-05 09:38:05 +08:00
Tianyi Cui c2f7722d86 test(web): await Session restoration before preset menu checks 2026-10-05 09:37:53 +08:00
Tianyi Cui f8502bb2d2 Merge pull request #4125 from deepseek-harness/worktree/benchmark-trajectory-observer-20260913
fix(benchmarks): sample Trajectory readiness on animation frames
2026-10-05 09:36:09 +08:00
Tianyi Cui 534acc5952 Merge pull request #3649 from deepseek-harness/fix/packed-install-private-npm-cache
fix(release): isolate packed-install npm cache
2026-10-05 09:23:14 +08:00
Tianyi Cui 19e1be4006 test(schedule): pin task-page relative time assertions 2026-10-05 09:21:47 +08:00
Tianyi Cui 51c5d6cd04 Merge master f74d0741 to resolve remaining Trajectory pairing conflict 2026-10-05 09:20:27 +08:00
Tianyi Cui c1b0e84b95 Merge pull request #5079 from deepseek-harness/worktree/python-live-smoke-ack-20260923
test(python): accept standalone live smoke acknowledgements
2026-10-05 09:18:47 +08:00
Tianyi Cui 21507982e6 Merge master checkpoint a2ac28a6 into Trajectory observer fix 2026-10-05 09:10:46 +08:00
Tianyi Cui d2d8c47b4a Merge pull request #5459 from deepseek-harness/worktree/installer-root-validation
fix(desktop): reject canonical drive roots in installer
2026-10-05 09:10:39 +08:00
Tianyi Cui 454c6bfa83 Merge pull request #5620 from deepseek-harness/test/dynamic-tool-cache-e2e-flake-2d600396
test(sdk): keep the dynamic tool cache e2e tolerant of extra model calls
2026-10-05 09:10:17 +08:00
Tianyi Cui d6b2430df1 Merge master checkpoint a2ac28a6 into packed-install cache fix 2026-10-05 09:09:23 +08:00
Tianyi Cui 3ca9334868 Merge observed master checkpoint to resolve Python smoke pairing conflict 2026-10-05 09:05:54 +08:00
Tianyi Cui ef9944a01f Merge pull request #5625 from deepseek-harness/worktree/native-handler-fixture-01a0f9ff
test(native-command): publish Windows handler marker atomically
2026-10-05 09:04:37 +08:00
Tianyi Cui 8c6d23c128 fix(scripts): find plugin record calls spelled with any escape
The caller gate parsed only files whose text held appendPluginRecord or a
\u escape, so a release package could reach the function through
S['\x61ppendPluginRecord'], a \u{61} code point escape, a needless
character escape, or a line continuation, which TypeScript reads as the
same string. The gate now also parses a file when its text with every
escape unescaped holds the name, and its spec rejects each spelling.
2026-10-05 08:57:58 +08:00
Tianyi Cui 1678f0f5f5 fix(session): address review of plugin records
- Make the record commit an ES private method, so appendPluginRecord()
  is its only runtime entry.
- Document PluginRecordType and PluginRecord on the session subsystem
  page, and state in the README and JSDoc that the V3-to-V4 edge renames
  unknown ignorable V3 events into the plugin: namespace and that plugins
  outside this repository must not call the writer.
- The caller gate parses only files that contain the name or a \u
  escape, documents that wildcard re-exports are not reported, and its
  spec reads a temporary repository instead of this checkout.
- Cover Session.fromRestore in the record test and name SessionEventMap
  in the catalog generator's diagnostic.
2026-10-05 08:57:58 +08:00
Tianyi Cui ab1e7811b9 fix(typert-generator): omit #private class members from declarations
classShape dropped only #private properties; methods and accessors with a private name reached the declaration text the cordis_inspect catalog serves. It now drops every member whose name is a private identifier, as the public-api projection in verify-type-equiv does.
2026-10-05 08:57:58 +08:00
Tianyi Cui 75542dd10a feat(session): let experimental packages append plugin records
Add appendPluginRecord(), which appends one ignorable event whose type is
`plugin:` followed by lowercase slash-separated segments, and
pluginRecordOf(), which reads such an event back. Records are not
SessionEventMap members, so the persistence catalog is unchanged; a build
that does not recognize one retains and skips it, and records never enter
the model-visible surface. Resume and fork carry them with the log, and a
format migration keeps them on a best-effort basis.

Only production source under packages/experimental/ may call the writer.
The verify-plugin-record-callers hygiene gate checks every reference in
repository sources, and the persistence catalog generator rejects a
SessionEventMap member in the plugin: namespace.

Session.append() and the record writer share one commit path, so a record
follows the same reentrancy, detach, and observer-containment rules. The
ignorable-events decision, the session README, the format-version
cookbook, and the plugin-author practices describe the records.
2026-10-05 08:57:58 +08:00
Tianyi Cui 115f92b5ed fix(typert-generator): omit static blocks from class declarations
A class's static initialization block has no type-level meaning, and the
public-api projection that verify-type-equiv checks already drops it.
The generated declaration text, which the model-visible cordis_inspect
catalog serves, printed it with the class's public members.
2026-10-05 08:57:58 +08:00
Tianyi Cui 7f83658b4a fix(desktop): reject canonical drive roots in installer 2026-10-05 08:53:27 +08:00
Tianyi Cui 22e627169e Merge branch 'master' into test/dynamic-tool-cache-e2e-flake-2d600396 2026-10-05 08:50:31 +08:00
Tianyi Cui 0f51ba0737 Merge pull request #5629 from deepseek-harness/test/llm-retry-transport-recovery-timeout-c2c45a16
fix(timeout): end an idle demand the transport abandons
2026-10-05 08:45:18 +08:00
Tianyi Cui 6f88bed362 Merge pull request #5689 from deepseek-harness/worktree/pi-ai-1.0.2-20261004
build(llm-pi-ai): upgrade @earendil-works/pi-ai to 1.0.2
2026-10-05 08:07:26 +08:00
Tianyi Cui 21fe89affe build(llm-pi-ai): upgrade @earendil-works/pi-ai to 1.0.2
pi-ai 1.0.1 and 1.0.2 bring model catalog updates and adapter fixes:
Anthropic native tool changes define later tools inline, Bedrock binds
replayed thinking blocks, OpenAI-compatible requests can pick sampling
parameters by thinking level, and "model is at capacity" is retried.
The runtime dependencies change only in @anthropic-ai/sdk (0.124.0 to
0.129.0) and @earendil-works/pi-telemetry (^1.0.2).

1.0.2 still re-parses the whole accumulated tool-argument JSON on every
stream delta (earendil-works/pi#9265), so the patch is regenerated
against the 1.0.2 sources: it removes the same six per-delta parses as
the 1.0.0 patch, and only the bedrock-converse-stream.js hunk moves, by a
line.
2026-10-05 06:40:08 +08:00
kingwl 401b810d5a fix(web): align task and attachment card styling 2026-10-05 00:14:25 +08:00
kingwl 5c5555eec1 docs(web): link radius rules directly and tidy curve comment 2026-10-04 23:42:50 +08:00
kingwl 3a9f0f1aab fix(web): unify conversation radii and nested menu insets 2026-10-04 23:36:21 +08:00
kingwl 169e0c3881 fix(web): reconcile composer geometry with radius standard 2026-10-04 22:52:19 +08:00
Tianyi Cui 3d0e274859 Merge pull request #5659 from deepseek-harness/worktree/pi-compat-notes-20261003
docs(agent-notes): propose Pi extensions bridge and Pi plugin support levels
2026-10-04 22:35:30 +08:00
kingwl 28c57a001e fix(web): align composer corner with send button 2026-10-04 21:41:34 +08:00
_Kerman 4263144de2 fix(agent-loop): retain resources until all agents finish teardown 2026-10-04 16:10:18 +08:00
_Kerman 1e1735a440 fix(session-projection): preserve composable registration disposers 2026-10-04 16:10:06 +08:00
_Kerman 288a2bd6dc fix(cordis): adopt effect disposers from their owning fiber 2026-10-04 16:09:45 +08:00
Tianyi Cui b3f8bec8e8 docs(agent-notes): address review of the Pi compatibility notes
State the Pi-to-DSH direction of the built-in tool translation, how setActiveTools treats Agent-scoped extension tools, that module-scope extension state is shared by concurrent Sessions, which format edges retain plugin records, and that SessionStartSource already declares clear and compact. Date the npm package count and narrow the plugin note's opening sentence.
2026-10-04 05:08:15 +08:00
Tianyi Cui 61cbe84624 docs(agent-notes): link the issue tracking each core gap
Add the GitHub issue number to each row of the Pi extensions bridge note's core-gap table, and state which rows follow from DSH rules.
2026-10-04 04:52:14 +08:00
Tianyi Cui 6500cacbb2 docs(agent-notes): propose Pi extensions bridge and Pi plugin support levels
Record two proposals from the Pi 1.0.0 compatibility investigation.

The Pi extensions bridge note states the design of an experimental bridge
that loads unmodified Pi extension sources on existing DSH extension
points, and ranks the DSH core mechanisms that are narrower than Pi's
extension API.

The Pi plugins note defers a compatibility layer for Pi's Chord-facet
plugins, whose API upstream declares unstable, and defines six levels of
support with the upstream trigger and the DSH work for each, plus the
runtime differences the plugin model exposes.
2026-10-04 04:52:14 +08:00
Tianyi Cui e1878e41ca fix(llm-pi-ai): withhold ChatGPT sign-in and serve one catalog
pi-ai 1.0.0 adds Sign in with ChatGPT to the `openai` provider, and that
login refuses to start unless the app supplies a stable installation UUID
through LoginOptions.getDeviceId. The harness keeps no installation ID
meant for a third-party account sign-in, so the route offers its API-key
login only; a Loader-composed test pins the offered methods.

catalogProvider(), catalogModels(), and catalogProviderIds() now read one
index that leaves out providers without a chat model, so a hand-declared
route under such a key inherits nothing from pi-ai. The browser-worker
stub gains the builtinModels refusal llm-pi-ai imports and drops the
getBuiltinProviders reader nothing imports. The tool-argument streaming
spec also covers the patched Anthropic Messages path.
2026-10-04 04:51:19 +08:00
Tianyi Cui abfa6302b7 fix(llm-pi-ai): keep catalog providers whose catalog lists no models
The chat-model filter left a provider out whenever pi-ai listed no chat
model for it. The browser-worker preview replaces pi-ai with a stub that
lists no models at all, so every provider was dropped and the empty
directory registration failed the llm-pi-ai mount. Only a provider whose
catalog lists models but no chat model is left out now; the stub gains
the `getAllBuiltinModels` reader the filter calls.
2026-10-04 02:09:17 +08:00
Tianyi Cui d5161807c8 fix(llm-pi-ai): offer only catalog providers that ship a chat model
pi-ai 1.0.0 adds classifier and image models to the built-in catalog and
ships `typesafe` with classifier models only. The adapter dispatches chat
requests only, so a catalog provider without a chat model gets no entry in
the configurable-provider directory and no sign-in flow.
2026-10-04 02:09:17 +08:00
Tianyi Cui f1f18bce98 build(llm-pi-ai): upgrade @earendil-works/pi-ai to 1.0.0
Move the pi-ai provider adapter from 0.87.1 to 1.0.0 and re-create the
local tool-argument patch for the new dist files. pi-ai 1.0.0 still
re-parses the whole accumulated argument JSON on every stream delta in
the Anthropic, Bedrock, Mistral, OpenAI Completions, OpenAI Responses,
and pi-messages adapters (upstream earendil-works/pi#9265), so the patch
removes the same six per-delta parses; arguments are still parsed once at
toolcall_end.

The release-age exemption moves to the exact 1.0.0 pi-ai and
pi-telemetry versions, and the generated third-party notices and README
links name the new patch file.
2026-10-04 02:09:17 +08:00
Tianyi Cui 2ac5313009 Merge pull request #5650 from deepseek-harness/worktree/session-v4-release-record
docs(session): record the published V4 format
2026-10-03 23:18:42 +08:00
Turtle 31ff3a73c0 fix(trajectory): report streaming Assistant records and running compactions as pending 2026-10-03 21:02:36 +08:00
turtle1999 5535f0bcf7 docs(notes): add an optional homepage to market index plugins 2026-10-03 12:02:13 +08:00
turtle1999 a042d53289 docs(notes): follow the registry plan and tighten market index wording 2026-10-03 12:02:13 +08:00
turtle1999 6ac8f8766c docs(notes): explain relative icon references in the market index 2026-10-03 12:02:13 +08:00
turtle1999 2c073b3e0f docs(notes): group market index versions per plugin and use engines.dsh 2026-10-03 12:02:13 +08:00
turtle1999 55261c310b docs(notes): propose plugin market index format 2026-10-03 12:02:13 +08:00
Tianyi Cui e166240405 docs(session): keep release status in the published state 2026-10-03 11:55:48 +08:00
Tianyi Cui 5badb15009 Merge pull request #5648 from deepseek-harness/worktree/release-dsh-0.2.1-alpha.1
release(dsh): prepare 0.2.1-alpha.1
2026-10-03 11:48:13 +08:00
Tianyi Cui 7c22428471 docs(session): record the published V4 format 2026-10-03 11:37:09 +08:00
Tianyi Cui ec48669f48 release(dsh): 0.2.1-alpha.1 2026-10-03 10:46:11 +08:00
Tianyi Cui edcbb89bc8 Merge pull request #5646 from deepseek-harness/worktree/release-vendor-0.2.1-alpha.1
release(vendor): prepare isolated prereleases for DSH 0.2.1-alpha.1
2026-10-03 10:32:53 +08:00
Tianyi Cui 9c45de099f Merge pull request #5643 from deepseek-harness/worktree/release-vendor-channel
feat(release): support isolated npm publication channels
2026-10-03 10:18:21 +08:00
Turtle d3c2b3e642 fix(workflow-run): infer interruption only from crash or fork closers
Replace the persisted background marker with a client-only rule. A
foreground run writes run-end before its Tool Step ends and a background
run outlives that Step, so only a Turn closed after a crash or at a fork
boundary shows a run without run-end as interrupted.
2026-10-03 10:16:11 +08:00
Tianyi Cui 71086449e2 release(vendor): cordis 4.0.5-alpha.1, cosmokit 1.8.6-alpha.1, group 1.0.5-alpha.1, hmr 1.0.20-alpha.1, include 1.0.10-alpha.1, loader 1.0.6-alpha.1, logger-console 1.0.5-alpha.1, schemastery 3.18.5-alpha.1, timer 1.1.7-alpha.1 2026-10-03 10:02:24 +08:00
Tianyi Cui a809d9289d fix(release): preflight channels without relying on latest 2026-10-03 09:52:54 +08:00
Tianyi Cui c1dee0e6f6 test(release): allow inputs on manual publishing workflows 2026-10-03 09:34:42 +08:00
Tianyi Cui 185b9c59e7 feat(release): support isolated npm channels 2026-10-03 09:20:13 +08:00
Tianyi Cui da00f7f535 Merge pull request #5623 from deepseek-harness/feat/experimental-claude-code-mods-20261002
feat(experimental): add Claude Code mods bridge
2026-10-03 07:44:05 +08:00
Tianyi Cui 44d678e279 fix(docs): map example plugin aliases to themselves in doc-typecheck
The examples subpath alias of the mods bridge points at TypeScript entries
that ship no declarations; a documentation fence never imports them, so the
mapper keeps the authored path instead of failing the gate.
2026-10-03 06:33:11 +08:00
Tianyi Cui 536bb5840f test(experimental): serve the claude-code test-kit names from the Vitest config
The aliases leave tsconfig.base.json, which doc-typecheck maps to built
declarations, and live in the Vitest projects' resolve.alias; the examples
subpath maps to itself there because example plugin entries ship no
declarations. The README's wrapper fence declares its register import so
the fence compiles on its own.
2026-10-03 06:13:21 +08:00
Tianyi Cui a161070a76 test(experimental): run the example mod tests through a spec the coverage lane inventories
The coverage partitions list *.spec.ts files only, so the published
*.test.ts files reached no partition and the test kit's mount paths went
uncovered there. examples.spec.ts imports them by computed path; the kit
resolves the mod under test from the outermost describe when the file runs
through a spec.
2026-10-03 06:03:30 +08:00
Tianyi Cui 56f2f48669 fix(experimental): hairline band borders and one engine-event list
The band's bordered boxes and buttons draw the theme's 0.5px hairline, as
the elevation gate requires; KNOWN_EVENTS is built from ENGINE_EVENTS
instead of repeating the list.
2026-10-03 05:47:53 +08:00
Tianyi Cui 77fcdf46d2 docs(preset): list the mods band package in the composition reference 2026-10-03 05:24:51 +08:00
Tianyi Cui 233032b8f4 fix(experimental): close the mods bridge review findings
- Disposal cancels detached runs before the engine waits for timer callbacks,
  so a callback parked in a $ call ends instead of blocking unload.
- A forgotten band wakes and ends its watch streams; a refresh asked for
  during a pass joins one more pass that settles after it; the Web band drops
  an ended stream so the next subscriber opens a fresh one.
- $ has Claude Code's namespaces: an unserved member rejects with
  'no implementation for <namespace>.<member>' instead of a TypeError.
- A .catch handler's next makes the rewrite check; a tool rename is refused
  like an argument rewrite; a null op answer is reported as no answer;
  defineMod returns its disposer from apply; the live turn record is copied
  before the chain freezes it; prompt.submit is raised only for batches with
  a human message and names the submitting mod as origin.
- $.http.fetch bounds the body while streaming; bandColumns/bandRows are
  Config; the client package drops its stale gateway edges; the source
  overlay lives in the package and anchors its entries to the file, and the
  dsh installation no longer depends on the experimental packages.
2026-10-03 05:18:32 +08:00
Tianyi Cui f87c957624 test(snapshot): record the Claude Code mods composition headlessly
A scenario-local guard mod adds a context block after the prompt and
refuses a force push, beside Replay Theater and Token Weather from the
examples; the recording shows the context inside the user's message and
the refusal as the tool result. Blast Radius stays out of the headless
composition because it holds a command until a button press.
2026-10-03 03:54:52 +08:00
Tianyi Cui 34f52880b0 test(experimental): typecheck the mod test fixtures and example wrappers
Hook results spread the typed result from beneath, element props accept an
explicit undefined as a JavaScript mod passes it, the band's registry
payload is narrowed by assertion, and the example wrappers join the Host
typecheck project.
2026-10-03 03:28:09 +08:00
Tianyi Cui 2db0c83e86 docs(experimental): compatibility page, READMEs, and catalogs for mods as plugins
docs/subsystems/claude-code-mods.md lists every way a mod behaves
differently through the bridge than under Claude Code 2.1.287 — packaging,
events, the chain, $ members, drawing, testing, and the example mods,
including the four official mods assessed by reading. The bridge README
describes defineMod, the band, and the test kit; the band package gets its
README; the group index, release families, config and client catalogs,
module and seam graphs, and the Cordis API catalog are regenerated.
2026-10-03 03:19:43 +08:00
Tianyi Cui 0b87f74cd3 feat(experimental): Web band for Claude Code mods
A Client package mounts the bridge's Remote contribution, watches each
session's band through watchBand, draws the serialized tree in the input
dock with Claude Code's Box/Text/Button vocabulary on this theme's tokens,
and sends button clicks back through pressBand with the generation they
were drawn in. An opt-in overlay composes the bridge, the band, and the
three example mods for a source launch.
2026-10-03 02:46:33 +08:00
Turtle 34aef8c140 docs(workflow): state forward-only background marker and lost-run limits 2026-10-03 02:32:09 +08:00
Tianyi Cui 57126d8baf feat(experimental): draw the mods' AbovePrompt band and expose it over a Remote
The bridge keeps one band per session: ui.render is raised through the
mods in load order, the tree's buttons keep their onPress host-side behind
per-drawing action ids, a $.state read during a render subscribes the band
to that slot, and $.ui.open/close/invalidate, the end of a tool.call chain,
and turn.complete redraw it. ClaudeCodeMods is a TypertRemoteService:
watchBand streams snapshots, pressBand runs a button and redraws. null is
an accepted hook answer (a surface drawn empty).
2026-10-03 02:17:21 +08:00
Turtle a4af361ed7 fix(workflow): keep background workflow runs running after their step closes
A background workflow run outlives the Tool Step that started it, so the
Web workflow node inferred interruption as soon as that Step closed and
showed live members as interrupted. Mark background runs on
tool-workflow/run-start and infer interruption only for foreground runs.

Refs #5638
2026-10-03 02:16:21 +08:00
Tianyi Cui f1715c67ec refactor(experimental): make mods DSH plugins and drop the persistence change
A mod is now a plugin built with defineMod() around its register(on,
options); the bridge is the ClaudeCodeMods service (ctx.claudeCodeMods)
that keeps the loaded mods and raises their events. The plugin.json /
hooks.json loader, pluginDirs, and dynamic imports are gone.

prompt.submit context becomes text blocks appended to the human's own
prompt message and $.prompt.submit queues a user-sourced message, so the
bridge adds no message source kind: the persistence record and the
regenerated schema are removed and the artifacts match master again.

Engine correctness from the review round: next() is memoized and every
started run beneath is awaited before a hook's answer settles; a rewritten
tool argument skips the hook with a report pointing at the pre-tool input
rewrite proposal; timers belong to the session whose event started them;
$.tool.call injects a tool's deferred contexts; $.clock.sleep honors the
event signal; a built-in tool answered with { result } is validated against
its output schema before it becomes an error-shaped result; hooks on events
this host never raises are reported at load.

Examples: the three mods from the Claude Code blog post under examples/,
Token Weather and its test unchanged, Blast Radius and Replay Theater
completed from the published fragments, run by their own tests through a
claude-code/testing alias over the new test kit ($.ui.mount/find/press).
2026-10-03 01:38:21 +08:00
imccyu 2794d0a402 Merge pull request #5584 from deepseek-harness/fix/plugin-manager-runtime-resolution-1001
fix(plugin-manager): refresh runtime package resolution
2026-10-02 17:37:05 +08:00
imccyu 0046fe3f27 test(app-boot): update captured resolution source fixture 2026-10-02 17:09:01 +08:00
imccyu abf8b760ec fix(plugin-manager): preserve live runtime resolution mappings 2026-10-02 17:09:01 +08:00
imccyu 99fce8d4ea docs(plugin-manager): clarify runtime resolution publication rules 2026-10-02 17:09:01 +08:00
imccyu 869afc493d fix(plugin-manager): refresh runtime package resolution 2026-10-02 17:09:01 +08:00
imccyu fdacc98bf1 Merge pull request #5583 from deepseek-harness/fix/hmr-package-manifest-invalidation-1001
fix(hmr): invalidate changed package manifests
2026-10-02 17:08:57 +08:00
imccyu 4eb53e63ff fix(ci): cover HMR edge cases and document strict assertions 2026-10-02 16:02:37 +08:00
imccyu 93b469a5e1 fix(webworker): support strict truthiness assertions 2026-10-02 14:31:11 +08:00
imccyu a59beb8ae3 fix(hmr): preserve manifest refresh with Office resolution 2026-10-02 13:55:54 +08:00
imccyu b1c5f861b6 fix(hmr): preserve loaded entry identities across manifest changes 2026-10-02 13:54:51 +08:00
imccyu 1273855237 test(hmr): cover runtime removal during dependency traversal 2026-10-02 13:54:03 +08:00
imccyu d7d2e5fd4e fix(hmr): refresh CommonJS requests without evicting modules 2026-10-02 13:54:03 +08:00
imccyu 69f555f06a docs(hmr): clarify CommonJS request refresh 2026-10-02 13:54:01 +08:00
imccyu 980b410340 fix(hmr): preserve native manifest behavior 2026-10-02 13:53:41 +08:00
imccyu 6fe4a2e184 fix(hmr): invalidate changed package manifests 2026-10-02 13:51:41 +08:00
Turtle 31fbe85ec5 Merge pull request #5626 from deepseek-harness/turtle/unrun-build-dep-bc6bf626ae0d
fix(build): reject Node processes without TypeScript type stripping
2026-10-02 13:40:47 +08:00
Tianyi Cui 99670bab72 fix(timeout): keep the deadline reaction per demand
Review follow-up on the watchdog rewrite:

- Register the deadline reaction inside `next()` and detach it when the
  demand settles. Racing against one watchdog-lifetime promise kept every
  settled race reachable through that promise's reactions, retaining each
  resolved `StreamChunk` for the length of the stream: a 10,000-value probe
  kept 100/100 sampled values before this change and 0/100 after.
- Take the neighboring stall case's 1,000ms idle budget in the new
  transport-recovery case: the retry performs a real local HTTP/SSE round
  trip, and a 50ms budget would let coverage-lane scheduling decide it.
- Document the contract where it is described: `packages/util/timeout/README`
  (both languages) and the bounded-recovery and timeout-library notes no
  longer claim that only the transport observes the watchdog signal.
2026-10-02 13:22:19 +08:00
Tianyi Cui 600034d653 fix(experimental): harden the mods bridge after review
- prompt.submit sees and rewrites only the human's own messages, gains the
  rewritten text on an image-only prompt, and keeps only typed result fields
- a mod's $.tool.call reaches only the mods loaded before it, attributed to
  the caller, instead of re-entering every mod through the pipeline
- a .catch handler shares the failed hook's beneath state so nothing beneath
  runs twice; a late next from an abandoned handler is ignored
- hook results are validated before use; detached runs report rejections
- session.end keeps $.state readable until its hooks settle; agent creation
  cancellation abandons a waiting session.start hook; agents is read lazily
- a success a hook marks isError becomes a failure; replacement entries clear
  on tools/result; per-agent registrations drop with the agent
- $.store writes are serialized per plugin and bounded in UTF-8 bytes;
  $.http.fetch bodies are bounded; timers refuse rescheduling after unload
  and unload awaits running callbacks; regex matchers reset lastIndex
2026-10-02 13:18:17 +08:00
Turtle c71cd255ac test(scripts): expect the native config loader in build:bench 2026-10-02 13:03:29 +08:00
Tianyi Cui dbb150ff0e fix(timeout): end an idle demand the transport abandons
An aborted read can stay pending forever: undici drops the error when the
abort lands on an in-flight response-body read (observed on the coverage
lane's Node v24.13.0), and the stalled body of
`llm-retry/tests/transport-recovery.spec.ts` then never settles. The idle
watchdog delegated termination to the iterator observing its signal, so the
request outlived its own deadline and the agent stayed `running` until
Vitest's 90s budget; awaiting the abandoned request generator's `return()`
queued behind that demand and would have re-hung the settled outcome.

`idleWatchdog.next` now races its demand against its own deadline and
rejects with the watchdog's TimeoutReason, so the deadline — not the
transport — decides when an outstanding demand ends. Both adapters that
consume the watchdog stop awaiting the abandoned generator's drain; the
abort they already issue owns socket and SDK teardown.

Evidence: instrumented stress harness at ~1s idle on Node v24.13.0 hung 4/160
iterations before this change (each with the abort delivered at ~1002ms and
the underlying read never settling) and 0/160 after; Node v24.19.0 never
hung. The new case in transport-recovery.spec.ts pins the behavior
deterministically: it fails (times out) with the watchdog change alone and
with no product change at all.
2026-10-02 13:02:47 +08:00
Turtle 500614c0d5 fix(build): pin tsdown to the native config loader
Root build scripts, the desktop bundle and the dev:web watcher pass the
native loader so tsdown never selects the undeclared unrun fallback. A spec
covers the build.ts rejection path.
2026-10-02 12:48:01 +08:00
Turtle f3013b2d8d fix(build): reject Node processes without TypeScript type stripping
Without process.features.typescript, tsdown falls back to the undeclared
unrun loader, which fails to import and, once installed, resolves
import.meta.url in packages/client/tsdown.client.ts to the entry config.

Refs #5622
2026-10-02 12:31:36 +08:00
Turtle c130868430 Merge pull request #5567 from deepseek-harness/turtle/port-auto-assign-fe24bf6ef1d1
fix(desktop): listen on an OS-assigned port by default
2026-10-02 12:28:03 +08:00
Tianyi Cui dd123a6a68 test(native-command): publish Windows handler marker atomically 2026-10-02 12:00:50 +08:00
Tianyi Cui 7555272e97 test(experimental): widen the budget-pause timing margin for loaded CI hosts 2026-10-02 11:55:14 +08:00
Tianyi Cui 6e948732d1 test(experimental): cover the mods bridge's process cwd fallback on Windows and list the package in the release family
Also narrow the mod tool's rendered value to the string its schema admits and
bind the registration's catch before calling it untyped.
2026-10-02 11:53:56 +08:00
Tianyi Cui ca83aecbc8 test(experimental): keep mods bridge specs platform-stable
Resolve expected module paths through the platform path module and keep
the signal-termination assertion to POSIX, where a self-killed child has no
exit code.
2026-10-02 11:36:41 +08:00
Tianyi Cui 7794021892 docs: regenerate the config catalog for the mods bridge source line 2026-10-02 11:34:02 +08:00
Tianyi Cui 54fa38795f fix(experimental): drop unknown casts from the mods bridge and its tests
Type the mod tool's output as the answering text, read JSON into a typed
unknown, and replace the test doubles that went through unknown with a
real $ over a slow invoke, an Agent-comparable facts object, loosely typed
on() calls, and the Loader's own import path.
2026-10-02 11:27:47 +08:00
Tianyi Cui 35873604ad feat(experimental): add Claude Code mods bridge
Add @deepseek-ai/dsh-experimental-claude-code-mods, an alpha bridge that
loads Claude Code mods (plugin directories whose hooks/hooks.json names a
hooks module), runs register(on, options) unchanged, and raises the mod
events from harness extension points: session.start on agent/created,
prompt.submit and turn.start on agent/pre-step, tool.call around
tools/execute, turn.complete on turn/end, session.end on agent/disposed,
and command.run from registered commands. The $ mods API is served over
composed services (commands, tools, user-questions, fs, subprocess,
storage domain, projections); unserved members fail by name.

Includes a middleware chain with Claude Code's failure rules and budget
clock, a claude-code/testing-style test kit, fixtures from the mods
tutorial, full-loop and Loader composition tests, the attribution-only
claude-code-mods message source with its persistence record, and the
regenerated catalogs.
2026-10-02 11:10:41 +08:00
Tianyi Cui b85d98fb0f test(sdk): derive cache e2e registry history from request headers
Review follow-up: the developer message history is the net tool-list change
between two consecutive requests, not one entry per successful call, so a
remove/add pair batched into one step logs no message. Derive the expected
history from the recorded request headers, search for the later call after the
earlier one, and accept an already-removed tool in the removal prompt so the
REMOVED reply stays required.
2026-10-02 10:32:31 +08:00
Tianyi Cui f460022b58 test(sdk): assert required tool-call order in the cache e2e
The dynamic tool cache e2e asserted the exact recorded call sequence, so a
model that also removed the temporary tool inside the add turn failed an
otherwise valid run. Assert the calls the cache contract depends on and their
relative order instead, and derive the expected transcript registry history
from those recorded calls so one developer message per successful registry
change is still required.
2026-10-02 10:04:24 +08:00
Turtle 186e630b4a Merge pull request #5612 from deepseek-harness/turtle/spinner-scroll-sync-9edd522c716b
fix(client): re-pin StateDot loaders whose animation restarts
2026-10-01 23:15:39 +08:00
Yichen Jiang 27f9464d41 Merge remote-tracking branch 'origin/master' into worktree/input-command-concatenation-bug-5ed14e 2026-10-01 23:12:07 +08:00
imccyu 2596f6f592 Merge pull request #5596 from deepseek-harness/refactor/composer-dock-stat-ids
refactor(ui-chat): register composer stats pills as separate dock entries
2026-10-01 22:55:15 +08:00
Turtle 4b9d8ad6f7 fix(client): re-pin StateDot loaders whose animation restarts
Moving a loader's element (a keyed list reorder) or showing it again
after a display:none ancestor restarts its CSS animations, and the mount
ref does not run again, so the loader left the shared phase. The loader
now pins its animations to document time zero on every animationstart.
2026-10-01 22:40:13 +08:00
turtle1999 68ead9fced docs(ui-chat): state static plugin priority and Escape close 2026-10-01 19:50:18 +08:00
turtle1999 1f8cdc08a1 fix(ui-chat): document dock pill replacement order and outside-click close 2026-10-01 19:06:32 +08:00
turtle1999 f8c3c7efa0 docs: remove plugin inventory upgrade guide 2026-10-01 18:35:14 +08:00
turtle1999 f3c69681d0 fix(llm): report plugin names when versions are unavailable 2026-10-01 18:11:19 +08:00
Turtle e1c49269b2 Merge pull request #5517 from deepseek-harness/turtle/remove-invariants-ccf1396aaf61
refactor: remove runtime invariant plugins
2026-10-01 17:50:15 +08:00
turtle1999 2190082866 refactor(ui-chat): register composer stats pills as separate dock entries
Split the single 'stats' conversation.composer.dock entry into
'activity' (counts, speed, time dialog) and 'usage' (tokens, cache hit)
so another plugin can replace one pill by id instead of reimplementing
the whole row. The rendered pills are unchanged.
2026-10-01 17:47:35 +08:00
imccyu 7b658a9e94 Merge pull request #5597 from deepseek-harness/inspector-devtools-source
build(inspector): compile DevTools locally from npm sources
2026-10-01 17:29:45 +08:00
imccyu 9ec1a7ded9 test(inspector): align frontend smoke with the source build 2026-10-01 17:04:46 +08:00
imccyu 29ca976eaf test(web): keep DevTools source build e2e in the Host program 2026-10-01 16:59:42 +08:00
imccyu ad22e6c80f build(inspector): compile DevTools from pinned npm sources 2026-10-01 16:51:21 +08:00
Turtle 819eb8078e Merge origin/master into turtle/remove-invariants-ccf1396aaf61 2026-10-01 16:33:09 +08:00
Turtle 1ff1d43192 Merge pull request #5561 from deepseek-harness/fix/packer-agent-presets-mock
test(webworker-packer): accept the inventory agentPresets read
2026-10-01 14:28:50 +08:00
kingwl 48584b0060 Merge master and fix Windows HMR watch inventory assertions 2026-10-01 13:56:00 +08:00
Turtle 9c5fb6b0c5 Merge pull request #5550 from deepseek-harness/turtle/plugin-version-hint-66b6a2501f82
feat(plugin-manager): name the exact spec when pnpm installs an older version
2026-10-01 12:36:36 +08:00
turtle1999 6080e07ca3 chore: merge master into package inventory fix 2026-10-01 12:22:37 +08:00
Turtle 0bd1492940 fix(ui-plugin-manager): state the supply-chain policy, risk and remedy in the version notice 2026-10-01 12:19:01 +08:00
turtle1999 8e1dbdf88c fix(llm): keep package metadata failures from blocking requests 2026-10-01 12:11:31 +08:00
Yudong Han ebc616e01d Merge pull request #5589 from deepseek-harness/fix/bump-libreoffice-kit-0.1.5
chore(office): bump LibreOffice Kit to 0.1.5
2026-10-01 12:01:55 +08:00
Turtle 06f39bc83b Merge pull request #5537 from deepseek-harness/perf/recent-trace-hotspot
perf(api): time-slice Session list work
2026-10-01 12:01:45 +08:00
kingwl ca31126b20 docs(ci): reconcile coverage coordinator description with master 2026-10-01 11:16:38 +08:00
kingwl f99bafc91a fix(ci): verify complete coverage partition inventories 2026-10-01 11:14:35 +08:00
kingwl be7d58308c fix(hmr): exclude unrelated files from config watchers 2026-10-01 11:09:13 +08:00
yudshj 541fcec02f test(office): expect Kit 0.1.5 in SDK CLI smoke 2026-10-01 09:41:15 +08:00
yudshj d0916a8f90 chore(office): bump LibreOffice Kit to 0.1.5 2026-10-01 09:27:11 +08:00
kingwl f78b104b20 fix(deps): retain Worker-compatible Zod and align dependency checks 2026-10-01 03:19:25 +08:00
kingwl cbaefed057 fix(python): preserve SDK runtime aliases during resource sync 2026-10-01 03:02:51 +08:00
kingwl cb0cfa815f fix(web): validate KaTeX build helper and reuse browser scaffold 2026-10-01 03:02:11 +08:00
kingwl 18a8242003 docs(desktop): scope bundled ConPTY files to Windows 2026-10-01 02:58:59 +08:00
kingwl 874c399b8e chore(web): reconcile WebP documentation with master 2026-10-01 02:58:49 +08:00
kingwl eb28807cac fix(python): complete runtime pruning migration guidance 2026-10-01 02:58:48 +08:00
kingwl bb03ef5000 fix(desktop): retain shell exclusions in update qualification builds 2026-10-01 02:53:40 +08:00
kingwl 64c5255843 perf(deps): align desktop dependencies and share client libraries 2026-10-01 01:17:17 +08:00
imccyu 1274fa1047 Merge pull request #5259 from deepseek-harness/feat/session-inspector
feat(experimental): 增加会话数据检查与可选开发工具包
2026-10-01 00:59:35 +08:00
imccyu 799f3f2b48 Merge pull request #5211 from deepseek-harness/worktree-partialtool
feat(web): 在工具准备阶段显示已解析参数
2026-10-01 00:57:28 +08:00
imccyu f80df0426c fix(web): retain file input size across tool phases 2026-10-01 00:19:52 +08:00
imccyu d0cc135751 docs(web): describe persistent file input size 2026-10-01 00:19:52 +08:00
imccyu 83f9dcac8f fix(web): shorten streamed content size labels 2026-10-01 00:19:52 +08:00
imccyu b7f06692b6 fix(client): handle sealed deltas and Unicode summary boundaries 2026-10-01 00:19:52 +08:00
imccyu 2b6dfafd4b test(perf): exercise production conversation event routing 2026-10-01 00:19:52 +08:00
imccyu 4028ce27e8 test(fs): synchronize concurrent edit version guards 2026-10-01 00:19:52 +08:00
imccyu 46400a91bf fix(benchmarks): scale reconnect time budget consistently 2026-10-01 00:19:52 +08:00
imccyu 5d86fb0e79 docs(benchmarks): record reconnect CI calibration 2026-10-01 00:19:52 +08:00
imccyu cd759d8a09 chore(web): document allocation-free duplicate dispatch paths 2026-10-01 00:19:52 +08:00
imccyu 3bd1d3ef21 chore(client): refresh slot catalog after restack 2026-10-01 00:19:52 +08:00
imccyu 91818992b0 perf(web): finish incremental tool argument optimizations 2026-10-01 00:19:52 +08:00
imccyu a33bd1a80b perf(web): bound streamed tool argument work 2026-10-01 00:19:52 +08:00
imccyu d1b2b5a63b docs: record partial tool preparation performance 2026-10-01 00:19:52 +08:00
imccyu 2ba4144a7e feat(web): show parsed tool arguments during preparation 2026-10-01 00:19:52 +08:00
imccyu 35aebdca70 docs: describe shared lazy tool argument views 2026-10-01 00:19:52 +08:00
imccyu dcdf631ca2 feat(session-inspector): expand raw JSON details by default 2026-10-01 00:14:13 +08:00
imccyu 732dd913cf feat(inspector): embed Chrome DevTools and bundle optional diagnostics 2026-10-01 00:14:13 +08:00
imccyu 38c45638a2 feat(session-inspector): add raw-log and grouped-chat diagnostics 2026-10-01 00:03:25 +08:00
imccyu 88341c2a9f feat(layout): add a root-scoped bottom content slot 2026-10-01 00:03:21 +08:00
imccyu 0f2cda8c22 fix(dev): retain readiness hooks and stabilize Web scenario waits 2026-10-01 00:02:15 +08:00
imccyu 8463abc59d fix(sidebar): preserve Session Tab lifetimes and pane-local pages 2026-10-01 00:02:15 +08:00
Tianyi Cui a44b143ace Merge pull request #5574 from deepseek-harness/worktree/agent-notes-prune
docs(notes): prune redundant active Agent Notes
2026-09-30 23:39:56 +08:00
Tianyi Cui c7f66d13a6 docs(notes): prune redundant active decision records 2026-09-30 23:20:22 +08:00
kingwl cc11f9145c fix(desktop): limit dependency alignment to Koffi pin 2026-09-30 23:11:09 +08:00
Tianyi Cui bbf599483e docs(notes): normalize legacy implemented status metadata 2026-09-30 22:33:31 +08:00
kingwl 8d4503f3f0 fix(desktop): preserve and verify production dependency resolutions 2026-09-30 22:15:39 +08:00
kingwl 0dac34c338 fix(desktop): pin and validate Koffi 3.1.1 2026-09-30 21:57:11 +08:00
Tianyi Cui cae4251d57 Merge pull request #5571 from deepseek-harness/worktree/agent-notes-audit
docs(notes): prune local UI records and archive completed decisions
2026-09-30 21:44:13 +08:00
Tianyi Cui a1db5f13e8 docs(notes): prune local UI records and archive completed decisions 2026-09-30 21:28:21 +08:00
kingwl a863b7a989 perf(desktop): trim Domino tooling and legacy KaTeX font formats 2026-09-30 21:11:26 +08:00
Turtle ecd9bf9273 fix(desktop): listen on an OS-assigned port by default
The fixed 19387 listener fails when Windows (Hyper-V/WinNAT) reserves a dynamic
port range covering it, even though no process uses the port. Electron already
reads the bound port from the Host's ready message.
2026-09-30 21:04:32 +08:00
kingwl 019b5312b9 fix(desktop): prune shell source maps and build caches 2026-09-30 20:45:31 +08:00
turtle1999 c09be4813d test(webworker-packer): avoid counting inventory service reads in comment 2026-09-30 20:28:12 +08:00
kingwl d5b6cd29bb perf(client): encode onboarding illustrations as lossless WebP 2026-09-30 20:08:02 +08:00
turtle1999 a1df190fd9 test(webworker-packer): accept the inventory agentPresets read
Refs #5560
2026-09-30 20:04:26 +08:00
kingwl db1d900f6d fix: omit ConPTY sources from non-Windows Desktop packages 2026-09-30 19:51:06 +08:00
kingwl 18f00612c6 fix(desktop): use shared pnpm in the installed CLI 2026-09-30 19:39:54 +08:00
kingwl 037f46e917 Merge master into refactor/desktop-pnpm-dedupe 2026-09-30 19:26:25 +08:00
turtle1999 28107071fe fix(llm): omit unversioned private plugins from DeepSeek inventory 2026-09-30 18:47:07 +08:00
Turtle 43c5f1e924 fix(plugin-manager): explain another installed version only for one-registry runs 2026-09-30 18:42:32 +08:00
Turtle 97bbbdfa13 Merge pull request #5489 from deepseek-harness/fix/windows-coverage-electron
fix(ci): stabilize Windows coverage and tooltip snapshots
2026-09-30 18:34:29 +08:00
Turtle a2dcede62a Merge pull request #5540 from deepseek-harness/turtle/paused-goal-copy-48ed636139ee
fix(ui-goal): label disarmed goals as 已暂停的目标
2026-09-30 18:26:19 +08:00
imccyu 02629473c6 Merge pull request #5497 from deepseek-harness/worktree-bundledep
refactor(deps): align plugin dependencies with runtime ownership
2026-09-30 18:16:07 +08:00
Turtle bab69fbec5 feat(plugin-manager): name the exact spec when pnpm installs an older version 2026-09-30 18:13:26 +08:00
Turtle c006c6c074 Merge pull request #5535 from deepseek-harness/fix/retired-schedule-bundle
fix: drop retired bundle selections and let the Plugins page remove orphans
2026-09-30 18:11:54 +08:00
Turtle 5572d0503f Merge pull request #5384 from deepseek-harness/docs/plugin-skill-display-checks
docs(skills): require plugin display metadata and icons
2026-09-30 18:10:42 +08:00
turtle1999 2f7ed5fced test(skills): leave template resource validation to the package-meta gate 2026-09-30 18:10:38 +08:00
turtle1999 e0358d76bc docs(skills): follow the package-root and subpath icon rule
Ordinary plugins now show exported icons, and subpath plugins use
<subpath>/icon instead of a package.json. Update the display checklist
and nested-package gate cases to match.
2026-09-30 18:10:38 +08:00
turtle1999 71fd3cf2b5 test(skills): cover icon precedence and native diagnostic paths 2026-09-30 18:10:38 +08:00
turtle1999 176e961c33 fix(skills): validate exported resources in nested templates 2026-09-30 18:10:38 +08:00
turtle1999 310c5ae151 docs(skills): require plugin display metadata and icons 2026-09-30 18:10:38 +08:00
Turtle 4ac4e95460 Merge pull request #5394 from deepseek-harness/fix/bundle-only-metadata
fix(plugins): read package.json only for package-root plugins
2026-09-30 18:10:34 +08:00
turtle1999 4402fa47e4 perf(api): time-slice Session list work 2026-09-30 18:02:50 +08:00
lsdsjy 6b31010c23 Merge pull request #5547 from deepseek-harness/feat/login-network-error
feat(web): 登录请求无响应时提示检查网络
2026-09-30 18:00:05 +08:00
turtle1999 47d58f7fa2 test(web): await focused Copy tooltip before aria capture 2026-09-30 17:57:24 +08:00
turtle1999 fe56439edc refine(ci): keep Electron preparation independent of build 2026-09-30 17:57:24 +08:00
turtle1999 40133c707f fix(ci): provision Electron before Windows coverage 2026-09-30 17:57:24 +08:00
turtle1999 f8a274b76e fix(plugins): name declaring manifests and reject built display manifests
Manifest icon diagnostics name the package.json the author edits.
verify-package-meta rejects a package.json export that resolves to build
output instead of reading it, and PackageManifest.exports uses a narrow
export-target type.
2026-09-30 17:54:55 +08:00
turtle1999 d9d9ad3716 test(web): expect Uninstall on an unresolvable bundle selection 2026-09-30 17:54:03 +08:00
turtle1999 f18d1911c6 chore: regenerate the Cordis catalog for the removeBundle contract 2026-09-30 17:52:03 +08:00
Yichen Yanandliukx0205 a7c3ad99bc feat(web): advertise a configured public application URL (#3972)
* feat(web): advertise a configured public application URL

* test(session): restore migration verifier prefix coverage

* test(llm): synchronize idle timeout with provider request

* Remove unrelated migration Worker lifecycle changes

---------

Co-authored-by: liukx0205 <[email protected]>
2026-09-30 17:46:52 +08:00
lsdsjy dff4dfbe75 fix(desktop): 接受登录无响应错误码并补充升级说明 2026-09-30 17:44:49 +08:00
turtle1999 00b363074a fix(plugin-manager): let the page remove a selection no package holds
Desktop loads its profile with `loadProfileDirectory`, so the retired
bundle removal moves there from `loadProfile` and covers every loader.

A name in `dsh.profile.bundles` that neither the profile's dependencies
nor the installation holds had no uninstall on the Plugins page: the
button required `installed`. The Host now reports such a selection as
`removable`, and `removeBundle` deselects it without running pnpm. The
page shows uninstall for `installed || removable`.
2026-09-30 17:36:56 +08:00
fz 95fec5694e test(inspector): honor lane deadlines and settle disconnected calls 2026-09-30 17:36:33 +08:00
lsdsjy f3679c5006 Merge pull request #5539 from deepseek-harness/fix/feedback-context-fields
fix(web): 精简反馈问卷字段并合并设备分辨率
2026-09-30 17:33:31 +08:00
lsdsjy f3168f2be4 feat(web): 登录请求无响应时提示检查网络 2026-09-30 17:23:16 +08:00
fz 6900e62db0 fix(plugin-manager): dispose pnpm logs on preparation failures 2026-09-30 16:58:30 +08:00
Turtle b1a69a9b9c fix(ui-goal): label disarmed goals as 已暂停的目标 2026-09-30 16:39:25 +08:00
Turtle 08f0721e9d Merge pull request #5319 from deepseek-harness/turtle/frontmatter-render-9aa734baa39d
feat(client): render Markdown YAML frontmatter as fields in document preview
2026-09-30 16:24:33 +08:00
fz 4f3b86983d fix(ci): run Windows coverage with the Realm cleanup fix 2026-09-30 16:22:26 +08:00
imccyu c222ea968b Merge pull request #5505 from deepseek-harness/session-prompt-prefill
feat(web): initialize prompts and preserve structured session drafts
2026-09-30 16:21:17 +08:00
Turtle 95a7a0cae3 Merge pull request #5534 from deepseek-harness/turtle/plugin-toggle-css-c341cac49368
fix(client-modules): keep other owners' styles when a plugin toggles
2026-09-30 16:15:49 +08:00
Turtle 7a6cef7c92 fix(ui-goal): label disarmed goals as 暂停的目标 2026-09-30 16:04:06 +08:00
lsdsjy bd0ff9f382 fix(web): 精简反馈问卷字段并合并设备分辨率 2026-09-30 15:56:03 +08:00
turtle1999 ecc01b54a4 perf(api): yield between Session list summaries 2026-09-30 15:50:40 +08:00
turtle1999 9633724b40 fix(app-boot): drop the retired schedule bundle from profile manifests
`@deepseek-ai/dsh-experimental-schedule-bundle` shipped in dsh-v0.2.0-rc.1
and rc.2 and was removed when the Web composition started mounting
Schedule itself. A profile that switched it on kept the name in
`dsh.profile.bundles`, so every start reported an unresolvable bundle and
the Plugins page showed a failed entry with no removal action.

`loadProfile` now removes names listed in `RETIRED_BUNDLES` from any
profile's bundle list, alongside the existing installation-owned tuple
normalization, and rewrites the manifest only when the list changes.
2026-09-30 15:39:25 +08:00
fz 42629929ce test(web): refresh job lifecycle replay fixtures 2026-09-30 15:31:25 +08:00
fz fb578d0510 test(jobs): record PowerShell lifecycle snapshot 2026-09-30 15:25:24 +08:00
fz f899e87a1e fix(jobs): persist owned job lifecycle timing in sessions 2026-09-30 15:25:24 +08:00
Turtle 015349e4ad fix(client-modules): remove untagged styles of a failed factory 2026-09-30 15:14:59 +08:00
kingwl b296271c83 fix: prune upstream tests from bundled Python libraries 2026-09-30 15:13:47 +08:00
Chinesezjc 0ebba99d8b Merge pull request #5161 from deepseek-harness/feat/preset-scoped-schedule-tools
feat(web): scope the reminder stack to the presets that declare it
2026-09-30 15:06:10 +08:00
Turtle aa5334f1e0 fix(client-modules): claim only styles a factory injects
Materialization tagged every untagged <style> in the document for the
materializing plugin, so styles inserted later by other owners (Cordis
dynamic plugins, runtime-injecting libraries) were removed when an
unrelated plugin was toggled.
2026-09-30 15:01:51 +08:00
imccyu 9aa8e788ba docs(client): clarify draft initialization lifecycle 2026-09-30 14:54:38 +08:00
imccyu 2c93df5620 fix(client): narrow prompt input and defer skill highlighting 2026-09-30 14:54:38 +08:00
imccyu d7099f9e2e docs(client): define text-only prompt initialization 2026-09-30 14:54:38 +08:00
imccyu 32e5555699 test(web): await source draft before target initialization 2026-09-30 14:54:37 +08:00
imccyu ae08c57c21 test(client): avoid unsafe draft catalog matchers 2026-09-30 14:54:37 +08:00
imccyu e6783c20fc fix(client): initialize draft lexicon after caching input shell 2026-09-30 14:54:37 +08:00
imccyu a456015082 docs(client): clarify draft lexicon initialization timing 2026-09-30 14:54:37 +08:00
imccyu 59b29ed6bd style(test): format the browser error observer 2026-09-30 14:54:37 +08:00
imccyu ec6b275c64 test(web): cover draft option and navigation cases without a test plugin 2026-09-30 14:54:37 +08:00
imccyu 7d3420126e test(client): update workspace initialization API expectations 2026-09-30 14:54:37 +08:00
imccyu 236ab7acbd docs(client): document structured draft initialization in both languages 2026-09-30 14:54:36 +08:00
imccyu e400349e3a feat(client): initialize session prompts and preserve structured drafts 2026-09-30 14:54:36 +08:00
lsdsjy 9e1df327ae fix(account): 延后赠金通知并隔离身份补齐通知 2026-09-30 14:54:05 +08:00
kingwl 3c95edd468 test: cover Python runtime aliases on Windows hosts 2026-09-30 14:43:28 +08:00
kingwl 099db91169 fix: preserve bundled Python interpreter aliases 2026-09-30 14:27:13 +08:00
kingwl 6b26100995 refactor(desktop): clarify runtime preparation stages 2026-09-30 14:09:56 +08:00
Chinesezjc 3e5231bc6f Merge origin/master into feat/preset-scoped-schedule-tools
Resolutions:
- `docs/subsystems/schedule.*` and `packages/client/ui-schedule/README.*` keep
  this branch's shipped-composition text with master's newer wording (Rules and
  Records tabs, the icon-button linked-session layout).
- `docs/event-producer-consumer.*` regenerated by `gen-doc-graphs`.
2026-09-30 13:49:30 +08:00
kingwl 98de8c0925 refactor(desktop): share bundled primary-runtime pnpm 2026-09-30 13:47:40 +08:00
imccyu 3e531a13d5 Merge pull request #5507 from deepseek-harness/tool-argument-order
fix(tools): 明确路径和描述字段的生成顺序
2026-09-30 13:44:40 +08:00
Turtle f1f0dc54ff docs: drop remaining references to removed invariant checks 2026-09-30 13:43:01 +08:00
creatixchu d94e64949d test(cua): isolate restoration from custom accessibility roots 2026-09-30 13:30:48 +08:00
creatixchu c2c5a96fde test(cua): use an empty AppKit collection option set 2026-09-30 13:28:59 +08:00
creatixchu 1038ecb92b test(cua): observe settled AppKit visibility during restoration 2026-09-30 13:28:09 +08:00
creatixchu 3865067590 test(cua): establish foreground state explicitly in restoration checks 2026-09-30 13:26:12 +08:00
creatixchu 9b1494d8d2 test(cua): await foreground fixture readiness 2026-09-30 13:24:16 +08:00
creatixchu c58e90ee1e test(cua): launch restoration fixtures through macOS application services 2026-09-30 13:23:45 +08:00
creatixchu 086e1b5c6c fix(cua): restore application visibility through accessibility 2026-09-30 13:20:02 +08:00
creatixchu 5d8a19cb0d test(cua): record window restoration and use bundled native fixtures 2026-09-30 13:17:43 +08:00
creatixchu a83cebc4cf feat(cua): restore windows without activation and reject stale coordinates 2026-09-30 13:13:57 +08:00
Turtle 963715344b test: cover paths previously exercised only by invariant companions
Delete the now-unused llm-retry history helper, drop the unreachable
credentials-local refresh rejection handler, and add direct tests for the
gateway SRC skip of unprovided Services and llm-retry projection dedupe.
2026-09-30 13:12:01 +08:00
Turtle f028f25667 refactor: remove runtime invariant plugins
Delete @deepseek-ai/dsh-invariants, every package's ./invariant companion
and its tests, the invariant gates and Vitest setup, the scoped-event
resolver generator, and the INVARIANT-coded listener rethrow paths.
Update docs, READMEs, Agent Notes, and add an upgrade guide.
2026-09-30 12:52:18 +08:00
imccyu f37f19ab43 fix(subprocess): compare executable errors by name 2026-09-30 12:47:48 +08:00
imccyu 2e3ab61940 fix(presets): own composition mounts in registry service 2026-09-30 12:47:47 +08:00
imccyu e93ff18021 Merge pull request #2689 from deepseek-harness/fix/typert-loader-steady-failure-flake
test(typert-loader): poll async assertions instead of fixed 20ms sleeps
2026-09-30 12:14:43 +08:00
creatixchu 4e5234ac9c fix(cua): 保留相同文字的值语义并压缩结构容器 2026-09-30 12:04:50 +08:00
creatixchu 6ff1825139 test(cua): 固定精简和展开 AX 的会话输出 2026-09-30 11:59:48 +08:00
Chinesezjc abc03cf2e5 Merge origin/master into fix/typert-loader-steady-failure-flake
Only packages/typert/loader/tests/loader.spec.ts conflicted. Master's side
was kept (master's non-awaited ctx.loader.remove calls, restored by the revert
of the transactional Cordis reload changes) and this branch's two vi.waitFor
conversions were re-applied on top, so the merged file differs from master
only by those two polling assertions.
2026-09-30 11:57:33 +08:00
creatixchu 7257181b9e feat(cua): 优化 AX 信息披露与按需展开 2026-09-30 11:55:50 +08:00
imccyu aa2ae5c779 fix(file-upload): isolate receipts by session instance 2026-09-30 11:52:43 +08:00
imccyu e6c6ec668f fix(remotes): remove redundant session runtime dependency 2026-09-30 11:52:42 +08:00
imccyu a63d8979fa fix(tools): align PTC examples with argument order 2026-09-30 11:46:29 +08:00
turtle1999 d9a40155c1 docs(upgrade): subpath plugins use <subpath>/icon instead of package.json 2026-09-30 11:42:59 +08:00
turtle1999 6c6b85e572 Merge remote-tracking branch 'origin/master' into turtle/bundle-only-metadata-5394 2026-09-30 11:41:32 +08:00
turtle1999 8339f16c1d fix(plugins): read package.json only for package-root plugins
Subpath plugins are not packages, so they never read a package.json and
take their icon from the exported <specifier>/icon resource, like locale.
Package roots keep manifest text fallback and icon, with ./icon as the
fallback image. Drop the bundle-only reader option.
2026-09-30 11:41:26 +08:00
Chinesezjc 3dce1c93d0 Merge pull request #5146 from deepseek-harness/fix/producer-owned-source-doc-examples
docs: show the producer-owned message source in current-state examples
2026-09-30 11:26:09 +08:00
Turtle 508e71b686 Merge pull request #5428 from deepseek-harness/turtle/plugin-source-section
feat(plugins): 在组合包详情页显示来源信息
2026-09-30 11:15:39 +08:00
Turtle e5a010be64 Merge pull request #5403 from deepseek-harness/perf/session-corpus-benchmarks
test(bench): measure Session list, search, and fork over large corpora
2026-09-30 11:13:47 +08:00
imccyu 17ac34c1c7 test(sdk): expect description before code in PTC schema 2026-09-30 03:25:42 +08:00
imccyu 4166dbd140 fix(tools): guide argument generation order 2026-09-30 02:18:04 +08:00
Ziya 4d59dc2dd6 Merge pull request #5399 from deepseek-harness/demo/plugin-first-ui
feat(web): add Creator entry to the plugin menu
2026-09-29 08:03:23 -07:00
Ziya 95efadbfbd Merge pull request #5413 from deepseek-harness/fix/beginner-mode-choices-20260928
fix(web): 关闭代码工作视图时隐藏开发模式并修正默认预设
2026-09-29 07:54:42 -07:00
Turtle d085f35c29 Merge pull request #5463 from deepseek-harness/turtle/cmd-expand-repro-4a4c3f1e4a80
fix(ui-tool): keep bash rows expandable with Host-accepted escalation fields
2026-09-29 20:39:48 +08:00
Turtle a2f2c61daa Merge pull request #5470 from deepseek-harness/turtle/linked-session-fit-a836e489848c
fix(ui-schedule): fit the linked Session entry and rename Records tab
2026-09-29 20:34:13 +08:00
Turtle 35a733ccb5 Merge pull request #5469 from deepseek-harness/turtle/followup-stop-behavior-5a63325e10fb
fix(goal-round-driver): withdraw a goal round parked by cancellation
2026-09-29 20:31:39 +08:00
Turtle 332fd1e075 Merge pull request #5340 from deepseek-harness/turtle/task-icon-size-f8a4f45d43b2
fix(ui-schedule): enlarge the Session-row clock mark by 2px
2026-09-29 20:30:55 +08:00
Turtle 2796fc8ae3 Merge pull request #5467 from deepseek-harness/turtle/goal-editor-singleline-d6d4f2ca3ce3
fix(client): share a multi-line inline editor for goals and queued messages
2026-09-29 20:30:39 +08:00
creatixchu 4f6f39ea2e Merge remote-tracking branch 'origin/feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-29 20:13:38 +08:00
creatixchu c72df24922 test(session-cache): await archived fixture checkpoint durability 2026-09-29 20:12:23 +08:00
creatixchu b8c1e6094a Merge remote-tracking branch 'origin/feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-29 19:51:14 +08:00
creatixchu c7d1a0e499 test(cua): refresh native scenario for current tool guidance 2026-09-29 19:50:25 +08:00
creatixchu 137d35a600 test(ptc): refresh persistent prompt for current tool guidance 2026-09-29 19:50:24 +08:00
creatixchu 0b6c5bb7b8 merge: update native CUA to the current release base 2026-09-29 19:47:33 +08:00
creatixchu fcecd8e37b merge: update persistent PTC to the current release base 2026-09-29 19:45:45 +08:00
creatixchu 6fcf790ccb test(cua): admit compiler outputs backed by either buffer storage 2026-09-29 19:30:06 +08:00
creatixchu a6b5a222a0 fix(cua): retain immutable native executables for source runtimes 2026-09-29 19:28:38 +08:00
creatixchu e3ab7232ef fix(cua): annotate the post-approval lifetime recheck 2026-09-29 19:05:40 +08:00
creatixchu 1d40e9bf31 fix(cua): keep async lifetime check and type native test requests 2026-09-29 19:05:24 +08:00
creatixchu e87b4298fd docs(cua): document native launch and rich input behavior 2026-09-29 19:01:34 +08:00
creatixchu b36fe768bb test(cua): refresh capability snapshots and wait for window creation 2026-09-29 19:00:24 +08:00
creatixchu 29e70c8ab2 fix(cua): type protocol generator and await application launch readiness 2026-09-29 18:59:05 +08:00
creatixchu eae305af6e refactor(cua): derive native protocol tables and isolate AX formatting 2026-09-29 18:52:37 +08:00
creatixchu e12fe33aaa fix(cua): own clipboard transactions on the AppKit main actor 2026-09-29 18:35:13 +08:00
creatixchu e312d6fdf6 fix(cua): retain paste data until the clipboard consumer requests it 2026-09-29 18:27:19 +08:00
creatixchu 9a562aa6ca fix(cua): distinguish disabled paste commands and verify fixture focus 2026-09-29 18:16:58 +08:00
creatixchu 13a41cd8ed test(cua): verify native editing and physical input in AppKit 2026-09-29 18:12:24 +08:00
creatixchu 0946619d1e fix(cua): validate installed bundle signatures before launch 2026-09-29 18:05:18 +08:00
creatixchu c520c10a84 feat(cua): discover and launch applications after consent 2026-09-29 17:59:46 +08:00
creatixchu 9fbdf7e72b fix(cua): use the existing atomic-write package for paste locking 2026-09-29 17:46:17 +08:00
creatixchu 4e7a987acd docs(cua): describe clipboard paste and preservation limits 2026-09-29 17:40:28 +08:00
creatixchu d35070bf4b feat(cua): paste text and HTML through native clipboard commands 2026-09-29 17:39:34 +08:00
Chinesezjc 4f1a4f8940 Merge origin/master into feat/preset-scoped-schedule-tools
Resolutions:
- `packages/experimental/schedule-bundle/package.json` stays deleted: master
  bumped a package this branch retires.
- `@deepseek-ai/dsh-tool-schedule` follows the release train version.
2026-09-29 17:33:43 +08:00
Chinesezjc 1abe2c6270 docs: regenerate the module graph for the delegation dependency
`@deepseek-ai/dsh-schedule` and `@deepseek-ai/dsh-tool-schedule` now depend on
`@deepseek-ai/dsh-subagent`, and the schedule package no longer imports the
Session controller's ownership predicate, so the committed module graph moves.
2026-09-29 17:32:34 +08:00
creatixchu d2e8a5be3a feat(cua): select literal text with verified AX ranges 2026-09-29 17:31:14 +08:00
ZiyaZhang 57383630a6 Merge updated Creator mode parent and keep shared entry flow 2026-09-29 02:30:07 -07:00
ZiyaZhang 753fea38e6 fix(web): address preset review feedback and stale documentation 2026-09-29 02:25:24 -07:00
creatixchu db59be0b6a feat(cua): support keypad and modified middle-button input 2026-09-29 17:23:15 +08:00
imccyu 639ed01539 Merge pull request #5479 from deepseek-harness/worktree/release-dsh-0.2.0-rc.2
release: [email protected]
2026-09-29 17:21:31 +08:00
ZiyaZhang 7f7225ea7c Merge master and keep current coding view settings copy 2026-09-29 02:20:39 -07:00
Yichen Jiang 92b23cb792 fix(web): stop claim token decoration from looping on boundary input
Typing at the end of the highlighted command token lands in the styled
node. The decoration split the overflow back out, but splitText copied
the token style onto it, so Lexical's normalization merged the halves
again and the transform looped until Lexical aborted the update. The
DOM kept the native insertion while the editor state rolled back, which
left the composer desynchronized for every later keystroke.

Clear the overflow style in the same transform pass.

Refs #4490
2026-09-29 17:11:02 +08:00
Chinesezjc 1b1b09e1fb fix(schedule): enforce the caller restriction in the tool layer
Review follow-ups on the delegated-child rule:

- Every one of the four tools refuses a delegated caller before dispatch,
  reading `delegationDepthOf(exec.agent)` and returning the stable
  `subagent_session` refusal, so `schedule_list`, `schedule_delete`, and a
  content-only `schedule_update` are covered too. The preset `toolFilter.deny`
  stays as the layer that keeps the tools out of a child's prompt.
- The service keys the arming refusal on that same delegation accounting
  alone; `hasApiSessionSubagentOwner` returns to package-private and
  `@deepseek-ai/dsh-schedule` no longer imports it.
- The preset child row is `time-context` again: the `preset-` prefix separated
  it from a Host row that no longer exists, and `verify-cordis-config` passes
  with the sibling-style id.
- Docs, Agent Notes, and the generated catalogs follow.
2026-09-29 16:57:25 +08:00
Turtle 66e101821c refactor(client): share the queued-message and goal inline editor
Move the auto-growing textarea into ui-primitives as InlineEditor and use it
for both the queued-message and goal editors. It also refits when its width
changes and treats keyCode 229 as IME composition.
2026-09-29 16:56:26 +08:00
imccyu c1b47e41fc release(dsh): 0.2.0-rc.2 2026-09-29 16:40:57 +08:00
Chinesezjc fc395556b6 Merge remote-tracking branch 'origin/master' into feat/preset-scoped-schedule-tools 2026-09-29 16:39:19 +08:00
Chinesezjc 699f1a8dc1 feat(schedule): deny the reminder tools to delegated children
A delegated child could arm reminders through the tools its preset mount
passes down, even though delivery can never reach a child's Session. The
refusal now reads the delegation-depth accounting the delegation cap itself
enforces, and the shipped presets deny the four tools to children outright:

- `reminderTargetRefusal` refuses when `delegationDepthOf(agent)` is above
  zero, or when the Session is subagent-owned without a depth record.
- `standard`, `cordis`, and `ptc` set `toolFilter.deny` on both delegation
  rows, so the four tools leave a child's prompt and reject execution.

`create` still rejects and `update` still returns the non-mutating refusal.
2026-09-29 16:39:05 +08:00
Tianyi Cui 1de97d1c10 Merge pull request #5288 from deepseek-harness/worktree/desktop-cli/manage
feat(desktop): manage dsh command from the app menu
2026-09-29 16:27:30 +08:00
Turtle c02925ed6b test(web): pin goal round withdrawal after Stop in queue-actions
Tighten goal-round-driver docs and regression assertions for the withdrawn
queued round: continuation disarms when the cancelled turn belonged to other
work, and the removal is a durable canceled next-turn splice.
2026-09-29 16:26:04 +08:00
Turtle d8f38c4ad6 fix(ui-schedule): keep linked Session focus and disabled tooltip
Render one Button for both layouts so crossing the fit threshold keeps focus,
anchor the tooltip on the wrapper so a disabled compact entry still names
itself, observe each tab, and rename the tab in the user and subsystem docs.
2026-09-29 16:23:52 +08:00
Huanqi Cao 7cecc72cae Merge pull request #5432 from deepseek-harness/fix/windows-acl-single-run-repair
fix(sandbox-windows-acl): diagnose and repair ACL denials in one run
2026-09-29 16:21:54 +08:00
imccyu fe5b4da6f5 Merge pull request #5456 from deepseek-harness/worktree-perflong
perf(web): 降低长会话渲染、输入与鲸鱼动画开销
2026-09-29 16:21:47 +08:00
Turtle b88b6c248d fix(ui-goal): rebind the goal editor scrollbar and harden its Enter guard
Rebind the scrollbar thumb to the l2 pair on the elevated goal strip, treat
keyCode 229 as IME composition, and re-measure the editor when the inline
error changes its width.
2026-09-29 16:17:00 +08:00
Huanqi Cao e0c194cfe1 fix(windows): classify after the subtree scan and surface report failures
The classification was recorded before the subtree scan, so a run that found and
removed package ACEs under the requested directory still reported NOT_THIS_CLASS
or PRECONDITION with an empty packageObjects, contradicting README and SKILL. The
scan now runs first, so the verdict and packageObjects describe what the run
actually repairs.

A report-file write failure now prints REPORT_IO_FAILED with the path and the
error on stderr instead of silently leaving an incomplete report behind.
2026-09-29 16:12:42 +08:00
imccyu e1cbde3af1 fix(web): clarify coding view settings copy 2026-09-29 16:10:48 +08:00
Turtle c74f39b4dc refactor(ui-tool): drop Client-side escalation validation from diff cards 2026-09-29 16:09:34 +08:00
imccyu 167fea0723 fix(web): preserve whale accessibility and update animation tests 2026-09-29 16:03:26 +08:00
imccyu e4aa508e35 docs(web): align whale animation and modal cache descriptions 2026-09-29 16:03:26 +08:00
imccyu bb7455da04 perf(web): inline whale image into CSS at build time 2026-09-29 16:03:26 +08:00
imccyu 6a0f36cdea perf(client): reduce long-session rendering and whale animation overhead 2026-09-29 16:03:26 +08:00
Turtle 5586cfef7e fix(ui-schedule): fit the linked Session entry and rename Records tab
Shrink the linked Session entry to a chat icon button with a Linked session
tooltip when the detail strip cannot fit it, hide the tab list scrollbar,
and rename the English Delivery records tab to Records.
2026-09-29 16:01:14 +08:00
lsdsjy 4f26143bf2 Merge pull request #5393 from deepseek-harness/feat/desktop-login-shell-env
feat(desktop): 启动时读取用户登录 shell 环境
2026-09-29 15:59:28 +08:00
Turtle 9a8d21dfe7 fix(goal-round-driver): withdraw a goal round parked by cancellation
A goal round queued behind human work stayed in the inbox after Stop. The
next human prompt claimed that stale round first, pre-step rejected it, and
the driver exited with the human prompt still parked until another send.
2026-09-29 15:58:09 +08:00
Turtle 3843225471 fix(ui-goal): edit the goal objective in a multi-line editor
The goal edit field was a single-line input: Enter always saved, a newline
could not be entered, and a long objective scrolled sideways on one line.
Use an auto-growing textarea capped at six lines, matching the queued-message
editor: Enter saves, Shift+Enter breaks the line, IME confirmation does not
save, Escape cancels.
2026-09-29 15:57:22 +08:00
imccyu 6bb3d8becf Merge pull request #5409 from deepseek-harness/fix/client-inspect-query-timeout
fix(cordis): bound Client inspect queries and retain failures
2026-09-29 15:52:59 +08:00
imccyu afadb61008 Merge pull request #5314 from deepseek-harness/feat/sidebar-folder-open
feat(web): 为侧栏文件夹添加打开按钮
2026-09-29 15:52:51 +08:00
imccyu 5e7e961aef Merge pull request #5208 from deepseek-harness/turtle/pwsh-prompt-path-check-d15d1781302e
fix(shell): remind agents to check resolved paths before delete or move
2026-09-29 15:51:56 +08:00
Turtle b5d7123351 fix(ui-tool): document unchecked shell escalation fields and cover diff-card pairs 2026-09-29 15:44:23 +08:00
Tianyi Cui a01f2444c3 refactor(desktop): make CLI registration a post-install menu action 2026-09-29 15:41:06 +08:00
imccyu 657b8622c1 docs(cordis): clarify inspect diagnostics and fixture checks
Clarify acknowledgement and first-failure semantics, update configuration and timeout terminology, and explain request-side fixture checks without changing execution logic or recorded expectations.
2026-09-29 15:38:38 +08:00
ZiyaZhang 16c485166c docs(web): clarify add-plugin actions and Creator flow 2026-09-29 00:32:08 -07:00
Huanqi Cao fd5e89feb7 fix(windows): close the remaining ACL review findings
The desktop archive probe called the script with only -Path, which the new
interface refuses, so it now passes -AllowRoot and -Out. The skill no longer
suggests running the repair confined: the confined token cannot write a DACL, so
that run would report the sandbox's own restriction as a missing right.

The subtree walk bounds its first enumeration too, and a directory whose stat
fails counts as unreadable instead of vanishing. The removal decision says
inherited copies follow their repaired source, and the pre-flight comment names
grant targets as well. Add the third behavior test the rewrite dropped: an
inherit-only FullControl ACE survives a grant.
2026-09-29 15:29:52 +08:00
Huanqi Cao d7defa7e51 docs(windows): say Windows file permissions, not ACL, to the user
The approval rule and the stop template are the text a user reads, so they now
name Windows file permissions and permission entries; ACL and ACE stay in the
model-facing technical sections and the report.
2026-09-29 15:29:52 +08:00
Huanqi Cao 7ac193ba45 docs(windows): shorten the stop guidance and pair it in Chinese
The stop paragraph now says only the user can lift confinement, names the term
the Chinese UI shows (完全权限), and offers both options that switch opens: keep
working under full access, or have the agent keep investigating the ACL problem
from the report's mechanism and evidence. A bilingual template carries the same
message, and the surrounding skill text is tightened to stay inside its budget.
2026-09-29 15:29:52 +08:00
Huanqi Cao 9408da49b9 docs(windows): leave lifting confinement to the user
The stop path told the agent to switch the session to full access, which only the
user can do. Ask them to switch it instead, keep the agent out of that decision,
and record the same wording in the windows-acl-skill snapshot.
2026-09-29 15:29:52 +08:00
Huanqi Cao 5329de143a fix(windows): keep the ACL report readable after truncation
Tool output keeps only its tail, so a long repair run lost its early observations
and nothing durable held the full record set. Every run now writes each REPORT
record to \`-Out\acl-report-*.jsonl\` and ends with a \`RECAP\` line carrying the
verdicts, changes, verifications, refusals and scans, followed by the report path
and the counts. Verification re-reads stop repeating an ACE list the run already
printed, and the localised icacls rendering leaves the record.

The skill now tells the agent what to do when a repair stops: name the blocking
object and right, unblock the user by switching the session to full access
temporarily (stating that confinement is off and that this is a workaround), and
ask for feedback with this session so the unhandled scenario reaches the team,
quoting the report records because only what reaches the conversation travels.

Also from review: the subtree walk reports directories it could not read instead
of claiming a complete walk, a grant target without effective WRITE_DAC is refused
before any change rather than failing mid-repair, grant targets require complete
observations, and repair sources are ordered ancestor first for scanned paths too.
2026-09-29 15:29:52 +08:00
Huanqi Cao 9da8c9dd34 test(snapshot): refresh windows-acl-skill for the tightened skill text
The recorded session embeds the skill description and the loaded instructions,
so the review-driven edits to SKILL.md need the same two-line fixture update.
2026-09-29 15:29:52 +08:00
Huanqi Cao 58f64d0117 fix(windows): tighten the single-run repair against review findings
Review found the unified run had dropped the grant pre-check: a target without
effective WRITE_DAC was attempted anyway, failed, marked a recovery attempted, and
the rollback could not restore it either, ending in restore_pending_then_stop with
a command that cannot run. Refuse that target before any change, and gate grants on
complete observations the way package removals already are.

Repair sources are now ordered ancestor first for chain and scan-discovered paths
alike; the old reverse made a deeper scanned source come first. The subtree walk
reports directories it could not read instead of claiming a complete walk, and the
docs record the authorized-root trigger plus one recovery pair per change.

Restore the two behavior tests the rewrite dropped: a deny sharing the removed
allow's SID, and an inherited source outside -AllowRoot with an in-root explicit
child.
2026-09-29 15:29:52 +08:00
Huanqi Cao e909f866aa test(snapshot): refresh windows-acl-skill for the single-run skill text
The recorded session embeds the skill's catalog description and the loaded
instructions, so the keyless replay diffed the previous two-step text against
the shipped one. Replace both with the shipped text; nothing else changes.
2026-09-29 15:29:52 +08:00
Huanqi Cao 0618f449a3 docs(windows): record the single-run ACL repair in the agent note
The note still described a diagnosis-then-repair workflow with a mode choice.
Record what shipped: one invocation for both repairs, the bounded subtree walk
under a directory the caller cannot provision, the authorized root repairing and
restoring itself, and the per-object recovery record plus script.
2026-09-29 15:29:52 +08:00
Huanqi Cao ab0195f802 fix(windows): diagnose and repair ACL failures in one run
The script made the caller choose a mode, so one sandbox failure cost two
approvals: one to diagnose and one to repair. It now has no modes. A single run
adds the signed-in user's full-control allow ACE to the directories on the chain
that lack effective WRITE_DAC or WRITE_OWNER, removes explicit package allow ACEs
at their sources, ancestor first, and verifies every change by re-reading it.

A directory the caller cannot provision also has its subtree checked for explicit
package allow ACEs in that same run: the sandbox reports its provisioning failure
on the workspace root while the conflicting entry often sits deeper, and the walk
is bounded and reports truncation. The authorized root itself may be granted and
restored, so a workspace root can repair and roll itself back.

Recovery artifacts shrink to one record and one script per modified object; the
unused icacls save file and the duplicated command file are gone. The skill, its
README paragraphs and the script tests follow the single command: the former
-Fix, -GrantFullControl and -Compact switches are rejected.
2026-09-29 15:29:51 +08:00
Huanqi Cao 4f96bc18df fix(windows): verify ACL repairs against the object's own entries
Comparing whole DACL strings and whole icacls listings reported a successful
package-ACE removal as a collateral change: listing order, inherited entries
and the object's own entries were treated as one value. The package allow
filter also matched the rendered ACE row instead of the ACE's SID, so -Fix
could never verify a removal.

Compare the object's own ACEs and its inheritance protection instead, save and
restore own ACEs only so a parent that changes during the repair cannot make a
correct restore fail, and let -GrantFullControl accept the authorized root
itself so a caller can repair its own workspace root.
2026-09-29 15:29:30 +08:00
imccyu 10a4a17ccc fix(cordis): skip offline Client inspect queries
Use Gateway event stream availability before dispatch without changing Peer or manifest synchronization APIs. Keep the response deadline after disconnection and cover connected, offline, and disconnect-after-dispatch behavior.
2026-09-29 15:27:55 +08:00
turtle1999 f0e97fb7bc fix(cordis): bound Client inspect queries and retain failures 2026-09-29 15:27:54 +08:00
ZiyaZhang 05e2d90042 test(session-projection-cache): await fixture checkpoint writes 2026-09-29 00:18:51 -07:00
Turtle b5f8cea6dc Merge pull request #5405 from deepseek-harness/fix/master-ci-windows-acl
fix(ci): stabilize Windows setup, shell completion, and cancellation
2026-09-29 15:18:33 +08:00
yudshj 171c9e9225 refactor(web): reuse the path-based open-in-app action 2026-09-29 15:15:38 +08:00
yudshj 35002626a1 refactor(web): pass the displayed directory to sidebar actions 2026-09-29 15:15:38 +08:00
yudshj be0e31233c feat(web): open the workspace from the sidebar file tree 2026-09-29 15:15:38 +08:00
imccyu 2d15b9b3e7 Merge pull request #5438 from deepseek-harness/fix/queuedock-collapsed-actions
test(web): target the queue count header in the steering scenario
2026-09-29 15:10:52 +08:00
creatixchu b6242fe01c test(cua): refresh app-first window guidance snapshot 2026-09-29 15:02:46 +08:00
creatixchu 9c33b13e5d fix(cua): prefer direct app operations for single-window tasks 2026-09-29 15:01:27 +08:00
Ziya 2bde15f551 Merge pull request #5410 from deepseek-harness/turtle/plugin-upgrade-copy-66fc552187f2
fix(ui-plugin-manager): tell users to reinstall a plugin to upgrade it
2026-09-29 00:00:44 -07:00
Turtle 511a62cd1b Merge pull request #5137 from deepseek-harness/feat/schedule-reminder-framing
feat(schedule): frame due reminders as scheduled user messages
2026-09-29 14:55:39 +08:00
Turtle fce0a41da8 fix(ui-tool): keep bash rows expandable with Host-accepted escalation fields
The Bash tool accepts sandbox_permissions equal to the current mode with a
blank justification, and a blank justification alone. The terminal card
rejected both, leaving successful commands without an expandable body.
Escalation validity depends on the Session sandbox mode, which only the Host
knows; a rejected call already settles as an error result.
2026-09-29 14:53:19 +08:00
Yichen Jiang 32c47d6eae Merge remote-tracking branch 'origin/master' into worktree/sleepy-grothendieck-64df7b 2026-09-29 14:52:58 +08:00
Yichen Jiang f17741c756 fix(session): reuse blank Sessions under the requested preset
session.create treats a named sessionId as a blank Session to reuse while
the Host can verify it is still reusable: no turn has started, it belongs to
the requested directory, it is an unarchived member of the requested
Workspace, and no other owner writes it. The reused Session runs the
requested agentPreset or the configured default; its recorded preset is not
resolved, so a blank recorded under a preset that is no longer declared no
longer breaks New Session or startup restoration. A change is logged as
agent-preset/selected before the Agent is published. A candidate that is no
longer reusable stays unchanged and the Host creates a new Session, which
replaces the client's writer-held fallback.

The Web client restores a saved draft with its recorded preset and falls back
to the default when that preset is missing or fails to activate, passes the
creator entry's preset through creation instead of issuing a concurrent
select, and reloads the projections of a declined candidate so a stale blank
hint no longer hides a started conversation.

Related to #2566
2026-09-29 14:52:11 +08:00
ZiyaZhang 68eb79d9e1 fix(web): handle preset settings updates and empty choices 2026-09-28 23:43:21 -07:00
turtle1999 2b6d046f32 test(ci): arm signal trap before reporting readiness 2026-09-29 14:31:45 +08:00
ZiyaZhang 737691913f Merge master and reuse existing preset staging cleanup 2026-09-28 23:28:55 -07:00
Tianyi Cui 2c8daf728a test(desktop): allow native installer completion under emulation 2026-09-29 14:26:30 +08:00
Tianyi Cui 800f1b147b refactor(desktop): retain existing installer directory lifecycle 2026-09-29 14:21:17 +08:00
ZiyaZhang 9073ea1941 fix(web): clear unapplied coding presets when tools turn off 2026-09-28 23:16:56 -07:00
07akioni 010f0e230a Merge pull request #5396 from deepseek-harness/07akioni/desktop-latest-downloads
feat(desktop): add fixed latest installer upload commands
2026-09-29 14:16:55 +08:00
Tianyi Cui f50b6db1c1 Revert "test(desktop): set installer paths through the Unicode control helper"
This reverts commit 752fedb179d34e845f1397696c28ee023ca83356.
2026-09-29 14:14:15 +08:00
imccyu e8a777fb32 Merge pull request #5449 from deepseek-harness/fix/preset-settings-selection-ungated
fix(web): 设置页的预设切换与 Creator 入口不再受代码工作工具开关限制
2026-09-29 14:08:12 +08:00
07akioni 9ff76e66b3 fix(desktop): support fixed installer uploads with Windows credentials 2026-09-29 13:53:38 +08:00
lsdsjy 3825706a15 fix(web): 本 PR 暂不同步空白会话 2026-09-29 13:53:35 +08:00
Tianyi Cui d0c721b3f1 test(desktop): set installer paths through the Unicode control helper 2026-09-29 13:51:06 +08:00
turtle1999 a1e6ded917 test(workspace-files): report missing-file watcher phases 2026-09-29 13:46:15 +08:00
ZiyaZhang 5d7a1f14e4 fix(web): preserve current preset when coding tools are disabled 2026-09-28 22:42:34 -07:00
Tianyi Cui 454b87e59a Merge pull request #5445 from deepseek-harness/worktree/pi-ai-latest
chore(deps): upgrade pi-ai to 0.87.1
2026-09-29 13:39:56 +08:00
lsdsjy 3c17f569da fix(web): 设置页的 Creator 入口不再受代码工作工具开关限制 2026-09-29 13:36:55 +08:00
turtle1999 41a869e33a Merge commit 'c413bb92ee765460eeeb2644234180459e561f65' into fix/master-ci-windows-acl 2026-09-29 13:32:00 +08:00
Tianyi Cui 28648ffb6b fix(llm): permit empty compatibility guard constituents 2026-09-29 13:29:53 +08:00
turtle1999 9b79f97010 fix(plugins): keep aliases and whole user information in bundle sources
Address the second ds-review-bot round on the bundle Source section:

- remove an http(s) URL's user information up to its last `@`, so a
  username containing `@` no longer leaves the password behind;
- keep the dependency name before a local or git spec when the package's
  own manifest name differs, so reinstalling restores the alias;
- accept scp-like git addresses with any user name;
- show Built in for a profile dependency whose loaded copy the
  installation supplies, instead of hiding the section;
- align the PackageView, subsystem page, and README wording with the
  shadowing rule and the kept query string, and assert the source of
  not-bundle and unreadable bundles.
2026-09-29 13:27:43 +08:00
Tianyi Cui 6863e7fe9b fix(desktop): simplify command installation and correct checkbox text 2026-09-29 13:23:55 +08:00
ZiyaZhang 9490dfceae refactor(web): trim preset visibility diff 2026-09-28 22:20:08 -07:00
Tianyi Cui c73b80b1ea fix(llm): include Mistral in pi-ai compatibility type checks 2026-09-29 13:20:03 +08:00
lsdsjy 3442930ebf fix(web): 设置页切换默认预设不再受代码工作工具开关限制 2026-09-29 13:19:50 +08:00
Tianyi Cui f1d14380cf Merge simplified CLI runtime into command management 2026-09-29 13:17:04 +08:00
Tianyi Cui 0e5ab65758 fix(desktop): simplify bundled CLI and manage Desktop plugins 2026-09-29 13:15:00 +08:00
Tianyi Cui 082404a7b6 test(llm): retain unsupported-image coverage after catalog upgrade 2026-09-29 13:13:41 +08:00
Turtle 17da46e4f3 Merge pull request #5389 from deepseek-harness/docs/upgrade-guide-structure
docs: add upgrade guide structure, skill, and gate
2026-09-29 13:10:23 +08:00
lsdsjy 7ca920cec8 Merge pull request #5430 from deepseek-harness/fix/hide-empty-bonus-row
fix(web): 无赠金时隐藏设置页赠金行并修正引导充值文案入口
2026-09-29 13:08:06 +08:00
Tianyi Cui 6ed596f71b chore(deps): upgrade pi-ai to 0.87.1 2026-09-29 13:04:11 +08:00
Chinesezjc 9ed5d6db5f test(web): correct the steering dock comment on hidden rows
The collapsed dock renders the count header and no rows at all; Playwright text
matching does match elements inside a hidden list. State what the assertion
actually relies on.
2026-09-29 12:58:03 +08:00
Agandag f84703543c docs: simplify Chinese README community signup (#5311)
Co-authored-by: ag <[email protected]>
2026-09-29 04:57:46 +00:00
Tianyi Cui 05c0687372 fix(desktop): report only retained command backups after retry 2026-09-29 12:55:47 +08:00
Tianyi Cui 386487ec66 fix(desktop): preserve command errors and validate installer choices 2026-09-29 12:55:47 +08:00
Tianyi Cui cbfcd4027f test(desktop): accept canonical Windows temporary paths 2026-09-29 12:55:47 +08:00
Tianyi Cui 0677288518 fix(desktop): claim command backups before restoring them 2026-09-29 12:55:47 +08:00
Tianyi Cui 5670a14646 fix(desktop): retain symlink identity across command rollback 2026-09-29 12:55:47 +08:00
Tianyi Cui d796ae1efd fix(desktop): preserve command ownership and guard silent installers 2026-09-29 12:55:46 +08:00
Tianyi Cui ae4f3546ae fix(desktop): cancel handoffs after controller release 2026-09-29 12:54:53 +08:00
Tianyi Cui 9c8f5c2bf3 feat(desktop): manage the installed dsh command from native menus 2026-09-29 12:54:53 +08:00
Tianyi Cui b18bc3b6ef test(desktop): keep the console probe alive during Ctrl-Break 2026-09-29 12:54:53 +08:00
Tianyi Cui e21ed97f29 fix(desktop): deliver Windows console signals to CLI handlers 2026-09-29 12:54:53 +08:00
Tianyi Cui 197cb2a379 test(desktop): await update coordinator admission cleanup 2026-09-29 12:54:53 +08:00
Tianyi Cui d1e05324ea fix(desktop): bind CLI admission to the current installation 2026-09-29 12:54:53 +08:00
Tianyi Cui fb94237085 fix(desktop): match CLI helpers to Electron macOS support 2026-09-29 12:54:53 +08:00
Tianyi Cui fa9586824e fix(desktop): keep Host and CLI entry bundles self-contained 2026-09-29 12:54:53 +08:00
Tianyi Cui ac88033f4c fix(desktop): expose only dsh through the CLI PATH directory 2026-09-29 12:54:52 +08:00
Tianyi Cui 5f99386fa8 feat(desktop): add bundled CLI launch and installation guards 2026-09-29 12:54:52 +08:00
Agandag 31ba15da2b docs: fix expired Discord invite (#5433) (#5437)
Co-authored-by: ag <[email protected]>
2026-09-29 12:42:50 +08:00
Chinesezjc 2db8206953 test(web): target the queue count header in the steering scenario
The scenario expanded the two-row queue dock by clicking whatever button
`[data-queue-dock]` exposed. Every visible row renders its own Edit, Remove,
and Steer actions, so that query also matches them, and Playwright's strict
mode rejects the click. Name the count header and pin the collapsed state it
is expanded from.

The dock spec states the same invariant directly: the collapsed dock exposes
only the count header, and the expanded dock adds one action group per row.
2026-09-29 12:42:38 +08:00
turtle1999 ffab80f0cc merge: integrate master CI reliability fixes 2026-09-29 12:39:34 +08:00
Yifffan 31ed8ec4c4 Merge pull request #5435 from deepseek-harness/ux/plugin-guide-package-only
refine(web): 精简插件安装引导并补充插件升级说明
2026-09-29 12:29:08 +08:00
Tianyi Cui 93234e4007 Merge pull request #5338 from deepseek-harness/test/lane-budget-inline-projects-20260928
test(vitest): apply the lane test budget inside every inline project
2026-09-29 12:23:19 +08:00
Tianyi Cui 9d4547c6f4 Merge pull request #5415 from deepseek-harness/test/hmr-watch-config-darwin-20260929
test(hmr): wait for a live native watch before the first config write
2026-09-29 12:21:43 +08:00
Chinesezjc 538e831512 Merge branch 'master' into feat/preset-scoped-schedule-tools 2026-09-29 12:20:57 +08:00
Yif ec3197d122 test(web): assert dialog clearance instead of a filled viewport
The install dialog is content-sized, so trimming the guide to its one
package-name entry leaves it shorter than the 520x600 viewport and centered
inside the same clearances; the caption-overlays case pinned y to the margin
and height to the full available box, which only held while the three-entry
guide overflowed. Assert the intent instead: the dialog stays inside the
Windows caption margin and clear of the mask.
2026-09-29 12:19:10 +08:00
07akioni d1b1de1734 Merge pull request #5408 from deepseek-harness/07akioni/fix-intel-node-signing
fix(desktop): grant Intel Node executable-memory signing entitlement
2026-09-29 12:17:58 +08:00
07akioni 329718741d Merge branch 'master' into 07akioni/fix-intel-node-signing 2026-09-29 12:09:10 +08:00
turtle1999 6d1e12b237 fix(plugins): keep credentials and shadowed copies out of bundle sources
Address the first ds-review-bot round on the bundle Source section:

- strip the user information of http(s) and git+http(s) URLs so a private
  Git URL's token reaches neither the page nor the plugin_manager tool;
- expand `~` in file:/link: paths to the home directory as pnpm does;
- write jsr: aliases after the dependency name, like npm: aliases;
- give no source for a profile dependency the installation also supplies,
  whose installation copy is the one that loads;
- label the English row "Code source" to match the Chinese copy and hold
  for built-in bundles, and sync the subsystem page, READMEs, CSS comment,
  and tool test.
2026-09-29 12:07:56 +08:00
Yif fd4cd8b348 docs(web): correct the install guide's stale comments, JSDoc, and README
Review follow-up: the guide shows one package-name entry, so the comments
and copy that still described three forms or a displayed Git/local-path
example no longer match. The Git and local-path template strings keep their
replacement reminder for a field that still holds them; the constants' JSDoc
and the package READMEs now say that instead of claiming a displayed example.

Also moves .installSafetyText below the rule its comment heads, and pins the
upgrade assertion to the trust box rather than the whole dialog text.
2026-09-29 12:04:21 +08:00
turtle1999 92ee04ce48 Merge commit '864837fd0b898cfc867d49f80720c203839f85bf' into fix/master-ci-windows-acl 2026-09-29 12:00:33 +08:00
Chinesezjc 08125dd330 test(schedule): assert the exact refusal instead of an unsafe matcher
`expect.any(String)` assigns `any` inside the expected object, which
`lint:contracts-ready` rejects.
2026-09-29 12:00:28 +08:00
Yif 7a0c6ebd9e refine(web): show only the package-name example in the install guide
The install guide listed the package name, a GitHub address, and a local
directory as numbered steps; only the package name needs an example. Keep
that entry and drop the index badge, give the item's hint and example the
title's text color, and balance the container's vertical padding.

The trust box above Install also states that installed plugins do not update
automatically, that upgrading means uninstalling and installing the new
version, and that later releases will keep improving that experience.
2026-09-29 11:57:21 +08:00
Chinesezjc 1f05deac2e Merge branch 'master' into feat/schedule-reminder-framing 2026-09-29 11:53:32 +08:00
Chinesezjc 8c23bab422 docs(schedule): regenerate the Cordis catalog for the update refusal
The `update` contract now states that a subagent-owned Session returns the
non-mutating refusal, so the committed catalog artifacts change with it.
2026-09-29 11:52:02 +08:00
Chinesezjc a0b3f536fe test(ui-schedule): mirror the error-shaped refusal the service returns 2026-09-29 11:47:30 +08:00
Chinesezjc 500295b2bd fix(schedule): return the subagent refusal through the update result
`update` threw `ScheduleInputError` for a Session subagent routing owns, so the
Remote gateway turned it into a failed result and the Web editor rendered
`rule.error.unknown`; the `timing.subagentSession` message could never appear.
The refusal now travels the non-mutating `ScheduleUpdateResult` path, which the
editor already maps through the same `code` lookup as `schedule_not_found` and
`schedule_conflict`. `create` keeps rejecting because it has no result path.
2026-09-29 11:43:56 +08:00
Chinesezjc 5e9399f6c8 Merge origin/master into feat/preset-scoped-schedule-tools
Resolutions:
- `docs/tool-catalog.{md,i18n.yaml}` regenerated from the merged tool sources.
2026-09-29 11:43:44 +08:00
imccyu 59fcf274d0 Merge pull request #5099 from deepseek-harness/worktree/deepseek-harness-bug-verify-94fe09
fix(web): open pending plan reviews across Sidebar seat changes
2026-09-29 11:43:11 +08:00
07akioni 34b424952c Address Intel Node signing review feedback 2026-09-29 11:39:41 +08:00
Chinesezjc f290488fbf Merge remote-tracking branch 'origin/master' into fix/pty-bundled-openconsole
# Conflicts:
#	.agents/notes/implemented/bug-fix/2026-09-27-pwsh-prompt-tail-grace.i18n.yaml
#	.agents/notes/implemented/bug-fix/2026-09-27-pwsh-prompt-tail-grace.md
#	.agents/notes/implemented/bug-fix/2026-09-27-pwsh-prompt-tail-grace.zh.md
2026-09-29 11:37:40 +08:00
lsdsjy 30a3913397 fix(web): 统一引导页设置入口文案并覆盖赠金行分隔线
引导页两条确认提示改为指向实际入口:Settings → Account / Settings → General,
中文同步为 设置 → 账号与余额 / 设置 → 通用设置。赠金行可见性提为 showBonusRow,
并断言隐藏赠金行时其分隔线一并移除。
2026-09-29 11:12:35 +08:00
lsdsjy 8671d30583 fix(web): 无赠金时隐藏设置页赠金行并修正引导充值文案入口
余额读取成功但没有正额赠金时,账号设置页不再显示赠金余额行及其分隔线;
加载中与读取失败时仍保留该行。删除不再使用的 bonusEmpty 文案。

引导页跳过充值的英文提示改为指向 Settings → Accounts。
2026-09-29 11:00:58 +08:00
turtle1999 7d0fa2ffbf Merge commit '9052053da7be7b38b2360a6250fe136eab36fdc2' into fix/master-ci-windows-acl 2026-09-29 10:58:50 +08:00
Yichen Jiang c02a23c1f8 Merge pull request #5426 from deepseek-harness/worktree/list-terminal-duplicate-shells-e8dc50
fix(web): list each shell once in the new-terminal menu
2026-09-29 10:58:42 +08:00
turtle1999 b96959ecf4 feat(plugins): show where a bundle comes from on its page
The bundle page ends with a Source section: the spec that installs the
bundle elsewhere, as `pnpm add` accepts it, or Built in for an official
bundle the installation ships, followed by its current version.

The Host's listBundles carries the new `source` field for profile
dependencies: git addresses and URLs as recorded, file:/link: paths made
absolute against the profile, and registry ranges, tags, or aliases after
the package name.
2026-09-29 10:51:33 +08:00
turtle1999 811940168a test(bench): calibrate the p99 fork at rank 988
The measured-p99 source (7,229 events) forks in 1,066.2 ms on hosted CI,
below the 1,485-1,523 ms of the former 99.3% source; its budget drops to
1,375 ms. Record the new higher maxima of the other endpoints.
2026-09-29 10:40:38 +08:00
Yichen Jiang 41021fc803 fix(web): list each shell once in the new-terminal menu
Shell discovery keyed entries by resolved path. On merged-/usr hosts the
login shell /bin/bash from $SHELL and the PATH hit /usr/bin/bash for the
`bash` candidate are one file with two spellings, so the menu showed
"bash" twice. Key discovered shells by executable name, compared without
letter case or `.exe`, and keep the earliest entry so the default shell
stays first.
2026-09-29 10:40:27 +08:00
imccyu 5a9b56a8be Merge pull request #4787 from deepseek-harness/xx/model-search
feat(web): add search to composer model picker & unify 2 model picker UI and interaction
2026-09-29 10:38:53 +08:00
Yichen Jiang cfa7784fd4 refactor(sidebar-right): declare SidebarRightHost where the binding was
Moves the interface to the position SidebarRightBinding held, after the controller factory, so the change reads as one interface replacing the other. Its content is unchanged.
2026-09-29 10:35:06 +08:00
turtle1999 61d4ab0b6c docs: make upgrade guides bilingual and drop the OTel guide
Upgrade guides now pair guide.md with guide.zh.md and guide.i18n.yaml under
the ordinary translation-pairing gate. verify-upgrade-guides checks the
Chinese sibling's metadata and its 变更/迁移 sections; the 500-word ceiling
applies to the English source. Remove the session-log-otel-collector guide.
2026-09-29 10:34:29 +08:00
imccyu 11925ce345 fix(web): stabilize e2e and settings placement
wait for SVG changed-file card

update performance settings placement

skip crashing WebKit model-menu observer case
2026-09-29 10:29:28 +08:00
turtle1999 9126818b7f docs: backfill v0.1.7-rc.2 upgrade guides
Record the three externally perceptible breaks between dsh-v0.1.7-rc.2 and
dsh-v0.2.0-rc.1: Schedule rows moving into the Automation tasks optional
bundle, the legacy work-details value reading as Detailed, and Session-log
uploads requiring dsh-otel with a new collector host. The template no longer
asks for pull request links, which verify-repository-references rejects.
2026-09-29 10:25:27 +08:00
turtle1999 2778be7375 test(bench): address Session corpus review findings
- Fork the measured p99 at rank 988, the highest top-level rank of that
  anchor; rank 990 fell in the 99.3% anchor. Derive fork ranks from the
  corpus size and pin their shapes in a unit test.
- Seed separate search and fork roots so fork children never reach the
  search index.
- Bound child deadlines by the file limit and give every test a deadline
  that outlasts its sequential children, so failures reap children before
  cleanup.
- Budget peak RSS of the list, search, and fork processes, and check
  every recorded median against its budget.
- Name a missing folded record, correct the list-order comment, state that
  search models an opt-in deployment, and keep new dependencies sorted.
2026-09-29 10:24:57 +08:00
Turtle d4b9f4083c Merge branch 'turtle/plugin-upgrade-copy-66fc552187f2' of https://github.com/deepseek-harness/deepseek-harness into turtle/plugin-upgrade-copy-66fc552187f2 2026-09-29 10:22:59 +08:00
Turtle 93996db3c7 fix(ui-plugin-manager): tell an incompatible installed plugin to reinstall a compatible version
An install refused as incompatible keeps asking for a compatible version; an
installed plugin found incompatible now says to uninstall it and install a
version compatible with this DSH.
2026-09-29 10:22:53 +08:00
turtle1999 9cd1264115 Merge branch 'master' into docs/upgrade-guide-structure 2026-09-29 10:19:14 +08:00
ZiyaZhang 7a078907b6 fix(web): surface Creator selection failures and trim redundant coverage 2026-09-28 12:43:34 -07:00
ZiyaZhang 66f00a9170 test(web): verify plugin entry across modes and session states 2026-09-28 12:21:45 -07:00
turtle1999 4b7a45d154 fix(pwsh): accept ASCII-padded completion status lines 2026-09-29 03:11:05 +08:00
ZiyaZhang 6dccc57a5c refactor(web): reuse shared Creator mode from plugin entry 2026-09-28 12:01:24 -07:00
Ziya 9b26073eaf Merge branch 'master' into turtle/plugin-upgrade-copy-66fc552187f2 2026-09-28 11:45:51 -07:00
Tianyi Cui c194143fef test(hmr): print pending refresh state on failure and cite the libuv barrier
The case budget fires before eventually() can name the pending step, so the
native-delivery cases print the observed refresh values on failure. The
barrier JSDoc cites the libuv close-time wait and states that any directory
handle rebuilds the per-process stream; the transaction case takes the same
budget as its siblings; the hmr README records the darwin registration
window as a known limitation.
2026-09-29 02:03:10 +08:00
Tianyi Cui 7d3c9750e6 test(hmr): wait for a live native watch before the first config write
Chokidar reports ready once fs.watch() returns, but libuv on darwin builds
the per-process FSEvents stream later on its CoreFoundation thread, so a
write that lands first is never reported. The watch-config cases now close
a second fs.watch directory handle after registration, which blocks until
that stream is rebuilt with the remaining handles, and eventually() takes
the case's effective budget instead of a local 10 s constant.

Fixes #5414
2026-09-29 01:29:18 +08:00
turtle1999 374f7df31b chore(ci): align proxy opt-in and clarify test contracts 2026-09-29 01:07:38 +08:00
ZiyaZhang f3946dc39a fix(web): reset hidden presets when coding tools are disabled 2026-09-28 09:29:01 -07:00
turtle1999 f3050951f1 fix(testing): preserve turn-end timeout diagnostics 2026-09-29 00:24:24 +08:00
turtle1999 44b2ccb0bb Merge commit '272ead1e2c8225e2954cb08e42f36cef132e2093' into fix/master-ci-windows-acl 2026-09-29 00:04:57 +08:00
turtle1999 23706d7ff9 test(ptc): await committed background job publication 2026-09-29 00:04:57 +08:00
Yif 3ec8cd925d perf(web): observe model menu stickiness without layout reads 2026-09-29 00:01:58 +08:00
Yif 989b93d86f feat(web): unify grouped model picker ordering and sticky headers 2026-09-29 00:01:58 +08:00
Yif bfec75eb14 fix(web): refine model search threshold and focus restoration 2026-09-29 00:01:58 +08:00
Yif 45368fb158 fix(web): align model command menus and keyboard focus 2026-09-29 00:01:57 +08:00
Yif 78bc78d48c feat(web): refine model picker search and sticky headings 2026-09-29 00:01:57 +08:00
Yao Meng 75ea006f4c fix(web): use circular arcs for model search capsule
Signed-off-by: Yao Meng <[email protected]>
2026-09-29 00:01:57 +08:00
Yao Meng 18a548a56b style(web): make model search field pill-shaped
Signed-off-by: Yao Meng <[email protected]>
2026-09-29 00:01:56 +08:00
Yao Meng b3d6da9083 fix(web): address model search accessibility review
Signed-off-by: Yao Meng <[email protected]>
2026-09-29 00:01:56 +08:00
Yao Meng 4ff33be0bd test(web): update provider model picker search snapshot
Signed-off-by: Yao Meng <[email protected]>
2026-09-29 00:01:56 +08:00
Yao Meng b29578b8f0 style(web): soften model search field and add leading icon
Signed-off-by: Yao Meng <[email protected]>
2026-09-29 00:01:56 +08:00
Yao Meng 6773e10645 feat(web): add fuzzy search to composer model picker
Signed-off-by: Yao Meng <[email protected]>
2026-09-29 00:01:55 +08:00
turtle1999 74fcbdd625 docs(notes): record hosted Session corpus timing with parallel preparation 2026-09-29 00:00:26 +08:00
imccyu 3e973e689a Merge pull request #5178 from deepseek-harness/timed-user-questions-replacement
feat: restore opt-in timed user questions
2026-09-28 23:57:02 +08:00
ZiyaZhang 001e6f5e84 fix(web): clarify coding tools preset options subtitle 2026-09-28 08:56:03 -07:00
turtle1999 92a65cbb65 test(bench): prepare Session corpus anchors on both CPUs
On the EPYC 7763 runner the file took 294.5 s, 85 s of it single-process
seeding. Two preparation processes now author, validate, and fold
byte-balanced anchor groups in parallel, and a seed process writes the
corpora from their saved bodies and records. Budgets cover the higher
median of the 7763 and 9V74 runner models.
2026-09-28 23:45:58 +08:00
imccyu a0ad129252 test(web): refresh question completion status 2026-09-28 23:42:53 +08:00
turtle1999 d12257c959 fix(plugins): preserve manifest icon precedence 2026-09-28 23:30:05 +08:00
Tianyi Cui f4d8115b4a merge: master into lane-budget-inline-projects
Resolves the semantic conflict with #5331: its ci-unit gate spread
coverageTestTimeoutArgs, which this branch retires; the gate is now a
plain vitest run and the darwin lane budget reaches vitest.config.ts
through the inherited DSH_COVERAGE_TEST_TIMEOUT_MS. The ci-unit spec
cases pin that shape under both budget values.
2026-09-28 23:25:21 +08:00
turtle1999 ed8a2a9163 test(bench): calibrate Session corpus list and fork across runner models
Record the hosted 3,000-Session list medians and cover both standard runner
models (EPYC 7763 and 9V74): the longest fork took 17.5 s and 20.3 s.
2026-09-28 23:23:48 +08:00
turtle1999 6790ad428d Merge commit '50daf9d60e356dfe02e1ea302c3fb45f971e1eba' into fix/master-ci-windows-acl 2026-09-28 23:23:00 +08:00
Magolor ed34a1d7fe fix: keep queued question replies read-only after reload 2026-09-28 23:21:38 +08:00
Magolor 1c6c462633 Preselect recommended question choices without stopping the timer 2026-09-28 23:21:38 +08:00
Magolor 050944fc8e Clarify question row actions 2026-09-28 23:21:38 +08:00
Magolor 1840297173 Show queued question replies in the read-only row 2026-09-28 23:21:38 +08:00
Magolor 24226a7164 Deliver late question answers through steering 2026-09-28 23:21:38 +08:00
Magolor fa70937848 Cover queued plan reply hide failure 2026-09-28 23:21:38 +08:00
Magolor 690239c510 Queue late question replies as ordinary follow-ups 2026-09-28 23:21:37 +08:00
Magolor 0c4498ac42 test: cover competing restored reply claims 2026-09-28 23:21:37 +08:00
Magolor fc30c5a7d2 fix: keep timed question replies recoverable 2026-09-28 23:21:37 +08:00
Magolor edd0660b5d fix(user-questions): reserve continued replies through admission 2026-09-28 23:21:37 +08:00
Magolor 8430907d22 test(user-questions): cover PTC projection edges 2026-09-28 23:21:37 +08:00
Magolor f52099515e fix(user-questions): handle cancelled claim and document admission 2026-09-28 23:21:37 +08:00
Magolor b6401085cb fix(user-questions): address review findings 2026-09-28 23:21:36 +08:00
Magolor 92542fddec Regenerate user question inventory with compact types 2026-09-28 23:21:36 +08:00
Magolor daec283261 refactor(tool-ask-user): keep default definition in place 2026-09-28 23:21:36 +08:00
Magolor a68ecdefc4 fix(user-questions): preserve master legacy tool schema 2026-09-28 23:21:36 +08:00
Magolor 8b9b7307ea fix(user-questions): align late replies with produced answers 2026-09-28 23:21:36 +08:00
Magolorandimccyu f04ad05f30 fix(user-questions): reset projection version and use brand utility
Co-authored-by: imccyu <[email protected]>
2026-09-28 23:21:35 +08:00
Magolorandimccyu 511b18e322 fix(user-questions): align styles and cover wait cleanup
Co-authored-by: imccyu <[email protected]>
2026-09-28 23:21:35 +08:00
Magolorandimccyu 3a296b16b4 feat(user-questions): support timed waits and late replies
Co-authored-by: imccyu <[email protected]>
2026-09-28 23:21:35 +08:00
ZiyaZhang d396f17f17 fix(web): filter advanced presets in settings when coding tools are off 2026-09-28 08:19:13 -07:00
Turtle 05c891200c fix(ui-plugin-manager): word shipped bundles and incompatibility upgrades separately
A bundle the installation ships is refused with a note that it upgrades with
DSH, since it cannot be uninstalled. The reinstall-to-upgrade sentence follows
an incompatibility once, however many packages it names, joined by a
locale-owned sentence separator.
2026-09-28 23:18:07 +08:00
Tianyi Cui c89b65aa45 Merge pull request #5286 from deepseek-harness/worktree/plugin-highlight-ci-flake-20260927
test(web): keep plugin install routes active until page closes
2026-09-28 23:11:52 +08:00
Tianyi Cui 7b30c81614 Merge pull request #5331 from deepseek-harness/ci/unit-darwin-lane-budget-20260928
ci(sandbox): grant the darwin unit parity job the coverage lanes' test budget
2026-09-28 23:10:50 +08:00
Tianyi Cui dc19d6b7fb Merge pull request #5298 from deepseek-harness/fix/pwsh-settle-diagnosis-20260927
test(pwsh): record a per-send readiness timeline in the loader-composition case
2026-09-28 23:10:24 +08:00
ZiyaZhang 3c26fdd204 feat(web): keep standard and creator presets available without coding tools 2026-09-28 08:08:31 -07:00
turtle1999 bfcd447963 test(bench): fit Session corpus benchmark within five minutes
Keep each case at its hardest setting that fits five minutes of hosted CI:
search and fork stay at 1,000 Sessions with the longest fork sampled once,
the list runs 3 samples over 3,000 Sessions, and seeding validates authored
bodies in memory instead of a separate verification pass. The file's last
case asserts the limit; the benchmark job timeout becomes 20 minutes.
2026-09-28 23:08:19 +08:00
turtle1999 4bcd820889 Merge remote-tracking branch 'origin/master' into fix/master-ci-windows-acl 2026-09-28 22:59:47 +08:00
imccyu 7c5f35360f Merge pull request #5346 from deepseek-harness/ihsiang/chat-ui-local-polish
fix(client): 优化聊天耗时、主题样式与快捷键
2026-09-28 22:53:30 +08:00
Turtle de1ec63678 fix(ui-plugin-manager): tell users to reinstall a plugin to upgrade it
The already-installed refusal and the incompatible-version reason now say
that upgrading an installed plugin means uninstalling and installing again.
2026-09-28 22:46:51 +08:00
turtle1999 9cd8a888bb chore: merge master into bundle metadata correction 2026-09-28 22:45:57 +08:00
07akioni dbf31101d8 fix(desktop): grant Intel Node executable-memory signing entitlement 2026-09-28 22:43:06 +08:00
turtle1999 ecedbbc2e6 fix(plugins): reuse locale metadata and export bundle icons 2026-09-28 22:34:46 +08:00
ZiyaZhang 479de510ca test(subagent): dispose continuable fixtures before removing storage 2026-09-28 07:20:26 -07:00
turtle1999 e806d9cb97 test(bench): calibrate Session corpus budgets on hosted CI
Standard two-CPU hosted runs are 2.4-3.4 times the reference machine, above
the shared reference scale, so the budgets use rounded hosted medians with
the shared 1.25 headroom. The benchmark job took 14.4 minutes with these
cases; its timeout becomes 25 minutes.
2026-09-28 22:18:58 +08:00
turtle1999 7deaab676f test(bench): bound corpus frame compression concurrency
Starting every frame compression at once kept one native Zstandard context
per pending frame alive and peaked the seed worker at 7.7 GB RSS, which
exceeds the standard hosted runner's memory. Bound compression like file
writes; the seed now peaks at 2.2 GB and writes identical bytes.
2026-09-28 22:00:40 +08:00
ZiyaZhang e75c2ff098 test(web): wait for Creator backend requests before assertions 2026-09-28 06:58:13 -07:00
ZiyaZhang 93a7d221ed test(web): align plugin menu snapshots and verify Creator flow 2026-09-28 06:55:46 -07:00
yixiangihsiang ad008e2ea5 fix(client): refine chat duration, theme, and shortcuts 2026-09-28 21:32:57 +08:00
ZiyaZhang 7d88fc9b2b refactor(web): limit plugin UX changes to add and create flows 2026-09-28 06:22:01 -07:00
turtle1999 3545e9a2a6 fix(ci): provision Electron before Windows smoke tests 2026-09-28 21:13:12 +08:00
ZiyaZhang 6200ffe8c7 fix(web): allow one-task Creator entry with Coding Tools off 2026-09-28 06:11:53 -07:00
turtle1999 d70efffb63 test(bench): measure Session list, search, and fork over large corpora
Add a required benchmark over synthetic corpora whose per-Session length
distribution is at least a measured local DSH corpus: list at 1,000 and
5,000 Sessions, cold and built content search and stratified forks at
1,000 Sessions, all through the real SessionController on built plain-Node
workers. Raise the benchmark job timeout to 30 minutes for the added cases.
2026-09-28 21:08:18 +08:00
ZiyaZhang ed50a72fc4 feat(web): connect plugin creation and usage entrypoints 2026-09-28 05:54:26 -07:00
Chinesezjc 00e7a85f62 Merge origin/master into feat/preset-scoped-schedule-tools
Resolutions:
- `packages/experimental/schedule-bundle/package.json` stays deleted: master
  bumped a package this branch retires.
- `@deepseek-ai/dsh-tool-schedule` follows the release train version.
2026-09-28 20:11:15 +08:00
07akioni aaceea0554 feat(desktop): add fixed latest installer upload commands 2026-09-28 19:58:55 +08:00
turtle1999 7d70426f5e test(web): align settings snapshots with loaded plugin metadata 2026-09-28 19:51:17 +08:00
Chinesezjc 60c825a80f Merge branch 'master' into feat/schedule-reminder-framing 2026-09-28 19:39:25 +08:00
turtle1999 f30aec98b6 fix(plugins): reserve package display resources for bundles 2026-09-28 19:33:17 +08:00
turtle1999 23d3807ae1 docs: add upgrade guide structure, skill, and gate
Introduce docs/upgrade-guide/v<version>/<item>/guide.md for externally
perceptible breaking changes. The dsh-create-upgrade-guide skill owns scope,
placement, maintenance, and format; verify-upgrade-guides enforces layout,
frontmatter, sections, and the 500-word ceiling. Guides are English-only and
registered as the upgrade-guide document kind.
2026-09-28 19:12:16 +08:00
Chinesezjc ce9bb458bb test(web): expect the reminder tools in the standard preset
The shipped Web composition now mounts the Schedule service, so the
`standard` preset's `tool-schedule` row registers its four tools.
2026-09-28 18:40:09 +08:00
Chinesezjc c6dd905972 feat(web): ship the Schedule service and task page in the Web composition
The reminder stack no longer hides behind an optional experimental bundle.
`packages/bundle/web-app/cordis.patch.yml` inserts `schedule` and
`ui-schedule`, so a shipped profile mounts the task store, the delivery
runtime, and the Automation tasks page; the
`@deepseek-ai/dsh-experimental-schedule-bundle` package and its wiring are
removed.

Preset ownership is unchanged: `standard`, `cordis`, and `ptc` declare the
clock and the four reminder tools in their own scope, and `minimal` declares
neither, so a minimal session carries no reading and no reminder tool even
though the service is mounted.

`apps/cli` depends on `@deepseek-ai/dsh-tool-schedule`, and
`packages/bundle/web-app` declares `@deepseek-ai/dsh-schedule` and
`@deepseek-ai/dsh-client-ui-schedule`: preset and profile rows resolve plugin
names from the installation anchor, so a missing declaration leaves the row
without a fiber and every session creation fails with
`agent-preset/invalid`.

Documentation, Agent Notes, and the recorded Web fixtures follow the shipped
composition.
2026-09-28 18:31:53 +08:00
creatixchu 22a5a41d0c docs(cua): remove the deferred bundle from the base module graph 2026-09-28 17:49:45 +08:00
creatixchu ecd2f24da0 test(cua): cover saved grants and denied handles on every platform 2026-09-28 17:45:14 +08:00
creatixchu 1b892c355c Merge remote-tracking branch 'origin/feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-28 17:15:40 +08:00
creatixchu 7690c3a0fe docs(cua): refresh the catalog for the manual provider layer 2026-09-28 17:07:39 +08:00
creatixchu 3793f16f3a docs(cua): document the application consent owner lifecycle 2026-09-28 17:06:10 +08:00
creatixchu 40047a4577 test(cua): cover consent independently of permission-page controls 2026-09-28 17:02:57 +08:00
creatixchu 15332e42e6 refactor(cua): keep manual provider and application consent in base layer 2026-09-28 16:53:29 +08:00
creatixchu eab69c7008 test(ptc): cover Python execution instructions 2026-09-28 16:35:59 +08:00
Chinesezjc ab86d7a568 Merge remote-tracking branch 'origin/master' into feat/preset-scoped-schedule-tools 2026-09-28 16:34:27 +08:00
Chinesezjc 18e3f39ff6 fix(subprocess): cover the bundled console host in the packaged smoke
Review follow-ups: the Electron payload smoke allocates the way the product
does on Windows, so the packaged tree resolves the console host assets it now
depends on; the README states that dependency and its loud failure as a known
limitation; the terminal handle takes the platform this method already
resolved; and the note links the earlier tail-grace note, records why that
grace cannot cover a malformed tail, and drops the claim that the smoke
exercises the operating system host.
2026-09-28 16:34:06 +08:00
creatixchu 219d664ad5 test(ptc): wait for concurrent releases of the same owner 2026-09-28 16:27:46 +08:00
creatixchu bcd1e66141 fix(ptc): reserve owners through explicit environment release 2026-09-28 16:27:15 +08:00
creatixchu 6fe4bf04fc fix(ptc): retain idle process cleanup until it settles 2026-09-28 16:24:05 +08:00
Chinesezjc 76e16f9a17 test(subprocess): type the terminal spawn double
The per-platform case reads the third spawn argument to assert the console-host
option is absent on POSIX; an untyped vi.fn() declares no parameters, so the
indexed call argument fails typecheck.
2026-09-28 16:21:43 +08:00
creatixchu 8b5986fdb9 Merge remote-tracking branch 'origin/feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-28 16:19:52 +08:00
Chinesezjc 707b0d98cc fix(subprocess): name the bundled console host in the docs and comments
The README, the Ctrl-C comment, and the bare-kill comment still described
Windows' own console host as the one backing the PTY. Name the host the code
now selects, record the exit-event behaviour of both teardown paths measured on
the pool machine, state that a missing conpty asset fails loud, and move the
note to the bug-fix class next to the other Windows console fix. The terminal
case now asserts the option key is absent on POSIX rather than not true.
2026-09-28 16:19:38 +08:00
creatixchu 3f1c666d03 docs(ptc): keep Python model guidance in its README contract 2026-09-28 16:19:03 +08:00
creatixchu ba1ba99157 Merge remote-tracking branch 'origin/feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-28 16:17:55 +08:00
creatixchu 02c12b5a38 test(ptc): refresh runtime-owned execution instructions 2026-09-28 16:16:20 +08:00
Chinesezjc b55a5d416c docs(notes): state the conpty backend's test surface
The note records which categories carry this change: the per-platform unit
case, the master push's Windows standby run as the end-to-end signal, and the
desktop payload smoke for the packaged runtime tree.
2026-09-28 16:10:09 +08:00
creatixchu bf95e3a74b fix(ptc): preserve policy and evaluation lifecycle across memory runs 2026-09-28 16:08:45 +08:00
Chinesezjc 59ba1321eb fix(subprocess): back Windows terminals with node-pty's bundled console host
The console host Windows provides, on the images the master standby pool runs
(Server 2022, Windows 10 22H2), replays a prompt line that scrolled out of the
viewport as `\ndsh>\x1b[1C`: the trailing space becomes a cursor move, so the
persistent-pwsh readiness path never sees its `dsh> ` tail and every send waits
out the silence tier. The same case passes on the Blacksmith Windows image,
whose console host emits the tail verbatim.

Allocate Windows PTYs with `useConptyDll: true`, so the PTY is backed by the
OpenConsole the node-pty package ships. The option is set only for `win32`;
the terminal spec pins it per platform.

Probing the pool machine with the bundled console host rendered the `dsh> `
tail for all seven prompts of the failing case's command sequence, and
`pty.pid` still resolves to `pwsh.exe` and equals the shell's own `$PID`.
2026-09-28 16:07:57 +08:00
creatixchu 810fd8601f Merge PTC cleanup and refresh CUA dependency graph 2026-09-28 15:42:37 +08:00
creatixchu 3a0c2ae3bb test: drop the retired desktop keyboard cleanup patch 2026-09-28 15:42:08 +08:00
creatixchu 51000b5283 Merge updated PTC base into CUA 2026-09-28 15:35:59 +08:00
creatixchu 21e3950519 Merge master into PTC execution-mode change 2026-09-28 15:34:26 +08:00
creatixchu 83cb2c3f1a test(ptc): update desktop fixture and generated package catalog 2026-09-28 15:33:36 +08:00
creatixchu 6657824b6a Merge PTC execution-mode fixture fixes 2026-09-28 15:31:58 +08:00
creatixchu faf41c6cd7 test(ptc): validate raw mode values at the schema parser 2026-09-28 15:31:34 +08:00
creatixchu f38f025726 feat(cua): enable retained PTC through executionMode 2026-09-28 15:31:12 +08:00
creatixchu 7c05445810 test(ptc): reload execution modes through the provider fiber 2026-09-28 15:29:57 +08:00
creatixchu 30b193b38a feat(ptc): select Node state retention through executionMode 2026-09-28 15:27:39 +08:00
Tianyi Cui 3e38e2118c test(vitest): make the lane-budget regression load-independent and own its resources
The fixture's poll case counts attempts instead of reading a clock, so a host
stall cannot turn a budget-ended poll into a pass; the control case reads the
poll's reported duration, which the 1000 ms default bounds from below. The
spawning spec acquires its temporary config in beforeAll, bounds the child
with a timeout and asserts no signal ended it, and counts the polled values it
inspects. CoverageTestTimeoutOptions is Vitest's own TestUserConfig members;
the rule's reach has one home in its JSDoc, which the config, gate, spec, and
note comments reference.
2026-09-28 14:18:03 +08:00
Turtle 7d7ca289d9 fix(ui-schedule): enlarge the Session-row clock mark by 2px 2026-09-28 13:55:12 +08:00
Turtle 2ca5f648c3 test(client): pin first-line-only frontmatter detection 2026-09-28 13:44:46 +08:00
Tianyi Cui 333d7e75d2 test(vitest): apply the lane test budget inside every inline project
DSH_COVERAGE_TEST_TIMEOUT_MS expanded to --testTimeout, --hookTimeout, and
--expect.poll.timeout on the coverage and serial lanes, but Vitest forwards
only a fixed list of CLI overrides into inline projects and neither
hookTimeout nor expect is on it, so under the root config's two projects the
hook and expect.poll budgets stayed at Vitest's defaults on every lane.

vitest.config.ts now reads the variable through coverageTestTimeoutOptions and
spreads the three budgets into both projects; run-gates and the partition
coordinator pass no timeout flags, leaving one owner for the rule. A new spec
spawns vitest on the root config with a 200 ms budget and proves all three
waits end inside both projects, that unset keeps the defaults, and that a
malformed value fails at config load.

Fixes #5335
Related to #5325
2026-09-28 13:37:20 +08:00
Tianyi Cui 0976d15122 test(run-gates): own the coverage-gate environment in the spec and pin ci-unit to the test script
run-gates.spec.ts clears DSH_COVERAGE_PARTITIONS and DSH_COVERAGE_MAX_WORKERS
before each case, so the coverage gates it builds take their shape from the
case, not from a partitioned lane that exports the variables to every child.
The ci-unit case derives its two gates from the `test` package script's
segments. The serial-reference note keeps only the lane fact; the mechanism
fact about inline-project inheritance is owned by the fix that changes it.
2026-09-28 13:28:31 +08:00
Chinesezjc 8d7ba898f8 Merge origin/master into feat/preset-scoped-schedule-tools
master now ships the reminder stack as the optional
`@deepseek-ai/dsh-experimental-schedule-bundle`, which inserts the rows the
Web composition leaves out. This branch keeps the preset-level ownership
beside it.

Resolutions:
- The bundle inserts `schedule` and `ui-schedule` only. It no longer inserts
  `time-context`: the clock belongs to the `standard`, `cordis`, and `ptc`
  presets, and a Host row for the same package would mount it in two scopes
  and append two readings per step.
- `packages/bundle/web-app/package.json` declares `@deepseek-ai/dsh-time-context`
  again: the presets reference it by bare name, so `verify-cordis-config`
  requires the dependency.
- The bundle's patch spec, locale, package, README pair, the optional-bundle
  composition spec, the plugin-manager component list, and the
  `schedule-after` roster assertions describe the two-row bundle and the
  preset-owned clock and tools.
- Documentation and Agent Notes follow the same split; the note master
  archived stays frozen with its manifest hashes.
2026-09-28 13:04:51 +08:00
Tianyi Cui 9ab3f2c990 ci(sandbox): grant the darwin unit parity job the coverage lanes' test budget
The unit-darwin job ran the whole unit inventory at Vitest's 5000 ms default
on a shared 3-vCPU macos-latest runner; the first two master runs after #5292
each timed out a different set of cases that pass in under a second on a quiet
host. Every other whole-inventory lane raises the budget through
DSH_COVERAGE_TEST_TIMEOUT_MS=90000.

The job now sets that variable and runs `pnpm run check:ci:unit`, a run-gates
aggregate that is `pnpm run test` (native build, then `vitest run`) through the
path that consumes it. ci-unit receives no CI worker settings, so the inventory
inherits the environment `pnpm run test` finds: on a 3-CPU host the defaults
would inject DSH_COVERAGE_PARTITIONS=2, which run-gates.spec.ts reads as a
partitioned coverage lane.

Fixes #5325
2026-09-28 12:58:10 +08:00
Turtle 39c614a143 fix(client): keep frontmatter preview robust and faithful to authored YAML
Read fields from the YAML syntax tree so non-string scalars and aliases keep
their authored text, show the verbatim block while the field chunk loads or
when it fails, close an empty block at its first delimiter, and refresh the
skill preview golden.
2026-09-28 12:29:25 +08:00
Turtle 0cad3a0137 feat(client): render Markdown YAML frontmatter as fields in document preview
Closes #5195
2026-09-28 12:06:45 +08:00
Tianyi Cui 0310066b39 test(pwsh): build the fake terminal handle without an unknown cast
The unit spec's fake handle is a typed object whose methods read a
mutable state record, so the no-new-unknown-casts gate has nothing to
reject.
2026-09-28 01:30:26 +08:00
Tianyi Cui 51ede0f8c5 test(pwsh): build the failure message lazily and bound windows by event order
Review round 1: the settle assertions build their message only when one
is about to fail, so a passing run never pays the host-facts shell probe;
send windows are bounded by event sequence numbers instead of
milliseconds, so two sends that hand over within one millisecond keep
their own events; the replay starts at the send's own input write and
ignores the emulator's terminal-protocol replies; a throwing foreground
inspection is recorded before the send rejects; a sanitizer is attributed
to the most recently spawned terminal, which the class documents as the
sequential-session assumption. A unit spec pins the replay rule against
the session's evidence states, the window boundaries, the reply/input
distinction, and the bounded, escaped rendering. Notes and comments drop
change narration and the unverified claim about the pool's build.
2026-09-28 01:22:54 +08:00
Tianyi Cui f0a7f798a3 docs(notes): correct the pwsh lane record to the observed silence-bound settles
The 2026-09-27 14:30Z master run carried the tail grace and took the same
20.8 s as the run before it, so the lane's mechanism is not a stalled
prompt tail; the composition keeps the default and the notes record the
open investigation, the native pwsh 7.6.6 evidence, the ConPTY repaint
re-emission of the 133;D mark as the leading hypothesis, and issue #5297
for the Windows pid 0 side finding.
2026-09-28 00:55:28 +08:00
Tianyi Cui fc885edf72 test(pwsh): record a per-send readiness timeline in the loader-composition case
The self-hosted Windows lane settles one or two of seven sends on the
controlled prompt and the rest at the plain silence bound, and the
settle reasons alone cannot say whether the marker was missing, its tail
was invalidated by later output, or the foreground comparison failed.
The case now records every decoded pty chunk with the sanitizer's marker
verdict and prompt tail, every foreground poll, every input write, each
send's settle reason and elapsed time, the session's prompt evidence
replayed from those chunks, and the host, pwsh, PSReadLine, and console
host versions; the settle assertions carry that timeline in their
failure message and onTestFailed prints it when the runner's budget ends
the case first.

promptTailGraceMs returns to the product default: master runs with and
without it took the same 20.8 s, so the lane's degraded sends never held
the state it covers, and a nonzero value there would only lengthen a
never-arriving-tail fallback.
2026-09-28 00:55:28 +08:00
Tianyi Cui 4b19616206 docs(testing): clarify plugin interception evidence and terminology 2026-09-27 23:03:40 +08:00
Tianyi Cui 7152b91e7a test(web): keep plugin install routes active until page closes 2026-09-27 22:47:59 +08:00
Dudu-0223 43dd2bdeac revert: keep existing Agent attribution for Team messages 2026-09-27 17:12:27 +08:00
Dudu-0223 3948bffd46 fix(agent-team): record Team-owned relay attribution 2026-09-27 17:07:03 +08:00
Yichen Jiang 4ccf48c4ef refactor(sidebar-right): take the auto-fullscreen rule from the seats
The fullscreen command needs to know whether the frame is narrow enough
that an expanded panel is fullscreen automatically. Reading it from a new
ctx.layout.viewportWidth widened the layout plugin's public face for this
one consumer. The seats already receive the frame width as owner props and
compute the rule they render with, so each seat now reports that verdict
through its inject face, as it reports its docking kit's room. The command
reads the latest report only when the user runs it, after the commit that
rendered the width has settled.

- Revert ctx.layout.viewportWidth and the test fakes that provided it.
- SidebarRightInjected gains reportAutoFullscreen.
2026-09-27 17:02:34 +08:00
Dudu-0223 58ce417bab fix(ui-chat): use ordinary Agent presentation for Team relays 2026-09-27 16:48:01 +08:00
Yichen Jiang ebb6b03378 fix(sidebar-right): name the on-screen Session instead of a seat binding
ctx.sidebarRight acted on a binding the right Sidebar seat published from
passive effects. React runs a commit's passive effects in tree order and
the frame renders the Conversation column before the right column, so an
opener mounting in the commit that switched Sessions or returned from a
global panel ran while no seat was bound, and its open threw.

The plugin now names the on-screen Session itself: the selected Session
while the Conversation fills the main column, derived from the Sidebar's
Session views and ctx.layout.panelInfo. Both notify before React renders,
so `mounted` already names the arriving Session during that commit, and
its seat mints the Session's store in the same render. Public commands act
through the Session's adopted store; the seat reports only the room its
docking kit measured, and focus continuity and the auto-fullscreen rule
come from a host the plugin supplies.

- ctx.layout gains viewportWidth from the root layout store.
- SidebarRightBinding, controller.bind(), and the seat's bindService are
  removed; the seat's inject face gains measureRoom.
- ui-plan's review opener returns to a plain open gated on `mounted`.
- The plan-review e2e expands the Workspace group by its aria state.
2026-09-27 16:43:45 +08:00
Dudu-0223 af9292b6bd Merge branch 'master' into refactor/agent-team-direct-steer 2026-09-27 16:29:12 +08:00
Yichen Jiang 46f044e642 Merge remote-tracking branch 'origin/master' into worktree/deepseek-harness-bug-verify-94fe09 2026-09-27 16:01:11 +08:00
Dudu-0223 1a1b3c1896 refactor(agent-team): unify admitted operation tracking 2026-09-27 16:00:49 +08:00
Dudu-0223 e076dfe30a test(subagent): align inherited result event reference 2026-09-27 15:49:41 +08:00
Dudu-0223 acb2849495 chore(subagent): remove incidental snapshot generation changes 2026-09-27 15:42:32 +08:00
Dudu-0223 9a8a6d1c78 fix(subagent): align cross-platform snapshots after master sync 2026-09-27 15:36:25 +08:00
Dudu-0223 3254ed611d Merge master and preserve catalog-recursive subagent discovery 2026-09-27 15:23:31 +08:00
Dudu-0223 e0f52ae912 Merge remote-tracking branch 'origin/master' into codex/pr-5247-worktree
# Conflicts:
#	packages/client/ui-chat/tests/turn-trigger.client.spec.tsx
2026-09-27 15:04:29 +08:00
Dudu-0223 a5098110cf refactor(agent-team): stop delivering historical mailbox records
Historical team/message/queued and team/message/delivered records remain
decodable and projected, but Team no longer drains or acknowledges them
after restart. Remove the compatibility dispatcher, its disposal wait,
and its tests, and document that historical pending mail stays undelivered.
2026-09-27 15:01:00 +08:00
Dudu-0223 a98efc7115 Merge latest master documentation into Agent Team delivery 2026-09-27 06:45:46 +08:00
Dudu-0223 d190996167 docs(agent-team): keep merged architecture summary within budget 2026-09-26 22:39:30 +08:00
Dudu-0223 6e369b4479 Merge origin/master into Agent Team direct delivery 2026-09-26 22:36:55 +08:00
Dudu-0223 8cae58aea8 fix(agent-team): close direct delivery review gaps 2026-09-26 22:35:08 +08:00
Yif a9d169a399 Merge master into ui/plugin-placeholder-default-name 2026-09-26 22:04:14 +08:00
Yif 6ce05157f9 Merge master to refresh session UI fixes base 2026-09-26 21:57:59 +08:00
Dudu-0223 c772c85c17 refactor(agent-team): send directly through Agent inbox steering 2026-09-26 16:52:54 +08:00
creatixchu 6182c8b232 Merge branch 'feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-26 12:48:40 +08:00
creatixchu 2181d16495 test: wait for refreshed models before reopening editor 2026-09-26 12:47:53 +08:00
creatixchu be7ab6a17c Merge branch 'feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-26 12:34:16 +08:00
creatixchu 1c8683c47b test: preserve config reader binding in cleaner fixture 2026-09-26 12:33:53 +08:00
creatixchu 5f9d8a7467 Merge branch 'feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-26 12:12:32 +08:00
creatixchu b9e461b144 fix(build): make desktop keyboard output safe to clean 2026-09-26 12:11:56 +08:00
creatixchu 0bc7c0d5c8 test(plugins): exercise preserved non-Error startup failures 2026-09-26 12:09:59 +08:00
creatixchu 5e6524bca4 test(hooks): match the installer canonical worktree path 2026-09-26 12:09:58 +08:00
creatixchu 9210c519e2 test(plugins): cover non-Error startup diagnostics 2026-09-26 12:05:27 +08:00
creatixchu 9d2dbee7e1 test(cua): resolve provider defaults through the loader 2026-09-26 11:59:26 +08:00
creatixchu 9ea2c628c8 test(cua): exercise real loader startup and refresh configuration contracts 2026-09-26 11:57:32 +08:00
creatixchu 19b2cfa0fc fix(cua): resolve the bridge outside projects and retain setup diagnostics 2026-09-26 11:54:20 +08:00
creatixchu 74d1f1e55d fix(cua): await provider preparation through Cordis lifecycle 2026-09-26 11:38:46 +08:00
creatixchu dde252235d Merge branch 'feat/persistent-ptc' into feat/experimental-dsh-cua
# Conflicts:
#	.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.i18n.yaml
#	.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md
#	.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.zh.md
2026-09-26 11:32:58 +08:00
creatixchu 683e42a3b0 Merge remote-tracking branch 'origin/master' into feat/persistent-ptc 2026-09-26 11:30:25 +08:00
creatixchu d1011ec11a refactor(cua): pass admitted parameters to the native worker 2026-09-26 11:28:23 +08:00
creatixchu f22177a1f9 refactor(cua): keep native preparation internal and remove duplicate checks 2026-09-26 11:25:04 +08:00
Chinesezjc f04f5f2959 fix(web): restore the version row in the no-browser settings golden
A local refresh rewrote this golden without the version row the CI build
renders.
2026-09-26 10:41:30 +08:00
Chinesezjc 574bb7e7da test(web): refresh the recorded Web sessions for the preset clock
The clock row is preset-level, so a `standard`, `cordis`, or `ptc` session
appends one reading per eligible step; the recorded sessions carry that
message and the identifier shifts it causes. The plugin manager loses the
clock wording from the bundle description.
2026-09-26 10:28:58 +08:00
Chinesezjc 2edc6705b5 Merge origin/master into feat/preset-scoped-schedule-tools
Resolutions:
- `python/sdk-runtime/package.json` and `pnpm-lock.yaml` keep both sides'
  additions (`@deepseek-ai/dsh-otel` beside the schedule packages).
- The generated graph pages are re-emitted from the merged sources.
2026-09-26 10:14:10 +08:00
Chinesezjc f6bb7aa892 fix(tool-schedule): match the release train version
`pnpm run constraints` requires every workspace package to carry the root
version, which the release bump to 0.1.7-rc.2 changed.
2026-09-26 01:15:44 +08:00
Chinesezjc fd53e83125 Merge origin/master into feat/preset-scoped-schedule-tools
master now ships the reminder stack as the optional
`@deepseek-ai/dsh-experimental-schedule-bundle`; this branch keeps the
preset-level ownership beside it.

Resolutions:
- The Host rows keep master's `disabled: true`. The optional bundle switches
  `schedule` and `ui-schedule` on and no longer `time-context`: the clock row
  is preset-level, so flipping the Host row as well would mount the plugin in
  two scopes and write two readings per step.
- `standard`, `cordis`, and `ptc` declare `preset-time-context` and
  `tool-schedule`; `minimal` declares neither.
- `tool-schedule` injects `tools` and resolves `schedule` per scope through
  `ctx.inject`, so the row stays valid but produces no tools while the service
  is off, and produces them once the bundle mounts it.
- The assembled-Web Schedule spec keeps master's bundle overlay and restates
  the shipped `preset-standard` row instead of the deleted fixture, because a
  top-level patch cannot reach a plugin a preset declares.
- Documentation and Agent Notes describe both layers; the note master archived
  stays frozen with its manifest hashes.
2026-09-26 01:12:54 +08:00
Yif 57eef060f0 fix(ui): isolate session hover and jobs menu fixes
Merge origin/master and move plugin manager, artwork, and automation trigger changes to their independent PR. Cover keyboard-focused inline cards without warming the next pointer visit.
2026-09-26 01:05:32 +08:00
creatixchu a9683e8a23 test(cua): use fixture-aware session recovery cases 2026-09-25 19:57:00 +08:00
creatixchu ce11b81599 fix(cua): keep existing conversations usable after activation 2026-09-25 19:55:44 +08:00
creatixchu e0d9be74df test(plugins): assert experimental metadata errors directly 2026-09-25 19:46:16 +08:00
creatixchu cc1c7dd8d1 fix(cua): retain typed configuration during native setup 2026-09-25 19:44:39 +08:00
creatixchu 15ca36182c test(cua): clarify cancellation listener callbacks 2026-09-25 19:40:57 +08:00
creatixchu 0edd6e7666 fix(cua): make awaited preparation cleanup explicit 2026-09-25 19:33:10 +08:00
creatixchu e07f6e859b test(cua): refresh the concise activation explanation 2026-09-25 19:11:11 +08:00
creatixchu 4409f16ada fix(cua): keep activation effects readable beside the switch 2026-09-25 19:07:52 +08:00
creatixchu 14588b9aa9 docs(cua): refresh the promoted package dependency graph 2026-09-25 18:58:22 +08:00
creatixchu 932bdbde60 fix(cua): normalize the published native payload manifest 2026-09-25 18:54:53 +08:00
creatixchu ae57ea3ff8 test(cua): record the optional Computer Use plugin card 2026-09-25 18:49:17 +08:00
creatixchu 73f379582f test(cua): cover failed native diagnostics and artifact locations 2026-09-25 18:42:43 +08:00
creatixchu 87dfe408a0 fix(cua): align host test compilation and package references 2026-09-25 18:35:52 +08:00
creatixchu 82b3073ba5 test(cua): align preparation fixtures and component status queries 2026-09-25 18:31:34 +08:00
creatixchu 504b6df830 feat(cua): add an experimental opt-in with on-demand native preparation 2026-09-25 18:26:24 +08:00
creatixchu 3b7e28a873 Merge branch 'feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-25 15:40:32 +08:00
creatixchu ca3a438a4e test(ptc): give nested tool fixtures an owned lifecycle context 2026-09-25 15:38:45 +08:00
Turtle 1a50c05170 fix(shell): remind agents to check resolved paths before delete or move
Add a path-check reminder to the bash and pwsh tool descriptions. pwsh
also warns against assigning automatic variables such as $HOME; bash
also asks agents to guard path variables with ${VAR:?}.
2026-09-25 14:26:26 +08:00
creatixchu 063cf99673 Merge branch 'feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-25 13:54:37 +08:00
creatixchu 2fa5cc080c test(cua): reject calls from ended agents before helper acquisition 2026-09-25 13:54:04 +08:00
creatixchu 10d4193663 test(ptc): cover cleanup and cancellation after idle process exit 2026-09-25 13:54:03 +08:00
creatixchu 742a3a2656 test(cua): refresh state projection and window recovery snapshot 2026-09-25 13:50:53 +08:00
creatixchu 3977aa43b3 Merge branch 'feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-25 13:49:38 +08:00
creatixchu a18696bbc4 fix(cua): separate accessibility timeout and document recovery 2026-09-25 13:49:06 +08:00
creatixchu bf84ab113f docs(ptc): specify retained evaluation and release behavior 2026-09-25 13:49:05 +08:00
creatixchu 298ba12709 fix(cua): attempt all native fixture cleanup actions 2026-09-25 13:46:36 +08:00
creatixchu f8d19a57e4 test(cua): verify window ownership around accessibility reads 2026-09-25 13:46:35 +08:00
creatixchu 065963128c test(ptc): pin implicit globals and completed callback errors 2026-09-25 13:40:12 +08:00
creatixchu 34d3caed82 refactor(ptc): derive renderer formats from the runtime service 2026-09-25 13:36:42 +08:00
creatixchu e7bcb1b373 fix(cua): retain fractional drag movement delays 2026-09-25 13:34:24 +08:00
creatixchu 01aeea93f2 fix(ptc): reject dispatch to an exited retained process 2026-09-25 13:34:23 +08:00
creatixchu 7bf811902f perf(cua): assemble native response frames once 2026-09-25 13:28:30 +08:00
creatixchu fb594a665c fix(cua): project only documented accessibility state fields 2026-09-25 13:20:56 +08:00
creatixchu 5a2bb185ab fix(ptc): refresh retained binding error descriptors 2026-09-25 13:15:17 +08:00
creatixchu 1c29ff0598 fix(ptc): await every retained environment during unload 2026-09-25 13:11:00 +08:00
creatixchu d256be165c fix(ptc): return bounded parse-overflow cleanup failures 2026-09-25 13:04:16 +08:00
creatixchu cc4e98f5bc fix(cua): await screenshot projection during disposal 2026-09-25 13:02:57 +08:00
creatixchu d3ab674dcd test(ptc): pin syntax rejection before REPL startup 2026-09-25 12:47:36 +08:00
creatixchu 56a93f538c fix(cua): accept literal plus-key chords 2026-09-25 12:47:36 +08:00
creatixchu 0b26294635 test(ptc): keep process identity diagnostics free of environment data 2026-09-25 12:43:09 +08:00
creatixchu 9d6a9e28b5 fix(ptc): isolate the REPL process binding 2026-09-25 12:40:48 +08:00
creatixchu ed6a2b090d Merge typed PTC Session fixtures into dsh-cua 2026-09-25 12:22:34 +08:00
creatixchu 5e0adc7968 test(ptc): use a real Session in scoped agent fixtures 2026-09-25 12:21:37 +08:00
creatixchu 3e15397c46 Merge retired PTC cast allowances into dsh-cua 2026-09-25 12:15:19 +08:00
creatixchu 9bc8d9bed9 test(ptc): retire unknown-cast allowances for agent fixtures 2026-09-25 12:14:36 +08:00
creatixchu dd7172a44c Merge PTC CI fixture fixes into dsh-cua 2026-09-25 12:12:32 +08:00
creatixchu 3f7a8d7b7e test(ptc): give inspection fixtures lifecycle ownership 2026-09-25 12:10:56 +08:00
creatixchu 3d76810a57 test(cua): refresh tool snapshots after the master sync 2026-09-25 12:04:51 +08:00
creatixchu 502422ce1b Merge persistent PTC replay updates into dsh-cua 2026-09-25 12:01:35 +08:00
creatixchu 5e02e2a13b test(ptc): refresh the master-synced tool guidance snapshot 2026-09-25 12:00:59 +08:00
creatixchu 3337488bdf Merge master-synced persistent PTC into dsh-cua 2026-09-25 11:58:21 +08:00
creatixchu 1b6dbdde6b test(ptc): disable the split API-key provider during replay 2026-09-25 11:56:53 +08:00
creatixchu a340ecfd31 Merge master into persistent PTC 2026-09-25 11:52:21 +08:00
creatixchu d3056e3fbe test(cua): record window geometry conflict errors 2026-09-25 11:20:59 +08:00
creatixchu cd5df606db fix(cua): reject conflicting window geometry before input 2026-09-25 11:18:13 +08:00
Chinesezjc 8f161254b7 Merge remote-tracking branch 'origin/master' into feat/schedule-reminder-framing 2026-09-25 00:35:11 +08:00
creatixchu 505c4fcb7d perf(cua): batch AX roles with observation attributes 2026-09-24 23:17:02 +08:00
creatixchu a73eed85f1 Merge persistent PTC review fixes into dsh-cua 2026-09-24 23:08:20 +08:00
creatixchu 2c986ca3c3 test(ptc): pin raw subprocess output guidance 2026-09-24 23:03:40 +08:00
creatixchu 0309d22520 docs(ptc): clarify raw subprocess output attribution 2026-09-24 23:01:33 +08:00
creatixchu 9e17500315 fix(ptc): separate shared schema value from config type 2026-09-24 22:55:09 +08:00
creatixchu 7101555061 test(ptc): cover retained process races and refresh model evidence 2026-09-24 22:52:52 +08:00
creatixchu c5dff80c94 test(ptc): give tool bridge fixtures owned agent contexts 2026-09-24 22:48:23 +08:00
creatixchu 6a8483ce42 fix(ptc): contain retained evaluation failures and output 2026-09-24 22:44:56 +08:00
Chinesezjc a3a4c3b9ce test(web): take the reminder tools from the preset in the Schedule Web spec
The scenario boots the shipped composition, which disables the Schedule
service and the clock, and the two reminder rows live inside
`preset-standard`. A top-level patch cannot address a plugin a preset
declares, so the spec builds its overlay from the shipped preset and restates
that row with `preset-time-context` and `tool-schedule` enabled, beside the
Host row enables. Directly created Agents mount the default preset so their
tool set comes from the product composition, and the shipped-roster assertion
covers both planes.

The static fixture is deleted: it restated only the Host rows.
2026-09-24 21:32:42 +08:00
Chinesezjc c75bd5a514 fix(web): keep the preset reminder rows disabled with the Host stopgap
A preset row that waits for a disabled service fails the boot audit:
`tool-schedule` cannot resolve `schedule` while the shipped bundle keeps it
off, and the Web preset suite boots exactly that composition. The three
presets now declare `preset-time-context` and `tool-schedule` with the same
`disabled: true`, so the arrangement is recorded while nothing
reminder-related activates; the preset rows are enabled together with the
Host rows when the stopgap is lifted.
2026-09-24 21:19:41 +08:00
creatixchu ef09d35786 perf(cua): reduce validated Unicode event spacing 2026-09-24 21:10:10 +08:00
Chinesezjc 5e9b942f8c Merge origin/master into feat/preset-scoped-schedule-tools
`#5175` disabled the three Host rows (`time-context`, `schedule`,
`ui-schedule`) as a temporary stopgap and refreshed the Web fixtures for that
composition. Those rows and fixtures stay as master has them; this branch
keeps its preset ownership of the reminder stack, which takes effect when the
stopgap is lifted.

Resolutions:
- `packages/bundle/web-app/cordis.patch.yml` keeps master's `disabled: true`
  on all three rows.
- The three presets declare the clock under `preset-time-context`: a row id
  belongs to exactly one plane, and the Host row retains `time-context`.
- `apps/web/tests/schedule-after.e2e.ts`, `apps/web/tests/fixtures/
  time-context-every-step.patch.yml`, `web-default-isolation.expected.e2e.ts`,
  and the `minimal-preset` session fixture keep master's stopgap-era state.
2026-09-24 21:09:32 +08:00
creatixchu 755eb3e3f9 fix(cua): deliver text line breaks with native Return events 2026-09-24 20:51:16 +08:00
Chinesezjc 656adfc986 feat(web): mount time-context from the presets that use it
`packages/bundle/web-app/cordis.patch.yml` inserted `time-context` as a Host
row, so every session in the shipped Web profile — `minimal` included —
received a per-step clock reading its composition never declared. The row
moves into the `standard`, `cordis`, and `ptc` presets; `minimal` mounts
neither the reading nor the reminder tools. The Schedule service row and the
`ui-schedule` client row stay Host-wide. 139a7eb379 carried the bundle,
preset, and runtime-closure half of this move; this commit carries the
fixtures, documentation, and Agent Notes that follow it.

The `minimal` session fixture is refreshed keylessly, the assembled-Web spec
builds its every-step overlay from the shipped preset because a preset plugin
cannot be addressed by id from a top-level patch, and the composition Agent
Note points at the new note that owns the preset-scoped reading.
2026-09-24 20:50:12 +08:00
creatixchu 29ecbbb3d5 test(cua): compare native text pacing with Blender readback 2026-09-24 20:44:01 +08:00
creatixchu 8f9f086180 feat(cua): configure Unicode text event pacing 2026-09-24 20:39:25 +08:00
Chinesezjc 9706f3e5f3 test(web): cover the subagent-session mapping in the schedule editor
The new code joins the update-result union, so the exhaustive switch gained a
branch no test reached; the table-driven mapping test now names it.
2026-09-24 20:36:52 +08:00
Chinesezjc b7a6568c29 chore(docs): regenerate the graphs and persistence catalog after the merge
`SubagentSessionError` shifts line numbers in the Schedule types these
generated pages cite; both generators re-emit them, and the
persistence-catalog pair is re-recorded.
2026-09-24 20:27:28 +08:00
Chinesezjc d02a959870 Merge origin/master into feat/preset-scoped-schedule-tools
Resolutions:
- `snapshots/web/minimal-preset/tool-schemas.expected.json` keeps this
  branch's side: the four reminder tools are absent from a `minimal` session
  under the new composition, so master's description refresh of those entries
  does not apply.
- `packages/schedule/tool-schedule/src/index.ts` keeps this branch's plugin
  shape and ports master's trimmed tool descriptions (20bea14129) onto the
  moved definitions; `docs/tool-catalog.md` is regenerated from them.
- `docs/tool-catalog.zh.md` has its schema code block realigned with the
  regenerated English side, and the pairing record is re-recorded.
2026-09-24 20:20:33 +08:00
Chinesezjc 59c8bbbd6d fix(web): name the subagent-session refusal in the schedule editor
`subagent_session` joins the update-result error union, so the client's
exhaustive mapping needs an entry: the timing switch returns a new
`timing.subagentSession` key and both locale dictionaries carry the copy.
The editor shows it when someone edits a task whose Session subagent routing
owns.
2026-09-24 19:57:45 +08:00
Chinesezjc 96c421d985 fix(schedule): refuse reminders for sessions subagent routing owns
A preset mount reaches the preset's whole subtree, so a `standard`, `cordis`,
or `ptc` subagent now sees the reminder tools the removed
`ctx.agents.roots()` filter kept away from it. A task bound to such a Session
can never be delivered — `ctx.sessionController.resolveAgent` refuses it — so
`ScheduleService.create` and `ScheduleService.update` refuse it with
`subagent_session`, in the operation that creates the obligation rather than
in each consumer.

`list` and `delete` keep serving those Sessions so a task stored before the
rule stays removable, and the tool maps the new code into its error output.
The Agent Note, both package READMEs, and the generated catalogs record the
subtree exposure and the enforcement point.
2026-09-24 19:54:53 +08:00
Yif 5c0ef3a7c2 Merge master and preserve requested terminal gradient 2026-09-24 19:45:21 +08:00
creatixchu 5ed5b9cb4f test(cua): observe modal dismissal independently of window destruction 2026-09-24 19:40:59 +08:00
Yif 0701068a31 fix(ui): polish session hints, task menus and plugin examples 2026-09-24 19:40:02 +08:00
creatixchu 4a7fcb3e38 test(cua): record stale observation recovery in session replay 2026-09-24 19:37:36 +08:00
creatixchu 6718231377 fix(cua): invalidate observations when accessibility nodes disappear 2026-09-24 19:36:30 +08:00
creatixchu bdf183e7e1 test(cua): compare complete native observations on synthetic windows 2026-09-24 19:26:56 +08:00
creatixchu 6b3a196a3f fix(cua): compile batch attribute regression assertions 2026-09-24 19:24:42 +08:00
creatixchu c327aa7ddd perf(cua): batch per-node accessibility observation reads 2026-09-24 19:23:19 +08:00
creatixchu 24b2d1358e fix(cua): separate optional AX metadata from structural discovery 2026-09-24 18:57:48 +08:00
creatixchu 039e854166 fix(cua): retain panel observations when action metadata is unavailable 2026-09-24 18:54:19 +08:00
Chinesezjc 62aa32c6fe fix(schedule): complete the runtime closure and regenerate the graphs
A preset now mounts `@deepseek-ai/dsh-tool-schedule`, so the executable
deploy manifest must supply it and every required workspace peer reachable
from it: the Python runtime manifest gains the tool package, the Schedule
service and the peers that service requires. The stale product/consumer and
module graphs are regenerated for the new package.
2026-09-24 18:52:12 +08:00
creatixchu 5435226a79 fix(cua): allow unavailable optional values in AppKit panels 2026-09-24 18:48:17 +08:00
Chinesezjc 6c1a590a4c feat(schedule): contribute the reminder tools from a preset-scoped package
The Host plugin registered `schedule_create`, `schedule_list`,
`schedule_update`, and `schedule_delete` on every live root Agent, so a
`minimal` session received four reminder tools its preset never declared. The
tools move to the preset-scoped Consumer `@deepseek-ai/dsh-tool-schedule`,
which injects `tools` and `schedule` and registers them in the scope that
mounts it: `standard`, `cordis`, and `ptc` carry the row, `minimal` does not.
`@deepseek-ai/dsh-schedule` keeps the Host service, storage, delivery, and the
Automation surface.

The five `minimal` assertions in the Web preset suite and the `minimal-preset`
tool-schema snapshot return to the bash-only table, the tool catalog is
regenerated under the new owner, and the Agent Note that recorded the previous
composition points at the new one.
2026-09-24 18:39:00 +08:00
creatixchu 110abb9ad7 fix(cua): consume requests before EOF on persistent stdin pipes 2026-09-24 18:33:13 +08:00
creatixchu bf508eaa2f fix(cua): preserve window metadata and support Apple CLI test runtimes 2026-09-24 18:23:08 +08:00
Chinesezjc 72a9690fa8 Merge branch 'master' into fix/producer-owned-source-doc-examples 2026-09-24 18:20:16 +08:00
creatixchu d994a3326b feat(cua): replace the macOS Rust helper with Swift 2026-09-24 18:09:17 +08:00
Chinesezjc 21e2b5c7f1 docs(notes): describe the framing block position and the missing snapshot harness support
The Decision no longer says the renderers open with the fixed line: the bracketed
marker is the first line, and the shared line is the second. The snapshot
paragraph names both missing harness capabilities, clock control and seeding the
schedule storage domain, and the pinning sentence distinguishes the full-string
unit assertions from the Web assertion over the assembled request.
2026-09-24 18:06:40 +08:00
Chinesezjc ba92dafe00 docs(schedule): narrow the snapshot claim and the prompt contract
The snapshot paragraph now states what the tree does not have (no scenario patch
controls the wall clock delivery reads, and no Web scenario scripts a delivered
reminder) instead of concluding that the harness cannot support such a fixture.
The README attributes the presentation wording to schedule_create and the update
wording to schedule_update, and the note names the batch payload field alongside
the one-shot one.
2026-09-24 18:05:38 +08:00
Chinesezjc fd81b474b3 Merge remote-tracking branch 'origin/master' into feat/schedule-reminder-framing 2026-09-24 17:59:44 +08:00
Chinesezjc 30024e37c8 docs: keep the reminder and cron sources exact, and link MessageSourceMap
Review of the previous commit found two inaccuracies it introduced. The
repeat-tool-reminder producer still writes `form: 'notice'` and its
`<tool> × <count>` summary — `src/index.ts` spreads them onto
`REMINDER_SOURCE` — so only the wrapper should have been dropped. The cron row
also claimed an `inject()` path that `dsh-schedule` does not have:
`runtime.ts` always delivers through `followup()` and flushes the session.

Link `MessageSourceMap` to the page that owns it, and write `V4` as the corpus
does for the format name. Both pairs are re-recorded.
2026-09-24 17:57:13 +08:00
Chinesezjc 7f53c7498c docs(schedule): record the reminder framing risk, the snapshot gap, and the prompt contract
The Agent Note now states what a model infers from the origin line and records
the residual risk of dropping the untrusted-content instruction as accepted, with
its reintroduction condition and the assertions that keep a later change
deliberate. It also records why no recorded-session snapshot covers a delivered
reminder, and the host note links back to it.

The package README keeps the creation-side contract in view: prompt stays the
content to present to the user when the target becomes due.
2026-09-24 17:56:43 +08:00
Chinesezjc fc5da09dbc docs: show the producer-owned message source in current-state examples
Session format v4 refuses the retired `{ kind: 'plugin', plugin: '<name>' }`
wrapper at message admission, and the v3-to-v4 migration maps released plugin
names to producer-owned kinds. Five paired documents still show the wrapper as
the current shape, so a plugin author copying them writes a source the session
refuses.

The examples now name the kind the producer declares through
`MessageSourceMap`, and the tool cookbook states that declaration requirement;
the wrapper appears only as the form the admission check rejects. The two
package READMEs also disagreed with their own sources: time-context writes
`{ kind: 'time-context', form: 'snapshot', sections }`, and
repeat-tool-reminder writes `{ kind: 'repeat-tool-reminder' }` with no `form`
or `summary`.
2026-09-24 17:42:40 +08:00
Chinesezjc 4c0caf9c74 Merge remote-tracking branch 'origin/master' into feat/schedule-reminder-framing 2026-09-24 17:09:26 +08:00
Chinesezjc b00ed4681c docs(notes): scope the reminder framing binding claim to the tools
The Consequences and the alternative treated the task's Session binding as the
constraint on who writes the prompt. The package README records that the same
binding is not caller authorization, and the Web task detail writes the prompt
through the same service, so both sentences now name the prompt's writing paths
and the binding's actual scope instead.
2026-09-24 17:07:10 +08:00
Chinesezjc 59d64164f2 docs(notes): use the bound-session wording in the reminder framing note
The note said the Session "owns" the schedule; the storage binds a task to a
sessionId and the owning note keeps "Host-owned" for the Host storage domain, so
the Decision and the alternative now use that binding. The Decision also stops
calling every dynamic field JSON-encoded, since only the id and the prompt are,
and the alternative states plainly that the prompt was called untrusted input.
2026-09-24 17:05:26 +08:00
Yichen Jiang 566944f970 feat(web): name an empty model catalog as unconfigured
When the loaded catalog offers no model and no provider failed to load,
the composer trigger shows a warning dot and "No model configured"
instead of the saved route id, and its menu opens on guidance to sign in
to a DeepSeek account or add an API key. A saved selection that becomes
unavailable while other models remain keeps its route id. The README no
longer claims an unavailable model disables the composer.
2026-09-24 17:05:04 +08:00
Chinesezjc 670b61e549 docs(notes): record the reminder framing limits and rendered notice
The Consequences now state that the prompt text carries no authorship guarantee:
a model-written reminder can quote text read from the web, files, or command
output and deliver it under the user-origin line, while the Session binding only
limits which Session's model writes the task. They also name the Web notice that
renders the delivered message, and the Problem and Decision drop the repeated
"standing" wording and the change narration.
2026-09-24 17:03:17 +08:00
Chinesezjc c81f9f964d docs(notes): state the reminder framing origin and encoding precisely
The Decision now separates the message's origin (a schedule owned by that
Session) from the authorship of the prompt text, which the schedule tools let the
model write on the user's behalf. It also replaces the claim that every dynamic
field is JSON-encoded: the occurrence instant is a validated canonical RFC 3339
value, and the id and prompt are JSON strings.
2026-09-24 17:00:06 +08:00
Chinesezjc af39300572 feat(schedule): frame due reminders as scheduled user messages
Due reminders entered their Session as user-role messages whose fixed text told
the model to treat the reminder prompt as untrusted content rather than new user
instructions. Both delivery paths now open with one shared origin line,
"This is a scheduled message from the user", so the message states where it came
from instead of what standing to give its own payload.

One-shot and recurring batch framing share SCHEDULED_MESSAGE_FRAMING, so the two
paths cannot drift. The bracketed markers and the JSON-encoded dynamic fields are
unchanged, so a prompt still cannot forge framing lines.

The rationale and alternatives are recorded in the Agent Note
.agents/notes/implemented/architecture/2026-09-24-scheduled-message-framing.md.
2026-09-24 16:54:55 +08:00
creatixchu bc6ec2b1cd test(cua): record foreground observations and align invocation assertions 2026-09-24 16:54:33 +08:00
creatixchu feba1df810 fix(cua): avoid redundant foreground requests and correlate their observations 2026-09-24 16:52:28 +08:00
creatixchu 330a6cf3e5 fix(cua): admit large screenshots through the real PTC image pipeline 2026-09-24 16:49:10 +08:00
Yichen Jiang 94593168a3 feat(llm): offer API-key route models only while their key resolves
The official DeepSeek route and pi-ai routes that name an API-key
reference again return an empty catalog while that reference resolves
to nothing, so model pickers stop offering models that can only fail
with MISSING_CREDENTIAL. A malformed key still reports
INVALID_CREDENTIAL, and routes with provider-native authentication keep
their catalogs. This restores the discovery rule that 6db08fd80f
replaced with credential-independent catalogs.
2026-09-24 16:48:19 +08:00
Yichen Jiang 6d602d792e fix(llm): satisfy type-aware lint in the DeepSeek account package
lint:contracts-ready rejected the override filter's undefined check
against its declared type and four asymmetric matchers typed any. The
override filter now takes the parsed configuration as it arrives, and
the tests narrow their matchers the way other packages do.
2026-09-24 16:48:11 +08:00
Yichen Jiang 835bf97370 feat(web): show the DeepSeek account row as signed in
The account row lost its only action when the catalog editor was removed
and rendered as a bare name. It now carries a green "Signed in" status;
the store keeps the row only while the account lists models, so the
status holds whenever the row renders. The package README no longer
describes the removed editor.
2026-09-24 16:29:19 +08:00
creatixchu a0dd723300 test(cua): observe and raise the exact Blender fixture window 2026-09-24 16:24:26 +08:00
creatixchu 149ba9acd0 test(cua): locate Blender editor independently of Retina units 2026-09-24 16:15:49 +08:00
creatixchu eb10c938ca test(cua): record AXless window pixel workflow 2026-09-24 15:33:57 +08:00
creatixchu 0a83a1a941 fix(cua): retain pixel access for owned windows without AX 2026-09-24 15:29:36 +08:00
creatixchu b3e452b942 test(mcp-client): distinguish protocol and image encoding rejection 2026-09-24 15:08:33 +08:00
creatixchu 745a25f561 test(mcp-client): isolate noncanonical image cases 2026-09-24 15:05:47 +08:00
creatixchu c2caea031e fix(mcp-client): admit large canonical image payloads without regex recursion 2026-09-24 14:59:53 +08:00
creatixchu 9a53f64dda fix(cua): send modifier transitions for native key chords 2026-09-24 14:52:18 +08:00
creatixchu de1f8b2421 test(cua): refresh foreground guidance snapshot 2026-09-24 14:15:01 +08:00
creatixchu fffc899f9c fix(cua): avoid preemptive foreground activation 2026-09-24 14:11:14 +08:00
Yichen Jiang 7755d97dba test(llm): cover the account listing and gate through the Loader composition 2026-09-24 13:38:08 +08:00
Yichen Jiang 7653ca66ab Merge remote-tracking branch 'origin/master' into worktree/deepseek-account-models-ba9235
Resolve the account provider import to carry both the account quota
codes from #4858 and APP_IDENTITY for the model gate. The upstream
account-quota spec now answers the account listing request with 404,
because the account route requests /models before its first Messages
call and a shared mocked Response body can only be read once.
2026-09-24 13:37:06 +08:00
creatixchu 33b10af1f2 fix(cua): deliver background pointer events once 2026-09-24 13:36:43 +08:00
Yichen Jiang 5dd772d537 docs(llm): document the DeepSeek account listing, overrides, and version gate 2026-09-24 13:20:44 +08:00
Yichen Jiang 783d98b78e feat(web): drop the account catalog editor from the Models page 2026-09-24 13:15:30 +08:00
Yichen Jiang e647f079b9 fix(llm): default DeepSeek account model overrides to an empty dict 2026-09-24 13:15:29 +08:00
Yichen Jiang 0a13e89b0d feat(llm): serve the DeepSeek account catalog from the account listing 2026-09-24 13:10:36 +08:00
Yichen Jiang 31ce1ad5f1 feat(llm): cache the DeepSeek account listing per credential 2026-09-24 13:08:00 +08:00
Yichen Jiang 2817b9e205 test(llm): cover listing entries that omit optional account catalog fields 2026-09-24 13:07:59 +08:00
Yichen Jiang d8c9868763 feat(llm): gate DeepSeek account models by declared client version and bundled support 2026-09-24 13:06:13 +08:00
Yichen Jiang ad0a30075f feat(llm): decode the DeepSeek account model listing entry by entry 2026-09-24 13:04:10 +08:00
Yichen Jiang 4082eb3ceb feat(llm): configure the DeepSeek account listing endpoint and model overrides 2026-09-24 13:02:47 +08:00
Yichen Jiang 20f99ffb0c feat(llm): let DeepSeek providers await their connection and refuse models before I/O 2026-09-24 12:59:31 +08:00
Yichen Jiang 7f38c1b099 fix(llm): name the Flash catalog entry DeepSeek-V4.1-Flash 2026-09-24 12:57:20 +08:00
Yichen Jiang 9a2f353813 fix(web): open pending plan reviews across Sidebar seat changes
A plan review that mounted in the same commit as a Sidebar seat change
still crashed its opener, which retired the View full plan link and every
automatic open until the page reloaded. Two paths reached the crash:

- Returning from another Session: PlanReviewOpen read the departing seat
  as mounted during render, and that seat released before the review's
  effect ran while the arriving seat bound after it.
- A Session without a saved Sidebar layout: the seat released and rebound
  around every store commit, and the commit that created the layout was
  the one in which the review opened.

The seat now republishes its binding after each commit without releasing
it in between, and releases the latest binding only when it leaves the
screen. The review opener reads the mounted snapshot when it acts,
reports whether an open reached a seat, retries whenever the mounted
Session changes, and records the review as opened only after an open
does. Embedded subagent reviews still open in the visible parent Sidebar.
2026-09-24 12:35:12 +08:00
creatixchu b60a49409d test(cua): compare file panel URLs by filesystem identity 2026-09-24 11:45:17 +08:00
creatixchu cd9fa73222 test(cua): wait on panel input readiness without AX contention 2026-09-24 11:43:29 +08:00
creatixchu 9be9a29c9b fix(cua): reject unavailable nearest element windows 2026-09-24 11:40:52 +08:00
creatixchu 4d18c4d501 test(cua): observe app-wide sheets for keyboard completion 2026-09-24 11:40:19 +08:00
creatixchu 4f64e43bb1 test(cua): focus the observed sheet after multi-window actions 2026-09-24 11:35:53 +08:00
creatixchu eefea870f4 test(cua): budget panel polling for remote AX traversal 2026-09-24 11:33:23 +08:00
creatixchu 73c80201f0 fix(cua): refuse keys before system panel input is ready 2026-09-24 11:30:18 +08:00
creatixchu c612a97e47 test(cua): keep native fixture windows outside Stage Manager sets 2026-09-24 11:26:13 +08:00
Tianyi Cui 21df47b0e3 Merge branch 'master' into worktree/python-live-smoke-ack-20260923 2026-09-24 11:24:42 +08:00
creatixchu c17f008c00 test(cua): isolate system panel regression entry 2026-09-24 11:03:07 +08:00
creatixchu dc5e41a319 test(cua): observe complete system file panel 2026-09-24 11:01:18 +08:00
creatixchu 5304401ada fix(cua): resolve AppKit sheets and system panel input 2026-09-24 10:59:22 +08:00
gengruilin 218cf9dc20 fix(client): 保留输入框内嵌浮层的焦点交互 2026-09-24 10:52:05 +08:00
gengruilin 06fa431947 fix(client): 点击输入框留白时保留光标和选区 2026-09-24 10:50:48 +08:00
Tianyi Cui 8c32bcf97d test(python): accept standalone live smoke acknowledgements
The installed-wheel smoke checks real model tool use and externally verifies
the created file, a fresh host-only challenge, the copied receipt, and the
unchanged source. DeepSeek can return the requested acknowledgement before
a file-details paragraph; requiring it to be the last line makes correct
SDK execution fail according to the placement of explanatory prose.

Accept the exact acknowledgement on any standalone line, retaining completed
turns, model-requested tool calls, exact file bytes, and session-log checks.
Replay the observed response through both turns and keep negative coverage
for absent or embedded acknowledgements and incorrect files.
2026-09-23 23:43:04 +08:00
creatixchu 76fba44641 test(cua): refresh formatted API reference snapshot 2026-09-23 22:11:33 +08:00
creatixchu 775b6416f0 docs(cua): format object API guidance as a method list 2026-09-23 22:03:59 +08:00
creatixchu aeca82c699 fix(cua): require a logged-in console for desktop readiness 2026-09-23 21:53:01 +08:00
creatixchu df0b833500 test(cua): record desktop readiness and complete object API guidance 2026-09-23 21:38:14 +08:00
creatixchu f1c728c7af fix(cua): reject locked sessions and bound cyclic AX traversal 2026-09-23 21:13:45 +08:00
creatixchu 685bb24bf7 test(cua): record foreground recovery operation 2026-09-23 20:47:32 +08:00
creatixchu 091a085d5d feat(cua): add explicit activation for hidden application recovery 2026-09-23 20:40:46 +08:00
creatixchu 3a7e7650bb test(cua): record explicit secondary action schema and guidance 2026-09-23 20:32:34 +08:00
creatixchu 493cd1e0bc feat(cua): keep app selection in background and expose explicit AX actions 2026-09-23 20:28:31 +08:00
creatixchu f808571fff Merge remote-tracking branch 'origin/feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-23 20:22:03 +08:00
creatixchu f5c4110b5e fix(cua): activate selected apps before observing their windows 2026-09-23 20:20:33 +08:00
creatixchu 75ae02da4a fix(ptc): allow top-level await in scoped blocks 2026-09-23 20:18:49 +08:00
creatixchu 9107ae0d21 test(cua): refresh persistent PTC guidance snapshot 2026-09-23 20:18:45 +08:00
creatixchu 56f3d3135d feat(cua): expose plain-text paste and persistent PTC composition 2026-09-23 20:12:21 +08:00
creatixchu 9bd3aca35e feat(cua): support indexed pointer gestures and focused windows 2026-09-23 20:07:19 +08:00
Yichen Jiang 11c58d11b9 fix(ssh): build helper executables only on manual requests 2026-09-23 19:52:50 +08:00
Yichen Jiang d9342fcb5d feat(ssh): package standalone POSIX helper runtimes 2026-09-23 19:16:59 +08:00
creatixchu 2a17abf773 test(cua): declare image capability for screenshot admission 2026-09-23 17:59:41 +08:00
Dudu-0223 8b43d44cc6 refactor(subagent): limit discovery to parent-delivery children 2026-09-23 17:59:35 +08:00
creatixchu ad41f5f970 test(cua): compare screenshot coordinate metadata structurally 2026-09-23 17:56:25 +08:00
creatixchu a11af71304 test(cua): cover portable screenshots and replay published package exports 2026-09-23 17:55:39 +08:00
Dudu-0223 4a569396c5 fix(subagent): validate providers and consolidate catalog writes 2026-09-23 17:39:34 +08:00
creatixchu b44230bdbe Merge remote-tracking branch 'origin/feat/persistent-ptc' into feat/experimental-dsh-cua 2026-09-23 17:38:15 +08:00
creatixchu cd08b60f9c test(ptc): declare workflow runtime confinement capabilities 2026-09-23 17:36:07 +08:00
creatixchu dde3e78c23 Merge remote-tracking branch 'origin/master' into feat/persistent-ptc 2026-09-23 17:19:20 +08:00
creatixchu 62396f4537 docs(ptc): synchronize the generated config source reference 2026-09-23 17:16:00 +08:00
creatixchu cff260f048 chore(ptc): align published artifacts and strict lint contracts 2026-09-23 17:12:43 +08:00
creatixchu b0dc38429a test(ptc): pin packaged-host persistent bootstrap selection 2026-09-23 17:08:00 +08:00
creatixchu d59f96ece2 docs(ptc): refresh generated source locations 2026-09-23 17:06:56 +08:00
creatixchu 1393ed2e12 fix(ptc): simplify evaluation settlement and isolate published bundles 2026-09-23 17:03:04 +08:00
creatixchu 7391d06a8d fix(ptc): preserve provider identity and self-contained published entries 2026-09-23 17:00:37 +08:00
creatixchu e625e7a6a5 fix(ptc): report process loss consistently across exit event ordering 2026-09-23 16:58:27 +08:00
creatixchu f85883425d fix(ptc): release each provider once and await workflow REPL completion 2026-09-23 16:57:46 +08:00
creatixchu 4fe78cb71a fix(ptc): compose the persistent provider and share process cleanup 2026-09-23 16:55:21 +08:00
creatixchu 5f5395f7ad test(ptc): cover persistent process transport and cleanup failures 2026-09-23 16:50:38 +08:00
creatixchu 2859d2bb08 test(ptc): verify REPL callback ownership and scoped output 2026-09-23 16:48:26 +08:00
creatixchu bd2ed0ce61 test(ptc): exercise ownerless requests without explicit undefined fields 2026-09-23 16:45:21 +08:00
creatixchu 607077b985 test(ptc): cover retained state and recovery through the shipped profile 2026-09-23 16:44:48 +08:00
creatixchu 4fb14dcac6 feat(ptc): add opt-in best-effort persistent Node REPL 2026-09-23 16:41:38 +08:00
creatixchu 8a64473c5b docs(cua): document the API and external evaluator integration
Explain configuration, window and input semantics, source ownership and current limitations. Record why persistence belongs to the execution host and refresh repository catalogs.
2026-09-23 16:01:41 +08:00
creatixchu 09b60c331c test(cua): record native tool operations and image delivery
Exercise the real Loader, AgentLoop, helper transport and attachment pipeline with an explicit desktop protocol fixture. Add a headless V4 Session replay for observations and actions.
2026-09-23 16:01:40 +08:00
creatixchu ee676a3025 test(cua): verify AppKit and Electron operations on macOS
Use disposable applications and independent state records to verify clicks, Unicode input, modifiers, scrolling, dragging, capture and stale-target cleanup. Share the native test transport.
2026-09-23 16:01:39 +08:00
creatixchu 445c5f3da7 build(cua): wire the experimental package and source profile
Declare package exports, workspace dependencies and build entries. Add an opt-in macOS source composition and enforce the experimental release payload.
2026-09-23 16:01:36 +08:00
creatixchu 17a4118c20 feat(cua): integrate logged tools with Agent-owned native resources
Register native operations and model guidance, and bridge objects through the current authorized tool binding. Join Agent and provider cleanup without introducing a persistent evaluator.
2026-09-23 16:01:36 +08:00
creatixchu e3911008a8 feat(cua): bound native process communication and cleanup
Implement serial JSONL transport with request/response limits, deadlines, cancellation and process-range cleanup. Cover protocol and stream failures across host platforms.
2026-09-23 16:01:35 +08:00
creatixchu 2355950d20 feat(cua): add scoped application and window objects
Provide discovery, observations, screenshots and input through retained objects. Preserve per-window snapshot identity and prevent action options from replacing the selected target.
2026-09-23 16:01:34 +08:00
creatixchu b0507f94af feat(cua): define application types and validate the operation protocol
Define the evaluator-independent app/window API and validate method-specific requests and native responses. Test invalid targets and parameter admission.
2026-09-23 16:01:34 +08:00
creatixchu 4a6e03fecd feat(cua): implement the macOS native operation helper
Expose app and window handles, scoped AX snapshots, permissions, input and capture through a JSONL helper. Bind handles to process lifetimes and report stable native errors.
2026-09-23 16:01:31 +08:00
creatixchu 7417c38a14 feat(cua): copy licensed macOS accessibility and input primitives
Copy the selected Cua Driver macOS source without modifications. Preserve the MIT notice and a file-level source manifest.
2026-09-23 16:01:29 +08:00
Dudu-0223 307c75011b Merge master and reconcile declarative presets with activations 2026-09-21 16:41:53 +08:00
Dudu-0223 0c7450ca51 test(subagent): order sequential snapshot settlement 2026-09-21 16:27:05 +08:00
Dudu-0223 7ea035dc3c Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-21 16:24:57 +08:00
Dudu-0223 96251d06c6 Merge remote-tracking branch 'origin/master' into refactor/subagent
# Conflicts:
#	docs/capability-seams.i18n.yaml
#	docs/capability-seams.md
#	docs/capability-seams.zh.md
2026-09-21 16:20:37 +08:00
Dudu-0223 a1da7bcfb9 fix(subagent): close settlement delivery gaps 2026-09-21 16:19:07 +08:00
Dudu-0223 34a4cbb4e8 Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-21 15:22:59 +08:00
Dudu-0223 6e38051503 fix(subagent): preserve parent answers when cleanup fails 2026-09-21 15:21:09 +08:00
Dudu-0223 1cfb187611 test(snapshot): refresh merged subagent skill guidance 2026-09-21 15:12:33 +08:00
Dudu-0223 6cb6baaaae test: align merged catalog and job fixtures 2026-09-21 15:10:19 +08:00
Dudu-0223 4767528ed8 fix(subagent): await pending descendants during activation disposal 2026-09-21 15:08:10 +08:00
Dudu-0223 55cbf441d0 Merge origin/master into refactor/subagent 2026-09-21 15:07:47 +08:00
Dudu-0223 c17a1fa189 refactor(subagent): represent external catalog entries by mode 2026-09-21 15:03:34 +08:00
Dudu-0223 1ba45fb7b6 test(subagent): retain typed access to manager internals 2026-09-21 12:02:22 +08:00
Dudu-0223 b3b0cd95cc Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-21 11:59:58 +08:00
Dudu-0223 390fbe8852 refactor(subagent): merge orchestration and activation ownership 2026-09-21 11:58:14 +08:00
Dudu-0223 89e2c7e0ea fix(subagent): report interrupted execution cleanup failures once 2026-09-21 11:12:33 +08:00
Dudu-0223 5ca7f533e1 refactor(subagent): own external runs without activation drivers 2026-09-21 11:09:41 +08:00
Dudu-0223 554974614f refactor(subagent): restore input delivery type alias 2026-09-21 11:02:51 +08:00
Dudu-0223 bb16d7d989 refactor(subagent): return listing promises directly 2026-09-21 10:49:20 +08:00
Dudu-0223 1e437229da test(subagent): inspect children before activation completion 2026-09-21 10:43:43 +08:00
Dudu-0223 fb41430414 Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-21 10:37:54 +08:00
Dudu-0223 ef88d6a277 refactor(subagent): deliver activation results after teardown 2026-09-21 10:37:26 +08:00
Dudu-0223 703bf4d504 Merge master after validating subagent cleanup 2026-09-20 17:59:25 +08:00
Dudu-0223 c882069928 test(subagent): record creation-only external catalogs 2026-09-20 17:53:43 +08:00
Dudu-0223 44121c69a7 test(sdk): record local activation final answer delivery 2026-09-20 17:44:56 +08:00
Dudu-0223 1e00ab89a7 refactor(subagent): keep catalog entries as creation facts 2026-09-20 17:43:31 +08:00
Dudu-0223 307332baee Merge master and preserve compatible subagent catalog evolution 2026-09-20 17:35:18 +08:00
Dudu-0223 f3a69dff00 refactor(subagent): remove redundant state and settle local results after descendants 2026-09-20 17:27:05 +08:00
Dudu-0223 90d59915b9 Merge remote-tracking branch 'origin/master' into refactor/subagent
# Conflicts:
#	apps/web/tests/replay-round-trip.e2e.ts
2026-09-20 16:12:16 +08:00
Dudu-0223 a008c6adae refactor(subagent): keep input delivery local to activation drivers 2026-09-20 16:10:25 +08:00
Dudu-0223 1829f2f74a Merge remote-tracking branch 'origin/master' into refactor/subagent
# Conflicts:
#	packages/client/ui-plugin-manager/tests/components.client.spec.tsx
#	packages/subagent/subagent/src/list-children.ts
2026-09-20 16:04:50 +08:00
Dudu-0223 8d28b06ec6 fix(subagent): share delegation scheduling guidance 2026-09-20 14:57:36 +08:00
Dudu-0223 2cd032bd28 test(snapshots): retain unchanged child V3 fixtures 2026-09-19 23:00:16 +08:00
Dudu-0223 d5a0f7dd68 fix(subagent): list only continuable children 2026-09-19 22:41:38 +08:00
Dudu-0223 2ff0070d8d test(plugins): adapt the configuration slot mock signature 2026-09-19 22:41:02 +08:00
Dudu-0223 6196d1b52d test(plugins): narrow the shared configuration slot owner 2026-09-19 22:38:53 +08:00
Dudu-0223 73801ce10b fix(ci): type plugin metadata fixtures without unknown casts 2026-09-19 22:37:00 +08:00
Dudu-0223 6a4a74eadf Merge commit '8b890e7550' into refactor/subagent 2026-09-19 22:25:34 +08:00
Dudu-0223 9f994c651f test(subagent): retain V3 fixtures for unchanged scenarios 2026-09-19 22:25:25 +08:00
Dudu-0223 780fa93a7d test(desktop): isolate packaging Git inputs from parallel suites 2026-09-19 21:44:53 +08:00
Dudu-0223 08275450c5 test(subagent): refresh Web pins and preserve bash background probe 2026-09-19 21:37:09 +08:00
Dudu-0223 5c7dd0d23c test(subagent): avoid unsafe matcher object assignment 2026-09-19 21:26:46 +08:00
Dudu-0223 ae0df2a128 test(subagent): align headless settlement and inheritance expectations 2026-09-19 21:23:51 +08:00
Dudu-0223 ec441c1ac9 test(subagent): synchronize delegation snapshots and refresh PowerShell prompts 2026-09-19 21:17:13 +08:00
Dudu-0223 955c9d255a fix(subagent): align catalog consumers and integration coverage 2026-09-19 21:04:01 +08:00
Dudu-0223 6419c0eb21 chore(subagent): integrate latest master and typed test fixtures 2026-09-19 20:44:43 +08:00
Dudu-0223 7e8591de1c refactor(subagent): rebuild activations on master with shared catalog 2026-09-19 20:39:43 +08:00
Dudu-0223 78088667f9 Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-17 14:56:14 +08:00
Dudu-0223 3d852a1cea refactor(subagent): unify local and external activation lifecycles 2026-09-17 14:54:10 +08:00
Dudu-0223 776a675197 Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-17 13:46:45 +08:00
Dudu-0223 508aee8ae5 test(subagent): refresh inherited fork defaults in SDK snapshots 2026-09-17 11:02:59 +08:00
Dudu-0223 4565dafc58 refactor(subagent): default base fork delegation to continuable 2026-09-17 10:57:12 +08:00
Tianyi Cui c042eb2560 fix(benchmarks): sample Trajectory readiness on animation frames 2026-09-13 14:03:32 +08:00
Tianyi Cui c9cd76464a fix(release): isolate packed-install npm cache 2026-09-06 21:40:21 +08:00
Hypatia May 2a23b73e7b test(typert-loader): state comment contracts without CI-incident citations 2026-08-28 16:15:51 +08:00
Hypatia May 23527f0df2 test(typert-loader): poll async assertions instead of fixed 20ms sleeps
'contains steady-state registration failures' flaked on the CI coverage
lane (mock called 0 times): the spec slept a fixed 20ms and asserted an
async continuation had run, which contention can outlast. Convert the
three positive-assertion sleeps to the file's existing vi.waitFor
pattern; the absence-assertion sleeps stay, because polling cannot prove
nothing happened.
2026-08-28 16:15:51 +08:00
8599 changed files with 345778 additions and 89051 deletions

No files matched your search

+4 -4
View File
@@ -6,8 +6,8 @@
en: a10991a192c7b55d
zh: c2e5b938ece4f366
/agent-notes/layout-and-naming:
en: 6b38cb0eb38c2baf
zh: 535234fb23fc8921
en: 0a517dfc15d4af0a
zh: 324bd9e13a0295e3
/agent-notes/classification:
en: 055a5e49f9af3dc2
zh: 9f7c78409cccfded
@@ -18,8 +18,8 @@
en: 2beb1b94d8fb633c
zh: 889b5542bb771205
/agent-notes/the-file-format:
en: 601f85df49f80fc7
zh: acbd0955d6543b13
en: c8efdd37e51c8746
zh: 0080340005bd31db
/agent-notes/the-file-format/the-header-block:
en: 16fdaab0c74a5bb5
zh: 2553f145a1eb878f
+2 -2
View File
@@ -16,7 +16,7 @@ Every Agent Note has two axes, both encoded in its **path** — `{lifecycle}/{cl
The date in the filename is when the topic was **first proposed** (per git history). Cross-references between Agent Notes use relative markdown links (`[topic](../../implemented/architecture/2026-…-….md)`) — never bare prose or numbers — so they are mechanically checkable and survive moves between folders.
The active lifecycle tree is the working inventory: browse its lifecycle/class folders or search the repository. Do not add a centralized `INDEX.md`; the [no-index Agent Note](implemented/process/2026-07-19-remove-generated-agent-note-index.md) owns the rationale. Implemented records with historical decision value but little future guidance move to the separate frozen [`archived/`](archived/AGENTS.md) tree described below.
The active lifecycle tree is the working inventory: browse its lifecycle/class folders or search the repository. Do not add a centralized `INDEX.md`: it duplicates path metadata and makes unrelated note changes contend on one generated file. Implemented records with historical decision value but little future guidance move to the separate frozen [`archived/`](archived/AGENTS.md) tree described below.
## Classification
@@ -53,7 +53,7 @@ A feature-addition note may be consolidated into the later removal note only whe
## The file format
Every active Agent Note follows one in-file format, enforced by `pnpm run verify-agent-note-format` ([scripts/verify-agent-note-format.ts](../../scripts/verify-agent-note-format.ts), part of `doc-sync`); the rationale for the format — and the alternatives it rejected — is [the uniform-format Agent Note](implemented/process/2026-07-05-uniform-agent-note-format.md). Archived notes retain the format they had when sealed plus the archive-date line above.
Every active Agent Note follows one in-file format, enforced by `pnpm run verify-agent-note-format` ([scripts/verify-agent-note-format.ts](../../scripts/verify-agent-note-format.ts), part of `doc-sync`); the rationale for the format — and the alternatives it rejected — is [archived the uniform-format Agent Note](archived/process/2026-07-05-uniform-agent-note-format.md). Archived notes retain the format they had when sealed plus the archive-date line above.
### The header block
+2 -2
View File
@@ -16,7 +16,7 @@
文件名中的日期是该主题**首次提出**的时间(以 git 历史为准)。Agent Note 之间的交叉引用使用相对 Markdown 链接(`[topic](../../implemented/architecture/2026-…-….md)`),从不使用纯文字或编号,这样既可机械检查,也能在文件夹间移动时保持有效。
活跃生命周期目录树就是工作清单:浏览其生命周期/类别文件夹,或搜索仓库即可。请勿添加集中式 `INDEX.md`;设计理由见[不设索引的 Agent Note](implemented/process/2026-07-19-remove-generated-agent-note-index.zh.md)。具有历史决策价值但未来指导价值较低的已实施记录会移至下文所述、单独冻结的 [`archived/`](archived/AGENTS.md) 目录树。
活跃生命周期目录树就是工作清单:浏览其生命周期/类别文件夹,或搜索仓库即可。请勿添加集中式 `INDEX.md`:它重复路径元数据,并让无关记录的变更争用同一个生成文件。具有历史决策价值但未来指导价值较低的已实施记录会移至下文所述、单独冻结的 [`archived/`](archived/AGENTS.md) 目录树。
<a id="classification"></a>
@@ -59,7 +59,7 @@
## 文件格式
每份活跃 Agent Note 遵循统一的文件内格式,由 `pnpm run verify-agent-note-format`([scripts/verify-agent-note-format.ts](../../scripts/verify-agent-note-format.ts),`doc-sync`(文档同步门禁)的一环)强制执行;该格式的设计动机及其否决的替代方案见[统一格式 Agent Note](implemented/process/2026-07-05-uniform-agent-note-format.zh.md)。归档记录保留封存时的格式,并增加上述归档日期行。
每份活跃 Agent Note 遵循统一的文件内格式,由 `pnpm run verify-agent-note-format`([scripts/verify-agent-note-format.ts](../../scripts/verify-agent-note-format.ts),`doc-sync`(文档同步门禁)的一环)强制执行;该格式的设计动机及其否决的替代方案见[已归档的统一格式 Agent Note](archived/process/2026-07-05-uniform-agent-note-format.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-content-block-vocabulary.md
2026-06-11-content-block-vocabulary.md: ae60931f37b3c470d0a1d6ee5f074ee77f9b3c14
2026-06-11-content-block-vocabulary.zh.md: 3feed6e3ac9e7836a6e36be47fb19f346978886c
@@ -1,6 +1,7 @@
# Agent Note: Provider-neutral content-block vocabulary owned by dsh-llm
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-11-content-block-vocabulary.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 由 dsh-llm 拥有的提供方无关内容块词汇
Status: implemented
Archived: 2026-09-30
[English](2026-06-11-content-block-vocabulary.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-microkernel-event-taxonomy.md
2026-06-11-microkernel-event-taxonomy.md: 681ab6eed1dc4d8a361990e69f071b918ce297c2
2026-06-11-microkernel-event-taxonomy.zh.md: 3b7504a21be7d83969c9cee77a77c33803a41e74
@@ -1,6 +1,7 @@
# Agent Note: Microkernel — extension via Cordis event taxonomy, one concrete loop
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-11-microkernel-event-taxonomy.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 微内核——通过 Cordis 事件分类体系实现扩展,唯一具体循环
Status: implemented
Archived: 2026-09-30
[English](2026-06-11-microkernel-event-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-14-session-persistence.md
2026-06-14-session-persistence.md: 4d067d2905d764a5c0d70b0a3eae5de68cb717f4
2026-06-14-session-persistence.zh.md: 1f0f4af301a439c02fc23a1ffdc541d6bcbb24d2
@@ -1,6 +1,7 @@
# Agent Note: Session persistence as an abstract service over the existing `SessionEvent`
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-14-session-persistence.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 会话持久化作为基于现有 `SessionEvent` 的抽象服务
Status: implemented
Archived: 2026-09-30
[English](2026-06-14-session-persistence.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-generic-long-running-tool-runtime.md
2026-06-20-generic-long-running-tool-runtime.md: 7cdb72ece6ca5681ba83999dd5d95fc2c27bf318
2026-06-20-generic-long-running-tool-runtime.zh.md: bf0a5d61c0e45aa6b39c6bcd0ac71cfb9b61d43f
@@ -1,6 +1,7 @@
# Agent Note: The background job runtime (`ctx.jobs`) and generic task control tools
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-20-generic-long-running-tool-runtime.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 后台任务运行时(`ctx.jobs`)与通用任务控制工具
Status: implemented
Archived: 2026-09-30
[English](2026-06-20-generic-long-running-tool-runtime.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-21-mandatory-app-attribution-headers.md
2026-06-21-mandatory-app-attribution-headers.md: 680bd56301d80f87f13294bc7744a5de376425be
2026-06-21-mandatory-app-attribution-headers.zh.md: d9e19dbf8cf5a8f8594f25c0cd8565a7deb4b8a6
@@ -1,6 +1,7 @@
# Agent Note: Mandatory `User-Agent` attribution for provider requests
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-21-mandatory-app-attribution-headers.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 对提供方请求强制携带 `User-Agent` 归属标识
Status: implemented
Archived: 2026-09-30
[English](2026-06-21-mandatory-app-attribution-headers.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-26-file-context-as-event-gate.md
2026-06-26-file-context-as-event-gate.md: 96962f6a7260cc4da393a90349528aece3c23ce1
2026-06-26-file-context-as-event-gate.zh.md: 22fb85fc1246bb67bc0793f8cf7816b6134f11ae
@@ -1,6 +1,7 @@
# Agent Note: Make `dsh-fs-observation-policy` an event-gate plugin, not a method interface
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-26-file-context-as-event-gate.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 将 `dsh-fs-observation-policy` 改为事件门禁插件,而非方法接口
Status: implemented
Archived: 2026-09-30
[English](2026-06-26-file-context-as-event-gate.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-windows-jsonl-durable-publish.md
2026-07-05-windows-jsonl-durable-publish.md: f6be0b602d00daabdffc152508b0f8658fcb47a5
2026-07-05-windows-jsonl-durable-publish.zh.md: 136b4c92b44d53c6fbfcefc94b683c9cbbfc9597
@@ -1,6 +1,7 @@
# Agent Note: Windows-native durable JSONL publication
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-05-windows-jsonl-durable-publish.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Windows 原生持久 JSONL 发布
Status: implemented
Archived: 2026-09-30
[English](2026-07-05-windows-jsonl-durable-publish.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-08-agent-scope-contexts.md
2026-07-08-agent-scope-contexts.md: e6513e6dc5aab699ba12d028aa7985f8dc5e33af
2026-07-08-agent-scope-contexts.zh.md: bfb1dfdad882c51ea39fd701e5a6c549af9b2349
@@ -1,6 +1,7 @@
# Agent Note: The agent is a registration scope
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-08-agent-scope-contexts.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: agent 即注册作用域
Status: implemented
Archived: 2026-09-30
[English](2026-07-08-agent-scope-contexts.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-10-after-call-compaction-pressure-and-overflow-recovery.md
2026-07-10-after-call-compaction-pressure-and-overflow-recovery.md: f5b739b80022c85c9009a37de0e8b3f147f920b1
2026-07-10-after-call-compaction-pressure-and-overflow-recovery.zh.md: 303f266079e0738ed9b0c6d7a19fadce7dc77442
@@ -1,6 +1,7 @@
# Agent Note: After-call compaction pressure and context-overflow recovery
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-10-after-call-compaction-pressure-and-overflow-recovery.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 调用后压缩压力与上下文溢出恢复
Status: implemented
Archived: 2026-09-30
[English](2026-07-10-after-call-compaction-pressure-and-overflow-recovery.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-agent-scope-runtime-design.md
2026-07-12-agent-scope-runtime-design.md: dba700b99a622a2f38c964fcfe6a6fdcf877c45e
2026-07-12-agent-scope-runtime-design.zh.md: f5c12fce6b9829e4ada61eab44d49232fa5aa241
@@ -1,6 +1,7 @@
# Agent Note: Agent-scope runtime design and correctness
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-12-agent-scope-runtime-design.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Agent 作用域运行时设计与正确性
Status: implemented
Archived: 2026-09-30
[English](2026-07-12-agent-scope-runtime-design.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-16-explicit-turn-cancellation.md
2026-07-16-explicit-turn-cancellation.md: 23aaaae2d1f57a546ccbae7986c163e50f89fe24
2026-07-16-explicit-turn-cancellation.zh.md: 4ce379c84640a214be1fa9708426e15ecc25c1d4
@@ -1,6 +1,7 @@
# Agent Note: Explicit turn cancellation capability
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-16-explicit-turn-cancellation.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 显式轮次取消能力
Status: implemented
Archived: 2026-09-30
[English](2026-07-16-explicit-turn-cancellation.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-19-gui-web-client-architecture.md
2026-07-19-gui-web-client-architecture.md: f54f13869d748b68fd00bdfff23c2da49b8fdc81
2026-07-19-gui-web-client-architecture.zh.md: 4ab3639dac9d7e8916a0d3affb14bd965c11d783
@@ -1,6 +1,7 @@
# Agent Note: Web client architecture — the client cordis plugin tree, the slot system, and the React-free object layer
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-19-gui-web-client-architecture.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Web 客户端架构——client cordis 插件树、slot 体系与 React-free 对象层
Status: implemented
Archived: 2026-09-30
[English](2026-07-19-gui-web-client-architecture.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-invariant-runtime-contracts.md
2026-07-19-package-invariant-runtime-contracts.md: d0559b0379ce05aa9a5a0c30df4808e3088c840b
2026-07-19-package-invariant-runtime-contracts.zh.md: 0cfe61ee6344a4f6da73ffff22bb8a1b30f9f3a9
@@ -1,6 +1,7 @@
# Agent Note: Meaningful package invariant contracts
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-19-package-invariant-runtime-contracts.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 有意义的包不变量约定
Status: implemented
Archived: 2026-09-30
[English](2026-07-19-package-invariant-runtime-contracts.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-zstandard-jsonl-session-logs.md
2026-07-19-zstandard-jsonl-session-logs.md: 8ab55279bc94224b8b048c972bfda5c4a91a2fc8
2026-07-19-zstandard-jsonl-session-logs.zh.md: c8f1b1599c415aaec37af3f238a2a979461f855b
@@ -1,6 +1,7 @@
# Agent Note: Zstandard JSONL session logs
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-19-zstandard-jsonl-session-logs.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Zstandard JSONL 会话日志
Status: implemented
Archived: 2026-09-30
[English](2026-07-19-zstandard-jsonl-session-logs.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-canonical-tool-output-contract.md
2026-07-20-canonical-tool-output-contract.md: 1e2cdacdfa9100ca89840bb6ff0c98f07cecf8be
2026-07-20-canonical-tool-output-contract.zh.md: 6fa16a682a03a79d98278e2ffa543ec330550b9b
@@ -1,6 +1,7 @@
# Agent Note: Canonical tool output contract
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-20-canonical-tool-output-contract.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 规范工具输出约定
Status: implemented
Archived: 2026-09-30
[English](2026-07-20-canonical-tool-output-contract.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-unified-json-value-schema-dsl.md
2026-07-20-unified-json-value-schema-dsl.md: c1cc5c16f3d0e8ac65cff881a9f7b2ff51259e2a
2026-07-20-unified-json-value-schema-dsl.zh.md: 7cd7be62c47ba96914c802b208fd87640849b3eb
@@ -1,6 +1,7 @@
# Agent Note: Unified JSON-value schema DSL
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-20-unified-json-value-schema-dsl.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 统一 JSON 值 schema DSL
Status: implemented
Archived: 2026-09-30
[English](2026-07-20-unified-json-value-schema-dsl.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-24-project-session-directories.md
2026-07-24-project-session-directories.md: 92a8ea11b8150b7c60fe76ae1354c5fadddd13c9
2026-07-24-project-session-directories.zh.md: 1850f04366deb79709b2bc51db194098eab9a95e
@@ -1,6 +1,7 @@
# Agent Note: Project-grouped session directories
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-24-project-session-directories.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 按项目分组的会话目录
Status: implemented
Archived: 2026-09-30
[English](2026-07-24-project-session-directories.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-24-web-config-tree-boot-and-transport-layering.md
2026-07-24-web-config-tree-boot-and-transport-layering.md: 7f1a619796158be987e58fa718af119421e477fa
2026-07-24-web-config-tree-boot-and-transport-layering.zh.md: 6f0dc590944f3994752ef1de06de46a843fdbc94
@@ -1,6 +1,7 @@
# Agent Note: dsh web config-tree boot and the web transport layering
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-24-web-config-tree-boot-and-transport-layering.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: dsh web 的 config-tree boot 与 web 传输分层
Status: implemented
Archived: 2026-09-30
[English](2026-07-24-web-config-tree-boot-and-transport-layering.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-client-session-scope-and-provide-channel.md
2026-07-25-web-client-session-scope-and-provide-channel.md: 9afd2419c24f21b903c6e2c692cc6ee943244e07
2026-07-25-web-client-session-scope-and-provide-channel.zh.md: 2385cfc8edde2dd65291037ea6d0d18c90f720d4
@@ -1,6 +1,7 @@
# Agent Note: Web client Agent-scope parity model and the provisioning channel (agents/scope / blank reuse / provide)
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-25-web-client-session-scope-and-provide-channel.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Web client Agent-scope 对等模型与供数通道(agents/scope / blank 复用 / provide)
Status: implemented
Archived: 2026-09-30
[English](2026-07-25-web-client-session-scope-and-provide-channel.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-session-end-seed-log-boundary.md
2026-07-30-session-end-seed-log-boundary.md: d7025aac7a69ffafd4f64a2f73d202e7107452b2
2026-07-30-session-end-seed-log-boundary.zh.md: 5c6227c5866b8a12506709726a1a0f93a8a6dcdc
@@ -1,6 +1,7 @@
# Agent Note: the end-seed log boundary
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-30-session-end-seed-log-boundary.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 种子结束日志边界
Status: implemented
Archived: 2026-09-30
[English](2026-07-30-session-end-seed-log-boundary.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-31-claimed-pre-step-inbox-lifecycle.md
2026-07-31-claimed-pre-step-inbox-lifecycle.md: 1f5d06b7314e1433880e17cc370a842b153fe287
2026-07-31-claimed-pre-step-inbox-lifecycle.zh.md: f31790826ea3464ab519a5b21084834390075526
@@ -1,6 +1,7 @@
# Agent Note: Claim inbox input before one pre-step decision
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-31-claimed-pre-step-inbox-lifecycle.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 在单一 pre-step 决策前领取 inbox 输入
Status: implemented
Archived: 2026-09-30
[English](2026-07-31-claimed-pre-step-inbox-lifecycle.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-08-04-draft-provider-endpoint-interrogation.md
2026-08-04-draft-provider-endpoint-interrogation.md: d6de95d91b4c045d4eca793ca7190f6d148888d4
2026-08-04-draft-provider-endpoint-interrogation.zh.md: eb72884a7119db36549d64a613a5f9d927a1d30a
@@ -1,6 +1,7 @@
# Agent Note: Interrogating a draft provider endpoint
Status: implemented
Archived: 2026-09-30
English | [中文](2026-08-04-draft-provider-endpoint-interrogation.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 询问草稿中的提供方端点
Status: implemented
Archived: 2026-09-30
[English](2026-08-04-draft-provider-endpoint-interrogation.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-08-10-remote-event-delivery.md
2026-08-10-remote-event-delivery.md: c5c68db6e280dcd10344d019d7f961bd0530f965
2026-08-10-remote-event-delivery.zh.md: 86c1321fd153ea0e062193f95e31aafbf0dd6c46
@@ -1,6 +1,7 @@
# Agent Note: Remote event delivery (`ctx.remote.$on`)
Status: implemented
Archived: 2026-09-30
English | [中文](2026-08-10-remote-event-delivery.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Remote 事件投递(ctx.remote.$on)
Status: implemented
Archived: 2026-09-30
[English](2026-08-10-remote-event-delivery.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-08-18-experimental-agent-teams-packages.md
2026-08-18-experimental-agent-teams-packages.md: 358eec1f0d51286fe1bfb8b6b7ab71a858c26bef
2026-08-18-experimental-agent-teams-packages.zh.md: f511a2b5ae5560d8cae0f5925e67b7ea00da49c3
@@ -1,6 +1,7 @@
# Agent Note: Publish Agent Teams under experimental package names
Status: implemented
Archived: 2026-09-30
English | [中文](2026-08-18-experimental-agent-teams-packages.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 以实验性包名发布 Agent Teams
Status: implemented
Archived: 2026-09-30
[English](2026-08-18-experimental-agent-teams-packages.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-08-28-subprocess-native-containment.md
2026-08-28-subprocess-native-containment.md: ea47118fa7da79bc56bfdba9fe08eb91d04c6a51
2026-08-28-subprocess-native-containment.zh.md: 750315d4b406cd0a802b91314e4cd4a77a19a99e
@@ -1,6 +1,7 @@
# Agent Note: Native owners contain escaped subprocess descendants
Status: implemented
Archived: 2026-09-30
English | [中文](2026-08-28-subprocess-native-containment.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 原生 owner 收容逃逸的 subprocess 后代
Status: implemented
Archived: 2026-09-30
[English](2026-08-28-subprocess-native-containment.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-09-01-jobs-absorb-activity-record.md
2026-09-01-jobs-absorb-activity-record.md: e5543737155cc75f62485d8b125a7fa178e63ca0
2026-09-01-jobs-absorb-activity-record.zh.md: 1f6e283c7924e2a30cc6f617396e4e0c9852e7e0
@@ -1,6 +1,7 @@
# Agent Note: The job registry absorbs the observation record; the standalone activity seam is removed
Status: implemented
Archived: 2026-09-30
Superseded: the record declaration (`JobStart.record`, `RecordingJob`, `readRecord`, `pumpJobOutput`) and the split wire (`SessionJob.record` on the session control stream, `ctx.jobOutput`) described below were consolidated into one output ring and direct operations on `ctx.jobs` — see [the jobs seam consolidation](2026-09-03-jobs-seam-consolidation.md). The argument for absorbing the standalone activity seam into `ctx.jobs` still holds.
@@ -1,6 +1,7 @@
# Agent Note:job 注册表吸收观测 record;独立的 activity seam 被移除
Status: implemented
Archived: 2026-09-30
Superseded:下文描述的 record 声明(`JobStart.record`、`RecordingJob`、`readRecord`、`pumpJobOutput`)与拆分的线路(会话控制流上的 `SessionJob.record`、`ctx.jobOutput`)已收敛为一个输出环与 `ctx.jobs` 上的直接操作——见 [jobs seam 收敛](2026-09-03-jobs-seam-consolidation.zh.md)。把独立 activity seam 吸收进 `ctx.jobs` 的论证仍然成立。
@@ -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-09-02-projcache-cross-version-read-compat.md
2026-09-02-projcache-cross-version-read-compat.md: 22722e7bb41c2d06ffbdf433aad10a9647abce3f
2026-09-02-projcache-cross-version-read-compat.zh.md: a928c40bfa6d294b2ed927a381528ccc260692ea
@@ -1,6 +1,7 @@
# Agent Note: Projection-cache predecessor recovery and Session-format binding (session_projcache v3-v6 → v7)
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-02-projcache-cross-version-read-compat.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 投影缓存前代恢复与 Session 格式绑定(session_projcache v3-v6 → v7)
Status: implemented
Archived: 2026-09-30
[English](2026-09-02-projcache-cross-version-read-compat.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-09-05-package-manifest-types.md
2026-09-05-package-manifest-types.md: 63c2dd833508d2246ba818b584eabe5c02846c07
2026-09-05-package-manifest-types.zh.md: 794983e05b914705eb431d204470cd67d512fab4
@@ -1,6 +1,7 @@
# Agent Note: Package manifest declaration ownership
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-05-package-manifest-types.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Package manifest 声明归属
Status: implemented
Archived: 2026-09-30
[English](2026-09-05-package-manifest-types.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-09-05-sidebar-tab-types-and-navigation.md
2026-09-05-sidebar-tab-types-and-navigation.md: a2eaed465332d1dc9adc4a770554ecac69535920
2026-09-05-sidebar-tab-types-and-navigation.zh.md: 60d0fc9ae20e6e234939a2cf45233a5c6bd602e9
@@ -1,6 +1,7 @@
# Agent Note: Right Sidebar tab types and navigation
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-05-sidebar-tab-types-and-navigation.zh.md)
@@ -72,7 +73,7 @@ interface SidebarRightTabParamsMap {} // key: kind — a page type declar
`openResource` accepts the union of every declared resource shape and `openTab<K>` the shape declared for `K`; a body narrows `navigation.params` by the protocol or kind it knows it serves. Parameters belong to the resource type rather than to the viewer because a line number is a fact about a file location, not about the text preview, and any type that claims `file` addresses receives the same shape. Values must be JSON-serializable, and a record must be rebuildable from address and parameters alone, because undo, redo, reload, and HMR rebuild tabs after the opener is gone.
Beside the two opens, the face carries `close(tabId)`, `active()`, `isExpanded()`, `toggleExpanded()`, and four operational methods — `focus(tabId)`, `split(paneId?)` (returning the new pane, or `undefined` when the pane budget or the width rule forbids the split, recording nothing), `float(tabId, rect?)`, and `dock(paneId)` — each recording one history entry and a no-op on a missing target or one already in the requested state. There is no layout snapshot, no subscription, and no lookup by address: the face grants control over the layout, not a view of it. The seat publishes its binding — its session, its store's actions, and its surface — while mounted; a command on the public face acts on the mounted session and throws with no mounted session surface. A tab's own actions reach their session's own store instead: the slot runtime mints one store per session, the plugin adopts each as it is minted, and the controller routes by session id, so an action fired after the user switched sessions still lands, and does nothing for a session whose store was never minted.
Beside the two opens, the face carries `close(tabId)`, `active()`, `isExpanded()`, `toggleExpanded()`, and four operational methods — `focus(tabId)`, `split(paneId?)` (returning the new pane, or `undefined` when the pane budget or the width rule forbids the split, recording nothing), `float(tabId, rect?)`, and `dock(paneId)` — each recording one history entry and a no-op on a missing target or one already in the requested state. There is no layout snapshot, no subscription, and no lookup by address: the face grants control over the layout, not a view of it. The plugin names the Session on screen — the selected Session while the Conversation fills the main column — from the Session selection and the main panel, before React renders either change, and publishes it as `mounted`; a command on the public face acts on that Session through its adopted store and throws when no Session is on screen or its store has not been minted. The seat reports only what it renders with: the room its docking kit measured and whether its frame width presents the panel fullscreen automatically. A tab's own actions reach their session's own store instead: the slot runtime mints one store per session, the plugin adopts each as it is minted, and the controller routes by session id, so an action fired after the user switched sessions still lands, and does nothing for a session whose store was never minted.
### Addresses
@@ -100,6 +101,8 @@ The conversation's `openFile(path, { line? })` — tool-row path links, produced
**Slot priorities to express an extension taking over a builtin, then registry-minted slot keys.** The first attempt had the overriding type register its body at a lower slot priority through an exported constant — a value import across dynamic plugins, and a second rule system (slot priority) standing in for the registry's. The second attempt had the registry mint a key per registration and return it from `register()`, which made registration a two-step dance whose ordering mattered. Letting the implementation declare its own `id` — required, unique, the same string it registers its seats under — needs no constant, no minting, and no ordering, and gives the registry the identity it needs to reject duplicates.
**A binding the seat publishes from its own effects.** The first form had the mounted seat publish its session, actions, and surface after each commit and release them when it left. React runs a commit's passive effects in tree order, and the frame renders the Conversation column before the right column, so in a commit that switched Sessions or returned from a global panel a Conversation component opening content from its effect ran while no seat was bound — after the departing seat's release and before the arriving seat's bind — and the open threw. The Session selection and the main panel change before React renders, so deriving the on-screen Session from them removes that ordering dependency. The seat still measures pane room, because only its rendered kit can.
## Consequences
- A type is one static object plus one or two keyed seat registrations; its occurrence information is read through injected `useTabInfo()`. The framework grows no per-type API surface, and a type shipped from outside this repository imports only types from the Sidebar package.
@@ -116,5 +119,5 @@ The conversation's `openFile(path, { line? })` — tool-row path links, produced
## Deferred
- A navigation protocol beyond `sidebar://<kind>`: sub-routes within a page, naming an implementation, and the ecosystem-facing rules for other navigation schemes.
- Opening into a session other than the one on screen from the public face, which acts on the mounted session only; a tab's own actions already act on their tab's session.
- Opening into a session other than the one on screen from the public face, which acts on the on-screen Session only; a tab's own actions already act on their tab's session.
- A localized message when an open fails from the conversation; the failure is currently the thrown error's text.
@@ -1,6 +1,7 @@
# Agent Note: 右侧 Sidebar 的 tab 类型与导航
Status: implemented
Archived: 2026-09-30
[English](2026-09-05-sidebar-tab-types-and-navigation.md) | 中文
@@ -72,7 +73,7 @@ interface SidebarRightTabParamsMap {} // key: kind — a page type declar
`openResource` 接受所有已声明资源形状的联合,`openTab<K>` 接受为 `K` 声明的形状;正文按自己所服务的协议或 kind 收窄 `navigation.params`。参数属于资源类型而非查看器,因为行号是关于文件位置的事实,不是关于文本预览的,任何认领 `file` 地址的类型收到同一形状。值必须可 JSON 序列化,一条记录必须只凭地址与参数就能重建,因为撤销、重做、刷新与 HMR 都在开启方已不在时重建 tab。
除两种打开外,该面还有 `close(tabId)`、`active()`、`isExpanded()`、`toggleExpanded()`,以及四个操作型方法——`focus(tabId)`、`split(paneId?)`(返回新格,预算或宽度规则不允许分栏时返回 `undefined` 且不记账)、`float(tabId, rect?)` 与 `dock(paneId)`——每个记一条历史,目标不存在或已在目标态时为 no-op。没有布局快照、没有订阅、没有按地址查找:该面给的是对布局的控制权,不是布局的视图。座位挂载期间发布其绑定——自己的会话、其 store 的 action 与其面;公开面上的命令作用于已挂载会话,没有已挂载会话面时抛错。tab 自己的动作则到达其会话自己的 store:slot 运行时每个会话铸一个 store,插件在铸出时逐个收养,控制器按会话 id 路由,因此用户切换会话之后触发的动作照样落地,而 store 从未铸出的会话什么也不做。
除两种打开外,该面还有 `close(tabId)`、`active()`、`isExpanded()`、`toggleExpanded()`,以及四个操作型方法——`focus(tabId)`、`split(paneId?)`(返回新格,预算或宽度规则不允许分栏时返回 `undefined` 且不记账)、`float(tabId, rect?)` 与 `dock(paneId)`——每个记一条历史,目标不存在或已在目标态时为 no-op。没有布局快照、没有订阅、没有按地址查找:该面给的是对布局的控制权,不是布局的视图。插件依据会话选择与主面板确定屏上会话——Conversation 占据主栏时的选中会话——并在 React 渲染这两者的变化之前将其发布为 `mounted`;公开面上的命令经该会话被收养的 store 作用于它,没有会话在屏上或其 store 尚未铸出时抛错。座位只上报它渲染时依据的事实:停靠套件测得的空间,以及框架宽度是否让面板自动全屏。tab 自己的动作则到达其会话自己的 store:slot 运行时每个会话铸一个 store,插件在铸出时逐个收养,控制器按会话 id 路由,因此用户切换会话之后触发的动作照样落地,而 store 从未铸出的会话什么也不做。
### 地址
@@ -100,6 +101,8 @@ interface SidebarRightTabParamsMap {} // key: kind — a page type declar
**用 Slot 优先级表达 extension 接管 builtin,随后是注册表铸造的坑位键。** 第一次尝试让覆盖方经一个导出常量以更低的 Slot 优先级注册正文——这是动态插件间的值引用,也是拿第二套规则(Slot 优先级)替注册表的规则站台。第二次尝试让注册表为每次注册铸一个键并从 `register()` 返回,这把注册变成了两步且顺序敏感的舞步。让实现自己声明 `id`——必填、唯一、与它注册坑位所用的同一个串——既不需要常量,也不需要铸键与顺序,还给了注册表拒绝重复所需的身份。
**由座位在自己的 effect 里发布绑定。** 最初的形式由已挂载的座位在每次提交后发布自己的会话、action 与面,离开时释放。React 按树序运行一次提交的被动 effect,而框架先渲染 Conversation 列、后渲染右栏,于是在切换会话或从全局面板返回的那次提交里,从自己 effect 打开内容的 Conversation 组件运行时没有任何座位已绑定——在离开的座位释放之后、到来的座位绑定之前——打开随之抛错。会话选择与主面板都在 React 渲染之前变化,从它们推导屏上会话便消除了这一顺序依赖。分栏空间仍由座位测量,因为只有它渲染出的套件能测。
## Consequences
- 一个类型 = 一个静态对象 + 一到两个 keyed 坑位注册;其实例信息通过注入的 `useTabInfo()` 读取。框架不长任何按类型的 API 面,仓外类型从 Sidebar 包只引类型。
@@ -116,5 +119,5 @@ interface SidebarRightTabParamsMap {} // key: kind — a page type declar
## Deferred
- `sidebar://<kind>` 之外的导航协议:页内子路由、点名实现、以及面向生态的其它导航 scheme 规则。
- 从公开面往屏上会话之外的会话里打开;公开面只作用于已挂载的会话,而 tab 自己的动作已作用于其所在会话。
- 从公开面往屏上会话之外的会话里打开;公开面只作用于屏上会话,而 tab 自己的动作已作用于其所在会话。
- 从会话区打开失败时的本地化提示;目前是抛错文本本身。
@@ -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-09-06-embedded-stream-record-readers.md
2026-09-06-embedded-stream-record-readers.md: 88a15f50f8d122676b1b5d2c7df39aa7b7e7b331
2026-09-06-embedded-stream-record-readers.zh.md: a66dbc69c788a05569859de7de4bc43b985183ff
@@ -1,6 +1,7 @@
# Agent Note: Embedded Assistant stream consumers read compact records
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-06-embedded-stream-record-readers.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 内嵌 Assistant 流的消费方直接读取紧凑记录
Status: implemented
Archived: 2026-09-30
[English](2026-09-06-embedded-stream-record-readers.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-09-07-sidebar-responsive-tab-info.md
2026-09-07-sidebar-responsive-tab-info.md: e47ad9cd1a9b24b783d5acec780f0a2af6303727
2026-09-07-sidebar-responsive-tab-info.zh.md: d2e3c84b76ffad6f52f7db1d13158ed51e3d5624
@@ -1,6 +1,7 @@
# Agent Note: Responsive Sidebar and injected tab information
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-07-sidebar-responsive-tab-info.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 响应式 Sidebar 与注入的标签信息
Status: implemented
Archived: 2026-09-30
[English](2026-09-07-sidebar-responsive-tab-info.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-09-07-workspace-files-dual-face-package.md
2026-09-07-workspace-files-dual-face-package.md: dbefb894291ac7c0b3e7847c75a7bd4d19c19d3e
2026-09-07-workspace-files-dual-face-package.zh.md: c10a46736982a2b326bcedae11723feef6871476
@@ -1,6 +1,7 @@
# Agent Note: Workspace files as one dual-face API package
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-07-workspace-files-dual-face-package.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 工作区文件统一为 API 双面包
Status: implemented
Archived: 2026-09-30
[English](2026-09-07-workspace-files-dual-face-package.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-09-08-global-main-panels.md
2026-09-08-global-main-panels.md: 86336e694ea89bcb219b1fb927f92a5c72ee2630
2026-09-08-global-main-panels.zh.md: 89743b456c7aad101705c2d9264e63449222b29a
Loaded 100 of 8599 files, more files were not shown because too many files have changed in this diff. Show more