Compare commits

...
Author SHA1 Message Date
imccyu 687f282e86 Merge pull request #6408 from deepseek-harness/worktree/release-dsh-0.2.1-rc.2
release: next version [email protected]
2026-10-17 15:22:43 +08:00
imccyu d1b9c04067 release(dsh): 0.2.1-rc.2 2026-10-17 15:10:31 +08:00
Yudong HanandLegGasai fda98dadd2 feat(web): add DeepSeek Search and Fetch APIs behind a settings switch (#6103)
* fix(web-search-deepseek): disable thinking for auxiliary search requests

The provider discards the generated text of the auxiliary Messages turn,
so reasoning tokens have no consumer. DeepSeek enables thinking by default,
which adds latency and output tokens to every search.

Fixes #6099.

* feat(web): add opt-in traditional Search and Fetch APIs

* test(web): verify API settings persistence and refresh Session evidence

* fix(web): require an explicit Search API base with its route prefix

* docs(web): document direct Search and Fetch API decisions

* fix(web): keep Messages search default behind the new Web Search API switch

- Rename useTraditionalApi/traditionalBaseURL to useSearchApi/searchApiBaseURL and
  label the switch "Use the new Web Search API"; Messages search stays the default.
- Default the Search / Fetch API base to https://api.deepseek.com/v1/tools.
- Authenticate the Search API with an API key only: DeepSeek Account tokens
  returned an empty HTTP 404 on /v1/tools/* when probed on 2026-10-16.
- Remove the count setting, which tool-web's maxResults always overrides, and
  the undocumented DeepSeek-API-Version header.
- Name the active API's base URL field and the current settings path in
  endpoint guidance; re-record the endpoint guidance Session.
- Keep WebFetchResult.statusCode required: DeepSeek Fetch reports HTTP 200 and
  drops the page title, so the fetch-metadata widening and its upgrade guide
  are removed.

* fix(web): accept account sign-in on the live Search API

The public Search and Fetch routes went live on 2026-10-16 and accept the
DeepSeek Account token, so account-route Sessions send it to the Search API
as they do for Messages search, and the settings copy no longer says account
sign-in does not apply.

Record the live behavior in the README and Agent Note: summaries of
1,000-2,300 characters, an HTTP 500 for an unresolvable Fetch target, and
migration notes for gateways without /v1/tools routes. Test doubles now use
the live response fields and RFC 3339 offsets.

* feat(web): configure Search API result count and send the triggering question

- Add web-search-deepseek.count (1-50, default 10, the service default) and
  show it as "Results per search" in Search API mode, where "Max searches per
  request" applies only to Messages; a smaller request maxResults still wins.
- Send the initiating Session's latest human prompt as ori_question, with
  whitespace collapsed and cut to the API's 128-character limit; blank or
  absent prompts omit it, and sendOriginalQuestion: false disables it. The
  settings hint states that the question is sent.
- Match the web search double on the request's query field, since
  ori_question now carries every query in the prompt.

* fix(client): unify web search endpoint override controls

* feat(web): configure registered search and fetch providers through shared settings

* feat(web): include Exa and Perplexity in provider settings

* test(web): cover provider settings branches and refresh plugin snapshots

* revert(web): drop the provider dropdown, schema-driven form, and Exa/Perplexity settings

Revert aed8c5cb609, d88c47dcd80, and 036a5a337d3. The Web search settings
page returns to the DeepSeek toggle; the DeepSeek Search and Fetch API split
is reintroduced as one plugin in the following commit.

* feat(web): move the DeepSeek Search and Fetch APIs into web-deepseek-api

The new web-deepseek-api plugin registers deepseek-search-api and
deepseek-fetch-api over one credential and API base, and exports the
authentication and redirect-rejecting transport that web-search-deepseek now
reuses for Messages search only. The web service reads searchProvider and
fetchProvider for each operation, so the Web search settings switch selects
both APIs together on save and restores Messages search with local HTTP fetch
when turned off. The switch hint links to the DeepSeek search and fetch guide.

* refactor(client): keep the web search endpoint fields on the shared override controls

Drop the always-visible reset and the inherited-address placeholder from the
Web search page, restoring ui-primitives to its base. Each endpoint field shows
the selected section's effective value and offers Reset to default only for an
override, like every other settings field.

* refactor(web): keep Messages search independent of web-deepseek-api

Restore dsh-web-search-deepseek to its own credential and transport code,
keeping only the disabled-thinking request and the current settings guidance,
so the Messages plugin no longer depends on the Search and Fetch API package.
dsh-web-deepseek-api keeps its transport internal; the regions that repeat the
Messages helpers carry jscpd:ignore markers, with the rationale recorded in the
Search and Fetch API Agent Note.

* refactor(web): keep the web-deepseek-api request type module-private

---------

Co-authored-by: LegGasai <[email protected]>
2026-10-17 15:08:08 +08:00
Yichen Jiang ca15fe4f17 Merge pull request #6417 from deepseek-harness/worktree/deepseek-flash-1017-badge
feat(web): replace the DeepSeek Flash suffix with a temporary badge
2026-10-17 13:54:15 +08:00
Yichen Jiang 3c937cd0ba feat(web): display a temporary 1017 badge for DeepSeek Flash 2026-10-17 13:33:35 +08:00
Yichen Jiang 32efe36a4e revert: restore the bundled DeepSeek Flash display name 2026-10-17 13:23:06 +08:00
Yichen Jiang c6acc07232 Merge pull request #6406 from deepseek-harness/worktree/deepseek-flash-1017
fix(llm): append 1017 to the bundled DeepSeek Flash display name
2026-10-17 09:23:32 +08:00
Yichen Jiang 9404cd1790 Merge branch 'master' into worktree/deepseek-flash-1017 2026-10-17 09:13:01 +08:00
Yichen Jiang 7d844abc87 fix(llm): append 1017 to the bundled DeepSeek Flash display name 2026-10-17 09:06:36 +08:00
imccyu 1600d8a1e1 Merge pull request #6387 from deepseek-harness/worktree/release-dsh-0.2.1-rc.1
release: next version [email protected]
2026-10-16 21:46:57 +08:00
imccyu c6e89e6755 release(dsh): 0.2.1-rc.1 2026-10-16 21:39:18 +08:00
imccyu ca912356fb Merge pull request #6388 from deepseek-harness/worktree/release-vendor-4.0.5
release(vendor): prepare cordis 4.0.5 stable packages
2026-10-16 21:19:31 +08:00
imccyu d9c04d6cc6 release(vendor): cordis 4.0.5, cosmokit 1.8.6, group 1.0.5, hmr 1.0.20, include 1.0.10, loader 1.0.6, logger-console 1.0.5, schemastery 3.18.5, timer 1.1.7 2026-10-16 20:53:44 +08:00
imccyu 1517a4dbca Merge pull request #6327 from deepseek-harness/worktree/release-dsh-0.2.1-alpha.5
release: next version [email protected]
2026-10-16 19:02:34 +08:00
imccyu a5e553a5ee Merge branch 'master' into worktree/release-dsh-0.2.1-alpha.5 2026-10-16 18:44:50 +08:00
lsdsjy 5ee0f50811 Merge pull request #6384 from deepseek-harness/feat/account-notice-stack
feat(account): 支持通用通知字段和多通知层叠展示
2026-10-16 18:40:03 +08:00
lsdsjy 00a1155f5a test(account): 修复通知动画测试的类型感知 lint 2026-10-16 18:26:26 +08:00
lsdsjy da6c16747e fix(account): 平滑过渡不同高度的通知卡片 2026-10-16 18:21:04 +08:00
Yichen Jiang 29a497ee5c Merge pull request #6357 from deepseek-harness/worktree/model-label-slot
feat(web): add provider-aware model label slot
2026-10-16 18:12:40 +08:00
lsdsjy 474d7b7989 docs(account): 同步通知元数据类型依赖图 2026-10-16 18:04:16 +08:00
lsdsjy 1f312b6282 fix(account): 保留未校验的通知元数据 2026-10-16 17:58:20 +08:00
lsdsjy 6ac5c103db fix(account): 修复通知空标题和过期队首处理 2026-10-16 17:52:44 +08:00
lsdsjy 2dcd031a8e feat(account): 支持通用通知字段和多通知层叠展示 2026-10-16 17:14:42 +08:00
Yichen Jiang f87c08950a fix(web): memoize model label providers 2026-10-16 16:34:19 +08:00
imccyu 0a49d91bb2 release: setup next release version for [email protected] 2026-10-16 16:17:09 +08:00
Yichen Jiang 1b385d6e2a fix(web): keep model menu positioning local 2026-10-16 16:01:04 +08:00
imccyu e28419f15b Merge pull request #6353 from deepseek-harness/fix/sidebar-pageup-shift
fix(web): clip the collapsed right sidebar so PageUp cannot shift the frame
2026-10-16 15:49:54 +08:00
fz d614ae2769 Merge pull request #6348 from deepseek-harness/fix/ptc-prompt-alignment
fix(prompts): restore compatible PTC guidance and SDK persona
2026-10-16 15:48:04 +08:00
fz 839bd5131d refactor(tools): compose PTC instructions without prose replacement
Pass execution-specific phrases directly to the run_code flavor factory and render SDK instructions from explicit program-format branches. Keep all emitted text byte-identical while removing coupling to exact shared prose. Validate the owning tests with full scoped coverage, focused session/SDK replays, and a complete build.
2026-10-16 15:30:12 +08:00
fz c34a107428 test(sdk): apply cache E2E retry settings and expose provider failures
Set the required normal retry mode so the Loader accepts the full provider patch, and type-check the policy before JSON serialization. Assert the effective request settings and successful warm-up turns, report failed attempt causes immediately, and inherit suite retries for transient external API failures.
2026-10-16 15:16:35 +08:00
Yichen Jiang c78f3fd33d fix(web): keep model label menus inside the viewport 2026-10-16 15:16:21 +08:00
Yichen Jiang 919aa5f400 feat(web): add provider-aware model label slot 2026-10-16 14:24:47 +08:00
Shigma 1a33461f2b Merge pull request #6182 from deepseek-harness/docs/cordis-rc11-plan
docs(cordis): Cordis rc.11 vendor upgrade plan
2026-10-16 14:23:05 +08:00
imccyu 8953554b5e fix(web): clip the collapsed right sidebar so PageUp cannot shift the frame
While the right sidebar is collapsed, its docked hosts are translated past
the frame's right edge and widen the frame's scrollable overflow. Outside
macOS, PageUp in a text field moves the caret and reveals it against the
start edge of every scrollable ancestor, so the `overflow: hidden` frame
scrolled sideways and the whole UI shifted left.

Clip the panel's overflow. `overflow: clip` does not make the panel a scroll
container and does not clip the fixed-position floating panels, whose
containing block is the viewport; the DockLayout ancestor contract now says so.

Fixes #6341
2026-10-16 14:21:08 +08:00
fz d6adc5d9b9 fix(prompts): restore compatible PTC guidance and SDK persona 2026-10-16 13:14:24 +08:00
imccyu 085f3c6a58 Merge pull request #6339 from deepseek-harness/ci/master-baseline-canary-1016
test(web): keep page timers running under the pinned fixture day
2026-10-16 12:41:53 +08:00
imccyu 4cea5c36d2 test(web): sweep the Host clock distance in the pinned-clock regression
The page clock failure depended on the real-to-fixture distance modulo
2^32 ms, so a regression run on today's date alone passes against the old
fixture for half of every period. The test now shifts the Host clock across
eight phases of that period; the page.clock fixture fails every phase,
either with stopped page timers or with a Date that does not advance.
2026-10-16 12:23:10 +08:00
imccyu 81803f7ca5 test(web): keep page timers running under the pinned fixture day
pinHostClock replaces Date.now in the Vitest worker, where Playwright's
server also runs. page.clock.setFixedTime therefore recorded the fixture
day, and after a navigation the page clock replayed the gap to the real
day. The resulting negative timer delay was truncated to a 32-bit integer
and, from 2026-10-15T13:45:20Z, became a delay of weeks that stopped every
page timer, failing the steering and seeded-history suites.

pinBrowserClock now replaces only the page's Date so it reads the fixture
day while native timers and animation frames keep their real schedule; a
regression test navigates twice with both clocks pinned.
2026-10-16 12:07:47 +08:00
winewill 3f621c65c3 Merge pull request #6281 from deepseek-harness/feat/windows-runner-supervision
feat(desktop): supervise Windows runner and reject debug publications early
2026-10-16 10:47:39 +08:00
Yichen Jiang e412760f94 Merge pull request #6275 from deepseek-harness/fix/skill-menu-plugin-change
fix(ui-skill): 开关插件后刷新 `/` 菜单的 skill 列表
2026-10-16 10:38:32 +08:00
Yichen Jiang 2d7f15a644 Merge pull request #6304 from deepseek-harness/worktree/terminal-session-list
fix(web): share terminal discovery per session
2026-10-15 22:42:21 +08:00
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
gengruilin ba392ae0e7 docs(ui-skill): record the catalog gaps a plugin change leaves
State why every plugin manager operation drops every cached catalog, and
list two remaining gaps among the known limitations: on-disk SKILL.md
changes forward no event to an open session, and draft skill highlighting
waits for the next catalog fetch after an invalidation.
2026-10-15 20:17:59 +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
Yichen Jiang 0ae278b935 fix(web): share terminal discovery per session 2026-10-15 20:12:52 +08:00
imccyu f2235d6c02 release(dsh): 0.2.1-alpha.4 2026-10-15 20:00:58 +08:00
winewill b8f8abc5d6 fix(desktop): publish to administratively unversioned COS buckets 2026-10-15 18:19:27 +08:00
winewill af66022ace fix(desktop): default Windows packaging to signed 2026-10-15 17:52:13 +08:00
winewill 5e23825f15 fix(desktop): reject debug publications early and harden runner supervision 2026-10-15 17:40:38 +08:00
winewill cfa52b0bac feat(infra): supervise Windows packaging runner with Task Scheduler 2026-10-15 17:19:42 +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
gengruilin 6910cd6e9c fix(ui-skill): refresh the slash menu after plugin manager changes
The browser skill source cached each Session's catalog until a preset
switch or connection reset, so an open Session kept listing the skills of
a plugin switched off on the Plugins page and missed those of a plugin
switched on. Clear every cached catalog on the forwarded
plugin-manager/changed event, which the Host emits after the operation's
reload.

Fixes #6268
2026-10-15 16:36:30 +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
Shigma c0bf2ac81d docs(cordis): plan the staged rc.11 vendor upgrade 2026-10-14 14:28:16 +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
imccyu 4878cdabd8 release(dsh): 0.2.0-rc.1 (#5387) 2026-09-28 19:48:10 +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
Turtle 805cb207be fix(webworker): open config files and load plugin manager in the preview (#5375)
* fix(webworker): load plugin manager and HMR in the preview Worker

The Worker disabled both rows, which left Creator mode's
tool-plugin-manager waiting for its service and the Plugins page without
a manageable profile. Only package commands are unavailable; the
services load. The Worker provides appReady from its own readiness
promise, resolved once the tunnel serves, and its process shim reports
no entry script, so HMR keeps only its profile configuration watches.

Fixes #5372

* fix(webworker): show xdg-open text files in a preview viewer

The Worker implements xdg-open as a platform executable that sends one
VFS text file to the page, which shows it in a read-only modal dialog.
Settings' "Open configuration file" now opens the profile patch in the
preview instead of failing on a missing desktop opener.

Fixes #5371
2026-09-28 19:29:45 +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
Ziya 5e19099593 Merge pull request #5356 from deepseek-harness/copy/preview-notice-0.2
fix(web): 更新 0.2 中英文预览版说明
2026-09-28 03:37:01 -07: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
Tianyi Cui 4094b8622e Merge pull request #5299 from deepseek-harness/test/oxlint-contract-fix-retry-budget-20260927
test(lint): bound every process-spawning oxlint contract case at 90s
2026-09-28 18:03:54 +08:00
Huanqi Cao eb1a903a45 Merge pull request #5203 from deepseek-harness/windows-sandbox-acl-diagnosis
feat(sandbox-windows-acl): ship a diagnosis skill for ACL denials
2026-09-28 17:58:46 +08:00
imccyu 1ae8857842 Merge pull request #5368 from deepseek-harness/pr-5346-snapshot-refresh
style(client): 统一扫光动画 & 调整聊天过程间距
2026-09-28 17:57:04 +08:00
turtle1999 7ded036fdb feat(web): add Session Log upload preference in General settings (#5337) 2026-09-28 17:55:03 +08:00
Tianyi Cui 5f782ebf12 Merge pull request #5291 from deepseek-harness/fix/document-preview-selection-20260927
test(web): move the spreadsheet selection by keyboard before sidebar reflows
2026-09-28 17:52:39 +08:00
creatixchu 22a5a41d0c docs(cua): remove the deferred bundle from the base module graph 2026-09-28 17:49:45 +08:00
ZiyaZhang 4374c2040a fix(web): apply revised 0.2 preview notice copy 2026-09-28 02:45:16 -07:00
creatixchu ecd2f24da0 test(cua): cover saved grants and denied handles on every platform 2026-09-28 17:45:14 +08:00
yixiangihsiangandimccyu 6dd319ad5a test(web): align completed turn spacing
Co-authored-by: imccyu <[email protected]>
2026-09-28 17:18:32 +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
yixiangihsiangandimccyu 4be290f4d8 test(client): align shimmer and spacing assertions
Co-authored-by: imccyu <[email protected]>
2026-09-28 17:09:23 +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
Yudong Han 447471d34d fix(windows): keep dialogs and floating panels clear of the caption (#5268)
* fix(dockkit): keep floating headers below the Windows caption

* fix(windows): preserve caption gaps across dialogs and fullscreen

* fix(client): unify overlay clearance and preserve the Windows caption

* docs(desktop): explain fullscreen IPC platform guard
2026-09-28 17:05:05 +08:00
creatixchu 40047a4577 test(cua): cover consent independently of permission-page controls 2026-09-28 17:02:57 +08:00
imccyu 00c179c1da Merge pull request #5359 from deepseek-harness/fix/layout-resolution-cost
fix(ci): decide the dual-release install layout by graph scale
2026-09-28 16:59:58 +08:00
yudshj df82661082 docs(desktop): explain fullscreen IPC platform guard 2026-09-28 16:55:49 +08:00
yudshj 3adf561295 fix(client): unify overlay clearance and preserve the Windows caption 2026-09-28 16:55:49 +08:00
yudshj 1aea67a755 fix(windows): preserve caption gaps across dialogs and fullscreen 2026-09-28 16:55:48 +08:00
creatixchu 15332e42e6 refactor(cua): keep manual provider and application consent in base layer 2026-09-28 16:53:29 +08:00
Yudong Han ce6af05c0a fix(dockkit): keep floating headers below the Windows caption 2026-09-28 16:52:04 +08:00
yixiangihsiangandimccyu ae9a455bfd feat(client): unify process row shimmer
Co-authored-by: imccyu <[email protected]>
2026-09-28 16:48:53 +08:00
yixiangihsiangandimccyu aad6053316 style(chat): tighten process row spacing
Co-authored-by: imccyu <[email protected]>
2026-09-28 16:48:25 +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
Chinesezjc 903bfa55c6 Merge pull request #5339 from deepseek-harness/fix/task-manager-detail-close-race
test(client): wait for the task detail close after a successful retry
2026-09-28 16:33:23 +08:00
imccyu 3366973eea Merge pull request #5357 from deepseek-harness/turtle/config-inherited-compose
perf(settings): reuse composition for unoverridden entries
2026-09-28 16:30:50 +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
Chinesezjc 30a9770a58 docs(ci): correct the budget note's measurements and derive the hang guard
Fixes the review findings on the work-budget change:

- unify the measured npm time range to 137-205 s in the note's problem
  statement, which had carried the older 153-190 s range
- correct the peer-edge share to about three quarters (1874 of 2524),
  which the sentence had called two thirds
- state the ratchet threshold as the packages-times-edges product, about
  12% in packages and edges together
- derive NPM_HANG_GUARD_MS from MAX_RESOLUTION_WORK_UNITS so a raised
  budget cannot shrink the guard's headroom, and state the guard's
  guarantee as covering a runner four times slower than the measured host
- name the cost side of the hang guard in the note's consequences
2026-09-28 16:18:09 +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
turtle1999 f2af03539b perf(settings): skip unused shared compositions 2026-09-28 16:12:42 +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 39260067b5 docs(notes): record that the layout gate restores the recorded duration decision 2026-09-28 16:07:57 +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
ZiyaZhang 441939eaa4 fix(web): require acknowledgement of the 0.2 preview notice 2026-09-28 01:04:41 -07:00
Chinesezjc f45693fbe5 fix(ci): decide the dual-release install layout by graph scale
The Dependency layout lane failed whenever the npm child process exceeded
a hardcoded 300 s deadline. That deadline measured the runner rather than
the graph: the same layout resolves in 137-205 s on an idle developer host
and exceeded 300 s on CI while the placement assertion reported no error,
so the failure carried no information about what had grown.

The gate now bounds the verified graph by resolution work units,
dshPackagesPerVersion * checkedDshEdges against MAX_RESOLUTION_WORK_UNITS,
and keeps the wall clock only as a hang guard derived from that budget.
Growth fails with the graph's own measured counts on any runner.

The resolution cost itself is unchanged. Measurement attributed 99.3% of
it to npm's peer-conflict placement, and cache reuse, graph splitting and
the placement flags were measured and rejected.
2026-09-28 16:04:06 +08:00
turtle1999 3e6c104445 perf(settings): reuse composition for unoverridden entries 2026-09-28 15:58:23 +08:00
Yifffan e5587c7ff5 Merge pull request #5354 from deepseek-harness/ux/plugin-manager-followup
fix(web): 暗色下关闭态开关不再像禁用,并微调插件管理说明图标
2026-09-28 15:58:21 +08:00
Turtle 8665142fd3 Merge pull request #5342 from deepseek-harness/docs/merge-plugin-guideline
docs(agent-preset): consolidate shared plugin development skills
2026-09-28 15:54:22 +08:00
07akioni 94c4954780 Merge pull request #5316 from deepseek-harness/07akioni/desktop-otel-timeouts
fix(telemetry): align desktop product reporting timeouts
2026-09-28 15:51:40 +08:00
ZiyaZhang cd57af4925 fix(web): 更新 0.2 中英文预览版说明 2026-09-28 00:47:07 -07:00
Yif 9e8db21d2f fix(web): distinguish an off switch from a disabled one in dark mode
The off-state thumb reused the palette's primary foreground, which resolves
to near-black in dark mode; against the translucent track it read as
disabled, while a disabled control differs only by half opacity. Give the
off state its own thumb color through the new `--dsw-alias-switch-thumb`
alias: white in light mode and neutral-bluish 400 in dark mode.

The plugin management info button also becomes an 11px caption-colored icon
in a 20px square, keeping the 4px gap beside the subtitle.

Refs #5347
2026-09-28 15:46:43 +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
turtle1999 b1f5f5c171 docs(agent-preset): remove visual design section 2026-09-28 15:29:43 +08:00
07akioni 2974008e0e fix(preview): isolate desktop telemetry HTTP transport 2026-09-28 15:29:09 +08:00
creatixchu 30b193b38a feat(ptc): select Node state retention through executionMode 2026-09-28 15:27:39 +08:00
turtle1999 3879d81910 docs(agent-experience): remove date metadata 2026-09-28 15:25:50 +08:00
Chinesezjc 0bcd0822bc Merge branch 'master' into fix/task-manager-detail-close-race 2026-09-28 15:10:53 +08:00
turtle1999 8931fa2748 feat(agent-preset): share agent experience skill with creator mode 2026-09-28 15:08:08 +08:00
imccyu 4e25074651 Merge pull request #5310 from deepseek-harness/feat/feedback-device-info
feat(web): 反馈问卷预填账号、版本与桌面设备信息
2026-09-28 15:07:50 +08:00
turtle1999 1f847565ba docs(agent-preset): clarify plugin action and review guidance 2026-09-28 15:06:17 +08:00
lsdsjy c6aefab797 fix(web): 同步反馈菜单端到端快照与桌面说明 2026-09-28 14:59:30 +08:00
lsdsjy 19cc22746a fix(web): 统一账号菜单反馈入口文案 2026-09-28 14:59:30 +08:00
lsdsjy 3ae5c883eb feat(web): 反馈问卷预填账号、版本与桌面设备信息 2026-09-28 14:59:30 +08:00
Chinesezjc 9ba0f3b890 docs(notes): give the retried-read rejection one home
The rejection of a longer fixed wait or an unbound retry already lives in the
two linked notes; this note now keeps only what is specific to the case, that
`findByText` resolves on a commit that does not drop the panel.
2026-09-28 14:47:54 +08:00
Chinesezjc 879acaf610 docs(notes): cross-link the detail-close note with its decision family
The note links the two 2026-09-27 testing notes that record the same decision
family, and both link back. Line-number anchors give way to file and symbol
references, the deferred-refresh alternative the neighboring cases use is
recorded with why it was not chosen here, and the negative control states that
the close call is removed.
2026-09-28 14:46:11 +08:00
Yichen Jiang 647a787a99 Merge pull request #5323 from deepseek-harness/worktree/macos-microphone-entitlements
fix(desktop): grant microphone access in signed macOS builds
2026-09-28 14:31:53 +08:00
imccyu 1ca4e2af33 Merge pull request #4816 from deepseek-harness/fix/issue-4803-webkit-json
fix(web): 修复 Safari 输出中刷新后回复无法恢复
2026-09-28 14:31:14 +08:00
Huanqi Cao 99b887a177 fix(sandbox-windows-acl): assert the repair preserves the fixture's owner
The diagnosis script suite asserted that repaired paths are owned by the invoking user. On an elevated Windows runner the fixture objects are owned by BUILTIN\\Administrators, so the assertion failed without any repair defect. Compare the owner before and after the repair instead, which keeps the stated owner-preservation guarantee without assuming the host token's default owner. Verified locally: 34 tests pass.
2026-09-28 14:26:26 +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
turtle1999 68519237ac docs(agent-preset): avoid automatic UI action context injection 2026-09-28 14:12:43 +08:00
turtle1999 c795996b5d docs(agent-preset): merge plugin UI action and theme rules into cordis-plugin-development 2026-09-28 14:06:29 +08:00
Turtle 7d7ca289d9 fix(ui-schedule): enlarge the Session-row clock mark by 2px 2026-09-28 13:55:12 +08:00
gengruilin 326b9093c1 Merge origin/master into fix/issue-4803-webkit-json 2026-09-28 13:53:54 +08:00
Huanqi Cao 17877121ba Merge remote-tracking branch 'origin/master' into windows-sandbox-acl-diagnosis
# Conflicts:
#	packages/sandbox/sandbox-windows-acl/package.json
2026-09-28 13:51:41 +08:00
07akioni 746b9eb753 fix(telemetry): cancel product exports at shutdown deadline 2026-09-28 13:47:55 +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
Yichen Jiang db827cbf70 Merge remote-tracking branch 'origin/master' into worktree/macos-microphone-entitlements 2026-09-28 13:32:17 +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
Turtle 5c6427bd76 Merge pull request #5327 from deepseek-harness/fix/master-ci-watch
fix(release): pin Koffi to the validated native dependency
2026-09-28 13:27:29 +08:00
Chinesezjc daeb299fa1 test(client): wait for the task detail close after a successful retry
The case awaited the empty list's text and then read the panel once. The
detail closes through the effect that observes the removed row, one commit
after the render that replaces the list with its empty state, so that single
read could still see the panel. The assertion now waits for the state it
asserts, and a panel that never closes still fails.

Refs #5332
2026-09-28 13:25:10 +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
turtle1999 cc61979fbb docs(deps): clarify Koffi pin upgrade criteria 2026-09-28 12:59:59 +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
turtle1999 c6e4c77a12 fix(release): pin Koffi to the validated native dependency 2026-09-28 12:37:33 +08:00
Yichen Jiang 728d56156c fix(desktop): narrow microphone permission fix 2026-09-28 12:37:30 +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
Yichen Jiang 846afdfaa6 fix(desktop): grant microphone access in signed macOS builds 2026-09-28 12:27:20 +08:00
gengruilin 269768a823 refactor(web): limit Safari fix to session JSON validation 2026-09-28 12:07:24 +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
gengruilin 9925ba721d refactor(web): trim unrelated changes from Safari recovery fix 2026-09-28 12:00:35 +08:00
07akioni 32ade298b5 fix(telemetry): align desktop product reporting timeouts 2026-09-28 11:58:06 +08:00
Huanqi Cao d2d755077b fix(sandbox-windows-acl): request the diagnosis escalation after a denial
The bundled diagnosis skill told the model to run its script unconfined from the first call, which forbids trying the confined path and leaves no path but handing the command to the user. Run it in the current sandbox first, and request one escalated retry of the same call when a denial or an unwritable report directory prevents it; a refused or unavailable approval reports the path as undiagnosed. Refresh the recorded skill replay and re-record the README pairing hashes.
2026-09-28 11:46:04 +08:00
Yudong Han 8be17176fe Merge pull request #5312 from deepseek-harness/fix/office-selection
fix(client): make Office and PDF selections visible in both themes
2026-09-28 11:26:30 +08:00
gengruilin aee3c39ee7 fix(deps): pin Koffi to the tested release
Packed consumers resolved ^3.1.0 to 3.3.2, whose source build fails under the Linux release check. Pin every consumer to the existing lockfile version 3.1.1 so published installs use the tested dependency.
2026-09-28 11:16:17 +08:00
yudshj 37ffaa52ca fix(client): make Office and PDF text selections visible in both themes 2026-09-28 11:05:13 +08:00
Yudong Han 451e452043 Merge pull request #5223 from deepseek-harness/fix/explorer-window-visibility
fix(windows): keep Explorer path-opening windows visible
2026-09-28 10:43:58 +08:00
Ziya 4bbfa0884f Merge pull request #5284 from deepseek-harness/ux/plugin-manager-guidance-preview
fix(web): 完善插件管理说明与安装警告
2026-09-28 10:42:00 +08:00
Yudong Han 4f9e0e7840 Merge pull request #5191 from deepseek-harness/cleanup/compact-persistence-schema
refactor: compact persistence schema type inventory
2026-09-28 10:40:36 +08:00
Tianyi Cui 41c10a62c2 Merge branch 'master' into cleanup/compact-persistence-schema 2026-09-28 10:31:37 +08:00
Ruilin Geng 90cc7ce652 Merge branch 'master' into fix/issue-4803-webkit-json 2026-09-28 10:30:31 +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 da84e3a3f7 docs(notes): correct the oxlint contract budget note counts and alternatives
Seven cases, not nine, carried 90_000 before the change; the other seven
ran on the default and five of those spawn. Record the lane-flag
alternative, cite the archived describe-level budget notes and the
accepted risk, and bound the idle-host timing claim to the measured
cases.
2026-09-28 01:20:53 +08:00
Tianyi Cui d7b5b42231 test(web): assert the overlay focus and record the measured probe counts
Addresses ds-review-bot: the keyboard step now asserts that focus landed on
the sheet overlay before pressing arrows, the comment keeps only the local
why, and the Agent Note carries the measured counts (10 of 11 master runs,
7 of 38 probe runs, 26 of 26 keyboard runs, 10 of 10 local repetitions).
2026-09-28 01:12:46 +08:00
Tianyi Cui b01a926d44 test(lint): bound every process-spawning oxlint contract case at 90s
Five cases in scripts/oxlint-contract.spec.ts spawned oxlint or the
repository lint entrypoint on vitest's 5000 ms default while their nine
siblings carried the 90_000 ceiling from the Windows spawn-budget
alignment. The first darwin parity run on master (Sandbox run
36332053320) ran the file 2.2x slower than the passing run and timed out
`prints only the final diagnostics when a fix retry still fails` at
6309 ms. Give the five cases the same per-case ceiling and record the
decision in an Agent Note.

Fixes #2581
Related to #2677
2026-09-28 00:58:56 +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 979b77a6bc test(web): move the spreadsheet selection by keyboard before sidebar reflows
The meeting-sheet step of document-preview.e2e.ts clicked the sheet overlay
at the cell FortuneSheet already selects on mount, so its polls passed before
the click committed, and the press resolved its cell inside a React state
updater that later renders re-execute against the reflowed grid. On loaded
Linux runners that re-execution landed after the first sidebar resize and
committed B1 (the two-column sheet clamps the stale pointer x to its last
column), failing the reflow loop with `expected 'B1' to be 'A1'`.

Select A1 through ArrowRight/ArrowLeft instead: keyboard moves compute the
target from committed state, so a re-executed updater yields the same cell,
and the B1 -> A1 transition verifies the interaction before the reflows.

Refs #5242
2026-09-28 00:54:54 +08:00
ZiyaZhang adb58a76d1 fix(web): align plugin guidance with review feedback 2026-09-27 09:31:07 -07:00
Huanqi Cao 79d8910f2d Merge origin/master into windows-sandbox-acl-diagnosis 2026-09-28 00:23:56 +08:00
Huanqi Cao 5bab07157f fix(sandbox): repair inherited ACL entries within normalized roots 2026-09-28 00:18:06 +08:00
Tianyi Cui 76f174a1d2 Merge pull request #5292 from deepseek-harness/ci/sandbox-seatbelt-budget-20260927
ci(sandbox): run the darwin unit parity suite as its own macOS job
2026-09-28 00:07:15 +08:00
HYD@OVERTON 989fc3e2f5 refactor(native-command): require explicit window visibility 2026-09-27 23:55:26 +08:00
HYD@OVERTON a895066443 fix(windows): keep Explorer path-opening windows visible 2026-09-27 23:55:26 +08:00
Tianyi Cui b0505a0fd8 ci(sandbox): widen the darwin parity ceiling and keep the workflow prose current
Review follow-up: name the parity job in the workflow header, point the unit
comment at ci.yml's Linux jobs instead of a nonexistent `checks` job, state the
budget as a completion ceiling and raise it to 60 minutes so the slowest observed
runner keeps headroom, and let the owning Agent Note describe the budget and the
workflow's statuses without restating numbers the workflow owns.
2026-09-27 23:41:16 +08:00
Tianyi Cui c9c2ced4df ci(sandbox): run the darwin unit parity suite as its own macOS job
The seatbelt leg of the sandbox-e2e matrix also ran `pnpm run test`, and the
complete unit suite takes 16 to well over 20 minutes on macos-latest, so the
shared 20-minute job budget cancelled the leg on most master pushes — before
the Seatbelt confinement e2e ever ran. Move the parity run into a `unit-darwin`
job with a 45-minute budget; the four e2e legs keep 20 minutes.
2026-09-27 23:11:07 +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
Tianyi Cui 21638c5631 Merge pull request #5282 from deepseek-harness/fix/pwsh-prompt-tail-grace-20260927
fix(pty): bound the wait for a seen prompt marker's printable tail
2026-09-27 22:30:17 +08:00
ZiyaZhang 473fd15101 fix(web): clarify plugin management guidance and warnings 2026-09-27 07:18:09 -07:00
Tianyi Cui 9801015af3 docs(catalog): regenerate the config catalog for the new bound 2026-09-27 21:58:15 +08:00
Tianyi Cui 76a2b7a799 fix(pty): apply the tail grace only while the tail can still complete
Review round 1: the tolerance now requires the accumulated tail to remain a
prefix of the controlled prompt, so a prompt that arrived and was invalidated by
later output keeps the plain silence bound instead of waiting a tolerance with
nothing left to wait for. The field is validated as zero or at least one
`pollIntervalMs`, matching the handoff grace rule, and tests pin the extended
bound's expiry, the invalidated tail, and that rule. The owning readiness design
note records the new field and Tier 2 bound and cross-links this decision.
2026-09-27 21:36:42 +08:00
Tianyi Cui 4e25b13d79 docs(notes): record the native evidence for the prompt tail grace 2026-09-27 21:04:40 +08:00
Tianyi Cui ce7718ad6a Merge pull request #5277 from deepseek-harness/fix/zh-agent-copy-20260927
fix(ui-conversation): translate Agent as 智能体 in zh tool copy
2026-09-27 20:51:30 +08:00
Tianyi Cui 09ecc4f423 Merge pull request #5265 from deepseek-harness/fix/git-command-line-config-scrub-20260927
test(boot): isolate plugin-manager Git children from host command-line config
2026-09-27 20:44:24 +08:00
Tianyi Cui 0490c30f30 Merge pull request #5271 from deepseek-harness/fix/web-lane-flakes-20260927
test(web): name the input state each browser-lane capture asserts
2026-09-27 20:44:21 +08:00
Tianyi Cui 3693c2b402 fix(pty): bound the wait for a seen prompt marker's printable tail
Windows sessions on the self-hosted lane settled one or two of seven sends on
the controlled prompt and charged the silence tier for the rest (issue 2487).
The marker is written by the shell's own prompt function and the printable tail
by the same render, so a tail that arrives past `idleSilenceMs +
handoffGraceMs` means a stalled delivery, not an absent prompt.

`dsh-terminal-bash` gains a validated `promptTailGraceMs` bound (default 0,
which reproduces the previous bound exactly). While a send has seen the marker
and its printable tail has not arrived, the silence bound grows by it. The
pwsh Loader-composition case sets 5000 ms, the host class the bound is for, and
still fails when no marker appears at all.
2026-09-27 20:34:19 +08:00
Tianyi Cui 62ac57218d test(web): correct the states the new comments and note name
Review found two factual errors in the prose this change adds.

plugin-install-cancel: the scenario pauses the page clock before the
enable click, so the highlight's `setTimeout(clearHighlight, 2400)`
cannot fire while the status poll runs. The comment claimed a reload
could outlive that expiry, and the note explained the two CI timeouts
at the untouched highlight locator the same way. The cause of those
timeouts is not diagnosed, so both now say so instead of offering a
mechanism the paused clock rules out. The pre-change file reproduces the
same hang under the same lane command, which the note records.

workspace-new-session-folding: `nth(7)` is the first row the batch
reveals, not the last established one, and the reflowing `showMore.click()`
is above the comment, not below. Both are corrected, and the workspace-row
comment names what `:hover` reveals instead of restating a cell swap the
project row does not have.

turn-tail-actions: clear the pointer modality flag with `Shift`, which
moves no focus, matching focus-rings.e2e.ts.
2026-09-27 20:13:00 +08:00
Tianyi Cui ffbd9e3d2f fix(ui-conversation): translate Agent as 智能体 in zh tool copy
The zh dictionary rendered subagent, list_agents, interrupt_agent, and
ralph tool cards with 代理 (proxy) for Agent. Use 智能体 like the goal hint
and wait_agent copy already do.
2026-09-27 20:06:56 +08:00
Tianyi Cui 1c0234e7b1 test(boot): isolate plugin-manager Git children from host command-line config
The self-hosted Windows serial lane failed 12 cases from one cause: the host
exported Git's indexed command-line configuration (`GIT_CONFIG_COUNT` with
`GIT_CONFIG_KEY_0` / `GIT_CONFIG_VALUE_0`), and the shared subprocess scrub
removes credential-shaped names, so a child inherited the counter without its
key and died with `error: missing config key GIT_CONFIG_KEY_0` before it read
any configuration file.

Both spec files now delete that group from their own environment before they
spawn Git, because they judge profile behavior rather than host state. The
product-side handling stays out of this change; it is preserved on the branch
`deferred/git-command-line-config-scrub-20260927` for a later product PR.

GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=core.bare GIT_CONFIG_VALUE_0=true pnpm exec
vitest run packages/boot/plugin-manager/tests/github-connection.spec.ts
packages/boot/plugin-manager/tests/manager.spec.ts -> 12 failed at the parent
revision, 95/95 passed with the isolation.
2026-09-27 20:03:56 +08:00
ZiyaZhang 0b3256014c fix(web): center plugin installation example buttons 2026-09-27 04:57:03 -07:00
Tianyi Cui 1badc22b1b Merge pull request #5264 from deepseek-harness/fix/windows-lane-flakes-20260926
test(boot): wait on the observed state in two Windows-lane cases
2026-09-27 19:54:57 +08:00
Tianyi Cui 8a7c5e1a98 docs(notes): record the install-cancel residual and the lane baseline
The three-file lane run passes all three scenarios in three consecutive
local runs, and the install-cancel scenario keeps a residual exposure:
it finds the card through the highlight, so a reload that outlives the
highlight while the card is absent fails that locator. One lane run
failed there and it did not reproduce.
2026-09-27 19:24:25 +08:00
Tianyi Cui 5e09b8231d Merge pull request #5239 from deepseek-harness/worktree/web-clock-flake-20260926
test(web): pin conversation clocks to the fixture day and await saved settings
2026-09-27 19:15:50 +08:00
Tianyi Cui 751724c88e test(web): drop the obsolete settled-title wait from the steering scenario
Master's 07dcdb46e5 moved the question step's settled title into the
`Ask question waiting` row of mid-steer.expected.md, so the button this
scenario waited for no longer renders. The wait therefore never resolved and
parked the scenario on the question page, producing the lane's cascade: `no
turn/end within 30000ms`, no live root session matching session.v4.jsonl, and
`llm-replay: fixture not fully consumed`. `captureStableAria` already polls
until two consecutive normalized captures agree, so the settled state is
captured without the extra wait.

DSH_SNAPSHOT=replay pnpm exec vitest run --config vitest.web.config.ts
apps/web/tests/steering.e2e.ts -> 7 passed (reproduced twice); with the wait
present the same command fails at its 10 s bound and again widened to 30 s.
2026-09-27 19:06:39 +08:00
Tianyi Cui 378853c096 test(web): name the input state each browser-lane capture asserts
Three scenarios captured an aria region while the state their golden
records was implied by the pointer, the keyboard, or an in-flight Host
read, so the capture could land on the other state.

workspace-new-session-folding captures two goldens of one sidebar, each
recording a hovered row that Rows.module.css renders with the row
actions in place of the relative time. Both hovered rows are now
established before their capture instead of inherited from wherever the
Show-more click left a stationary pointer. The serial self-hosted master
lane failed this scenario in every failing run observed between
2026-09-24 and 2026-09-27.

turn-tail-actions records a tooltip beside the focused Copy footer in
running.expected.md. Tooltip ignores focus while the last input came
from a pointer and only a keydown clears that flag, so the scenario now
establishes keyboard-owned focus and waits for the bubble.

plugin-install-cancel polls the enabled card's status instead of
sampling it once. The store marks the card and starts the directory
reload the Host answers, and the status flipped disabled -> running 61 ms
after the highlight in three local runs, which the single read sampled
inside.

Goldens, product code, and assertion strength are unchanged.
2026-09-27 18:57:12 +08:00
imccyu 78a21f29a9 Merge pull request #5226 from deepseek-harness/worktree-newwhale
feat(ui-chat): animate a whale tail below the transcript while the Session runs
2026-09-27 17:19:32 +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
Tianyi Cui 6ad3557b1b test(boot): wait on the observed state in two Windows-lane cases
`operations.spec.ts` read the profile's run record from a 100 ms timer armed
before the refused installation whose repair it observes; a loaded runner
reached the repair run after that timer and the case failed with `null`
against the recorded run. The observing child now stays in flight until the
record appears, and the bounded wait starts at the launcher hand-over rather
than at test start.

The loader-composition case counts `stdin_read` settlements but reported only
the count, so its Windows failures could not say which tier settled which
send. The recorded reasons now ride in the assertion message; the threshold
and the assertions are unchanged.
2026-09-27 16:37:14 +08:00
Dudu-0223 af9292b6bd Merge branch 'master' into refactor/agent-team-direct-steer 2026-09-27 16:29:12 +08:00
Tianyi Cui 55bcb56684 Merge branch 'master' into worktree/web-clock-flake-20260926 2026-09-27 16:19:16 +08:00
Tianyi Cui 3117268c04 Merge pull request #5243 from deepseek-harness/fix/document-preview-selection-poll
test(web): poll the spreadsheet selection after each sidebar resize
2026-09-27 16:18:23 +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
Tianyi Cui ef2c281e6e Merge branch 'master' into worktree/web-clock-flake-20260926 2026-09-27 15:37:37 +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
imccyu e9e03abf95 fix(ui-chat): refine running status motion and shimmer 2026-09-27 15:16:20 +08:00
imccyu 69865faf7a docs(ui-chat): clarify running status placement 2026-09-27 15:16:07 +08:00
imccyu e44917fc52 test(web): refresh remaining running status snapshots 2026-09-27 15:10:08 +08:00
imccyu 03531c5836 test(web): align running status snapshots 2026-09-27 15:10:08 +08:00
imccyu cae515d504 feat(ui-chat): restore the complete running status 2026-09-27 15:10:07 +08:00
imccyu 398c2cde25 docs(ui-chat): describe the bottom running status 2026-09-27 15:10:07 +08:00
imccyu fa3d555cd8 feat(ui-chat): animate a whale tail below the transcript while the Session runs 2026-09-27 15:08:24 +08:00
imccyu 361ac7858f docs(ui-chat): describe the whale tail shown below the running transcript 2026-09-27 15:08:23 +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
Yifffan a8fc0b3f16 Merge pull request #5233 from deepseek-harness/ui/plugin-example-visual-polish
fix(plugins):  change plugin placeholder npm, visual refine and UX bug ifx
2026-09-27 15:02:43 +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
Yif 142b655241 fix(plugins): use shared focus color for invalid inputs 2026-09-27 14:48:49 +08:00
Yif 69b55fb53b fix(plugins): preserve registry keyboard selection and focus feedback 2026-09-27 14:25:27 +08:00
Ruilin Geng 4e223acb8a Merge branch 'master' into fix/issue-4803-webkit-json 2026-09-27 14:23:32 +08:00
Tianyi Cui 94a9b4d700 Merge pull request #5228 from deepseek-harness/fix/web-search-account-token
fix(web-search): 账号路由会话的 DeepSeek 搜索使用账号 token 鉴权
2026-09-27 13:04:12 +08:00
Tianyi Cui 3443de63cc Merge branch 'master' into fix/web-search-account-token 2026-09-27 12:55:21 +08:00
Yif db5ed22884 test(plugins): make the refresh spinner hold deterministic
Extract settleRefresh() so the spinner-minimum hold has one settle point,
advance the e2e fake clock past the 400ms hold before asserting the button
restores, and drive the disposal-during-hold store test on fake timers for
both success and failure reads.
2026-09-27 12:42:30 +08:00
imccyu 80fad723f6 Merge pull request #5204 from deepseek-harness/fix/legacy-normal-detailed
调整工作过程展示的旧配置映射与 npm Web 默认值
2026-09-27 12:17:30 +08:00
imccyu 682393aede docs(ui-chat): separate display modes from saved preferences 2026-09-27 12:05:42 +08:00
imccyu 79fce08d25 test(web): align browser scenarios with detailed work defaults 2026-09-27 11:51:50 +08:00
imccyu 47db27a730 fix(ui-chat): resolve work-details defaults in client code 2026-09-27 11:43:10 +08:00
imccyu b066690f70 fix(web): default fresh work details to detailed 2026-09-27 11:43:09 +08:00
imccyu a03e63d1e3 fix(ui-chat): map legacy normal work details to detailed 2026-09-27 11:43:09 +08:00
Yif eb9efc6265 fix(plugins): restore registry group, own opaque material, hold refresh spinner
The install registry picker used MenuSurface and overrode the theme-owned
menu material tokens, which the shared-menu-material gate rejects. Return
the picker to a fieldset (its native group role) and paint an opaque
bg-layer-2 surface so the form controls stay readable without touching
menu tokens. This also restores the group's radios to the accessible tree.

Align plugin-install-registry.e2e and its snapshots with the PR's visible
text: registry option names drop the parentheses around the host, the
custom address field is no longer disabled, and the custom hint spells out
http(s) and ~/.npmrc.

Hold the manual-refresh spinner to a 400ms minimum so a fast read does not
flash it, clearing to idle (or the failure toast) only after the minimum,
and dropping a refresh that settles after disposal.

Prune the retired no-unknown-casts baseline entry for browser-plugin.client.spec.
2026-09-27 09:46:15 +08:00
Dudu-0223 a98efc7115 Merge latest master documentation into Agent Team delivery 2026-09-27 06:45:46 +08:00
Yif 9fabb67bca test(plugins): trim redundant refresh/tooltip coverage
Drop the plugin-manager refresh e2e to a single failure round: the store's
success and retry outcomes are covered deterministically by
manager-store.client.spec.ts, while the e2e keeps its unique value — real
500ms tooltip timing, a running spinner animation, aria-busy, and the
portaled failure toast over kept cards. Regenerate refresh.expected.md.

Remove the components spec tooltip-delay case; ui-primitives'
tooltip.client.spec.tsx already covers 499/500ms hover/focus delay, early
cancellation, and portaling. PluginManagerPage.tsx stays at 100% coverage.
2026-09-27 02:28:09 +08:00
Yif 9c6bdd020c Merge master into ui/plugin-example-visual-polish 2026-09-27 02:03:39 +08:00
Yif f057cc37c4 fix(plugins): guard IME submission and refine automation icon 2026-09-27 01:44:00 +08:00
Yif 5d72bfbe49 fix(plugins): refine refresh feedback and plugin artwork 2026-09-27 01:00:50 +08:00
std4453 2fc10a41c4 Merge pull request #5136 from deepseek-harness/feat/desktop-product-analytics
feat(desktop): add product analytics event collection
2026-09-26 23:14:59 +08:00
zhc b43d52ef45 merge: reconcile desktop analytics with latest master 2026-09-26 22:56:57 +08:00
Yif e967e3cbba fix(ui): shrink auto-review artwork by one pixel 2026-09-26 22:40:27 +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 d27663918d Merge master scheduling updates and preserve approved icon 2026-09-26 22:11:11 +08:00
Yif a9d169a399 Merge master into ui/plugin-placeholder-default-name 2026-09-26 22:04:14 +08:00
Tianyi Cui 67f648cf0c Merge pull request #4595 from deepseek-harness/worktree/fix-tool-failure-history-6967
fix(agent-loop): settle pending tool results before failed steps close
2026-09-26 22:01:39 +08:00
Yif 8ad3a2ca0d Merge master to refresh plugin polish base 2026-09-26 21:57:59 +08:00
Yif 6ce05157f9 Merge master to refresh session UI fixes base 2026-09-26 21:57:59 +08:00
Ziya 88967ce80a Merge pull request #5207 from deepseek-harness/ux/automation-tasks-plugin-row
fix(schedule-bundle): name the Plugins row Automation tasks with an alarm clock icon
2026-09-26 06:57:49 -07:00
Yichen Jiang 50117a144e Merge pull request #5190 from deepseek-harness/worktree/scoped-events-heap-budget
fix(docs): align publication runner and scoped-event heap budgets
2026-09-26 21:46:55 +08:00
Ziya d70db1ccfd Merge pull request #5210 from deepseek-harness/fix/plugin-inventory-card-align
fix(ui-settings-plugin-inventory): align and simplify plugin cards
2026-09-26 06:44:15 -07:00
ZiyaZhang 9626323fc4 Merge remote-tracking branch 'upstream/master' into ux/automation-tasks-plugin-row 2026-09-26 06:10:21 -07:00
Tianyi Cui 98f367c84c Merge remote-tracking branch 'origin/master' into worktree/web-clock-flake-20260926 2026-09-26 20:19:45 +08:00
Tianyi Cui c40b1fabd1 Merge remote-tracking branch 'origin/master' into worktree/fix-tool-failure-history-6967 2026-09-26 20:18:49 +08:00
Tianyi Cui 389539642f Merge pull request #5232 from deepseek-harness/fix/lefthook-lock-path-spelling-flake
fix(ci): canonicalize the Lefthook fixture common directory
2026-09-26 20:08:25 +08:00
Tianyi Cui bb5615558d Merge branch 'master' into fix/lefthook-lock-path-spelling-flake 2026-09-26 19:46:09 +08:00
Dudu-0223 c772c85c17 refactor(agent-team): send directly through Agent inbox steering 2026-09-26 16:52:54 +08:00
imccyu cf7c3d9ea5 Merge pull request #5206 from deepseek-harness/worktree-fixbuild
fix(build): 将 Desktop 键盘测试并入 Client typecheck
2026-09-26 15:36:46 +08:00
ZiyaZhang b90695ee7a Merge remote-tracking branch 'upstream/master' into ux/automation-tasks-plugin-row 2026-09-25 22:31:25 -07:00
Ziya 7fd5311508 Merge pull request #5212 from deepseek-harness/feat/schedule-bundle-owns-rows
feat(schedule-bundle): insert the Schedule rows from the bundle and list them on its page
2026-09-25 22:17:34 -07: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
Chinesezjc 5815da5a53 test(web): poll the spreadsheet selection after each sidebar resize 2026-09-26 11:33:16 +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
Tianyi Cui eff2c6463f test(web): await the saved provider settings before reopening
Closing the provider editor confirms its write, but the browser directory
refresh lands after it, and the reopened editor copies the previous input
selection into a new draft — checkbox polling cannot correct a draft that
was already built. Run 36159502081 (job 108152262196) read a stale `true`
from that draft at models-settings.e2e.ts:395.

Wait for the saved-provider notice, which the refresh publishes, before the
third reopen. The adjacent reopen in the same test file waits on the same
notice.
2026-09-26 04:17:02 +08:00
Tianyi Cui dc8508dc3b test(web): pin conversation clocks to the fixture day
The browser lane pins the browser to Asia/Shanghai, and formatMessageClock
prefixes clock.md / clock.ymd to the clock once a message's local calendar
day differs from the renderer's. Four scenarios left both clocks on the
wall clock while their message times are stamped during the run — a live
composer send by the Host, a `createdAt: 0` seed anchored from Date.now()
— so the job that began six minutes before local midnight rendered
`9/25 23:58` where their goldens record `{{clock}}` (run 36157253018, job
108144715986: steering, markdown-images, message-actions, and
reference-composer failed together, then passed in the next run).

Read WEB_FIXTURE_TIME on both clocks instead. Live-stamped steering suites
install pinHostClock(), a Date.now spy that advances from the anchor with
real elapsed time; pinBrowserClock() re-applies one frozen instant from the
anchor on an interval, because holding a single instant removes elapsed
time from the 150 ms process-title hold and the composer's 10 ms
composition guard, which then never elapse. Seeded scenarios anchor their
seed beside the pinned browser clock, which keeps the relative-age buckets
their goldens assert.

The steering mid capture waits for the settled question title its golden
records, and the whole-queue scenario waits for the running turn before its
queue gestures, whose decision resolves against an agent that reports busy.

Goldens, the Asia/Shanghai browser timezone, and product rendering are
unchanged.
2026-09-26 04:17:01 +08:00
Tianyi Cui b73a702587 test(ci): canonicalize the Lefthook fixture common directory
Reading Git's path text verbatim to keep trailing whitespace duplicated the
line-terminator helper that scripts/change-scope.ts already owns, which the
duplication gate rejects. Canonicalizing the fixture-side common directory
with realpathSync.native removes the text parsing entirely: short names,
junctions, and directory symlinks all collapse onto the physical directory
the installer resolves, and the injected path stays exact.

Drops the trailing-space case: with no text trimming left in the
derivation, that path already matched the installer before this change, so
the case could not fail and proved nothing.
2026-09-26 01:46:03 +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 ace2e5b305 test(plugins): use supported role query options 2026-09-26 01:11:16 +08:00
Tianyi Cui 1829cdfec9 test(ci): read the Lefthook fixture lock path without trimming
git() trims its output, which also drops a worktree directory's own
trailing whitespace; the installer removes only the line terminator. Derive
the expected lock path through gitPath()/stripGitLineTerminator(), which
applies the installer's exact rule, so the same-string claim holds for
every path.

Adds the trailing-space injection case (skipped on Windows, which cannot
create such a directory); it fails with the same probe ENOENT under the
trimming derivation.
2026-09-26 01:10:43 +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
Yif 9a144e3a01 Merge remote-tracking branch 'origin/master' into ui/plugin-example-visual-polish 2026-09-26 00:50:51 +08:00
Yif 16c30ed6ba fix(plugins): polish installation interactions and loading visuals 2026-09-26 00:50:42 +08:00
Tianyi Cui acb66b4c23 test(ci): force the Lefthook lock-path alias on every host
The five lock-access cases only diverged on a host whose temp directory
already carried a short name or directory alias. Route one case through an
aliased worktree root (a junction on Windows, a directory symlink
elsewhere) so the installer's resolved common directory necessarily differs
from the path this spec composes; the case fails with the same probe ENOENT
under the previous derivation on every platform.

The alias case shares the injection body through
expectInjectedLockAccessFailure, so the five existing case names and their
assertions are unchanged.
2026-09-26 00:50:02 +08:00
Tianyi Cui 6e28f315e7 fix(ci): derive the Lefthook fixture lock path from Git's top level
The lock-access cases injected a filesystem failure on a path this spec
predicted from the mkdtemp fixture directory. The installer resolves its
common directory against Git's own top-level path instead, and the host
spells that path differently: Git canonicalizes Windows 8.3 short names
and the macOS /var symlink. When the spellings diverged the injection
never fired, so the probe file was never written and all five cases
failed with ENOENT at the probe read - the signature seen in the Windows
coverage lane.

Resolving the relative common directory against Git's top-level, as the
installer does, makes the expected path identical to the one the
installer touches on every platform. The five cases fail deterministically
on macOS before this change and pass after it.
2026-09-26 00:43:46 +08:00
zhc 3fc7cc6607 fix(analytics): align desktop event fields with product specification 2026-09-26 00:18:07 +08:00
Tianyi Cui 8de4e51875 fix(session): tolerate a pending-free tool/result during recovery
`ToolCallRecovery.observe` compared `entry?.turn` against the event's turn
before reading `entry.step`. For a `tool/result` whose callId never registered
as pending and whose event carries no turn/step, both sides were `undefined`,
the guard passed, and the `entry.step` read threw. A pending entry is now
required before the turn and step comparison.
2026-09-26 00:13:35 +08:00
Tianyi Cui 3cdbf42a1d test(session): validate failed-step recovery on V4 2026-09-25 23:48:44 +08:00
Tianyi Cui eafd5b6068 fix(session): remove invalid recovery input guard 2026-09-25 23:48:44 +08:00
Tianyi Cui 6a6f350b94 fix(agent-loop): settle pending tool results before failed steps close 2026-09-25 23:48:44 +08:00
zhc 6c3df458c5 test: fix desktop version fixture and canonicalize installer lock paths 2026-09-25 23:44:43 +08:00
zhc 92b21d22c6 Merge remote-tracking branch 'origin/master' into feat/desktop-product-analytics 2026-09-25 23:42:19 +08:00
lsdsjy b38da29517 fix(web-search): 处理账号鉴权评审意见
- 路由判定改读 session.requestContext(),与账号登出判定保持一致
- available() 接受仅提供账号 token 解析器的配置
- 凭据解析器改为在取消检查之后、try 之内调用,避免取消后的未处理拒绝和同步异常逃逸
- 账号鉴权搜索收到 401 时给出重新登录指引,而非修改端点的指引;缺凭据消息提及账号登录
- 更新模块依赖图与 README 中过时的凭据描述
2026-09-25 23:34:37 +08:00
zhc 5d1beb324e refactor(analytics): limit auth events and reuse client version 2026-09-25 23:27:08 +08:00
lsdsjy b3c672e4f8 fix(web-search): 账号路由会话的 DeepSeek 搜索使用账号 token 鉴权
发起会话最近的请求头指明 deepseek-account 路由、且账号服务为搜索端点解析出
token 时,辅助搜索请求只发送 x-dsh-auth-token;其余搜索维持 API key 鉴权。
账号服务仅对部署配置的推理 origin 返回 token,因此自定义搜索端点不会收到账号凭据。
401 不登出账号。同步更新包 README、配置目录行号和网页搜索设置页的未配置密钥提示。
2026-09-25 23:18:49 +08:00
ZiyaZhang 912e5bafa1 refactor(schedule-bundle): give the Schedule rows the usual per-row switches
The bundle no longer declares `dsh.bundle.rowSwitches`, so its page offers a
switch per row while it is on, as every other bundle does. The README records
that the three rows work only together, and the Agent Note records the
rejected lock.
2026-09-25 07:50:15 -07:00
07akioni 719b86f870 Merge pull request #5224 from deepseek-harness/07akioni/remove-figma-links
chore: remove Figma links and harden Windows hook locking
2026-09-25 22:31:48 +08:00
07akioni 8d219c6a76 docs: link exact archive seal exceptions 2026-09-25 22:19:32 +08:00
07akioni dded54a6ee fix(hooks): wait for Windows installer lock access 2026-09-25 22:19:27 +08:00
07akioni 1104d10ef0 chore: remove repository Figma links 2026-09-25 21:59:34 +08:00
ZiyaZhang 738178f136 Revert "feat(plugin-manager): let a bundle list its rows without row switches"
This reverts commit 089291591cbf9a9e08dbe99d96aa378a5f1ccac8.
2026-09-25 06:57:37 -07:00
ZiyaZhang 6085a56eb6 Revert "feat(plugin-manager): refuse to switch a row alone when its bundle switches its rows as a whole"
This reverts commit 5bc789e8617bc7b7fe8b56ad3629ed385692c54d.
2026-09-25 06:57:32 -07:00
zhc 97b3e97657 fix(desktop): report install confirmation before locking host requests 2026-09-25 21:53:40 +08:00
Huanqi Cao 7c3c149187 fix(ci): normalize ACL fixture paths and refresh module graph 2026-09-25 21:39:24 +08:00
Huanqi Cao b876f825c7 fix(sandbox): stop failed ACL repairs and preserve diagnostic reports 2026-09-25 21:36:48 +08:00
Yif 4f6c556e55 Merge remote-tracking branch 'origin/master' into ui/plugin-example-visual-polish 2026-09-25 21:22:59 +08:00
Yif ac20d7f6bc fix(ui): isolate plugin examples and visual polish 2026-09-25 21:22:51 +08:00
zhc d0a7678471 fix(analytics): retain provider context for renderer reports 2026-09-25 21:07:33 +08:00
zhc 1a797d0d52 merge: reconcile shared OTel service from master 2026-09-25 20:05:36 +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
07akioni 779d268199 Merge pull request #5216 from deepseek-harness/07akioni/session-log-otel
feat(telemetry): share Cordis OTel reporting with byte-bounded session logs
2026-09-25 19:50:33 +08:00
zhc 86a61155fc docs(analytics): emphasize default Desktop reporting 2026-09-25 19:49:21 +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
07akioni 9d36f9c1fc refactor(telemetry): share reporting through a Cordis OTel service 2026-09-25 19:08:44 +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
07akioni b97ef29e79 fix(telemetry): await SDK export slot cleanup between requests 2026-09-25 18:47:23 +08:00
creatixchu 73f379582f test(cua): cover failed native diagnostics and artifact locations 2026-09-25 18:42:43 +08:00
07akioni 3dd52bfd9b fix(telemetry): own byte-bounded session request scheduling 2026-09-25 18:39:21 +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
Huanqi Cao 927b59e138 fix(sandbox-windows-acl): make diagnosis repairs safe and observable 2026-09-25 18:26:12 +08:00
07akioni 7b8c7dfff2 feat(telemetry): upload session log events through byte-bounded OTLP 2026-09-25 17:29:15 +08:00
CreatixChu 783569bf73 Merge pull request #5214 from deepseek-harness/worktree/deepseek-stale-file-batch-invalidate
fix(llm): remove every stale DeepSeek file mapping in one index update
2026-09-25 16:56:54 +08:00
ZiyaZhang dbd98c2b7e docs(schedule): name the Official group 官方 in the Chinese Schedule pages 2026-09-25 01:53:25 -07:00
ZiyaZhang 5511abfa14 Merge remote-tracking branch 'origin/ux/automation-tasks-plugin-row' into feat/schedule-bundle-owns-rows
# Conflicts:
#	docs/user/guide/schedule.i18n.yaml
#	docs/user/guide/schedule.md
2026-09-25 01:52:10 -07:00
ZiyaZhang b9ace787e4 feat(plugin-manager): refuse to switch a row alone when its bundle switches its rows as a whole
With `dsh.bundle.rowSwitches: false`, `listPlugins` reports each row the
bundle inserts with the `bundle-switch` read-only reason, so
`setPluginEnabled`, the `plugin_manager` tool, and the Plugins page agree,
and the page draws no switch for such a row. `bundleRowSwitches` validates
the manifest field; `listBundles` reports a non-boolean value on the bundle.
`BundleInfo.rowSwitches` is removed.
2026-09-25 01:51:00 -07:00
ZiyaZhang 0650bdeb30 test(schedule-bundle): expect the optional bundle to insert the Schedule rows 2026-09-25 01:50:58 -07:00
ZiyaZhang ce6d6a8582 Merge remote-tracking branch 'origin/ux/automation-tasks-plugin-row' into feat/schedule-bundle-owns-rows
# Conflicts:
#	.agents/notes/implemented/architecture/2026-09-24-schedule-opt-in-optional-bundle.i18n.yaml
#	.agents/notes/implemented/architecture/2026-09-24-schedule-opt-in-optional-bundle.md
#	.agents/notes/implemented/architecture/2026-09-24-schedule-opt-in-optional-bundle.zh.md
#	packages/experimental/schedule-bundle/README.i18n.yaml
#	packages/experimental/schedule-bundle/README.md
#	packages/experimental/schedule-bundle/README.zh.md
#	packages/experimental/schedule-bundle/package.json
2026-09-25 01:31:56 -07:00
creatixchu 97d9115336 refactor(llm): invalidate stale file mappings with the index generation type 2026-09-25 16:31:25 +08:00
creatixchu f9b8548dc3 Merge remote-tracking branch 'origin/master' into worktree/deepseek-stale-file-batch-invalidate 2026-09-25 16:30:49 +08:00
creatixchu a236e0fe23 docs(llm): re-record the DeepSeek README translation pair 2026-09-25 16:26:46 +08:00
creatixchu 3b2f46232e test(llm): assert batch invalidation in the Files stale-id specs 2026-09-25 16:26:45 +08:00
Christina Lee a6f3d3b91d Merge pull request #5122 from deepseek-harness/fix/update-copy-review
fix(client): clarify update copy and unnamed session labels
2026-09-25 16:25:52 +08:00
creatixchu 25e235d2c9 fix(llm): remove every stale DeepSeek file mapping in one index update
A stale-file response naming many file ids made RequestFiles.retry invalidate
each mapping through its own writer-lock cycle on files-v3.json. The lock waits
two seconds with a fixed backoff cadence, so concurrent contenders advance one
per round and most of them time out once a response names more than about a
dozen ids; the timeout surfaced as TRANSPORT and the replacement request never
left. DeepSeekUploadIndex.remove and DeepSeekFileStore.invalidate now take every
rejected generation at once and rewrite the index under one lock acquisition.
2026-09-25 16:24:33 +08:00
ZiyaZhang d6ffaa0198 test(plugin-manager): pin the English Automation tasks row and write its label as text
The language-switch case now reads the Automation tasks row's English title
and description, and the English guide writes the UI label as plain text like
the rest of the guide.
2026-09-25 01:19:47 -07:00
07akioni a3dad48152 test(web): wait for saved model settings before reopening 2026-09-25 16:15:29 +08:00
ZiyaZhang 9bbcd6cc7b Merge remote-tracking branch 'upstream/master' into ux/automation-tasks-plugin-row
# Conflicts:
#	packages/experimental/schedule-bundle/README.i18n.yaml
#	packages/experimental/schedule-bundle/README.md
#	packages/experimental/schedule-bundle/README.zh.md
2026-09-25 01:02:22 -07:00
Chinesezjc cfeb478e03 Merge pull request #5179 from deepseek-harness/feat/experimental-schedule-bundle
feat(schedule): ship the Schedule switch as an optional bundle
2026-09-25 15:57:37 +08:00
ZiyaZhang e563bb4bbc fix(ui-settings-plugin-inventory): address review on card ids and loading
The visible id chip and the accessible name now share one check for whether
the entry id adds to the title, so an include: id that matches the title is
left out of both. The loading skeleton's status region carries visually
hidden text so screen readers announce it. The settings-chrome browser
scenario expects the preset group open and enabled rows without a tag, and
its two ARIA snapshots are refreshed. The row-partner CSS comment states its
two-column assumption.
2026-09-25 00:49:05 -07:00
Chinesezjc 657b8dac06 docs(schedule-bundle): place the Automation tasks page on the sidebar entry
The bundle README said the right sidebar shows the Automation tasks page. The
ui-schedule client registers that page as a `main` panel with a sidebar entry and
keeps the right Sidebar for the single-task detail tab.
2026-09-25 15:48:37 +08:00
ZiyaZhang 64a361ee44 feat(schedule-bundle): insert the Schedule rows from the bundle and list them on its page
The Web composition no longer carries `time-context`, `schedule`, and
`ui-schedule`. The optional bundle inserts the three rows and depends on their
packages, as the other optional bundles insert theirs, so the Plugins page lists
them under the bundle; `dsh.bundle.rowSwitches: false` keeps the bundle's own
switch as their only control. The three packages gain localized titles and
descriptions for that list.
2026-09-25 00:42:21 -07:00
ZiyaZhang e42f262bc5 feat(plugin-manager): let a bundle list its rows without row switches
A bundle whose rows work only together sets `dsh.bundle.rowSwitches: false`.
`listBundles` reports it as `rowSwitches`, and the Plugins page then lists the
bundle's rows with their state and offers only the bundle's own switch. A
bundle that omits the field keeps a switch per row.
2026-09-25 00:41:49 -07: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
Chinesezjc acf3efeb03 build(schedule-bundle): match the workspace version after the master merge-forward
The 0.1.7-rc.2 release bumped the root and every dsh-family manifest; the new
experimental bundle carries the same version so check-workspace-constraints passes.
2026-09-25 15:32:29 +08:00
Chinesezjc 752e366a53 Merge remote-tracking branch 'origin/master' into feat/experimental-schedule-bundle 2026-09-25 15:31:58 +08:00
Chinesezjc e3a36cfe80 docs(schedule-bundle): keep the host-storage note current and trim the restated decision
The 2026-09-16 host-schedule-storage note now names the optional experimental
bundle as what mounts Schedule, since the Web composition carries the row disabled.
The opt-in note's Decision drops the sentence the Problem already owns, and the
assembled-remote mock states why its Schedule answers stay declared.
2026-09-25 15:29:39 +08:00
Chinesezjc 7b3bc172de docs(schedule-bundle): scope the overlay limitation and pin the overridden row name
The overlay alternative now says only its insert form fails to override a shipped
row, since an id-targeted --patch overlay does set one. The composed assertion
compares the overridden row's package name with the shipped layer's name instead of
asserting a string.
2026-09-25 15:18:31 +08:00
ZiyaZhang 92690a5a3b fix(ui-settings-plugin-inventory): align and simplify plugin cards
Cards in one grid row now share a height, with title rows and descriptions
starting at the same offsets. The entry id shows only when it differs from
the title, as a code chip in the card's bottom-left corner; tags mark only
states other than plainly enabled; descriptions clamp to two lines until the
card expands; the preset group starts open; loading shows skeleton cards.
Group headers share one height, the subtitle separator is evenly spaced, the
title weight drops to 500, 12.5px text moves to 12px, and a container query
on the tab switches the grid to one column.
2026-09-25 00:14:40 -07:00
Chinesezjc 1065f0afd1 fix(schedule-bundle): correct review findings on row semantics and the archived note
Cross-link the archived decision the opt-in note supersedes, state the Loader's one
entry per id and last-declaration-wins behavior in the overlay and extraction
alternatives, scope the missing-row warning to profiles that mount no Plugins page,
and move the switch-on-but-ineffective case to the list-order paragraph. Assert one
top-level composed row per id and correct the stale assembled-remote comment.
2026-09-25 15:12:14 +08:00
Chinesezjc 1145adee07 docs(schedule-bundle): correct the notes, README limits, and composed patch spec
Archive the reversed 2026-09-24-web-default-schedule-composition triplet and name
the four bundles in the optional-bundles note. Rewrite the opt-in note's Problem to
the state at the branch base and state why the bundle switches time-context on with
schedule. Record the missing-row warnings, the bundle list order, and the bundle
detail page's empty state in the bundle README. Pin the composed Schedule rows in
scripts/optional-bundles.spec.ts and move the cli dependency entry into order.
2026-09-25 15:00:26 +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
ZiyaZhang 197355bb12 fix(schedule-bundle): name the Plugins row Automation tasks with an alarm clock icon
The row now carries the name of the sidebar entry it adds and a
plain-language description, and its icon is an alarm clock drawn in the
Official group's 36px style. The README and the user guide quote the new
title; the README names the sidebar entry instead of a right-sidebar page.
2026-09-24 23:08:48 -07:00
imccyu a08472e982 fix(build): fold desktop keyboard tests into client typecheck 2026-09-25 14:01:08 +08:00
imccyu 638842895a docs(desktop): describe keyboard typecheck ownership 2026-09-25 14:00:53 +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
Huanqi Cao 1d56bd5628 feat(sandbox-windows-acl): ship a diagnosis skill for ACL denials
A denial this backend cannot explain — the confined child cannot open an object it
was granted, or provisioning itself fails with Win32 5 — reached the user as a bare
"Access is denied". The README documented both causes but shipped no way to tell
them apart.

Add the `diagnose-windows-sandbox-acl` skill. Its script reads unless a repair switch
is passed, and classifies the failing path and its ancestors before anything
changes; its two repair modes are the only supported ACL edits. `-Fix` removes a
foreign package-SID allow ACE, and `-GrantFullControl` supplies the
WRITE_DAC/WRITE_OWNER pair the mandatory-label write needs without ever changing an
owner. Both require `-AllowRoot`, refuse a target outside it, and refuse to run
together.

`dsh-sandbox-local` registers the skill on Windows through `ctx.inject(['skills'],
...)`, so the skill registry stays optional and the sandbox never depends on it. The
assets ship in this package's `files` list, which the workspace-constraints gate now
pins alongside the runner and emitted-type entries.

Tests cover the script's verdicts (foreign ACE, healthy object, inert capability
SID, inert DENY ACE), its surgical removal, the grant's owner invariant, and both
refusals; the catalog spec covers registration and disposal.
2026-09-25 13:17:36 +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
yudshj cf6276e78d fix: preserve independent persistence type graphs 2026-09-25 01:09:44 +08:00
Chinesezjc 8f161254b7 Merge remote-tracking branch 'origin/master' into feat/schedule-reminder-framing 2026-09-25 00:35:11 +08:00
yudshj cc3c631699 refactor: compact persistence schema type inventory 2026-09-25 00:32:15 +08:00
Yichen Jiang 7e5a4d1e4b fix(docs): align publication runner and scoped-event heap budgets 2026-09-24 23:56:45 +08:00
creatixchu 505c4fcb7d perf(cua): batch AX roles with observation attributes 2026-09-24 23:17:02 +08:00
zhc 0b275fc3f6 merge: sync master release and align analytics policy checks 2026-09-24 23:08:59 +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
zhc 9f7ef18c03 refactor(analytics): centralize live policy and message submission context 2026-09-24 22:58:55 +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
Turtle 477b4f4205 Merge pull request #5180 from deepseek-harness/rel/dsh-0.1.7-rc.2
release(dsh): 0.1.7-rc.2
2026-09-24 21:39:59 +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 3ce7b11425 fix(schedule-bundle): satisfy the omitted-companion README rule and refresh the plugin goldens 2026-09-24 21:32:28 +08:00
turtle1999 787b746b80 release(dsh): 0.1.7-rc.2 2026-09-24 21:24:26 +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
Chinesezjc d0f62c36fa build(schedule-bundle): add the bundle to the host program references 2026-09-24 21:05:54 +08:00
Chinesezjc 41c29fa832 feat(schedule): ship the Schedule switch as an optional bundle
The shipped Web composition carries `time-context`, `schedule`, and
`ui-schedule` disabled. This adds
`@deepseek-ai/dsh-experimental-schedule-bundle`, whose patch sets
`disabled: false` on those three rows and inserts none, and names it in
`OPTIONAL_BUNDLES` with a runtime dependency of `apps/cli`, so every
installation ships it switched off and the Web Plugins page offers it in
the Official group.

The two Web suites and the built-Web Schedule Remote scenario enable the
rows through that bundle instead of a scenario-local fixture.
2026-09-24 21:03:26 +08:00
Turtle f9564a0d48 Merge pull request #5175 from deepseek-harness/turtle/disable-shipped-schedule
feat(web): disable shipped schedule and time context plugins
2026-09-24 20:55:39 +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
Turtle f84891eaff Merge pull request #5150 from deepseek-harness/fix/auto-review-user-approval
fix(auto-review): ask the user after a denial and report reviewer failures
2026-09-24 20:48:39 +08:00
creatixchu 29ecbbb3d5 test(cua): compare native text pacing with Blender readback 2026-09-24 20:44:01 +08:00
turtle1999 374b9cc1fb test(web): align shipped composition fixtures with disabled scheduling 2026-09-24 20:41:51 +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
liyao 5b4cfa5141 Merge remote-tracking branch 'origin/master' into fix/update-copy-review
# Conflicts:
#	packages/client/ui-workspace/src/client/locales.ts
2026-09-24 20:35:12 +08:00
Yichen Jiang 24f28dfdb6 Merge pull request #5173 from deepseek-harness/worktree/model-selection-background-save
fix(session): save default model settings in the background
2026-09-24 20:31:25 +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
turtle1999 cad6fef2fd feat(web): disable shipped schedule and time context plugins 2026-09-24 20:27:14 +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
zhc e29a880027 Merge master and regenerate graphs after question revert 2026-09-24 20:17:40 +08:00
Xu Hanxiang 4ef97b92a9 Merge pull request #4827 from deepseek-harness/fix/truncate-without-splitting-surrogates
fix(tools): keep surrogate pairs intact when capping tool output
2026-09-24 20:16:49 +08:00
Turtle c92c72eb46 Merge pull request #5165 from deepseek-harness/turtle/atomic-write-exited-lock-takeover
fix: take over a writer lock whose holder exited, and wait for its pnpm run
2026-09-24 20:11:31 +08:00
Yichen Jiang e786c3f74a test(web): await background model preference saves 2026-09-24 20:08:56 +08:00
Turtle 1afcc03ff9 Merge pull request #5174 from deepseek-harness/revert-4868-reconciled-pr4839-ux-evidence
Revert "feat: reconcile timed questions with legacy default"
2026-09-24 20:06:41 +08:00
Turtle 32905d5ab5 Revert "feat: reconcile timed questions with legacy default" 2026-09-24 20:06:09 +08:00
mektpoy ea3667175d Merge remote-tracking branch 'origin/master' into fix/truncate-without-splitting-surrogates 2026-09-24 20:03:02 +08:00
zhc 996e846281 Merge master and regenerate event graphs for CI 2026-09-24 20:01:57 +08:00
Turtle 6e45fd5bea Merge pull request #4500 from deepseek-harness/fix/windows-directory-junction
fix(workspace-files): list directory links through their resolved target
2026-09-24 19:58:39 +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
imccyu a64eaf0b5e Merge pull request #4868 from deepseek-harness/reconciled-pr4839-ux-evidence
feat: reconcile timed questions with legacy default
2026-09-24 19:56:56 +08:00
zhc 847890a526 test(desktop): provide launch flag parser in Host lifecycle fixture 2026-09-24 19:56:50 +08:00
Turtle 1bd3df926d fix(plugin-manager): wait for a pnpm run its exited operation left behind
Review found three ways the takeover could let two writers overlap.

- A claimant that read an exited PID could remove the lock of a new
  holder that reused that PID before the claim. The claimant now probes
  the PID again under the claim, after re-reading the record.
- The browser Worker's process shim reports its own PID as absent, so a
  second writer in the Worker took over the first one's live lock. A
  record naming the contender's own process is never taken over.
- Takeover proves only that the holder exited, while a pnpm run it
  started can still be writing the profile. Each profile operation now
  records its pnpm run in .plugin-manager/run.json and removes the record
  when the run ends; an operation that finds a record waits for the run
  within the existing tree bound and otherwise refuses, naming the
  process and the record, without running pnpm.

A failed removal of the exited holder's lock now waits instead of
failing the acquisition, the probe range is stated as int32, and the
tests inject exited PIDs instead of reusing real ones, which Windows
reissues at once.
2026-09-24 19:55:41 +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
turtle1999 0a134ef94e fix(auto-review): localize the approval prompt and sync docs with the ask fallback
The tools pipeline's ask decision now carries an optional displayReason
that ToolRuntime forwards to the approval service, so the Auto review
prompt is localized while the audited reason stays English.

Adds the auto-review-approval Web snapshot for a user rejection after a
reviewer denial and for a reviewer failure, and updates the permission
preset pages, READMEs, Agent Notes, and child-agent JSDoc that still
described the shared never bundle.
2026-09-24 19:54:37 +08:00
zhc 3abdd5f7de Merge desktop Host startup diagnostics from master 2026-09-24 19:49:04 +08:00
Yichen Jiang 86331673d9 fix(session): save default model settings in the background 2026-09-24 19:48:49 +08:00
Yif 5c0ef3a7c2 Merge master and preserve requested terminal gradient 2026-09-24 19:45:21 +08:00
Magolorandimccyu a56d2bf2ff fix(user-questions): reset projection version and use brand utility
Co-authored-by: imccyu <[email protected]>
2026-09-24 19:43:16 +08:00
Magolorandimccyu 652bc9d396 fix(user-questions): align styles and cover wait cleanup
Co-authored-by: imccyu <[email protected]>
2026-09-24 19:43:16 +08:00
Magolorandimccyu bb19061473 feat(user-questions): support timed waits and late replies
Co-authored-by: imccyu <[email protected]>
2026-09-24 19:43:16 +08:00
turtle1999 74f85e177e Merge remote-tracking branch 'origin/master' into fix/windows-directory-junction
# Conflicts:
#	.agents/notes/implemented/architecture/2026-09-05-workspace-files-service.i18n.yaml
#	.agents/notes/implemented/architecture/2026-09-05-workspace-files-service.md
#	.agents/notes/implemented/architecture/2026-09-05-workspace-files-service.zh.md
#	packages/api/workspace-files/README.i18n.yaml
2026-09-24 19:41:46 +08:00
Turtle fb018e3e7a Merge pull request #5159 from deepseek-harness/fix/profile-bundle-skip-once
fix(boot): report skipped profile bundles once per start
2026-09-24 19:41:11 +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
zhc 8cfb9d4a67 Merge model selection pending state from master 2026-09-24 19:39:50 +08:00
imccyu b16b1eaea8 Merge pull request #5117 from deepseek-harness/ihsiang/shortcut-sidebar-polish
feat(web): refine shortcut editing and sidebar hints
2026-09-24 19:38:09 +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
zhc 0c7777828c Merge master into desktop analytics review fixes 2026-09-24 19:36:26 +08:00
Turtle c8631b2064 Merge pull request #5109 from deepseek-harness/refactor/trim-tool-constraint-descriptions
refactor(tools): trim constraint prose from tool descriptions
2026-09-24 19:34:54 +08:00
Turtle 6d5b3e8c23 Merge pull request #5156 from deepseek-harness/turtle/model-select-pending-spinner
feat(ui-model-selection): show a spinner while a model selection is pending
2026-09-24 19:34:15 +08:00
zhc 1dc5232999 fix(desktop): isolate analytics and redact installer inputs 2026-09-24 19:29:30 +08:00
creatixchu bdf183e7e1 test(cua): compare complete native observations on synthetic windows 2026-09-24 19:26:56 +08:00
Turtle 7bd17809e3 Merge pull request #5163 from deepseek-harness/turtle/fix-issue-3390-dfb901b523d2
feat(ui-tool): link the collapsed web fetch URL
2026-09-24 19:25:41 +08:00
Turtle 6dbf4ab6c9 docs(notes): name the kernel lock the Session lease already holds on Windows
The takeover note said no Windows binding exists for a kernel-released lock; the Session write lease already holds a named semaphore there through koffi.
2026-09-24 19:25:36 +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
Yudong Han 8e816b7ea4 Merge pull request #5167 from deepseek-harness/deps/libreoffice-kit-0.1.1
chore(deps): upgrade LibreOffice Kit to 0.1.1
2026-09-24 19:22:18 +08:00
turtle1999 0a6de62671 refactor(boot): derive skipped bundles only from Profile.skippedBundles
skippedProfileBundles recomputed the selected-minus-loaded bundle set from
the manifest, a second home for what loadProfileDirectory already records.
Runtime resolution and generateConfigSchema now read
profile.skippedBundles, so generateConfigSchema no longer reads the profile
manifest and drops its binName parameter.
2026-09-24 19:19:52 +08:00
Yichen Jiang a5309122f4 Merge pull request #5011 from deepseek-harness/worktree/voice-setup-navigation
feat(voice-input): guide unready microphones to plugin setup
2026-09-24 19:16:33 +08:00
Yichen Jiang 193f9ce413 fix(llm): keep oversized request extensions from blocking model requests (#5168)
Optional request extension fields had no size bound. A very large field
could exceed the runtime's string limit while the request was serialized,
which failed every attempt, including retries.

- Bound the extension payload carried by one request (8 MiB by default,
  configurable) and send the remainder with later requests.
- If the combined request still cannot be serialized, send the base
  request without extension fields and log which fields were omitted.
- Add regression tests and update the related references and decision note.
2026-09-24 11:15:37 +00:00
turtle1999 d55f434cdf fix(ui-model-selection): own the pending selection in ModelDirectory
The seat kept the pending row in local state, so a stale settlement after
connection/reset could clear a newer selection's spinner, a remount lost
it, and /model popup selections never marked a row. ModelDirectory now
publishes the submitted selection as pending under its generation guard.
The trigger spins whenever a selection is pending, so leaving the row's
pane keeps the feedback visible.
2026-09-24 19:09:14 +08:00
liyao 5fc3dafa49 fix(desktop): reuse Windows installation copy 2026-09-24 19:06:18 +08:00
Turtle 910711e6c1 fix(atomic-write): keep the PID-only lock record
The hostname guarded only writers on several hosts sharing one file,
which no supported deployment does, and macOS changes its hostname when
networks change, so locks from before the change could not be taken
over. The nonce closed a race that needs the PID space to wrap between
two reads. Keeping the `<pid>\n` record lets processes of both releases
interoperate.
2026-09-24 19:06:07 +08:00
turtle1999 473f381420 test(cli): export reportSkippedBundles from the desktop-host app-boot stub 2026-09-24 19:04:53 +08:00
Turtle b8e30bf599 fix(ui-tool): address review on web fetch summary link 2026-09-24 19:02:19 +08:00
yixiangihsiang f1b65c78f1 Merge latest origin/master and refresh translation pairing 2026-09-24 18:59:19 +08:00
creatixchu 24b2d1358e fix(cua): separate optional AX metadata from structural discovery 2026-09-24 18:57:48 +08:00
yudshj 03bd8258c3 chore(deps): upgrade LibreOffice Kit to 0.1.1 2026-09-24 18:56:22 +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
liyao d83023bd1a Merge remote-tracking branch 'origin/master' into fix/update-copy-review 2026-09-24 18:47:22 +08:00
Turtle 7e7ba139fd fix(atomic-write): take over a writer lock whose holder exited
A process that ends without running withFileLock's finally left
<file>.lock behind, and every later writer timed out until an operator
deleted it. `dsh plugin` interrupted with Ctrl-C, `dsh web` exiting
right after disposal while a cancelled install still restores files,
and any crash all left the profile package lock this way.

The lock now records its holder's PID, hostname, and a nonce. A
contender that finds a record from this host whose PID a signal probe
reports absent claims that record through a wx-created claim file,
re-reads the lock, removes it only while it still holds the record, and
retries at once. A PID-only record from an earlier release counts as
written on this host, so locks left before this change are taken over
too. Empty, incomplete, foreign-host, and live-holder records are still
waited for.
2026-09-24 18:46:42 +08:00
turtle1999 0a1d102ef0 Merge remote-tracking branch 'origin/master' into fix/profile-bundle-skip-once
# Conflicts:
#	packages/boot/app-boot/README.i18n.yaml
2026-09-24 18:44:35 +08:00
Turtle 61a0ed487e feat(ui-tool): link the collapsed web fetch URL
Closes #3390
2026-09-24 18:41:58 +08:00
yixiangihsiang 4d4bb4c907 fix(client): reveal new-session keys on hover and align settings radius 2026-09-24 18:40:55 +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
turtle1999 c8b10a16be fix(boot): report skipped profile bundles once per start
loadProfileDirectory printed each skipped bundle on every call, and startup,
runtime resolution, the config editor, the plugin manager, and HMR all load
the profile, so one incompatible bundle printed the same warning six times at
startup and again on each Web page load. Loading now returns the skips in
Profile.skippedBundles, and the CLI and Desktop launchers print them once per
start with reportSkippedBundles.
2026-09-24 18:32:48 +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
turtle1999 20b0730310 Merge remote-tracking branch 'origin/master' into fix/auto-review-user-approval 2026-09-24 18:19:32 +08:00
Chinesezjc 0ca5865a5c Merge pull request #5153 from deepseek-harness/fix/preset-legacy-tool-expectation
test: expect the Host Schedule tools in the legacy preset patch case
2026-09-24 18:19:09 +08:00
turtle1999 c87959bc44 feat(ui-model-selection): show a spinner while a model selection is pending
session.selectModel can take seconds while the Host persists the default
model. The composer seat disabled its rows with no other feedback; the
chosen row now spins in its check slot, and the trigger spins in place of
its chevron while the menu is closed.
2026-09-24 18:18:34 +08:00
lsdsjyandlsdsjy 1103c1a7dd fix(web): 将开发者工具开关更名为代码工作工具 (#5149)
* fix(web): 将开发者工具开关更名为代码工作工具

* test(web): 补齐旧预设配置的定时任务工具断言

* docs(web): 同步代码工作工具开关名称

---------

Co-authored-by: lsdsjy <[email protected]>
2026-09-24 10:15:55 +00:00
mektpoy 223ad4c373 docs(output-retention): address review feedback on the surrogate cap
- State the contract precisely: the cut never introduces a lone high
  surrogate, and an unpaired surrogate the input already carries is not
  repaired.
- Document the new export in the package README: a character-budget preview
  section naming the persistent bash and pwsh shells and str_replace_editor,
  plus a Known Limitations bullet that no longer contradicts it.
- Drop the assertion restatement from the two shell test comments.
- Let the str-replace test helper reuse a root so the clipped context reads
  its file inside its own working directory.
2026-09-24 18:15:52 +08:00
Turtle 488409e306 Merge pull request #5141 from deepseek-harness/turtle/settings-subagent-label-ffe748ff3c38
fix(client): use 子智能体 on the Chinese Subagent settings page
2026-09-24 18:12:29 +08:00
creatixchu d994a3326b feat(cua): replace the macOS Rust helper with Swift 2026-09-24 18:09:17 +08:00
Ziya 77f8d83363 Merge pull request #5143 from deepseek-harness/fix/schedule-record-prompt-clamp
fix(ui-schedule): clamp saved prompts in task run records to two lines
2026-09-24 03:07:56 -07: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
yixiangihsiang eccfda04d6 Merge origin/master into ihsiang/shortcut-sidebar-polish 2026-09-24 18:05:36 +08:00
gengruilin 640c1744c0 Merge master to include the legacy preset E2E fix 2026-09-24 18:05:33 +08:00
Xu Hanxiang 8267edfa62 Merge pull request #5148 from deepseek-harness/fix/agent-preset-legacy-schedule-tools
test(cli): expect the shipped Schedule tools in the legacy preset
2026-09-24 18:03:17 +08:00
Turtle 217fb65ac7 Merge pull request #5133 from deepseek-harness/turtle/time-context-ten-minutes
feat(time-context): default injections to ten-minute intervals
2026-09-24 18:01:18 +08:00
imccyu 13de94764b Merge pull request #4839 from deepseek-harness/timed-user-questions-two-settlements
feat: continue timed user questions as two settlements
2026-09-24 18:00:47 +08:00
Chinesezjc 1fa5ea3faa test: expect the Host Schedule tools in the legacy preset patch case
The shipped Web bundle gives every live root Agent the Host Schedule
tools, and every other scenario in this file that boots the shipped
base/web bundle with the minimal preset expects ['bash',
...SCHEDULE_TOOLS]. This case uses the same bootWeb composition and adds
only a settings patch, which does not change tool composition, so its
['bash'] expectation failed on every PR.
2026-09-24 18:00:23 +08:00
Chinesezjc fd81b474b3 Merge remote-tracking branch 'origin/master' into feat/schedule-reminder-framing 2026-09-24 17:59:44 +08:00
turtle1999 307a1920a5 test(cli): expect Schedule tools in the legacy-patch minimal preset
The minimal preset carries the Schedule tools since #5123; the
legacy-patch case added by #5108 still expected bash alone.
2026-09-24 17:58:58 +08:00
Ziya 90e8dfd17f Merge branch 'master' into fix/schedule-record-prompt-clamp 2026-09-24 02:58:29 -07: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
yixiangihsiang 08daf789d5 fix(client): keep new-session shortcuts visible and address review 2026-09-24 17:53:53 +08:00
turtle1999 409fb145af fix(auto-review): ask the user after a denial and report reviewer failures
A reviewer denial now returns the tools pipeline's ask decision when the
Session's approval policy is ask, so the user can approve, reject, or
cancel the call. Selecting Auto writes the ask policy; a recorded Auto
selection still matches never, which delegated children pin, so their
denials stay final.

A reviewer failure now fails the call with its specific error instead of
presenting it as an Auto review denial.
2026-09-24 17:53:25 +08:00
turtle1999 341023a9e7 refactor(schedule): trim constraint prose from Schedule tool descriptions
Keep the timing rules that apply to every selector in the create
description once, move the cron day-field and fixed-rate alignment rules
onto their parameters, and drop parameter formats, result fields, and
Host compare-and-set details from the tool descriptions.
2026-09-24 17:52:58 +08:00
turtle1999 8f86c22a9a refactor(tools): apply send_message, job_kill, and read_image review wording
Drop the extension-less path hint from read_image and the
returns-before-stopped note from job_kill, and describe send_message
delivery without "resumes a turn". image-compaction lowers its context
window by the 30-token tool-schema estimate reduction.
2026-09-24 17:52:58 +08:00
turtle1999 ab2f5d3009 refactor(tools): drop system-prompt repeats of tool definitions
Tool guidance sections keep only what the tool definitions do not say.
Apply review: reword interrupt_agent and list_agents, carry "a rejected
escalation stays denied" in the rejection error, pin
sandboxPermissionsDescription, and fix stale README and Agent Note
statements. Record the tool-definition rules in agent-experience.

Compaction threshold snapshots shift their context windows by the
370-token system-prompt estimate reduction; escalation-rejected moves to
a v4 fixture for the new rejection text.
2026-09-24 17:52:58 +08:00
turtle1999 321a6fa740 refactor(tools): trim constraint prose from tool descriptions
Delete constraints the model learns from the call result, shorten
implementation detail, and move per-parameter rules into the owning
parameter descriptions. Bash, pwsh, and fs share one
sandbox_permissions description in dsh-sandbox.

The standard preset's first-turn prompt drops from 7985 to 6551 tokens.
Compaction threshold snapshots lower their context windows by the
1548-token tool-schema estimate reduction so each trigger keeps its
position; their fixtures move to v4 generations.
2026-09-24 17:52:58 +08:00
Turtle 3c9c18c9fe fix(preset): route profile feature enabling through cordis-plugin-development (#5138)
Broaden the skill description to cover enabling a shipped plugin that a
bundle leaves disabled, add the workspace-bundle recipe for it, forbid
hand-editing profile files that install_bundle owns, and verify installs
through the install result and cordis_inspect_query instead of logs,
process lists, or paged list_plugins calls.
2026-09-24 17:51:15 +08:00
12c9dd599e feat(approval): localize approval explanations (#4793)
* feat(approval): localize prompts and allow consent for one turn

* test(approval): update cast baseline and Web PTC prompt pin

* fix(approval): cover PTC language and clarify turn consent

* fix(approval): group turn consent under allow menu

* fix(approval): keep turn consent in memory only

* test(snapshot): refresh owners for merged justification guidance

* fix(approval): drop duplicate allow-once from the allow menu

* refactor(approval): derive turn consent expiry from one check

Replace the turn approval bookkeeping (revocation state, incremental log
cursor, and turn-signal listeners) with one side-effect-free expiry check
over the log and lifetime flags. Events now only withdraw open
presentations early; the expiry check decides whether an answer or turn
consent still applies, including for Sessions without event publication.

* refactor(approval): drop one-turn consent and keep localization only

Remove the allowed-turn answer, the live turn-consent state, the allow
menu, and their tests, notes, and recorded Web scenario. The approval
service returns to the master request path; the request keeps the
localized displayReason for presentation, and the card resolves it in
the active UI language.

* test(snapshots): record the localized justification schema text in new scenarios

---------

Co-authored-by: Turtle <[email protected]>
Co-authored-by: Kaige-Gao <[email protected]>
2026-09-24 17:47:42 +08:00
ZiyaZhang d8e3efa860 test(cli): expect Schedule tools in the legacy preset-patch session
#5108 added this case against a master where the shipped Web bundle had no
Schedule rows; #5123 then made Schedule part of the default Web composition.
Every other minimal-preset session in this file already expects bash plus
the four Schedule tools, so this one does too.
2026-09-24 02:47:26 -07:00
mektpoy a09402b41c test(cli): expect the shipped Schedule tools in the legacy preset
The shipped Web composition gained the four Host Schedule tools, and the
other four minimal-agent assertions in this file already expect them. The
legacy profile-patch scenario still expected bash alone, so master's E2E
lane failed on it. Align it with its siblings.
2026-09-24 17:46:21 +08:00
lsdsjy 62db4c88c9 Merge pull request #5127 from deepseek-harness/fix/account-model-settings
fix(web): 修复账号模型设置的 namespace 识别
2026-09-24 17:43:32 +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
gengruilin 7a7ee29c28 test(web): wait for changed files card in SVG delivery test 2026-09-24 17:41:55 +08:00
Turtle 259534c2c7 docs: call the Chinese settings page 子智能体 in zh READMEs 2026-09-24 17:40:47 +08:00
liyao a4ac7e9eb3 fix(workspace): align unnamed rename entry points and hover actions 2026-09-24 17:31:42 +08:00
ZiyaZhang 27a0a4606c Merge remote-tracking branch 'upstream/master' into fix/schedule-record-prompt-clamp
# Conflicts:
#	packages/client/ui-schedule/README.i18n.yaml
2026-09-24 02:31:11 -07:00
Turtle bfd7e859f5 docs(client): re-record ui-settings-subagent README pairing 2026-09-24 17:26:11 +08:00
lsdsjy c0f0bcf587 Merge pull request #5108 from deepseek-harness/feat/developer-mode-preset-selection
feat(web): 由开发者模式统一控制新任务模式选择
2026-09-24 17:24:51 +08:00
mektpoy 9c64dee509 Merge origin/master into fix/truncate-without-splitting-surrogates
Conflict resolution:
- docs/config-catalog and docs/module-graph: regenerate with the current
  generators, which write the bilingual pages together.
- The conflict came from master's new short-fingerprint pairing records: our
  branch still carried the previous full-hash records. Take master's record
  format, then re-record the output-retention README pair after regenerating
  its two sides.
2026-09-24 17:23:43 +08:00
turtle1999 e1f65ea640 fix(preset): route profile feature enabling through cordis-plugin-development
Broaden the skill description to cover enabling a shipped plugin that a
bundle leaves disabled, add the workspace-bundle recipe for it, forbid
hand-editing profile files that install_bundle owns, and verify installs
through the install result and cordis_inspect_query instead of logs,
process lists, or paged list_plugins calls.
2026-09-24 17:20:17 +08:00
imccyu fa6d9fd75b docs(user-questions): propose timed waits and late replies 2026-09-24 17:20:01 +08:00
Turtle cf8fe108d5 fix(client): call Subagent 子智能体 in the Chinese settings page 2026-09-24 17:18:42 +08:00
liyao 274bb97e0a test(client): cover unnamed results and versionless update tooltips 2026-09-24 17:13:12 +08:00
zhc 35fa12f2a5 Merge master into desktop product analytics 2026-09-24 17:11:06 +08:00
Chinesezjc 4611e32e64 Merge pull request #5123 from deepseek-harness/feat/automation-phase1
feat(schedule): ship Schedule in the default Web composition
2026-09-24 17:10:53 +08:00
Chinesezjc 4c0caf9c74 Merge remote-tracking branch 'origin/master' into feat/schedule-reminder-framing 2026-09-24 17:09:26 +08:00
zhc b1cf871b25 feat(desktop): collect product analytics through OTel 2026-09-24 17:08:31 +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
ZiyaZhang 955a706d33 fix(ui-schedule): clamp saved prompts in task run records to two lines
Each record rendered its whole saved prompt, so a long instruction on a
recurring task filled the records tab with the same text once per run.
A prompt longer than two lines now shows two lines and an Expand toggle;
the toggle appears only while the clamp hides text, and a collapsed prompt
re-measures when the panel width changes.

Also drop the stale comment about the removed message-id anchor.
2026-09-24 01:59:56 -07:00
lsdsjy d183c8a8c0 fix(web): 按账号 provider 识别模型编辑器 2026-09-24 16:57:08 +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
lsdsjy 5577becafe fix(web): clear staged preset when developer tools turn off 2026-09-24 16:49:42 +08:00
Chinesezjc f31e51124b test(cli): pin the shipped Schedule rows by name, not loader id 2026-09-24 16:49:34 +08:00
liyao be5a84ad0b fix(workspace): capitalize Untitled and align title fixtures 2026-09-24 16:49:23 +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
Kexin Liu 89756afa72 Merge pull request #4691 from deepseek-harness/fix/focus-ring-brand-primary
fix(client): unify blue focus rings and keep silent focus silent
2026-09-24 16:48:12 +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
Dudu-0223 974c149446 Merge pull request #5114 from deepseek-harness/refactor/catalog-descendant-listing
refactor(subagent): discover descendants through parent catalogs
2026-09-24 16:46:03 +08:00
Chinesezjc 015c187e67 test(cli): read the inspect answer through the spill policy
The shipped Web composition now puts four Schedule tools on every live root
Agent, which pushes a full-preset `cordis_inspect_query` answer past the
12,500-token inline budget, so the spill policy retains its head and tail with
a spill path instead of the complete JSON.
2026-09-24 16:41:20 +08:00
Turtleandturtle1999 950910bdf9 fix(ci): preserve Wine build metadata and isolate test fixtures (#5088)
* fix(ci): preserve Wine build metadata and isolate test fixtures

* test(web): reopen shortcut fixture sidebar with its binding

---------

Co-authored-by: turtle1999 <[email protected]>
2026-09-24 16:37:37 +08:00
lsdsjy 7b86b84c2f fix(web): 修复账号模型设置的 namespace 识别 2026-09-24 16:37:07 +08:00
Chinesezjc 5c768e3c8a fix(schedule): point shared session references at the selected generation
Refreshed owners publish a v4 generation, so every scenario that names
another owner's Session fixture must name that owner's highest generation.
The shipped Web composition also puts the Host Schedule tools on every live
root Agent, so the minimal-preset tool-table assertions include them.
2026-09-24 16:37:05 +08:00
Turtle a3480857dd feat(plugins): offer Auto review and keep Inspector explicitly installed (#4867)
* feat(experimental): ship every experimental capability as an optional bundle

dsh-base mounts the registration-only browser-use and computer-use
services; the Playwright MCP, Chrome DevTools MCP, native and MCP Cua
Driver providers, Auto review, and the Inspector become one-row bundles
listed in OPTIONAL_BUNDLES with an icon and locale display metadata.
verify-default-product-isolation requires both for every optional
bundle. Python PTC and Stagehand stay explicit compositions.

* feat(experimental): keep optional bundles inside the install closure

Drop the Playwright MCP, Chrome DevTools MCP, and native Cua Driver
bundles: each is a runtime dependency of every install and would add
about 85 MB of provider runtimes whether or not enabled. dsh-browser-use
leaves dsh-base with them. The three packages keep their locale display
metadata for component rows.

* feat(experimental): drop the Cua Driver MCP bundle and leave dsh-base untouched

* test(web): refresh Official-group goldens for the four optional bundles

* fix(plugins): use an uninstalled bundle as the install example and pin optional-bundle metadata

The install guide's example is now @deepseek-ai/dsh-subagent-codex,
a published bundle no shipped profile carries, since Auto review is an
installed optional bundle. The optional-bundle spec guards its corpus and
pins each bundle's title, description, and icon in both languages; the
Inspector's Loader test mounts its real bundle patch, its Client names
the reload a hot-enabled page needs, and its description states the
loopback DevTools endpoint's reach.

* test(web): refresh GitHub install recovery placeholder snapshot
2026-09-24 16:33:50 +08:00
Dudu-0223 af371e21c0 revert(subagent): preserve list_agents tool descriptions 2026-09-24 16:32:57 +08:00
Dudu-0223 88500a0f3a fix(subagent): align catalog discovery docs and regression coverage 2026-09-24 16:30:58 +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
Chinesezjc fe6ce46248 docs(context): keep the group summary within its word budget 2026-09-24 16:28:51 +08:00
liyao 3dc1e1a92f Merge remote-tracking branch 'origin/master' into fix/update-copy-review
# Conflicts:
#	packages/client/ui-settings-general/README.i18n.yaml
#	packages/client/ui-settings-general/README.md
#	packages/client/ui-settings-general/README.zh.md
2026-09-24 16:27:41 +08:00
imccyu 3eadc9b56c Merge pull request #5107 from deepseek-harness/fix/desktop-local-markdown-images
fix(desktop): 修复本地 Markdown 图片预览
2026-09-24 16:27:11 +08:00
turtle1999 da05b8d9c5 test(web): reopen shortcut fixture sidebar with its binding 2026-09-24 16:27:07 +08:00
creatixchu a0dd723300 test(cua): observe and raise the exact Blender fixture window 2026-09-24 16:24:26 +08:00
liyao f134ad960c docs(client): sync update guidance and session title catalog 2026-09-24 16:18:56 +08:00
liyao bcf0ba45cb fix(client): clarify update guidance and unnamed session labels 2026-09-24 16:16:17 +08:00
creatixchu 149ba9acd0 test(cua): locate Blender editor independently of Retina units 2026-09-24 16:15:49 +08:00
Dudu-0223 4e6a1c1073 fix(session-query): classify live projection failures as corrupt 2026-09-24 16:13:37 +08:00
Chinesezjc e896737840 feat(schedule): ship Schedule in the default Web composition
The Web bundle now mounts `time-context` and `schedule` and leaves the
`ui-schedule` client row enabled, so the Automation tasks page, the Session
reminder catalog, and the `schedule_*` tools work without an overlay. Both
packages join the bundle's declared dependencies, and the example overlay is
deleted: re-inserting its rows would mount both Host plugins twice.

The fixed-rate floor drops from 300 to 60 seconds across the Host decoder,
the create and update validation, the model-visible tool schema, and the
client's per-unit floors.

Web recorded sessions and header sidecars are refreshed for the readings
`time-context` now appends; `normalizeWebSessionVolatiles` tokenizes their
sampled instant, browser zone, and elapsed duration so replay stays stable.
2026-09-24 16:11:52 +08:00
gengruilin c7bfe88e70 merge: 同步 master 并解决双语记录冲突 2026-09-24 16:06:40 +08:00
mektpoy 8e42deafa1 fix(client): keep the sidebar toggle's focus ring unclipped
The sidebar toggle is flush with `.logoRow`, which clips its own overflow, so
the standard outward ring lost every pixel that left the row: the reviewer saw
the ring cut on the toggle in both the expanded header and the settled rail.

The 36px rail toggle is also 1px wider than its 35px row, so the control's own
right edge was clipped there. Draw this control's ring inside its own box and
stop clipping the row once the rail has settled; the ring keeps the standard
`--dsw-focus-ring-width` colour and width, and pointer modality still resolves
`--dsw-focus-ring-color` to transparent.

`focus-rings.e2e.ts` asserts the whole ring against every clipping ancestor in
both layouts, in both themes.
2026-09-24 16:02:45 +08:00
turtle1999 6720a1206f fix(ci): reconcile workspace fixture with current master 2026-09-24 16:02:31 +08:00
Ziya 60e69cb931 Merge pull request #5113 from deepseek-harness/fix/github-recovery-on-mirror
fix(plugin-manager): offer another way when a GitHub failure already asked the mirror
2026-09-24 01:01:22 -07:00
yixiangihsiang ed3dcf54c5 feat(web): refine shortcut editing and sidebar hints 2026-09-24 15:55:33 +08:00
Dudu-0223 311cac1c17 docs: refresh subagent dependency graph 2026-09-24 15:54:47 +08:00
Dudu-0223 a4ddc28ed5 refactor(subagent): traverse descendant catalogs recursively 2026-09-24 15:49:55 +08:00
ZiyaZhang d7db3a2f06 test(plugin-manager): name the on-mirror recovery case by what it asserts 2026-09-24 00:46:50 -07:00
liukx0205 9827bcfb37 Merge master into fix/focus-ring-brand-primary 2026-09-24 15:38:51 +08:00
creatixchu eb10c938ca test(cua): record AXless window pixel workflow 2026-09-24 15:33:57 +08:00
lsdsjy 53e000810d Merge origin/master into feat/developer-mode-preset-selection 2026-09-24 15:33:43 +08:00
ZiyaZhang ef516f98cf fix(plugin-manager): offer another way when a GitHub failure already asked the mirror 2026-09-24 00:29:39 -07:00
creatixchu 0a83a1a941 fix(cua): retain pixel access for owned windows without AX 2026-09-24 15:29:36 +08:00
imccyu 55fadaa601 Merge pull request #5030 from deepseek-harness/ihsiang/ui-visual-consistency
feat(web): 统一界面圆角与菜单材质,优化文件改动展示
2026-09-24 15:10:55 +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
imccyu d3314da7c2 test(web): expect unblurred desktop onboarding confirmations 2026-09-24 14:58:55 +08:00
imccyu 59d2e01575 revert(desktop): remove branch-local development launchers 2026-09-24 14:58:55 +08:00
imccyu 6000dcdda5 fix(web): reconcile visual consistency after master rebase 2026-09-24 14:58:55 +08:00
yixiangihsiang 63c7e370ce test(desktop): isolate packaging Git observations from concurrent fixtures 2026-09-24 14:58:55 +08:00
yixiangihsiang df2372fefe fix(web): preserve macOS overlay opacity and desktop launch settings 2026-09-24 14:58:55 +08:00
yixiangihsiang 8b60939220 fix(desktop): confine launcher proxies to runtime preparation 2026-09-24 14:58:54 +08:00
yixiangihsiang fdd14a0989 feat(web): unify UI materials and streamline file review 2026-09-24 14:58:54 +08:00
creatixchu 9a53f64dda fix(cua): send modifier transitions for native key chords 2026-09-24 14:52:18 +08:00
lsdsjy 7e97c458ba Merge pull request #5106 from deepseek-harness/fix/account-balance-timeout
fix(account): extend balance request timeout to 30 seconds
2026-09-24 14:50:25 +08:00
mektpoy 74a0c834f9 Merge remote-tracking branch 'origin/master' into fix/focus-ring-brand-primary
Only the ui-theme README pairing record conflicted; re-recorded. The stylesheet
corpus spec passes over master's new client sheets, so no ring needed realigning.
2026-09-24 14:49:16 +08:00
mektpoy 006244a3ad refactor(client): unify the trajectory cell's selected ring on the brand blue
`.selected` still named `--dsw-alias-brand-primary-new-colorprimary-new-color`, the
corrupted token left by a botched rename; its dark value is `deepseek-450` while
every focus ring now uses `deepseek-400`. The selection ring reads the clean
brand-blue alias instead, so one blue covers selection and focus.
2026-09-24 14:47:50 +08:00
winewill 3511c45426 Merge pull request #5015 from deepseek-harness/feat/close-window-quit-behavior
feat(desktop): 关闭窗口隐藏到后台,退出前按任务状态确认
2026-09-24 14:45:04 +08:00
lsdsjy 4c4108ef1b test(web): 修复模式选择测试类型断言与分支覆盖 2026-09-24 14:42:13 +08:00
winewill fbb3fb770f fix(desktop): cancel pending quit decisions during installer exit 2026-09-24 14:36:02 +08:00
lsdsjy a44534e274 feat(web): 由开发者模式统一控制新任务模式选择 2026-09-24 14:29:18 +08:00
winewill 5637311d5a fix(desktop): confirm the first close with the shared shell dialog 2026-09-24 14:25:02 +08:00
winewill 20dae9b6fa test(desktop): align close behavior fixtures after master rebase 2026-09-24 14:24:39 +08:00
winewill eec2b5fa6e fix(desktop): enlarge whale artwork in Windows tray icon 2026-09-24 14:24:39 +08:00
winewill e6f135f15c fix(desktop): harden quit bypass and background-notice bookkeeping after review
- Only the definitive Windows session-end message bypasses the quit
  confirmation; the macOS power-off flag clears on the next focus or show
  because another application can cancel that shutdown.
- A bypassing quit disposes the pending confirmation so a late inspection
  result opens no box and an answered box cannot approve.
- Cancelling a quit that closing the welcome window started shows the
  welcome window again.
- The first-hide notice records its marker only after delivery and
  withdraws it on failure; the Windows quit dialog uses the multi-size ICO.
- windowShown settles when the awaited window is destroyed.
- Cross-link the partially superseded window-menus note; tidy docs.
2026-09-24 14:24:39 +08:00
winewill 4745934683 feat(desktop): hide the window on close and confirm interruptible quits
Closing the main window hides it on macOS and Windows; the page and the
Host keep running and the next show resumes the same document. Windows
gets a permanent tray icon (open / quit) and a one-time notification the
first time the window is hidden after installation.

Every ordinary quit entry asks the Host over a new quit-inspection IPC
request for active tasks (same rule as the update restart check) and
armed scheduled reminders (schedule family of workspace/session-activity
for loaded sessions). Nothing to interrupt quits silently; otherwise a
native message box explains what stops, with Quit as the default and
Cancel on Esc. Inspection failure or a missed two-second deadline counts
as running tasks. The installer restart, fatal recovery, the development
restart command, and OS session end skip the confirmation.

Also: defer the downloaded-update confirmation while the window is hidden,
render the tray ICO from the vector icon, and point the installer's
running-application message at the tray.

Closes #4013
2026-09-24 14:24:39 +08:00
creatixchu de1f8b2421 test(cua): refresh foreground guidance snapshot 2026-09-24 14:15:01 +08:00
lsdsjy c846fd48a3 fix(account): extend balance request timeout to 30 seconds 2026-09-24 14:11:23 +08:00
creatixchu fffc899f9c fix(cua): avoid preemptive foreground activation 2026-09-24 14:11:14 +08:00
Kaige-Gao 7f0a53dfb3 fix(desktop): render local Markdown images
Resolve local image paths through the authenticated dsh-app file route and allow that route in rewritten Markdown images. Cover desktop rendering, previews, encoded filenames, and unsupported origins.

Fixes #5105.
2026-09-24 14:10:13 +08:00
Yudong Han 31da6718a9 Merge pull request #5091 from deepseek-harness/fix/document-preview-white-placeholder
fix(web): 统一文档加载提示、分页留白和主题背景
2026-09-24 14:07:10 +08:00
yudshj ed4445b028 fix(web): unify document loading and spaced theme-aware pages 2026-09-24 13:57:42 +08:00
Yichen Jiang 55b06e6f81 Merge pull request #5098 from deepseek-harness/worktree/model-api-key-autofill
fix(web): suppress saved-password autofill in API key inputs
2026-09-24 13:55:56 +08:00
Yichen Jiang 9a816ec171 Merge pull request #5065 from deepseek-harness/worktree/issue-5003-review-a73e0a
fix(app-boot): preserve routed resolution errors under async module hooks
2026-09-24 13:50:38 +08:00
Yichen Jiang 1197478415 Revert "fix(session): isolate source migration verifiers in processes"
This reverts commit f1cc349a4290fbf34e1f68e51ea787524e761d7c.
2026-09-24 13:46:52 +08:00
winewill 1bc594d701 Merge pull request #5076 from deepseek-harness/feat/windows-update-restart
fix(desktop): clarify Windows updates and raise the restarted window
2026-09-24 13:41:12 +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 fa04034a9c fix(session): isolate source migration verifiers in processes 2026-09-24 13:31:16 +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
Yichen Jiang 11c0511271 fix(web): align remaining API key inputs with autofill policy 2026-09-24 12:32:10 +08:00
Yichen Jiang 4cc76d04e9 fix(web): suppress saved-password autofill in API key inputs 2026-09-24 12:31:56 +08:00
liukx0205 4f1a1289f5 fix(client): use blue focus rings in light and dark themes 2026-09-24 12:24:47 +08:00
Kexin Liu 450f155955 Merge pull request #4826 from deepseek-harness/feat/unify-code-highlight-languages
统一并扩展代码高亮语言表(read 卡片与侧栏 Code 预览)
2026-09-24 12:10:50 +08:00
liukx0205 e71fa92030 Merge master into fix/focus-ring-brand-primary 2026-09-24 12:05:19 +08:00
liukx0205 bf4d264368 Merge master into feat/unify-code-highlight-languages 2026-09-24 11:58:08 +08:00
Yichen Jiang 9a9a331963 fix(voice-input): preserve draft focus during setup guidance 2026-09-24 11:55:27 +08:00
2fd748edad feat(desktop): 按请求凭据区分欠费提示及充值入口 (#4858)
* feat(desktop): distinguish account quota alerts from API key notices

* docs: condense architecture introduction within existing budget

(cherry picked from commit 01aacaee4d48fd7f4d00acb5e23758084d3f224e)

* test(desktop): cover quota notice lifecycle and remove unknown casts

(cherry picked from commit 7fd09407c482d1f0e30f24ba0ebf23cd844ac9a1)

* chore(account-quota): align tests, catalogs, and bilingual pairs with the account plugin

* fix(ui-settings-account): pass the Platform retry label to the account top-up overlay

* fix(chat): preserve quota failures and global notices

* fix(account): keep active top-up pages across quota notices

* fix(account): share platform page ownership and release quota holds

* fix(account): defer notices behind the shared Platform page

The single native Platform view covers the document, so a quota failure that arrives while a Settings-opened page shows is deferred rather than retained: the newest failure still replaces an older notice and its Modal appears after the viewer returns if still current. Top up remains the retained case, releasing its hold and page request with the entry.

* test(account): align quota fixture with bonus actions

* fix(account): preserve quota notice and Platform return focus

* fix(account): preserve onboarding return reads and failed notices

* docs(account): clarify page opener return ownership

* test(account): drive bonus acknowledgement retry deterministically

---------

Co-authored-by: liyao <[email protected]>
Co-authored-by: lsdsjy <[email protected]>
2026-09-24 11:50:11 +08:00
winewill 037bed1f41 fix(desktop): reject running app before installer extraction 2026-09-24 11:49:01 +08:00
Yichen Jiang 1648bb6587 Merge origin/master into worktree/voice-setup-navigation 2026-09-24 11:45:52 +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
lsdsjy 5be03410cd Merge pull request #4990 from deepseek-harness/fix/platform-webview-persistence
fix(desktop): persist account-scoped Platform page preferences
2026-09-24 11:21:21 +08:00
Yichen Jiang 730446172e test(voice-input): address setup guidance review feedback 2026-09-24 11:11:21 +08:00
lsdsjy dd0578fadd Merge origin/master into fix/platform-webview-persistence 2026-09-24 11:05:40 +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
Turtle 2099andTurtle 16af6fddc7 fix(plugins): name the default install source by the registry it names (#5084)
* fix(plugins): name the default install source by the registry it names

The add-plugin dialog showed "默认安装源" for pnpm's own registry, which
told the reader nothing about where the install would download from. Name
npm's own registry as the official npm registry, and any other registry
pnpm's own configuration names by that registry's name or host, so the
folded control reads by the registry the install actually asks.

* test(plugins): cover comparing an unparseable registry address

---------

Co-authored-by: Turtle <[email protected]>
2026-09-24 10:55:35 +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
07akioni 655534d009 Merge pull request #5046 from deepseek-harness/fix/language-neutral-default-workspace-naming
fix(workspace): keep the default Workspace path language-neutral
2026-09-24 10:41:07 +08:00
_Kerman 26dcd5a247 Merge remote-tracking branch 'origin/master' into fix/language-neutral-default-workspace-naming
# Conflicts:
#	.agents/notes/implemented/feature/2026-09-20-default-workspace.i18n.yaml
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/subsystems/workspace.i18n.yaml
#	packages/api/workspace-controller/README.i18n.yaml
#	packages/client/ui-workspace/README.i18n.yaml
#	packages/client/ui-workspace/tests/workspaces-service.client.spec.ts
#	packages/workspace/workspace/README.i18n.yaml
2026-09-24 10:30:24 +08:00
turtle1999 687aa02578 fix(ci): preserve Wine build metadata and isolate test fixtures 2026-09-24 02:32:24 +08:00
winewill a67119845d fix(desktop): align update fixtures and clear deferred startup focus 2026-09-24 01:18:52 +08:00
winewill a7e745de66 Merge master into feat/windows-update-restart 2026-09-24 01:11:36 +08:00
winewill 3bcf1bfc7c Merge pull request #4967 from deepseek-harness/fix/desktop-main-bundle-order
build(desktop): bundle the main process after the workspace tsdown pass
2026-09-24 00:44:55 +08:00
std4453 3055bad0d1 Merge pull request #5078 from deepseek-harness/fix/onboarding-recharge-artwork
feat(desktop): add onboarding with current artwork and work-detail defaults
2026-09-24 00:36:30 +08:00
Yifffan f032bd2d04 Merge pull request #5002 from deepseek-harness/session-archieve-refine
feat(client): explicit three-way archived filter with empty-state refinements
2026-09-24 00:18:51 +08:00
zhc 7cadefb991 fix(onboarding): use shared modal focus ownership 2026-09-23 23:58:21 +08:00
Yif 5688962ee9 test(ui-primitives): count the 94 merged public glyphs 2026-09-23 23:48:05 +08:00
Yif 6ddece2439 refactor(ui-workspace): share the viewing store with the row toast as a declared store
The archived filter reaches the row toast through the registration's declared
store instead of a registrant-owned view hook, per the cross-entry view-state
rule. The README names the toast action by its actual label, and the
unarchive e2e switches back to Hide archived so it again proves the restored
row is an ordinary row in the default view.
2026-09-23 23:48:04 +08:00
Yif d6e5dc7748 test(client): cover the unset archived filter and follow the three-way menu in web goldens 2026-09-23 23:48:00 +08:00
Yif aaf733c175 fix(client): let a snippetless search result use the full row for its workspace name 2026-09-23 23:48:00 +08:00
Yif 64352df324 style(client): tune empty-state tokens and glyph spacing 2026-09-23 23:47:59 +08:00
Yif e28434bbc8 chore(client): re-record slot catalog source lines after the slots import 2026-09-23 23:47:59 +08:00
Yif 2129486048 feat(client): give the session list an iconed empty state with an archived-only way back 2026-09-23 23:47:30 +08:00
Yif 62bd4363e6 feat(client): omit the toast filter action while archived rows are visible 2026-09-23 23:46:21 +08:00
Yif 9775a95315 feat(client): make archived filtering an explicit three-way menu choice
The view-options filter is now hide/all/only radio items, the
archived-only view drops Workspaces without an archived Session, and
tree children of a dropped Workspace nest under the nearest shown
ancestor (#4854).
2026-09-23 23:46:21 +08:00
Yif 82b8c476e6 feat(client): add archive-off glyph and reuse chat-lines for session references 2026-09-23 23:46:21 +08:00
zhc 0e18138427 test(web): start bonus notice scenario after onboarding 2026-09-23 23:44:51 +08:00
zhc 6233f998a2 merge: integrate current account bonus notices with onboarding 2026-09-23 23:43:53 +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
winewill 1e5af11d8c build(desktop): emit shortcuts protocol before the main bundle 2026-09-23 23:42:19 +08:00
winewill 917613c776 Merge master and preserve Desktop bundle validation 2026-09-23 23:40:02 +08:00
zhc e44a4d4dd3 test(desktop): separate fixture state from native window members 2026-09-23 23:35:58 +08:00
lsdsjy a523d8ec58 Merge pull request #5040 from deepseek-harness/feat/account-bonus-notices
feat(account): show bonus notices and send Platform client metadata
2026-09-23 23:35:54 +08:00
zhc ac586cefca test(desktop): type overlay visibility fixture explicitly 2026-09-23 23:35:13 +08:00
涂轶翔 f6a2c700af Merge pull request #4844 from deepseek-harness/feat/dynamic-tool-update-message
Support dynamic tool updates during active conversations
2026-09-23 23:35:08 +08:00
zhc 4fdcaf16b5 merge: integrate desktop shortcuts and refresh onboarding decisions 2026-09-23 23:34:17 +08:00
Chinesezjc 7a362b263b Merge pull request #4335 from deepseek-harness/feat/schedule-storage-phase1
feat(schedule): persist tasks and resume due sessions
2026-09-23 23:33:33 +08:00
lsdsjy 6171ed6f5d Merge origin/master into feat/account-bonus-notices 2026-09-23 23:25:21 +08:00
lsdsjy 3ff8fe093a fix(account): satisfy bonus notice style and coverage checks 2026-09-23 23:12:19 +08:00
流光 6638afae5e Merge pull request #4938 from deepseek-harness/feat/shortcuts-rework
feat(shortcuts): restore configurable shortcuts with regression fixes
2026-09-23 23:08:15 +08:00
zhc f55c8d5215 test(desktop): await the selected onboarding preference write 2026-09-23 22:57:42 +08:00
lsdsjy b9fb1cceea fix(web): synchronize read-only spreadsheet scroll state 2026-09-23 22:53:08 +08:00
zhc c4b13d154f merge: refresh master translation pairing format 2026-09-23 22:47:06 +08:00
Xinyu Yang bfb624cd3b Merge master translation record migration into feat/shortcuts-rework 2026-09-23 22:46:08 +08:00
mektpoy c3cd67a2e8 Merge remote-tracking branch 'origin/master' into fix/focus-ring-brand-primary
Only the bilingual pairing records conflicted. Master moved Agent Note records to
per-heading hashes, so this branch's note record was re-recorded in that format;
the ui-primitives and ui-theme README records were re-recorded unchanged. The
stylesheet corpus spec still passes over master's new client sheets, so no ring
needed realigning this time.
2026-09-23 22:43:43 +08:00
lsdsjy 99032c6b10 Merge origin/master into feat/account-bonus-notices 2026-09-23 22:42:37 +08:00
Tianyi Cui ba66011fdb test(sdk): use generated sample data for cache probes
The probe needs a value that cannot be inferred from the prompt, not protected information. Describing that generated UUID as a private secret made the API test depend on an unrelated disclosure decision. Use an explicitly synthetic sample label and a benign formatting update while preserving execution audits, first-continuation cache assertions, and disabled retries.
2026-09-23 22:40:40 +08:00
Tianyi Cui 5827477658 test(web): account for tool update process rows
Open the running Think disclosure explicitly when a process group also contains tool updates, and keep the fork process summary expandable in its ARIA expectation. Record the Goal request-series marker in a V4 fixture successor while preserving the historical V3 recording. Production behavior and the scroll assertions stay unchanged.
2026-09-23 22:40:40 +08:00
Tianyi Cui 611c2bc2e9 test(headless): refresh dynamic tool request expectations
Record explicit request-series starts and the tool additions admitted when resuming a seeded parent with no tool declarations. Keep tool names and the shifted source-event reference alongside that activation history. Refresh only the affected owner-local outputs to the current writer format; retain historical replay fixtures and the unchanged child expectation.
2026-09-23 22:40:40 +08:00
Tianyi Cui f6848ee921 fix(agent-loop): preserve prompt history during supported tool updates
Tool changes previously forced prompt consolidation even when the prepared
route could activate new tools through history. Rewriting the first system
message, or clearing an earlier appended prompt, reset the declaration
series and turned additions into immediate declarations.

Only routes without toolUpdate need that tool-triggered consolidation.
Capable routes append the full changed prompt and keep existing messages.
Explicit series starts, surface replacements, and unsupported prompt
routes still consolidate; retained-name definition changes still rebuild
tool declarations in Session.

Cover both update modes and reset paths, and pin the combined prompt/tool
transition through the shipped headless profile with shared schema goldens.
2026-09-23 22:40:40 +08:00
Tianyi Cui f765a21dc7 test(sdk): verify cache reuse across native tool additions
Run a real DeepSeek conversation through the built SDK profile and change the scoped tool registry through a model-invoked controller. Compare the first post-addition cache usage with the preceding request after unique user history has been cached; verify deferred declarations, chronological activation, and actual tool execution. Removal remains covered without requiring its cache prefix to survive. Disable test and provider retries so a warmed transition cannot hide a cache regression.
2026-09-23 22:40:39 +08:00
Tianyi Cui e221615112 test(sdk): cover native dynamic tool lifecycle 2026-09-23 22:40:39 +08:00
Yixiang Tu 43048098f6 test(llm): cover dynamic tool updates and clarify documented limits 2026-09-23 22:40:38 +08:00
Yixiang Tu 1b0c2e5760 fix(session): retain baseline-bound tool activations 2026-09-23 22:40:36 +08:00
Yixiang Tu 1321345c84 docs: keep architecture within its word budget 2026-09-23 22:40:36 +08:00
Yixiang Tu 8862ed8266 docs: mirror regenerated event table rows into the Chinese counterpart 2026-09-23 22:40:36 +08:00
Yixiang Tu 59318c1204 fix(llm): clarify tool update projection and preserve deferred activation 2026-09-23 22:40:19 +08:00
Xinyu Yang e8daeb4969 test(web): align window drag fixture with desktop shortcuts 2026-09-23 22:39:48 +08:00
Yixiang Tu 7e5f906945 feat(client): present compact developer tool update notices 2026-09-23 22:39:34 +08:00
Yixiang Tu bc8c0dbf40 feat(llm): emit dynamic tool updates and project them per route
Log tool changes as developer messages independently of model capability,
fold committed headers and updates into Session.toolHistory(), and let the
LLM runtime construct deferred and retained declarations for routes that
declare a toolUpdate mode. DeepSeek serializes updates as system-role
tool_addition/tool_removal blocks with defer_loading and the tool-changes
beta header. An unchanged restored tool continues the series and is
re-offered through its recorded blocks instead of rewriting declarations.

Replace the obsolete rejection tests with wire assertions and add coverage
for the session fold, loop emission, route projection, config validation,
and the beta header. Chat and Trajectory changes land separately.
2026-09-23 22:39:26 +08:00
mektpoy c3a8318377 test(web): type the ring sample as a colour triple 2026-09-23 22:38:29 +08:00
lsdsjy 651f419bf8 Merge remote-tracking branch 'origin/master' into fix/platform-webview-persistence 2026-09-23 22:37:17 +08:00
lsdsjy 1efb58f47e Merge origin/master into feat/account-bonus-notices 2026-09-23 22:33:20 +08:00
Turtle e7def469e1 feat(i18n): key translation pairing records by heading section (#5036)
* feat(i18n): key translation pairing records by heading section

Replace the whole-file blob hashes in *.i18n.yaml with one entry per
heading section that still holds language-specific content, keyed by the
English heading-slug path. Blocks identical across the pair (generated
table rows, code blocks, shared regions) stay out of the hash, so edits to
different sections and identical regenerations merge with Git's default
text merge, including on GitHub.

Remove the dsh-translation-pairing merge driver, its resolver command and
installer wiring; gen-translation-brief recovers last-confirmed text from
commit history. Migrate all active records, archive the superseded Agent
Note, and record the replayed conflict reduction in the new one.

* test(i18n): refresh translation prompt snapshot for the terminology note

* feat(i18n): exclude only code blocks and generated regions from pairing records

Replace byte-equality masking with an explicit rule: a record hash skips
fenced code blocks and BEGIN/END GENERATED regions, the two kinds of
content the pairing gate already requires to be identical on both sides.

Move generated data into regions written into both pages:
gen-config-catalog renders both languages and the record with per-package
regions labelled by code identifiers; gen-module-graph keeps its table in a
region; gen-doc-graphs splices the event matrix regions into the Chinese
page. Add a generic region splice beside the region grammar.
2026-09-23 22:32:06 +08:00
Xinyu Yang 64d401c820 fix(shortcuts): align package versions with release 2026-09-23 22:26:26 +08:00
zhc 7b4541e21c fix(desktop): use public work detail types and precise persistence checks 2026-09-23 22:26:19 +08:00
lsdsjy 311ab0524f Merge remote-tracking branch 'origin/master' into fix/platform-webview-persistence 2026-09-23 22:25:54 +08:00
zhc 82fe79a7b1 fix(desktop): integrate onboarding with current master 2026-09-23 22:24:21 +08:00
lsdsjy 235b13ab12 Merge origin/master into feat/account-bonus-notices 2026-09-23 22:23:57 +08:00
mektpoy 6921e37b99 chore(code-language): match the root release version
master released 0.1.7-rc.1 while the package added by this branch still declared 0.1.7-alpha.2, which failed Dependency layout (verify-npm-install-layout), Pack npm tarballs (release members must share one version) and node 24 / static (constraints) from one cause. Merge origin/master and bump the new package to the root version.
2026-09-23 22:23:51 +08:00
zhc ad86306feb fix(desktop): align onboarding with current work detail modes 2026-09-23 22:21:19 +08:00
zhc 372c311511 fix(desktop): refresh recharge onboarding artwork 2026-09-23 22:21:18 +08:00
07akioni 93b832f1b0 Merge pull request #4459 from deepseek-harness/feat/desktop-onboarding
feat(desktop): add device-local account onboarding
2026-09-23 22:21:18 +08:00
mektpoy 120612ddc8 Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-23 22:17:39 +08:00
Xinyu Yang 851686d144 Merge latest origin/master into feat/shortcuts-rework 2026-09-23 22:12:48 +08:00
creatixchu 76fba44641 test(cua): refresh formatted API reference snapshot 2026-09-23 22:11:33 +08:00
Xinyu Yang 4b03fefec1 Merge origin/master into feat/shortcuts-rework 2026-09-23 22:10:54 +08:00
07akioni d9ff18ec2a Merge pull request #4622 from deepseek-harness/feat/window-drag-coverage
refactor(client): 让每个 chrome 行自持窗口拖拽(单一声明 + 覆盖契约 + 统一重收集)
2026-09-23 22:08:13 +08:00
winewill 174d385bf5 Merge master into fix/desktop-main-bundle-order 2026-09-23 22:07:37 +08:00
lsdsjy 7d56ff04aa fix(account): address bonus notice review and balance labels 2026-09-23 22:06:29 +08:00
lsdsjy 50293e4dd4 Merge origin/master into feat/account-bonus-notices 2026-09-23 22:05:41 +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
lsdsjy bf5eb8a39a Merge pull request #4650 from deepseek-harness/feat/account-provider-signout
feat(account,models): separate account routing and confirm sign-out impact
2026-09-23 21:48:20 +08:00
creatixchu df0b833500 test(cua): record desktop readiness and complete object API guidance 2026-09-23 21:38:14 +08:00
lsdsjy 9a9948bc83 test(web): align unavailable model and cold session expectations 2026-09-23 21:33:16 +08:00
Xu Hanxiang f717f413da Merge pull request #4813 from deepseek-harness/fix/windows-file-open-and-preview
fix(web): 修复 Windows 文件预览、应用图标与默认打开操作
2026-09-23 21:29:24 +08:00
winewill d2a5490fa0 fix(desktop): clarify Windows updates and raise the restarted window 2026-09-23 21:25:54 +08:00
lsdsjy 71f0713b86 fix(llm): align provider packages with release version 2026-09-23 21:18:17 +08:00
lsdsjy b1cb0d6718 Merge remote-tracking branch 'origin/master' into feat/account-provider-signout 2026-09-23 21:17:27 +08:00
creatixchu f1c728c7af fix(cua): reject locked sessions and bound cyclic AX traversal 2026-09-23 21:13:45 +08:00
mektpoy 4a409edf8b fix(client): keep the plugin manager's whole top strip draggable
The page carried a 28px top inset above its head row, so the window's topmost 28px on that page belonged to no drag region — the frame's former band covered it, and the per-row mark did not. The inset moves into the head rows themselves (.pageHead and .detailTop), which now start at the window's top edge while the content keeps its position. The browser lane pins each row's top edge at zero and the negative control confirms both assertions fail on the pre-fix sheet.
2026-09-23 21:10:27 +08:00
liukx0205 caa4b8feca fix: highlight CSV without changing the default spreadsheet preview 2026-09-23 21:09:42 +08:00
lsdsjy eff44a957c test(headless): isolate API-key credential snapshots 2026-09-23 21:08:21 +08:00
Turtle 46a7f68b09 Merge pull request #5073 from deepseek-harness/rel/dsh-0.1.7-rc.1
release(dsh): 0.1.7-rc.1
2026-09-23 21:03:33 +08:00
lsdsjy 3cf49f26ab fix(account): cover live notices and satisfy CI checks 2026-09-23 20:53:30 +08:00
turtle1999 a60af51e80 release(dsh): 0.1.7-rc.1 2026-09-23 20:47:45 +08:00
creatixchu 685bb24bf7 test(cua): record foreground recovery operation 2026-09-23 20:47:32 +08:00
lsdsjy 4e0283c89b Merge remote-tracking branch 'origin/master' into feat/account-provider-signout 2026-09-23 20:45:29 +08:00
Turtle 07ad70817f fix(plugins): deny incompatible bundles and clarify compatibility refusals (#5061)
* fix(plugins): deny incompatible bundles and clarify compatibility refusals

A bundle package is not a plugin row, so startup admission never read its
own DSH peers: a bundle installed outside DSH or before a DSH upgrade still
applied its patch layer. loadProfileDirectory now skips such a bundle like an
unreadable one unless the profile exempts that exact pair.

A post-install refusal in a profile without a lockfile reinstalls from the
restored manifest instead of failing a frozen install and leaving the
rejected packages in node_modules.

Compatibility warnings now name the `dsh plugin allow-version` command for
CLI-managed profiles, startup denials name the row id instead of a resolved
module URL, and the CLI no longer reports "pnpm failed" when pnpm never ran.

* feat(plugins): report incompatible versions as typed refusals

Compatibility checks now yield the refused packages as data instead of a
profile-specific sentence. runProfilePnpm returns them as
PackageResult.incompatible, and the plugin manager refuses with the
incompatible-version code carrying the same records. Each surface renders
them: the CLI prints the exact allow-version command for its profile, the
Web plugin manager words them through its locale dictionary, and app-boot
keeps one neutral English diagnostic for logs and startup stderr.

* fix(plugin-manager): drop the agent exemption hint from the incompatibility reason
2026-09-23 20:44:06 +08:00
creatixchu 091a085d5d feat(cua): add explicit activation for hidden application recovery 2026-09-23 20:40:46 +08:00
_Kerman ce5ef7a17b fix(workspace): let confirming the seeded label pin a default title
Review caught two real gaps in the previous commit.

The rename dialog's no-op check compared the localized display title, so
on an automatically titled Workspace the seeded prefill equalled it and
Rename stayed disabled — the user had no direct way to pin the visible
name. The dialog now seeds the draft with the label on screen while the
stored title decides whether confirming saves, and the duplicate check
excludes the target by Workspace identity instead of by title, since the
seeded label equals the row's own displayed title.

The registry took the automatic title from the canonical path, so a
symlink at the first-use path titled the Workspace after its target and
the default lost its localized label. The title now comes from the
requested directory's final segment; the path stays canonical.

Also: drop a rotting file count and the stale localized-path wording from
the Agent Notes, record the two cwd-derived Session label fallbacks as
known consequences, trim the WorkspaceBrowser memo comment to the
non-obvious part, and remove the deleted request type from the
hand-maintained catalog LINK_MAP.
2026-09-23 20:32:57 +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
imccyu c76217a356 Merge pull request #5053 from deepseek-harness/feat/tool-preparing-progress
feat(chat): add work detail modes and file preparation progress
2026-09-23 20:28:16 +08:00
imccyu 490f569044 Merge pull request #5067 from deepseek-harness/revert-5062-ihsiang/chat-flow-visual-polish
Revert "fix(web): 恢复蓝色深度求索动画并优化过程折叠展示"
2026-09-23 20:22:22 +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
imccyu 7c8a44ac31 Revert "feat(web): restore the process-row polish on the grouped work details"
This reverts commit 036d53fb612c785a17d9e6068f58b155d87120c1.
2026-09-23 20:21:46 +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
ihsiang b09dd94827 feat(web): restore the process-row polish on the grouped work details
* feat(web): restore the process-row polish on the grouped work details

The sweep highlight, shared row colors, expanded-row spacing, and the
12–24px font-size range were developed against the pre-revert work-details
implementation. Re-apply them to the grouped implementation that replaced it.

- TextShimmer keeps its active-driven span and now paints a masked sweep
  overlay in the theme's `--dsw-alias-label-shimmer` color, so the base text
  inherits the caller's color and hover changes.
- DisclosureRow owns the row color: tertiary at rest, secondary on hover,
  with glyphs, titles, and summaries inheriting it; tool, skill, command,
  reasoning, and workflow rows drop their own hover darkening.
- ChatView spaces process rows 8px apart and keeps 16px beside Assistant
  responses; the grouped header sits 8px above its first member.
- The Settings font-size stepper accepts 12–24px, and the grouped header's
  leading box and glyph scale with the content font-size delta.

* fix(web): restore blue running status and refine process disclosures

* fix(web): finalize running snapshots and whale animation

* fix(web): preserve disclosure layout and repair CI fixtures
2026-09-23 20:10:50 +08:00
creatixchu 9bd3aca35e feat(cua): support indexed pointer gestures and focused windows 2026-09-23 20:07:19 +08:00
turtle1999 f64c57dbb2 fix(plugin-manager): drop the agent exemption hint from the incompatibility reason 2026-09-23 20:04:31 +08:00
lsdsjy 1098fa52ea fix(account): use configured Platform origin for account link 2026-09-23 20:00:34 +08:00
lsdsjy 9759ea2719 Merge origin/master into feat/account-provider-signout 2026-09-23 20:00:03 +08:00
mektpoy f35db51bee fix(native-command): transport the Windows adapter as a script file
Resolving packaged-app icons grew the embedded C# until the generated
-EncodedCommand line reached 32,883 characters for a 222-character path,
past the 32767-character CreateProcess limit, so association queries stopped
starting for long multibyte paths. Write the adapter to a private temporary
script and pass it with -File instead; the command line no longer grows with
the path. The temporary directory is removed once the call settles.

The icon fallback also reads the handler name the caller already fetched
instead of calling GetName again, and the README records that icon
visibility depends on resolving the Shell's indirect reference.
2026-09-23 19:58:58 +08:00
mektpoy 64795b4879 fix(ui-open-in-app): open the application the control names
With no OS-marked default the split button labelled the first registered
application and marked it "(default)" in the menu, but the primary action
still asked the OS to resolve the association again; on Windows that can
prompt or open a different application than the button promises. Send that
application's id explicitly and keep the association path for the case the
Host actually marked a default.

The snapshot scenario now clears the platform's own default marker and
re-enters the file, so the association is read again instead of reusing the
answer already held, and it asserts the launched target rather than only the
labels.
2026-09-23 19:58:53 +08:00
mektpoy 2a0531e9c3 fix(code-language): address review on the persisted hint and aliases
Review threads: shrink READ_LANG_BY_EXTENSION to the suffixes whose own name is the better label (tsx/jsx/tf/tfvars/gradle) since the other 41 values already equal the language short name; label .hcl as hcl and .tfvars as tfvars instead of tf; accept .groovy alongside .gradle with its own short name; document that LANG_ALIASES also carries the persisted short ids; route the three inline alias lookups through grammarForHint; state that a short name may equal the grammar id; fix the util README wording.

Tests: cover .groovy, the four self-naming suffixes, and every id each suffix reaches through the shipped surfaces (the hand-synced LAZY_ALIASES list could not catch an alias whose target is neither boot nor lazy).
2026-09-23 19:57:19 +08:00
Yichen Jiang 11c58d11b9 fix(ssh): build helper executables only on manual requests 2026-09-23 19:52:50 +08:00
turtle1999 51d70c5f5c feat(plugins): report incompatible versions as typed refusals
Compatibility checks now yield the refused packages as data instead of a
profile-specific sentence. runProfilePnpm returns them as
PackageResult.incompatible, and the plugin manager refuses with the
incompatible-version code carrying the same records. Each surface renders
them: the CLI prints the exact allow-version command for its profile, the
Web plugin manager words them through its locale dictionary, and app-boot
keeps one neutral English diagnostic for logs and startup stderr.
2026-09-23 19:51:29 +08:00
mektpoy c5c09c9afa Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-23 19:49:34 +08:00
imccyu 96a4607ba2 test(chat): refresh work detail snapshots and preparation progress 2026-09-23 19:48:45 +08:00
imccyu 6943f9fee6 fix(chat): satisfy hook documentation and lint contracts 2026-09-23 19:48:45 +08:00
imccyu 5a32aae571 docs(chat): align preparing hooks and work detail modes 2026-09-23 19:48:45 +08:00
imccyu 1b55f5bea3 fix(chat): retain preparing tools and ordering until step completion 2026-09-23 19:48:45 +08:00
imccyu 4987e90b32 fix: static 2026-09-23 19:48:45 +08:00
imccyu ac77cefba7 test(chat): cover work detail modes and preparation subscriptions 2026-09-23 19:48:45 +08:00
imccyu d6fb1351b3 fix(chat): refine verbose headers and file preparation rows 2026-09-23 19:48:45 +08:00
imccyu 015a9b202c feat(chat): add four work detail modes and legacy mappings 2026-09-23 19:48:45 +08:00
imccyu b660f72d4e feat(tool): show content preparation progress for file mutations 2026-09-23 19:48:45 +08:00
mektpoy 63797c0208 docs(client): retire the sidebar note's window-drag pulse claim
The retained-tab-layout note still stated that existing window-drag region pulses remain; this layer's pulse is gone and the shell watcher replaces it. Rewrite both sides and re-record the pair.
2026-09-23 19:48:22 +08:00
mektpoy 7dfad90748 fix(client): keep the drag watcher alive through a slide and stop a float being dragged
The recall watcher now tolerates a short quiet window so a report that arrives before a CSS transition moves anything cannot end the loop on its first unchanged sample, re-arms on a transition or animation that touches a marked row, and re-arms on a child list change in a container holding one. A dock picture withdraws its strip's drag claim while a pane floats, because a float sorted before that row would otherwise sit earlier in the document and lose its own subtraction. The settings panel closes when an onboarding step appears, since the step's overlay marks only #root inert. Prose and the two Agent Notes record the Windows narrowing of the Platform overlay return bar, the collection rule, and the rows' one home in the ui-theme manifest.
2026-09-23 19:45:14 +08:00
Yudong Han fb8bb16345 Merge pull request #5052 from deepseek-harness/fix/zoom-rerender
fix(preview): redraw PDF and Office pages after pinch zoom
2026-09-23 19:42:44 +08:00
Yichen Jiang 2152881fcf fix(app-boot): preserve routed resolution errors under async module hooks
Node's module-hooks thread serializes resolver errors and returns the stack
accessor as a read-only configurable data property. Rewriting the routed
importer then assigned error.stack, threw a TypeError, and replaced the
original ERR_PACKAGE_PATH_NOT_EXPORTED or ERR_MODULE_NOT_FOUND error, so
plugin metadata reported a failure instead of falling back to package fields.

The importer rewrite now redefines a rejected stack value in place and
rethrows the original error with its code.
2026-09-23 19:42:34 +08:00
mektpoy f1869391d1 Merge remote-tracking branch 'origin/master' into fix/truncate-without-splitting-surrogates 2026-09-23 19:37:43 +08:00
yudshj 312341970c Merge master into fix/zoom-rerender 2026-09-23 19:31:59 +08:00
mektpoy e39b0c307c fix(client): align the image lightbox and image button rings
Master's newest commits add `.close` in ImageLightbox and `.imageButton` in
MarkdownText, each declaring the brand token directly. Both now read
`--dsw-focus-ring-color` through `--dsw-focus-ring-width`, as the stylesheet
corpus spec requires of every client focus rule.
2026-09-23 19:31:07 +08:00
mektpoy fefead85e9 Merge remote-tracking branch 'origin/master' into fix/focus-ring-brand-primary 2026-09-23 19:29:43 +08:00
imccyu 9b510d89a5 Merge pull request #5029 from deepseek-harness/feat/chat-image-preview-4941
feat(chat): 图片链接悬停预览与内联图片放大
2026-09-23 19:27:02 +08:00
Yudong Han 896c81d796 Merge pull request #5047 from deepseek-harness/fix/excel-trackpad-dark-mode
fix(web): support free spreadsheet trackpad panning and readable controls
2026-09-23 19:26:26 +08:00
lsdsjy 57a98bff5f fix(account): use medium weight for bonus notice title 2026-09-23 19:17:00 +08:00
Yichen Jiang d9342fcb5d feat(ssh): package standalone POSIX helper runtimes 2026-09-23 19:16:59 +08:00
turtle1999 747c98b0db fix(plugins): deny incompatible bundles and clarify compatibility refusals
A bundle package is not a plugin row, so startup admission never read its
own DSH peers: a bundle installed outside DSH or before a DSH upgrade still
applied its patch layer. loadProfileDirectory now skips such a bundle like an
unreadable one unless the profile exempts that exact pair.

A post-install refusal in a profile without a lockfile reinstalls from the
restored manifest instead of failing a frozen install and leaving the
rejected packages in node_modules.

Compatibility warnings now name the `dsh plugin allow-version` command for
CLI-managed profiles, startup denials name the row id instead of a resolved
module URL, and the CLI no longer reports "pnpm failed" when pnpm never ran.
2026-09-23 19:14:19 +08:00
Turtle 5ea77078d6 feat(plugins): enforce DSH peer compatibility with exact exemptions (#4980) 2026-09-23 18:56:56 +08:00
turtle1999 2c67633990 feat(plugins): enforce DSH peer compatibility with exact exemptions 2026-09-23 18:46:08 +08:00
mektpoy 58c70c2cca test(web): key the no-default marker to the platform that owns it
The new no-default scenario cleared the macOS application catalog, which
does nothing on Linux: `gio mime` owns the OS default there, and the
Linux stub never wrote the launch log, so CI timed out waiting for the
application gesture. Clear the marker each platform actually reads, log
launches from both stubs, and compare the launched id against the
platform's own registration id.
2026-09-23 18:41:50 +08:00
mektpoy 4ba758f47f Merge origin/master into fix/truncate-without-splitting-surrogates
Conflict resolution:
- docs/config-catalog: regenerate the English page; the Chinese page follows the
  three shifted Config sources and the bilingual pair record is re-recorded.
- docs/module-graph: the generator rewrites all three artifacts together.
- packages/shell/tool-pwsh-persistent/src/index.ts: keep master's rewrite of the
  prompt handling and re-apply the surrogate cap and its import.
- The three package.json dependency entries follow master's workspace:* range
  convention, and the lockfile importer specifiers match them.
2026-09-23 18:28:28 +08:00
mektpoy 5b4be3cfe8 fix(client): align the icon button's ring with the shared ring colour
Master's newest agent-preset sheet carries both the new `.helpButton` and the
retained `.iconButton`, whose focus ring still declared the brand token
directly. The stylesheet corpus spec rejects that form, so it now reads
`--dsw-focus-ring-color` with the brand-token fallback.
2026-09-23 18:21:14 +08:00
mektpoy ef7f44662d Merge remote-tracking branch 'origin/master' into fix/focus-ring-brand-primary
ui-theme/README.md, README.zh.md and README.i18n.yaml conflicted again: master
extended the `design-platform.css` sentence with the `--dsw-alias-file-diff-*`
palette. Kept that sentence together with this branch's `focus.css` paragraphs
and the seven-sheet entry list, then re-recorded the pairing hashes.
2026-09-23 18:20:56 +08:00
mektpoy fd5c4043fa Merge remote-tracking branch 'origin/master' into feat/window-drag-coverage
# Conflicts:
#	packages/client/ui-settings-general/package.json
2026-09-23 18:14:37 +08:00
mektpoy 20315dd321 Merge remote-tracking branch 'origin/master' into fix/windows-file-open-and-preview 2026-09-23 18:13:37 +08:00
yudshj 19d6df2b2f fix(web): pan read-only spreadsheets on both trackpad axes 2026-09-23 18:13:19 +08:00
yudshj e0e8327992 fix(preview): redraw PDF pages after settled zoom 2026-09-23 18:12:21 +08:00
imccyu 7eb9629e0a Merge pull request #5041 from deepseek-harness/fix-gateway-mem
fix(gateway): bound stream cancellation retention
2026-09-23 18:10:58 +08:00
Turtle 4aa207c5fe feat(preset): add plugin practices reference to creator skill (#5025)
* feat(preset): add creator-mode plugin practices skill

Creator mode mounts packages/preset/agent-preset/skills. The new
cordis-plugin-practices skill states Harness-specific principles and
concrete rules for plugins that survive upgrades and avoid polling or
rescanning session logs: waterfall delegation, restrict/guard over
assemble, agent.ctx ownership, no new session event types from profile
plugins, session projections, and slot-based UI.

* refactor(preset): fold plugin practices into cordis-plugin-development

A separate skill competed with cordis-plugin-development for the same
trigger. The practices now live in references/practices.md, read from
procedure step 2 before choosing an extension point.

* feat(preset): require Harness components and tokens for plugin pages

A creator-built management page served as an iframe with its own
stylesheet could not match the Harness design. The practices reference
now requires slot-rendered React pages built from ui-primitives, theme
tokens from Theme inspection, and light/dark checks in the real slot.

* feat(preset): make host UI consistency a principle and a verification step

Adds principle 6: the rendering surface decides whether a plugin can
match the Harness UI, so it is chosen before any view. Step 4 of
cordis-plugin-development now verifies primitives, token-only styles,
and light/dark rendering beside a comparable host page.

* feat(preset): prefer theme tokens over pre-stable ui-primitives

ui-primitives is a pre-stable platform module; creator plugins are plain
JS without type checks, and a throwing component blanks the slot entry.
The practices reference now treats tokens as the default way to match
the host, limits primitives to behavior that is costly to reproduce, and
tells the agent how to detect a slot entry crash after an upgrade.

* feat(preset): forbid runtime imports of Harness Client packages in plugins

Creator plugins must assume ui-primitives and other Client packages break
without notice. The practices reference now has plugins copy markup, CSS,
and behavior from primitives, or inspect the rendered host control, and
keep --dsw-alias-* tokens as the only shared styling dependency.

* fix(preset): correct plugin practices against runtime behavior

- agent.ctx registrations need a plugin-owned disposer too; plugin
  unload does not remove them.
- Timers start work with followup(); inject() does not wake the agent.
- inject() logs agent/inbox/spliced at call time; agent/request cannot
  change messages.
- Guards are synchronous; awaited decisions return ask from
  tools/pre-execute.
- Chat node renderers are keyed by kind; slot inject reinstalls on
  declaration return.

skills.spec now keeps whole-file cordis-plugin-development references
below the pruner threshold as the read tool renders them.
2026-09-23 18:06:52 +08:00
mektpoy c5e0a407ca test(web): cover the file menu when no application is the OS default
The reported defect is the branch where the Shell lists associated
applications but marks none as the default: the split button promoted
"Show file location" to the primary action and hid the applications
behind the menu.

Record that state in the keyless document-preview scenario. The new
golden pins the primary action to the opening control, and the gesture
log asserts the main button opens the file while the menu's marked
default launches the first registered application.
2026-09-23 18:05:08 +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
mektpoy 9fd52295fc fix(client): finish the ring-colour sweep and name the tooltip/ring split
Two focus treatments still named a colour of their own: the TurnNavigator
mark's tick filled with `state-business-primary` under a comment that already
claimed the brand colour, and the plugin inventory search input drew its focus
border in `state-business-primary` while the shadow beside it read
`--dsw-focus-ring-color`. Both now read the same ring colour as the rest.

`Tooltip` states why it takes `pointerModality()`'s wide answer while focus
rings read the narrower `data-input-modality` attribute the module publishes.
2026-09-23 17:58:06 +08:00
mektpoy 27ba49aa13 Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-23 17:57:38 +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
mektpoy 68e826a42f docs(client): record the window drag modules and the settings overlay placement
The ui-web source map gains the two window-drag modules and its boot row names the watcher install; ui-settings-general states that the settings panel portals beside #root. Both pairs are re-recorded. The ui-settings-general manifest keeps master's dependency order so only the two new dev entries appear in its diff.
2026-09-23 17:54:28 +08:00
yudshj e4234651ee fix(web): support spreadsheet tab gestures and readable name box 2026-09-23 17:52:13 +08:00
_Kerman ff1c7d415f fix(workspace): keep the default Workspace path language-neutral
The first-use directory name and its stored title came from the Client's
startup language, so one product decision carried two incompatible
requirements: a path addressed by shell commands, tool arguments, @path
references, and session logs, and a label a reader reads.

The controller now owns the fixed `default-workspace` directory name and
the registry titles the Workspace after that same segment, so
`workspace.initializeDefault` takes no request at all —
WorkspaceInitializeDefaultRequest and its name validation are gone, and
the registry resolver returns a path instead of a path and title. No
language reaches the Host.

Browser consumers label a Workspace through the new
`workspaceDisplayTitle`: a title still equal to the automatic one reads
as the localized default name from the `common` namespace, every other
title reads verbatim. The Workspace browser resolves it once at the store
read, so rows, hover card, search meta, and the rename and delete dialogs
inherit it; the hero picker and the Conversation chip resolve it too.
Confirming a rename stores the text on screen, which is what stops a row
following the language.
2026-09-23 17:46:32 +08:00
Xu Hanxiang c5dc0853d6 Merge pull request #4686 from deepseek-harness/fix/desktop-dev-runtime-target
fix(desktop): resolve the development runtime directory from the build target
2026-09-23 17:43:43 +08:00
lsdsjy 850d78b798 fix(account): refresh after top-up and accept exponent balances 2026-09-23 17:42:15 +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
lsdsjy 9987cae3ea fix(desktop): apply shared toast theme in welcome 2026-09-23 17:29:24 +08:00
lsdsjy e310916e59 refactor(llm): let providers resolve request authentication 2026-09-23 17:29:24 +08:00
lsdsjy 8f180cf45f fix(account): deliver credential expiry notices without replay 2026-09-23 17:26:01 +08:00
lsdsjy 8e5866e7b0 fix(models): retain API-key provider catalogs without credentials 2026-09-23 17:23:39 +08:00
Kaige-Gao bd2a49a2ca fix(chat): use elevated scrollbar colors for image previews 2026-09-23 17:22:55 +08:00
lsdsjy 5590fbee7c fix(account): update sign-in dialog copy 2026-09-23 17:22:45 +08:00
Xinyu Yang cec4e70f8d fix(settings): let modal restore preset guide focus 2026-09-23 17:21:45 +08:00
imccyu 45f5cd34b0 fix(gateway): pass explicit undefined in retention test 2026-09-23 17:20:38 +08:00
creatixchu dde3e78c23 Merge remote-tracking branch 'origin/master' into feat/persistent-ptc 2026-09-23 17:19:20 +08:00
Xu Hanxiang 62aef4c583 Merge branch 'master' into fix/desktop-dev-runtime-target 2026-09-23 17:19:03 +08:00
creatixchu 62396f4537 docs(ptc): synchronize the generated config source reference 2026-09-23 17:16:00 +08:00
lsdsjy 51be61db98 Merge origin/master into feat/account-bonus-notices 2026-09-23 17:15:22 +08:00
creatixchu cff260f048 chore(ptc): align published artifacts and strict lint contracts 2026-09-23 17:12:43 +08:00
Kaige-Gao 4839239954 fix(chat): address image preview review and coverage gaps 2026-09-23 17:12:03 +08:00
Ziya e68fb0bc8d Merge pull request #5022 from deepseek-harness/fix/subagent-zh-terminology
fix(i18n): 将 UI「子代理」改为「子智能体」
2026-09-23 17:08:26 +08:00
creatixchu b0dc38429a test(ptc): pin packaged-host persistent bootstrap selection 2026-09-23 17:08:00 +08:00
imccyu 4cfd292a7b fix(gateway): bound stream cancellation retention 2026-09-23 17:07:09 +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
Xinyu Yang 1aebb43147 fix(web): wait for sidebar collapse in delivery test 2026-09-23 17:02:19 +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
ZiyaZhang dc0ae81905 Merge remote-tracking branch 'upstream/master' into fix/subagent-zh-terminology 2026-09-23 01:54:16 -07: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
Xinyu Yang afbd10991a chore: update temporary CI merge to latest master 2026-09-23 16:44:04 +08:00
mektpoy a8776afa87 Merge remote-tracking branch 'origin/master' into fix/desktop-dev-runtime-target 2026-09-23 16:43:00 +08:00
Xinyu Yang 31688747ad chore: temporarily merge master for CI validation 2026-09-23 16:41:44 +08:00
creatixchu 4fb14dcac6 feat(ptc): add opt-in best-effort persistent Node REPL 2026-09-23 16:41:38 +08:00
Yudong Han 219db5454a Merge pull request #5027 from deepseek-harness/fix/excel-preview-sheet-navigation
fix(web): separate spreadsheet tab navigation from zoom controls
2026-09-23 16:38:47 +08:00
ZiyaZhang 3675e91cf9 fix(i18n): update subagent labels added on master 2026-09-23 01:34:17 -07:00
Yudong Han 5e25475857 fix(office): use bundled LibreOffice Kit 0.1.0 CLI across deployments (#4902)
* chore(office): upgrade libreoffice kit to 0.0.1-2

* fix(office): guide bounded CLI rendering and preview reuse

* chore(office): consume published LibreOffice Kit 0.0.3

* test(office): mock the complete LibreOffice converter interface

* chore(office): upgrade LibreOffice Kit to 0.0.4

* fix(office): expose bundled LibreOffice Kit 0.1.0 CLI across deployments

* fix(office): inspect Excel visuals only for layout tasks

* fix(office): allow compatible LibreOffice Kit 0.1 updates

* fix(office): stop Excel QA on blank previews and run regressions in CI

* fix(office): end workbook visual QA after an empty preview
2026-09-23 08:32:15 +00:00
ZiyaZhang f4c6b012aa Merge remote-tracking branch 'upstream/master' into fix/subagent-zh-terminology 2026-09-23 01:32:15 -07:00
mektpoy fe4d18fda3 test(desktop): provide the required primary runtime directory in the welcome startup spec
`welcome-startup.spec.ts` imports the unpackaged main entry, which now
requires `DSH_DESKTOP_PRIMARY_RUNTIME_DIR`. Stub it beside the neighbouring
`DSH_DESKTOP_*` values so the suite reaches the welcome startup it covers.
2026-09-23 16:29:28 +08:00
Kaige-Gao 907a241b61 Merge remote-tracking branch 'origin/master' into feat/chat-image-preview-4941 2026-09-23 16:28:26 +08:00
imccyu e5e9b5b982 Merge pull request #4985 from deepseek-harness/feat/tool-call-preparing
feat(chat): show preparing tools during live generation
2026-09-23 16:24:46 +08:00
Kaige-Gao 7fe9c06fa6 feat(chat): preview image links on hover and expand inline images 2026-09-23 16:18:09 +08:00
yudshj c920174964 fix(web): separate spreadsheet tab navigation from zoom controls 2026-09-23 16:13:21 +08:00
imccyu 3776169373 test(client): align wait agent row title expectation 2026-09-23 16:11:44 +08:00
imccyu 19675fd061 fix(client): align subagent coordination and wait labels 2026-09-23 16:11:44 +08:00
imccyu 536764c8b4 test(web): align snapshots with write activity labels 2026-09-23 16:11:44 +08:00
imccyu b66b602c72 fix(chat): address preparing lifecycle review feedback 2026-09-23 16:11:44 +08:00
imccyu 913aa2289b fix(chat): unify tool lifecycle titles and activity labels 2026-09-23 16:11:44 +08:00
imccyu 701026b5bf test(chat): bind the preparation start spy 2026-09-23 16:11:44 +08:00
imccyu 5840898e07 perf(tool): retain unchanged subcall branches 2026-09-23 16:11:44 +08:00
imccyu b2817d77fb perf(chat): batch preparing tool updates 2026-09-23 16:11:44 +08:00
imccyu a60d4df027 test(desktop): await ASAR fixture output completion 2026-09-23 16:11:44 +08:00
imccyu 833835d95c test(chat): retire unknown casts from tool row fixtures 2026-09-23 16:11:44 +08:00
imccyu 74511b3dcb test(chat): cover live preparation and durable history replay 2026-09-23 16:11:43 +08:00
imccyu d3086e6571 feat(chat): present tools in preparing, start, and result stages 2026-09-23 16:11:43 +08:00
imccyu d550f1c4af feat(conversation): initialize contexts from transient start matches 2026-09-23 16:11:43 +08:00
Turtle ccaa0dc11c fix(plugin-manager): bound pnpm runs so a silent child cannot hold the profile lock (#4982)
* fix(plugin-manager): bound pnpm runs so a silent child cannot hold the profile lock

A pnpm child that prints its completion line and then never exits holds the
profile write lock until the host is restarted, so every other session and host
on that profile fails after its own lock timeout (issue #4981). execa resolves
its promise only once the piped stdio has ended, so a run now completes on the
process's own exit and drains the pipes under a bound instead of awaiting their
end.

A service run whose captured output stays silent for idleTimeoutMs is
terminated, reports timedOut alongside its exit status, and is not retried on
the next registry; a run with inherited descriptors captures nothing and is
left unbounded for its operator.

* test(plugin-manager): type the mocked child and await the drain descendants

The inherited-descriptor fixture no longer needs its legacy `as unknown` cast,
because the mocked child is typed for the fields the operations read; the
retired baseline entry is pruned (verify-no-unknown-casts).

The drain specs wait for the killed descendant to exit before removing its
directory: Windows refuses to delete a directory a live process still holds.

* test(plugin-manager): stop the drain descendant deterministically

The descendant that holds the pipes now ends on a stop file the teardown
writes, and on its own after a minute, so the fixture leaves no process behind
when a kill cannot be delivered. Windows stops it through taskkill, and the
spec waits for the exit before removing the directory it ran in.

* test(plugin-manager): run the drain descendant from its own script file

Windows cannot carry a nested `-e` script through another spawn argument: the
descendant failed to start there, so the fixture asserted on a process that was
already gone. The descendant now runs from a script file the fixture writes.

* test(plugin-manager): cover the bounded drain everywhere and stage the real descendant on POSIX

Windows does not stage a descendant that keeps the inherited pipes open past
the direct child's exit, so the real-process cases run on POSIX only. The
mocked child now models execa's own completion rule — its promise settles only
once both pipes end — which covers the bounded drain on every platform and
still fails without the raw-exit race.

* test(plugin-manager): cover the drain failure path without a child process

An output consumer failure that the bounded drain cuts short is staged with the
mocked child as well, so the per-file coverage gate also holds where the
real-process cases are skipped.

* fix(plugin-manager): terminate the whole tree of a stalled run

A lifecycle script is a child of pnpm, so signalling pnpm alone left an
approved postinstall writing into the profile after the operation reported a
timeout and released the lock. A stalled run now stops its process group (or
Windows process tree) and waits for it to disappear before the caller restores
the files. The cut tail's close is told apart from a reading failure by where it
happened, so a failure from before the cut still surfaces.

* docs(plugin-manager): regenerate the config catalog after the rebase

The English catalog gains `idleTimeoutMs` from the regenerator, and the Chinese
counterpart carries the same interface line so the pair stays consistent.

* fix(plugin-manager): terminate a run's tree through execa, keeping exit cleanup

Spawning a service run with `detached` made execa skip the handler that kills
the child when the manager exits, so a crashed manager left the pnpm tree
running in the profile. `killDescendants` spawns the run as its own process
group while keeping that cleanup, and it addresses the tree on every kill path,
including cancellation. The module now only decides the probe target and waits
for quiescence.
2026-09-23 16:11:30 +08:00
Jiawei Song 19844ea9ad Merge pull request #5001 from deepseek-harness/fix/diff-review-colors
fix(web): 优化文件 diff Review 的浅色和深色配色
2026-09-23 16:09:33 +08:00
ZiyaZhang a2278b460c fix(i18n): limit subagent terminology changes to requested UI copy 2026-09-23 01:09:27 -07:00
Xinyu Yang d0861be2cd fix(shortcuts): restore PRD reference order 2026-09-23 16:04:22 +08:00
mektpoy 80e4da0e3d fix(desktop): take the development project target as an explicit input
`prepareDevelopmentProject()` resolved the build target from the host
platform and architecture, so a Linux host threw `unsupported target
linux-x64` while writing the runtime descriptor. Pass the target in
instead: the launcher supplies the target it prepared, and isolated tests
supply a fixed supported target.

Extract `desktopTargetPlatform()` into desktop-build-paths.mjs so the
target-to-payload mapping has one home, and use it for the qualification
runner, which previously derived both its target directory and its
descriptor from the host architecture.

Correct the README limitation to name the module that now performs the
architecture check.
2026-09-23 16:03:17 +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
ZiyaZhang f132684c81 fix(i18n): scope subagent terminology to UI and refresh snapshots 2026-09-23 00:57:07 -07:00
lsdsjy e9a438d9e9 chore: merge master into account provider branch 2026-09-23 15:52:07 +08:00
Turtle 3d6d46b8a6 Merge pull request #4896 from deepseek-harness/fix/preset-ui-20260921
fix(ui-agent-preset): restore the read-only configuration viewer
2026-09-23 15:50:34 +08:00
Yudong Han dd004b4221 fix(web): simplify read-only spreadsheet preview controls (#5006)
* fix(web): simplify read-only spreadsheet preview controls

* fix(web): soften read-only spreadsheet freeze dividers

* fix(web): hide read-only spreadsheet freeze dividers

* fix(web): keep spreadsheet formula bar on one line
2026-09-23 07:46:13 +00:00
Xu Hanxiang 38596d5c70 Merge pull request #4876 from deepseek-harness/fix/windows-open-through-explorer
fix(native-command): open Windows paths through explorer.exe
2026-09-23 15:46:04 +08:00
mektpoy b1eebbd045 fix(lockfile): drop re-resolution churn from the merge-forwards
pnpm install --lockfile-only, run to align the new workspace edge's specifiers, also re-resolved unrelated entries: it pinned registry.npmjs.org tarball URLs on the two libreoffice-kit optional platform packages and downgraded glob 7.2.3 to 7.2.0. The tarball URLs fail verify-lockfile-policy against the mirror's published metadata.

Rebuild the file as the base lockfile plus only the three intended importer additions (the new package's block and its two consumers), so the resolution entries stay byte-identical to master.
2026-09-23 15:41:12 +08:00
mektpoy 8b75ec9903 Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-23 15:39:36 +08:00
ZiyaZhang 8833ef9f63 Merge upstream/master into fix/subagent-zh-terminology 2026-09-23 00:38:59 -07:00
ZiyaZhang 995caa05ed fix(i18n): translate subagent as 子智能体 in Chinese UI 2026-09-23 00:33:41 -07:00
lsdsjy b8df537f07 fix(desktop): return to initial welcome page after sign-out 2026-09-23 15:28:12 +08:00
Yifffan 10292baeff Merge pull request #4818 from deepseek-harness/ui/agent-team-header-panel-refine
feat(web): refine the Team header panel interactions and adaptive header
2026-09-23 15:26:24 +08:00
Turtle bbeef5f250 Merge pull request #5020 from deepseek-harness/copy/plugin-experimental-labels
fix(web): label beta features as experimental
2026-09-23 15:24:43 +08:00
turtle1999 d52424042c Merge remote-tracking branch 'origin/master' into fix/preset-ui-20260921 2026-09-23 15:21:17 +08:00
Dudu-0223 2ea753960c fix(web): align Team card elevation and preset header expectations 2026-09-23 15:14:29 +08:00
Dudu-0223 2b44a4b657 fix(web): preserve Team hover pinning and responsive task expansion 2026-09-23 15:14:29 +08:00
Dudu-0223 4face54ea7 test(web): align adjacent navigation snapshots with header UI 2026-09-23 15:14:29 +08:00
Dudu-0223 0b62921f37 test(web): align Team panel snapshot with pinned projection UI 2026-09-23 15:14:29 +08:00
Yif 86e3e0e448 feat(web): refine the Team header panel interactions and adaptive header
The Team panel opens on hover with the subagent-catalog grace timings, pins
on click, polls the one-shot view RPC every 20s while open (replacing the
toolbar refresh/close controls), and eagerly loads on mount so the trigger
keeps a stable two-person icon. The lead card navigates from teammate
conversations, the current conversation carries a Current chat tag (selected
ring only among multiple members), task descriptions clamp to two lines
behind an expand toggle, an empty board shows a one-line description, and a
lone member narrows the panel to one column.

The header title row becomes an inline-size container: the preset label
hides first, then the Team trigger collapses to its icon and switches to
click-only opening. The subagent catalog moves to the front of the actions
band so lineage stays beside the title crumbs, and its pinned-menu behavior
matches the Team panel. Tooltip gains a gap prop for tight anchors.
2026-09-23 15:14:29 +08:00
Dudu-0223 61936aa113 Merge pull request #4810 from deepseek-harness/feat/agent-team-projection-panel
feat(agent-team): drive the Web Team panel from the agentTeam projection
2026-09-23 15:14:25 +08:00
Turtle 3b8be2928f Merge pull request #5017 from deepseek-harness/turtle/fix-tooltip-layering-e1cc527c20d0
fix(web): keep composer-stack tooltips above the input card
2026-09-23 15:14:07 +08:00
lsdsjy 150303ff22 fix(account): refine bonus notice lifecycle and diagnostics 2026-09-23 15:13:29 +08:00
ZiyaZhang 3c20f401d2 fix(web): label beta features as experimental 2026-09-23 00:07:13 -07:00
lsdsjy 9e19ca3e45 fix(account): limit automatic model selection to account login 2026-09-23 15:06:00 +08:00
turtle1999 a56e82e5dd fix(ui-agent-preset): share reader keyboard focus handling 2026-09-23 15:02:27 +08:00
Turtle a96d45af40 test(web): name the covering element in the tooltip hit test
Review follow-up on the tooltip layering fix. The helper probes
`bubble.contains(hit)` instead of identity, so a bubble that grows child
elements still passes, and each probe returns the hit element's tag and
class, so a regression reports what covered the bubble instead of a bare
`expected false to be true` — the pre-fix run now names `DIV.u82K-q_input`
for both probes.

The `portal` JSDoc says the ancestor stacking context confines the
bubble's z-index to that context rather than resolving it against
siblings.
2026-09-23 15:00:52 +08:00
Dudu-0223 63cc821e7e Merge master into feat/agent-team-projection-panel 2026-09-23 14:57:32 +08:00
Dudu-0223 df7fa8945c refactor(agent-team): narrow projection fields and task views 2026-09-23 14:54:21 +08:00
mektpoy ef0eaa3167 docs(code-language): restate the read-hint contract in the summary
The Summary narrated the change ("the suffixes the old read table recognized keep their historical value") rather than the contract, and at 109 words it exceeded the 100-word package Summary limit.

State the rule a reader at HEAD can act on: a suffix a recorded session already holds keeps its persisted value, every other suffix takes its language's short name. The dropped path-separator and leading-dot detail stays documented under Language selection. Both languages updated and the pairing record re-recorded.
2026-09-23 14:53:58 +08:00
mektpoy 192ab1155d fix(code-language): match the root release version
The package joined the workspace as version 0.1.6-alpha.2 while the root release moved on, which failed three CI jobs from one cause: constraints (version must match root), Dependency layout (verify-npm-install-layout finds no workspace version), and Pack npm tarballs (dsh release members must share one version).
2026-09-23 14:53:52 +08:00
mektpoy edd0a438bf docs(native-command): state that the Explorer handoff acknowledgement proves no open
The open paragraph accepted Explorer's exit code 1 as a delegated handoff but
did not repeat the reveal paragraph's warning that the acknowledgement proves no
application opened the file, which the Agent Note records for the Remote answer
`{ opened: true }`.
2026-09-23 14:49:30 +08:00
gengruilin 3a9d77a841 merge: 同步 master 并合并 WebKit 测试说明 2026-09-23 14:48:20 +08:00
turtle1999 02383832df Merge remote-tracking branch 'origin/master' into fix/preset-ui-20260921 2026-09-23 14:45:13 +08:00
lsdsjy 40da69ff75 refactor(account): isolate provider authentication and preserve model selections 2026-09-23 14:43:47 +08:00
Turtle 5082e05f71 fix(web): keep composer-stack tooltips above the input card
The goal strip and the queue dock ride directly above the input card, and
both create a stacking context (`isolation: isolate`) so their frosted
panel stays behind their own content. A tooltip bubble left inside that
context resolves its z-index there, where the card — painted later in the
same context — wins: the goal strip's bubble showed a two-pixel sliver
and the queue dock's stayed entirely hidden.

Portal those dock tooltips to the body, where the bubble's z-index
resolves above the whole card. The ui-primitives `portal` contract now
names the capping stacking context beside clipped containers, because
neither container clips its bubble.

The queue-actions aria goldens lose the tooltip line: the captured center
column no longer contains the portaled bubble. The scenario still covers
it by role and adds a hit test at the bubble's center and bottom edge, as
does goal-bar.
2026-09-23 14:43:23 +08:00
sjw1231 c4955b1900 test(web): strengthen diff review color assertions 2026-09-23 14:42:08 +08:00
Ziya 354da32a38 Merge pull request #4979 from deepseek-harness/fix/github-install-connectivity
fix(plugin-manager): fail fast on stalled GitHub connections
2026-09-23 14:38:25 +08:00
Xinyu Yang f6006c5547 fix(shortcuts): finish modal toggles and automatic focus handling 2026-09-23 14:34:20 +08:00
Dudu-0223 f546068553 fix(agent-team): align package metadata with merged release 2026-09-23 14:27:58 +08:00
mektpoy 88b1ea3c0b docs: state the code-language comments as current contracts
The new JSDoc and test prose narrated the change instead of the shipped
behavior: "pre-unification", "the old read table", "used to persist ... it
now persists". A reader at HEAD cannot resolve those stages, and the
persisted-value rule they describe is a durability contract that stands on
its own.

Restate each as the present contract: a suffix whose value a recorded
session already holds keeps it byte-identical; every other suffix takes its
language's short name. Rename the test's transcribed expectation away from
the branch vantage and re-wrap the module comment the earlier edit left
over-long.
2026-09-23 14:23:07 +08:00
mektpoy 5774f385f4 Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages
# Conflicts:
#	packages/client/ui-primitives/package.json
#	packages/fs/tool-fs/package.json
2026-09-23 14:19:53 +08:00
Dudu-0223 3bf6d738f1 fix(agent-team): keep late activation on normal reconnect path 2026-09-23 14:16:57 +08:00
Yichen Jiang 26b4980364 feat(voice-input): guide unready microphones to plugin setup 2026-09-23 14:15:26 +08:00
Yudong Han 5124a2a310 fix(web): show model IDs in monospace and names on hover (#5004)
* fix(web): show original model IDs on hover

* fix(web): display model IDs with names on hover
2026-09-23 06:10:30 +00:00
Dudu-0223 2aa3a469db fix(agent-team): consume shared projections without panel loads 2026-09-23 14:08:25 +08:00
winewill 0126d5be20 fix(desktop): load the flock entry lazily and build native/system on demand
`package-target.ts` imported `macos-notarization-proxy.ts`, whose top-level
import of `@deepseek-ai/node-addon-system/flock` resolves through the package
`exports` to the unbuilt `lib/flock.js` on a clean checkout. The step that
emits that file runs inside the same packaging script, so `check:package`,
`package:*`, and the `restore:mac-proxy` recovery command all failed with
`ERR_MODULE_NOT_FOUND` before reaching it; running `pnpm run typecheck` first
left the host addon binary missing instead, which failed at lock time.

The proxy lock now loads the entry at first use through `flock-entry.ts`. When
the import is unresolvable or the host platform package lacks a binary listed
in its `prebuilds.json`, the loader runs `pnpm run build:native-system` and
`pnpm --dir native/system run build:ts` before importing again; other errors
and build failures propagate, and a failed load is retried by the next call.
`check:package` no longer touches the entry at all.

Tests cover the loader steps and load the proxy module from a directory where
the addon package cannot be resolved. The Desktop README records the
behavior in both languages.

(cherry picked from commit 2d74cf50310d4efbbccbbe79a105fcc3a468b19d)
2026-09-23 14:03:10 +08:00
Dudu-0223 3f07e34b5e Merge remote-tracking branch 'origin/master' into codex/pr-4810-review-fixes
# Conflicts:
#	packages/experimental/agent-team/package.json
#	packages/experimental/client-ui-agent-team/package.json
#	pnpm-lock.yaml
2026-09-23 13:58:31 +08:00
ZiyaZhang d7b45fb415 Merge remote-tracking branch 'origin/master' into fix/github-install-connectivity 2026-09-22 22:18:07 -07:00
ZiyaZhang 75d74a055e fix(plugin-manager): preserve authentication fallback during GitHub checks 2026-09-22 22:15:09 -07:00
turtle1999 f68d4b5aba Merge remote-tracking branch 'origin/master' into fix/preset-ui-20260921
# Conflicts:
#	packages/preset/agent-preset-registry/package.json
2026-09-23 13:08:30 +08:00
Yichen Jiang 752953d2b6 Merge pull request #4966 from deepseek-harness/worktree/voice-model-download-mirrors
feat(voice-input): support automatic and manual model download sources
2026-09-23 13:01:51 +08:00
mektpoy 2b9923fede fix(native-command): escape both Explorer field separators and keep non-ASCII literal
On Windows 11 ARM64 build 26200 Explorer splits its own command line at
commas and equals signs and rejects percent-encoded non-ASCII in a file
URI, falling back to the Documents folder in both cases without reporting
it. `explorerTarget()` now escapes `=` next to `,` and decodes Node's
non-ASCII escapes back to the literal characters the shell resolves, so
the two rules stay in one place. The Agent Note and the target-encoding
table record the measured behavior.
2026-09-23 12:33:31 +08:00
winewill 4e41ccadcc build(desktop): check every import record and mirror the bundle step in the wine gate
The packaged-imports plugin moves from generateBundle to moduleParsed so
external dynamic import() and require() targets, which chunk metadata
omits, fail the bundle too. Each bundle now carries an import policy:
the main process allows Node builtins, sandboxed preloads only the
modules Electron's require polyfill resolves, and the failure names the
importing module and the allowed set. The wine Windows gate bundles
apps/desktop after the Host tsdown pass like build:lib:host, the
ts-build-config note lists that step, and the tsdown docs name the
workspace match exactly.

Fixes #4993
2026-09-23 12:03:48 +08:00
Ziya c3afd488aa Merge pull request #4962 from deepseek-harness/ux/plugin-install-20260922
feat(plugin-manager): offer mirror recovery for GitHub install failures
2026-09-23 12:03:47 +08:00
Yichen Jiang 3f0022a8fa Merge remote-tracking branch 'origin/master' into worktree/voice-model-download-mirrors 2026-09-23 12:03:11 +08:00
Turtle 040f47a822 Merge pull request #4987 from deepseek-harness/turtle/fix-title-overlap-b5d8f732773e
fix(ui-settings-account): clear the Windows caption for the Platform return bar
2026-09-23 12:02:28 +08:00
Ruilin Geng c68c6db9ca Merge pull request #4717 from deepseek-harness/fix/webkit-model-picker
fix(web): 修复 Safari 模型菜单鼠标选择失效
2026-09-23 11:59:53 +08:00
Yichen Jiang 0067efc8ae Merge pull request #4992 from deepseek-harness/worktree/pin-official-deepseek-first
fix(web): keep official DeepSeek first in model settings
2026-09-23 11:59:00 +08:00
Yichen Jiang d40dbef91b feat(voice-input): expose preparation download source selection 2026-09-23 11:58:54 +08:00
Yifffan 5bc57902d5 Merge pull request #4970 from deepseek-harness/docs/client-ui-ux-skill
docs(skills): add the dsh-client-ui-ux skill
2026-09-23 11:53:56 +08:00
lsdsjy fff88f7375 fix(desktop): harden Platform storage cleanup and identity publication 2026-09-23 11:30:37 +08:00
lsdsjy 2fc9262f3e chore: merge master into account provider branch 2026-09-23 11:19:22 +08:00
Yichen Jiang dc374b8879 fix(web): keep official DeepSeek first in model settings 2026-09-23 11:18:01 +08:00
lsdsjy c062c615dc feat(account): align signed-out sidebar menu with design 2026-09-23 11:13:27 +08:00
lsdsjy 4283f62d01 fix(desktop): leave sign-in activation to the completion page 2026-09-23 11:11:44 +08:00
lsdsjy 10b6ffec3f fix(desktop): use regular weight for welcome API key heading 2026-09-23 11:00:13 +08:00
lsdsjy be3ecb4977 fix(desktop): persist account-scoped Platform page preferences 2026-09-23 10:55:33 +08:00
Turtle 14a062acb7 docs(ui-settings-account): record the Platform view caption limitation
Review follow-up: the caption menu is inert while the Platform view is open,
which the previous geometry hid; state it under Known Limitations, and drop
the duplicated 40px figure the Desktop owns. The style spec's rule lookup
anchors on the rule boundary and asserts with toContain.
2026-09-23 10:47:17 +08:00
gengruilin d9b3db5d24 merge: 同步 master 并解决文档配对冲突 2026-09-23 10:44:36 +08:00
Turtle ceb997cdef fix(ui-settings-account): clear the Windows caption for the Platform return bar
The embedded Platform view renders its 48px return bar at the top of the
window. On Windows the Desktop-owned caption menu occupies that strip (fixed
at top 0, 40px high, z-index 1100), so the "Back to DeepSeek Harness" label
and the Application/Edit menu text were painted over each other.

Offset the overlay by --dsh-windows-titlebar-height where the Desktop preload
publishes its caption marker, the same clearance AppFrame and the sidebar
caption controls use. The return bar and the native view bounds, which come
from the viewport element's rectangle, both move below the strip.
2026-09-23 10:33:17 +08:00
gengruilin 60b5800816 Merge origin/master into fix/webkit-model-picker 2026-09-23 10:26:50 +08:00
ZiyaZhang 0edfe83573 fix(plugin-manager): bound GitHub connection checks before installation 2026-09-22 08:33:49 -07:00
imccyu 00102833df Merge pull request #4978 from deepseek-harness/worktree/release-dsh-0.1.7-alpha.2
release: [email protected]
2026-09-22 23:25:38 +08:00
imccyu 10ea83bcc3 release(dsh): 0.1.7-alpha.2 2026-09-22 23:12:55 +08:00
imccyu 178ee3a9eb Merge pull request #4975 from deepseek-harness/worktree/release-vendor-4.0.4
release(vendor): cordis 4.0.4, cosmokit 1.8.5, group 1.0.4, hmr 1.0.1…
2026-09-22 23:12:01 +08:00
ZiyaZhang 4bf9d2e0c0 Merge master into plugin installation recovery 2026-09-22 08:03:27 -07:00
imccyu d0dca04e22 release(vendor): cordis 4.0.4, cosmokit 1.8.5, group 1.0.4, hmr 1.0.19, include 1.0.9, loader 1.0.5, logger-console 1.0.4, schemastery 3.18.4, timer 1.1.6 2026-09-22 23:02:28 +08:00
imccyu 3950647caa Merge pull request #4954 from deepseek-harness/fix/dsh-exact-workspace-dependencies
build: 锁定 DSH 版本并将 vendor/native 依赖限制为补丁升级
2026-09-22 22:59:56 +08:00
imccyu 3889e97de0 Merge pull request #4947 from deepseek-harness/fix/chat-groups-followup
fix(chat): 稳定滚动控件与嵌套自动跟随
2026-09-22 22:59:36 +08:00
lsdsjy 081526aa3e feat(account): show bonus notices after visible display 2026-09-22 22:51:09 +08:00
imccyu 08c0e8e71b fix(chat): deduplicate admitted local steering 2026-09-22 22:47:12 +08:00
lsdsjy 3970cc974f feat(account): send client metadata with Platform requests 2026-09-22 22:42:11 +08:00
imccyu 43a8a22824 fix(chat): restore turn rail width threshold and clarify scroll gestures 2026-09-22 22:25:32 +08:00
lsdsjy 318c83fa84 chore: merge master and restore PR validation 2026-09-22 22:25:13 +08:00
Dudu-0223 9095678c8c fix(agent-team): address remaining projection review comments 2026-09-22 22:21:10 +08:00
Dudu-0223 9fcb76d9bc Merge remote-tracking branch 'origin/master' into codex/pr-4810-review-fixes 2026-09-22 22:17:37 +08:00
imccyu f6966f8fab test(client): align resize fixtures and restore branch coverage 2026-09-22 22:08:50 +08:00
imccyu fad9e27706 test(web): stabilize resize and scroll fixtures 2026-09-22 21:44:39 +08:00
imccyu 838eff14eb fix(chat): preserve reading intent around group scrolling 2026-09-22 21:44:00 +08:00
imccyu 4e6028a604 build: use tilde ranges for vendor and native workspaces 2026-09-22 21:14:06 +08:00
imccyu b9b5f7c58e fix: complete exact DSH ranges in application and runtime manifests 2026-09-22 21:12:57 +08:00
imccyu 7021420f29 fix: validate dependency ranges across every workspace 2026-09-22 21:12:57 +08:00
imccyu 37372101b5 build: pin internal DSH workspace dependencies 2026-09-22 21:12:56 +08:00
imccyu c92d5ebe18 perf(ui): fit tooltips from observed sizes 2026-09-22 21:07:56 +08:00
imccyu 820824edd7 fix(chat): stabilize input echo admission and ordering 2026-09-22 21:07:55 +08:00
imccyu 50ba2c8bb2 fix(session): align history pagination with turn boundaries 2026-09-22 21:07:55 +08:00
imccyu 2251b6189b fix(chat): preserve sticky headers with overflow clipping 2026-09-22 21:07:55 +08:00
imccyu 13dfae20c3 fix(chat): settle native scroll following before retargeting 2026-09-22 21:07:55 +08:00
imccyu fb02779a26 fix(chat): restore turn rail container queries 2026-09-22 21:07:55 +08:00
imccyu 1f029fc442 docs(chat): record scroll ownership and control geometry 2026-09-22 21:07:55 +08:00
imccyu 633cf7394e fix(chat): share independent scroll following with native group animation 2026-09-22 21:07:55 +08:00
imccyu 6b4055bf32 fix(chat): keep floating controls outside transcript clipping 2026-09-22 21:07:55 +08:00
Yif e8d5278c46 docs(skills): fix review findings in dsh-client-ui-ux and add scrollbar rule
Point selectable hover content at HoverCard (Tooltip has no interactive
prop), require a persistently mounted toast host, scope the font-weight
cap to new feature CSS, prefer theme typography tokens, link the styling
owners, date the design-reviewer roster, add the scrollbar containment
rule, and make the skill discoverable from packages/client/AGENTS.md.
2026-09-22 21:03:30 +08:00
Xinyu Yang 120cac4ea7 refactor(conversation): keep stop shortcut turn tracking internal 2026-09-22 21:02:32 +08:00
Xinyu Yang 6a82709a2b fix(shortcuts): preserve focus and tab layout, block overlay input 2026-09-22 21:02:32 +08:00
Xinyu Yang 91423ea1b4 revert: restore configurable Web and desktop shortcuts
Restore the feature removed by #4886 on current master. Preserve the current settings entry point, moving-menu behavior, and desktop update UI.
2026-09-22 21:02:32 +08:00
imccyu 3dcfbf2094 Merge pull request #4964 from deepseek-harness/fix-reconnect
fix(web): gate reconnects on application readiness
2026-09-22 21:00:21 +08:00
Yif 6a07033145 docs(skills): require designer review for new icons and user-perceivable UI changes 2026-09-22 20:39:38 +08:00
mektpoy b66e51e7ab fix(client): align master's new focus rings with the shared ring colour
Four focus rings added on master after this branch's base still declared their
own colour: PresetGuideDialog's panel, CodeCard's action (state-business-primary),
SegmentedControl's tab, and AccountSection's link button (button-primary-fill).
The stylesheet corpus spec now rejects each of them, so they read
`--dsw-focus-ring-color` with the brand-token fallback like every other ring.
CodeCard keeps its 1px dense width; the other three take
`--dsw-focus-ring-width`.
2026-09-22 20:37:46 +08:00
mektpoy fae37cd705 Merge remote-tracking branch 'origin/master' into fix/focus-ring-brand-primary
Conflicts and how they were resolved:

- ui-agent-preset/AgentPresetSection.module.css: master replaced the icon-only
  tooltip actions (`.iconButton`, `.iconDanger`, `.revealedPath`) with
  `.cardHelp` + `.helpButton`, which deleted the one declaration this branch
  edited. Took master's structure and re-applied the branch's change to the two
  `.cardMain:focus-visible` rings, which master kept unchanged.
- ui-theme/README.md and README.zh.md: master documented the separately exported
  `brand-font.css`; this branch documented `focus.css`. Kept both, with the
  dynamic entry's sheet list at seven sheets including `focus.css`.
  `README.i18n.yaml` re-recorded with `verify-translation-pairing --write`.
2026-09-22 20:37:05 +08:00
mektpoy 5925925d20 Merge remote-tracking branch 'origin/master' into fix/desktop-dev-runtime-target
# Conflicts:
#	apps/desktop/src/main.ts
2026-09-22 20:30:25 +08:00
mektpoy a6b909c767 docs(native-command): correct the non-interactive Explorer claim
The recorded exit code 0 after about 30 seconds was not reproduced: an SSH
session 0 on Windows 11 ARM64 build 26200 measured exit code 1 after about a
second with no association invoked, the same exit code a delegated open
returns. The README, both Agent Note languages, and the `explorerTarget` JSDoc
now record that measurement, and the `Invoke-Item` contrast keeps its
qualitative part without the timing.
2026-09-22 20:29:24 +08:00
mektpoy 2063f667ea Merge remote-tracking branch 'origin/master' into fix/windows-file-open-and-preview
# Conflicts:
#	packages/util/native-command/README.i18n.yaml
#	packages/util/native-command/README.md
#	packages/util/native-command/README.zh.md
2026-09-22 20:28:17 +08:00
mektpoy bca9cecc7d fix(client): keep pointer focus silent through descendant and editable rings
Pointer suppression previously cleared `outline-color` on the focused element
alone, so a ring painted by a descendant, a pseudo-element, or a `box-shadow`
stayed visible, and editable text controls lost the focus feedback they need on
click.

Ring colour now flows through `--dsw-focus-ring-color`, which component outlines
and focus-ring shadows read alongside the brand token. Every ring that inherits
the variable is suppressed together, and `body :focus-visible:not(:read-write)`
limits the suppression to rings while editable controls keep their own feedback.

Keyboard modality returns on Tab, Home, End, PageUp, or PageDown, and on focus
reaching a different control after a non-composing key. IME composition keys,
refocusing the same control, and window blur leave rings silent. The desktop
preload menubar suppresses its own ring inside its shadow root, where the
document-level attribute does not reach.
2026-09-22 20:28:10 +08:00
mektpoy b73031be9b test(native-command): pin the Explorer target for verbatim and device paths
A verbatim `\\?\` prefix and a `\\.\` device namespace take Node's UNC
resolution, and the comma encoding has to survive them. The drive-root case is
pinned separately because Node restores a trailing separator against the host's
`path.sep`, which differs on the Windows host this opener runs on.
2026-09-22 20:27:45 +08:00
mektpoy 3063767eef Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-22 20:27:08 +08:00
mektpoy 9cdfcd5f04 Merge remote-tracking branch 'origin/master' into feat/window-drag-coverage 2026-09-22 20:26:59 +08:00
sjw1231 fd784e4429 fix(web): refine file diff review colors 2026-09-22 20:23:45 +08:00
winewill 06717aebbb build(desktop): bundle the main process after the workspace tsdown pass
The root tsdown workspace pass builds every member concurrently, so the
Desktop main bundle could resolve its inlined workspace devDependencies
(dsh-home-paths, dsh-app-boot, dsh-deepseek-account) before their lib/
output existed. rolldown then kept them as external imports, which the
asar does not ship, and the packaged application failed at launch with
ERR_MODULE_NOT_FOUND on a clean checkout; stale lib/ output on long-lived
checkouts hid the defect.

apps/desktop leaves the root workspace list and build:lib:host bundles it
after the Host pass. Every Desktop bundle now runs a rolldown plugin that
fails the build when a chunk imports a bare specifier the packaged
application cannot resolve: electron and the manifest dependencies for
the main bundle, electron alone for sandboxed preloads.
2026-09-22 20:11:51 +08:00
gengruilin 969c3df8c1 Merge origin/master into fix/webkit-model-picker 2026-09-22 20:10:46 +08:00
Yichen Jiang 1498b01923 feat(voice-input): select responsive model download mirrors 2026-09-22 20:06:00 +08:00
mektpoy bf3de68213 Merge remote-tracking branch 'origin/master' into tmp4876 2026-09-22 20:04:19 +08:00
gengruilin 9178ff75f2 merge: 同步最新 master 2026-09-22 19:58:22 +08:00
Yichen Jiang 37e4dc2dee Merge pull request #4961 from deepseek-harness/worktree/model-discovery-display-name
fix(web): show discovered model names in picker
2026-09-22 19:56:28 +08:00
gengruilin 9e95d9a3f4 merge: 同步最新 master 2026-09-22 19:55:51 +08:00
imccyu a44ced5b96 fix(web): gate Remote WebSockets on application readiness 2026-09-22 19:54:21 +08:00
Yichen Jiang d4b109f439 Merge pull request #4907 from deepseek-harness/worktree/plugin-install-country-registry
feat(plugin-manager): select the first responsive public registry
2026-09-22 19:51:49 +08:00
Yichen Jiang bef0869d14 test(web): select discovered models by display name 2026-09-22 19:44:57 +08:00
lsdsjy 5a3c316401 fix(desktop): deliver welcome expiry notice once across windows 2026-09-22 19:21:12 +08:00
gengruilin 5729548cd0 merge: 同步最新 master 2026-09-22 19:05:01 +08:00
ZiyaZhang 82a7dd9c3f test(plugin-manager): strengthen GitHub recovery assertions 2026-09-22 04:04:33 -07:00
winewill 84394b818c Merge pull request #4919 from deepseek-harness/fix/fatal-diagnostics-and-crash-reports
fix: contain spill failures, recover failed client batches, and write Desktop crash reports
2026-09-22 19:01:39 +08:00
Yif 5b600047d2 docs(agents): add dsh-client-ui-ux skill for client UI/UX design and review
Collects the standing judgment rules for product-user-visible GUI work:
token and shared-treatment reuse, light/dark readability, font weight and
size scale, feedback-surface choice (toast vs in-place notice vs empty
state), loading treatments, overlay dismiss/fit/clip checks, macOS/Windows
window adaptation, and spacing review. dsh-code-review links it from its
sources of truth so UI PR reviews load it.
2026-09-22 18:52:15 +08:00
winewill ec852793b5 Merge remote-tracking branch 'origin/master' into fix/fatal-diagnostics-and-crash-reports 2026-09-22 18:51:57 +08:00
Yichen Jiang bdbf1fe339 Merge origin/master into registry response selection 2026-09-22 18:39:34 +08:00
Yichen Jiang 3c50bf6b6c feat(plugin-manager): choose the first responsive public registry 2026-09-22 18:38:43 +08:00
Ziya 20e7407ff1 Merge branch 'master' into ux/plugin-install-20260922 2026-09-22 18:36:24 +08:00
gengruilin aaa52be272 merge: 同步最新 master 2026-09-22 18:25:04 +08:00
ZiyaZhang d6e5b7e41a feat(plugin-manager): offer mirror recovery for GitHub install failures 2026-09-22 03:24:45 -07:00
winewill c22b226b18 fix: address review threads on the fatal-diagnostics PR
- Agent Notes: cross-link the new decision with the native fatal recovery
  and fail-loud release notes both ways, rewrite the older note's
  console-retention and dialog-detail facts in place, and state the report's
  actual bounds.
- crash-report: cut the rendered error section at 256 KiB and prune only
  files matching the generated crash-<time>-<source>.log syntax.
- main: backendReady follows the backend state except during shutdown, so a
  failure while tearing down a ready backend still reads as running.
- subprocess-local: the temporary-file-cleaner hint is appended only for
  ENOENT; other codes rely on the appended error.
- client-modules: describeError is module-private; BootModuleRow.url's
  JSDoc names its fallback role.
2026-09-22 18:20:12 +08:00
winewill af28c551f3 Merge pull request #4913 from deepseek-harness/fix/windows-installer-extract-diagnostics
fix(desktop): report Windows extraction failures with 7-Zip evidence
2026-09-22 18:15:40 +08:00
Yichen Jiang b34b5d33a1 fix(web): show discovered model names in picker 2026-09-22 18:01:37 +08:00
winewill 603a8fc7d3 Merge remote-tracking branch 'origin/master' into fix/fatal-diagnostics-and-crash-reports 2026-09-22 17:58:58 +08:00
Turtle 505559b03b Merge pull request #4955 from deepseek-harness/turtle/settings-link-copy-064fa5feb8cd
fix(client): clarify chat link-opening settings copy
2026-09-22 17:42:50 +08:00
winewill 30a7f8f787 Merge branch 'master' into fix/windows-installer-extract-diagnostics 2026-09-22 17:37:28 +08:00
Dudu-0223 7c296b3f08 Merge pull request #4951 from deepseek-harness/fix/teammate-lead-guidance
fix(agent-team): explain teammate discovery and messaging
2026-09-22 17:36:31 +08:00
mektpoy fac0d8d877 docs(native-command): record the interactive-session requirement for Explorer opens 2026-09-22 17:35:54 +08:00
Turtle b2ec54159f docs(client): name the Sidebar Browser in the link-opening row prose
The ui-chat README described the visibility rule as "while the built-in browser
is available", a phrase that now reads like an option label. Both languages name
the Sidebar Browser, matching the sentence that follows.
2026-09-22 17:33:49 +08:00
Yichen Jiang 108f767a89 Merge pull request #4949 from deepseek-harness/worktree/fix-voice-language-settings
fix(voice-input): persist recognition language settings
2026-09-22 17:31:21 +08:00
winewill 7b2094d04d fix(desktop): keep the Host's original diagnostic in startup crash reports
A Host startup failure reached the crash report as a fresh Error built from
a message string three hops away from the original: the Host sent only
error.message over the fatal IPC event, DesktopHostProcess wrapped it in a
new Error, desktopErrorState flattened it to text, and main.ts wrapped that
text again. Stack, cause, code, and path were gone, and the Host's stderr
tail arriving with the later exit was blocked by the first-failure latch.

The Host now sends its complete inspected error alongside the message
(bounded to 64 KiB; carried over IPC rather than stderr because the two
race and the shell reports the first failure it sees). DesktopHostProcess
keeps it on DesktopHostFatalError.diagnostic, the backend error state
carries the original failure object, main.ts reports that object, and the
crash report prints the Host diagnostic verbatim in its own section.
2026-09-22 17:31:17 +08:00
mektpoy 03294cb653 test(native-command): pin every Explorer open target through one table 2026-09-22 17:31:12 +08:00
winewill d8924486ad fix(desktop): declare the cordis peer the packaged application needs
apps/desktop imports @deepseek-ai/dsh-api-gateway/stream-protocol, whose
import chain reaches @deepseek-ai/dsh-typert-protocol and then
@deepseek-ai/cordis. Both intermediate packages declare cordis as a
peerDependency and nothing satisfied it for the application closure, so
electron-builder omitted cordis from app.asar and the packaged main process
died before opening a window with ERR_MODULE_NOT_FOUND. A workspace checkout
resolves the peer through pnpm's own links, so development runs and the unit
lanes stayed green while every packaged build since efbc8e26b6 (2026-09-20)
failed to launch.

The lockfile additionally drops a stale duplicate [email protected] in favour of the
7.2.3 it already carries; any real pnpm install removes it.

Verified with a signed win-x64 installer built from this tree: app.asar now
ships cordis and @standard-schema/spec, and the installed application opens
its main window.
2026-09-22 17:21:06 +08:00
Dudu-0223 a79e3a2a5f fix(agent-team): explain teammate discovery and messaging 2026-09-22 17:18:08 +08:00
Turtle c81adc2569 Merge pull request #4948 from deepseek-harness/turtle/agent-experience-skill
docs(skills): add the agent-experience skill
2026-09-22 17:16:36 +08:00
Turtle a294fc55d0 Merge pull request #4930 from deepseek-harness/fix/641-unbounded-completion-wakes
fix(tool-jobs): wake an idle owner for every completion by default
2026-09-22 17:14:13 +08:00
Turtle aba3472b1d fix(client): clarify chat link-opening settings copy
The Settings → General row for Chat link destinations now reads
网页链接默认打开方式 with the description 对话中网页链接的打开位置 and the option
labels 应用内侧边栏 and 默认浏览器. English keeps the title "Open chat links in" and
now reads "Choose where to open web links", "In-App Sidebar", and "Default
Browser".

The `ui-chat.linkOpening` setting, its values, persistence, visibility rule, and
open behavior are unchanged. The row spec, the clickable-link gallery scenario,
and the two package READMEs name the new copy; the bilingual pairing records were
re-confirmed for the README pairs.
2026-09-22 17:12:43 +08:00
Dudu-0223 d257fa4af7 fix(agent-team): limit the reminder to the lead identity 2026-09-22 17:08:45 +08:00
imccyu b980fdf5df Merge pull request #4950 from deepseek-harness/worktree/release-dsh-0.1.5-rc.3-history-to-master
chore(release): record dsh 0.1.5-rc.3 history on master
2026-09-22 17:07:52 +08:00
ihsiang e420c44d60 Merge pull request #4857 from deepseek-harness/ihsiang/unify-code-block-ui
feat(web): 统一代码块样式与复制、换行控件
2026-09-22 17:06:07 +08:00
turtle1999 bada62b50b docs(skills): add the agent-experience skill
Carry the user-scoped agent-experience guidance into the repository unchanged so
project sessions discover it beside the other repository skills. The file,
including its frontmatter, is byte-identical to the personal copy.
2026-09-22 17:03:36 +08:00
Dudu-0223 6ec97fa124 fix(agent-team): tell teammates how to message the lead 2026-09-22 17:02:25 +08:00
lsdsjy f0f4bb73fc fix(desktop): keep welcome back action on one line 2026-09-22 16:58:55 +08:00
yixiangihsiang 9c6c407da2 Merge master into ihsiang/unify-code-block-ui 2026-09-22 16:57:18 +08:00
Yichen Jiang 7c84d9d790 fix(voice-input): persist recognition language settings 2026-09-22 16:55:33 +08:00
imccyu 3ae2f687f1 merge: record dsh 0.1.5-rc.3 history on master
Keep the master tree unchanged while recording the dsh-v0.1.5-rc.3 release ancestry.
2026-09-22 16:50:58 +08:00
Yudong Han d3c5f959aa Merge pull request #4921 from deepseek-harness/fix/4918-excel-preview-resize
fix(web): resize Excel previews with their pane
2026-09-22 16:46:26 +08:00
gengruilin d08ae9a0be merge: 同步最新 master 2026-09-22 16:38:06 +08:00
lsdsjy 26af73ff50 chore: merge master account theme updates 2026-09-22 16:34:42 +08:00
HYD@OVERTON 58651b8359 fix(web): resize Excel previews with their pane 2026-09-22 16:33:30 +08:00
turtle1999 2d653be7b0 fix(tool-jobs): address review on the unbounded wake default
Skip the per-owner wake ledger entirely when no cap is configured.
Rewrite the 2026-08-11 Agent Note in place for the opt-in cap and add
a note recording why the default was removed. Keep `subagent`
untranslated in Chinese prose and drop change narration from the test.

Refs #4944
2026-09-22 16:33:24 +08:00
yixiangihsiang 5929af046c Merge master into ihsiang/unify-code-block-ui 2026-09-22 16:32:42 +08:00
yixiangihsiang 780e07b8ed test(web): align built boot assertions with diff layout 2026-09-22 16:28:46 +08:00
lsdsjy 32ca127565 Merge pull request #4898 from deepseek-harness/fix/contact-form-url
fix(client): update Feedback form and omit account UID
2026-09-22 16:27:23 +08:00
turtle1999 536b444f36 Merge remote-tracking branch 'origin/master' into fix/641-unbounded-completion-wakes 2026-09-22 16:26:50 +08:00
Huanqi Cao f5d7de2a01 Merge pull request #4807 from deepseek-harness/fix/pwsh-prompt-readiness
fix(pty): keep the controlled prompt so persistent pwsh settles fast
2026-09-22 16:25:59 +08:00
gengruilin dd1d739a55 merge: 同步 master 并更新文档配对记录 2026-09-22 16:24:03 +08:00
lsdsjy 4777947b6c fix(client): keep account UID fields out of questionnaire URLs
The Contact us action already stopped prefilling the signed-in UID, but a
configured contact form URL could still carry its own prefill_uid or hide_uid.
contactUrl now drops both query parameters unconditionally, with regression
coverage that starts from a form URL containing them.

The contact URL test also pins the shipped default form path, and the injected
contactUs documentation and the AccountProfile summary no longer describe a
support UID that is no longer sent.
2026-09-22 16:16:34 +08:00
lsdsjy 930d187e04 Merge remote-tracking branch 'origin/master' into fix/contact-form-url
# Conflicts:
#	packages/client/ui-settings-account/README.i18n.yaml
#	packages/client/ui-settings-account/README.md
#	packages/client/ui-settings-account/README.zh.md
2026-09-22 16:13:19 +08:00
Dudu-0223 ee0048558d test(web): capture terminal recovery readiness with its snapshot 2026-09-22 16:13:15 +08:00
lsdsjy 3e4119ebdb fix(account): expire account credentials on inference HTTP 401 2026-09-22 16:12:01 +08:00
Yudong Han 34a0a8e81d fix(web): preserve Excel previews across OPC paths and XML encodings (#4872)
* fix(web): resolve XLSX part relationships and namespace aliases

* fix(web): keep Excel browser scenario in the host test program

* fix(excel): preserve XML encodings and relocated workbook parts

* fix(excel): exclude installed launchers from dependency patch

* fix(excel): restore Strict and case-equivalent workbook previews
2026-09-22 08:04:13 +00:00
Dudu-0223 700b636508 fix(agent-team): limit baseline loading fix to the panel 2026-09-22 16:00:57 +08:00
lsdsjy e76a5eba21 Merge pull request #4903 from deepseek-harness/fix/platform-login-theme
fix(desktop): match Platform login theme
2026-09-22 16:00:44 +08:00
lsdsjy 8e92f17e9c chore: merge master into account provider branch 2026-09-22 15:50:45 +08:00
lsdsjy 64154d2f68 test(models): declare available fixture models and update selection flows 2026-09-22 15:49:54 +08:00
lsdsjy 785a92ab03 fix(client): rename the contact menu entry to Feedback
The account menu entry that opens the questionnaire is now labeled Feedback in
English and 意见反馈 in Chinese. The menu action, contact form URL and its
configuration options keep their existing names.

Expected menu snapshots and the bilingual README record the new copy.
2026-09-22 15:49:30 +08:00
lsdsjy 3b6a5399e8 docs(desktop): clarify login theme ownership 2026-09-22 15:49:20 +08:00
yixiangihsiang fd8bed1ad0 Merge master into ihsiang/unify-code-block-ui 2026-09-22 15:45:41 +08:00
yixiangihsiang 62f816f3a5 feat(web): refine code card spacing and thinking blocks 2026-09-22 15:44:57 +08:00
lsdsjy 37d3a31e29 fix(account): sign out on rejected inference tokens 2026-09-22 15:44:26 +08:00
Dudu-0223 bfc772bb47 Merge remote-tracking branch 'origin/master' into codex/pr-4810-review-fixes 2026-09-22 15:40:58 +08:00
Dudu-0223 749f05e9fa fix(agent-team): refresh projections when opening the panel 2026-09-22 15:38:32 +08:00
Yichen Jiang ab7cdbee75 Merge remote-tracking branch 'origin/master' into worktree/plugin-install-country-registry 2026-09-22 15:38:14 +08:00
Huanqi Cao 41fd0baf91 Merge remote-tracking branch 'origin/master' into fix/pwsh-prompt-readiness
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-09-22 15:36:21 +08:00
lsdsjy f50059e425 fix(desktop): theme workspace sign-in links 2026-09-22 15:34:58 +08:00
Turtle 5ca6d34ac6 Merge pull request #4924 from deepseek-harness/turtle/fix-queued-edit-newline-54bfaf4e59d7
fix(web): keep line breaks when re-editing a queued message
2026-09-22 15:33:31 +08:00
Yichen Jiang 8cf07ea76c fix(plugin-manager): preserve remembered registries during initial lookup 2026-09-22 15:32:16 +08:00
turtle1999 b6775f6d4f fix(tool-jobs): wake an idle owner for every completion by default
`maxConsecutiveWakes` no longer defaults to 3. Unset, every background
job completion wakes its idle owner; the cap is opt-in.

With the default cap, a session chaining background commands and
one-shot subagents exhausted the budget after three wakes. The fourth
notice was injected into the next-step inbox without waking the owner,
the client showed nothing, and the session stalled until the user
typed something (dsh-external/issues#641).

Closes dsh-external/issues#641
2026-09-22 15:29:23 +08:00
lsdsjy 43f107d164 fix(account): expire grants rejected by Platform response code 2026-09-22 15:27:38 +08:00
lsdsjy 2c098434b9 Merge remote-tracking branch 'origin/master' into fix/platform-login-theme 2026-09-22 15:27:06 +08:00
lsdsjy 13fe312e15 test(desktop): fix login theme CI fixtures 2026-09-22 15:26:39 +08:00
lsdsjy bc8e8005fc docs: refresh module graph for account provider dependencies 2026-09-22 15:19:29 +08:00
lsdsjy 4dae756ced Merge remote-tracking branch 'origin/master' into feat/account-provider-signout 2026-09-22 15:13:22 +08:00
Turtle 753df93b85 test(web): pin the multiline queued edit in the browser lane
The recorded-session scenario edited with a single-line value, so the ARIA
golden could not catch a return to a newline-stripping editor. Edit with a
two-line value and assert the model-bound user message keeps the line break;
with the previous input element the scenario fails on that assertion. Also
refresh the stale input cast and pin that Shift+Enter is not consumed.
2026-09-22 15:12:35 +08:00
lsdsjy 06a3daef9f Merge remote-tracking branch 'origin/master' into feat/account-provider-signout 2026-09-22 15:08:47 +08:00
Yichen Jiang 8ae7631861 Merge pull request #4916 from deepseek-harness/worktree/settings-provider-docs
docs(settings): correct provider configuration paths and examples
2026-09-22 15:08:34 +08:00
lsdsjy 6ef32577a3 fix(account,models): reconcile provider lifecycle with master 2026-09-22 15:06:16 +08:00
lsdsjy b1c084e769 Merge pull request #4904 from deepseek-harness/fix/web-account-client-platform
fix(credentials): send web client platform header for account requests
2026-09-22 15:02:35 +08:00
Yichen Jiang 13d9606675 test(voice-input): synchronize idle cleanup failure observation 2026-09-22 14:59:47 +08:00
Turtle c74e36acfc fix(web): keep line breaks when re-editing a queued message
The inline queue editor was a single-line input, and HTML strips newlines
from such a value: opening and saving a multi-line queued message silently
collapsed it into one line before delivery. Edit in a textarea that grows
with its content, capped at six lines; Enter saves, Shift+Enter breaks the
line, and Escape still cancels.
2026-09-22 14:55:34 +08:00
Jiawei Song e950c8bea4 Merge pull request #4838 from deepseek-harness/fix/4823-message-overflow-review-menu
fix(web): 修复消息长文件名溢出和 Review 浮窗菜单错位
2026-09-22 14:47:21 +08:00
winewill a19a48edea Merge pull request #4837 from deepseek-harness/feat/desktop-update-ui-2
fix(desktop): polish the Windows update copy, app icon and About dialog
2026-09-22 14:42:44 +08:00
lsdsjy f21098e9d3 fix(account): expire rejected credentials and hide signed-out provider 2026-09-22 14:41:33 +08:00
winewill cafb9b93b4 fix: address adversarial review of the fatal-diagnostics branch
client-modules: a batch that already executed is never requested again,
even when its first importer was a row it did register — every executed
batch URL is remembered and a still-missing row goes straight to its
one-resource URL. The in-process module system test in test-support is
updated to the aggregated arrival message. describeError replaces three
inline non-Error ternaries and is covered.

subprocess-local: the spill path is published only after the exclusive
open succeeds, so a failed open (EEXIST on a planted entry included) can no
longer unlink a path this process did not create; a reporter that throws is
contained and written to stderr; logSpillFailure builds the owner reporter
for both the runtime and the SSH helper so the logging path is exercised
once instead of duplicated. Tests cover the runtime logger, the bare-caller
stderr default, EEXIST, and a throwing reporter.

desktop: a fatal failure during shutdown still writes its report; the
report phase follows the backend state so a failure during a restart is
'startup' again; writeReport is a required recovery operation and the
dialog tests await the write; the shell pid is labelled; the withheld
response-header list states why set-cookie is dropped.

app-boot, READMEs, Agent Note: "never resumes" is restated as control never
returning to the failed operation while the loop runs until release
settles; inspect output is bounded; incident inferences (who removed the
spill directory, which batch failure occurred) are written as inferences.
2026-09-22 14:41:10 +08:00
lsdsjy 5f1a524f61 docs(credentials): clarify private platform request headers 2026-09-22 14:39:19 +08:00
Dudu-0223 db4bfb4c96 docs(agent-team): refresh generated module dependencies 2026-09-22 14:37:05 +08:00
lsdsjy 6a133a02b8 Merge origin/master into fix/web-account-client-platform 2026-09-22 14:36:24 +08:00
Yichen Jiang 43bd7010d0 test(llm): isolate idle timeout from HTTP setup timing 2026-09-22 14:36:17 +08:00
mektpoy 1a21e958df Merge remote-tracking branch 'origin/master' into tmp4876 2026-09-22 14:34:28 +08:00
Dudu-0223 7befda1147 test(agent-team): release fixtures and respect snapshot types 2026-09-22 14:32:01 +08:00
winewill bed4a2b565 fix(desktop): address review of the extraction failure report
- Headline skips the archive path 7-Zip echoes before an open failure
  (also when the path contains spaces) and prefers the operation line.
- Raw process statuses such as 0xC0000005 are kept and printed in hex
  instead of being clamped to INT_MAX.
- The expanded panel excerpts the result and 7-Zip's own lines rather
  than the report header.
- The saved report keeps up to 16 MiB of output, records any cut, and
  trims a partial UTF-8 sequence before decoding.
- The details view no longer reads the UTF-8 log as ANSI; the test seam
  define and the zero-padded GetTime order are documented; the smoke
  asserts a year-first report name and normalizes -FrameLibrary.
- README names the real updater cache directory.
2026-09-22 14:30:56 +08:00
Huanqi Cao dbd34bcc0d Merge remote-tracking branch 'origin/master' into fix/pwsh-prompt-readiness
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-09-22 14:30:34 +08:00
Yichen Jiang c9591d9445 Merge remote-tracking branch 'origin/master' into worktree/plugin-install-country-registry 2026-09-22 14:29:40 +08:00
Yichen Jiang d459183f32 docs(settings): correct provider configuration paths and examples 2026-09-22 14:28:46 +08:00
Dudu-0223 b7d9c0f6a4 Merge remote-tracking branch 'origin/master' into feat/agent-team-projection-panel 2026-09-22 14:27:15 +08:00
Dudu-0223 843e1b97af fix(agent-team): scope projection reads and address review feedback 2026-09-22 14:27:00 +08:00
yixiangihsiang ce2ba9b216 Merge master into ihsiang/unify-code-block-ui 2026-09-22 14:23:25 +08:00
CreatixChu ee4458f6d0 Merge pull request #4802 from deepseek-harness/fix/4775-multimodal-tool-retention
fix: 按统一 token 预算保留工具结果中的图文内容
2026-09-22 14:22:45 +08:00
Yichen Jiang d407a6ce90 test(credentials): allow either concurrent account request order 2026-09-22 14:22:13 +08:00
mektpoy ab77b55663 Merge origin/master into feat/window-drag-coverage
master grew a fourth drag owner after this branch: the Platform overlay's return
bar (ui-settings-account) declared `app-region: drag` on its own header. The
branch absorbs it into the contract — the header marks itself `data-window-drag`,
its own app-region drag/no-drag rules are deleted, the ui-theme manifest pins the
row and its 48px height, and the Agent Note's row list names it — so the tree
declares the drag surface in exactly two places again (the shell's mark rule and
the Windows caption row).

Earlier resolutions from the first merge stand: the dockkit strip keeps its mark,
the sidebar-right pulse stays deleted, ui-settings-general keeps upstream's
dsh-settings and this branch's react-dom, and tsconfig.host.json takes upstream's
`files: []`.

Checks: build, build:web, typecheck, test:gui, the ui-theme/base-styles gates, the
window-drag-coverage lane, doc-sync and translation pairing.
2026-09-22 13:49:49 +08:00
winewill 4544874d62 Merge branch 'master' into fix/windows-installer-extract-diagnostics 2026-09-22 13:46:04 +08:00
mektpoy 67eb749ef7 Merge origin/master into feat/window-drag-coverage
Conflict resolutions:
- ui-dockkit TabPanel: keep upstream's reworked tab strip and re-add the row's
  `data-window-drag` mark on `css.tabStrip`.
- ui-sidebar-right SidebarRight.tsx/.module.css: keep upstream's retention
  rewrite and re-delete its hand-written one-frame app-region pulse; the shell's
  window-drag watcher owns recollection.
- ui-settings-general/package.json: keep upstream's `@deepseek-ai/dsh-settings`
  dev dependency and this branch's `react-dom`.
- tsconfig.host.json: take upstream's `files: []`; client sources belong to the
  client aggregate.
- pnpm-lock.yaml: master's lock plus only the react-dom importer entries.
2026-09-22 13:41:21 +08:00
imccyu a4c74a91e0 Merge pull request #4909 from deepseek-harness/worktree/release-dsh-0.1.5-rc.3
release: [email protected]
2026-09-22 13:26:23 +08:00
winewill 6530130ffa docs(agent-notes): record fatal diagnostics and crash report decisions 2026-09-22 13:25:38 +08:00
winewill e38cca76fd feat(desktop): write a crash report before the fatal recovery dialog
The fatal recovery dialog showed the last eight lines of the error and
promised that the full diagnostic was in the Electron console, which a
packaged installation never surfaces. Two field failures were diagnosed
from screenshots of those eight lines: a Host killed by an uncaught
exception whose path happened to be in the tail, and a renderer boot
failure whose real import error lived only in the renderer console.

Every reportFatal caller now names its source (host, web-boot, renderer,
main). Before the first dialog opens, the shell writes
crash-<time>-<source>.log under app.getPath('logs') with the source, the
startup or running phase, application and runtime versions, the complete
inspected error with its properties and cause chain, and the primary
window's recent error-level console output (a 64 KiB tail captured from
webContents 'console-message'). The dialog names the file on its own line,
independent of whether the error was shortened and in the listener-conflict
variant too; the wait is bounded to one second and a failed write shows the
dialog without a path. Startup keeps the ten newest reports. Buttons and
recovery actions are unchanged.
2026-09-22 13:22:27 +08:00
imccyu 8e7cca22ca release(dsh): 0.1.5-rc.3 2026-09-22 13:08:07 +08:00
imccyu 943af81a18 fix(release): pin vendor dependencies for dsh 0.1.5 2026-09-22 13:07:34 +08:00
winewill 5864a6f6f1 fix(desktop): drop connection-level headers and bundle cache headers when forwarding to the Host
forwardWebRequest relayed transfer-encoding, connection, keep-alive, and
the other hop-by-hop headers from the Host's response into the dsh-app://
response, describing a Node fetch connection that Chromium never saw. It
also relayed the Host's `cache-control: public, max-age=31536000,
immutable` on plugin bundles whose revision changes on every launch, so
each start wrote another unreusable copy into the renderer's disk cache.

The forwarder now strips the connection-level header set alongside the
encoding headers it already removed and marks /plugins/ responses
no-store. Whether either header contributed to the observed batch load
failure is unverified; both are corrections in their own right.
2026-09-22 13:03:13 +08:00
winewill afde35880f feat(client-modules): recover from a failed batch script and record import errors
One application batch is a single classic script that registers every
package in sequence, requested exactly once during boot. A transient
failure of that one <script> request failed every row in the batch and,
through arriveGraphRow's dependency wait, every row that injects or
requests them; the boot audit then listed each as "import failed (see
console for the import error)" with the real error only in the renderer
console.

Arrival now distinguishes the two failure kinds. A transport failure
(script error event, nothing executed) is retried once on the same URL and
the retry is shared by every row waiting on that batch. A script that
loaded without registering a row is never re-executed, because register()
rejects duplicates and a replay would stop at the first package the
original run did register. Either way each still-missing row then loads its
own one-resource combo URL, which the Host serves for every package. A batch
URL that failed is remembered so later rows skip straight to their
fallback; a one-resource URL is not, so it stays retryable on the next
import as before. Dependency failures are wrapped with the consumer and
dependency names so a cascade reads as a chain.

The module system records the last import() or prefetch() failure per
graph row at the outer operation, so factory execution errors are captured
as well as arrival errors, and clears it on success or invalidation.
assertEntriesActive takes the module system and reports that text per
fiberless entry.
2026-09-22 13:00:13 +08:00
Yichen Jiang 9f52c6401e docs(ip-geolocation): refresh the module dependency graph 2026-09-22 12:57:05 +08:00
Yichen Jiang 22be805026 fix(ip-geolocation): align the package with the current release 2026-09-22 12:50:28 +08:00
winewill 9f9a50e553 feat(app-boot): treat uncaught exceptions as fatal through installFailLoud
The Desktop Host and every other profile launcher installed a fail-loud
handler for unhandled rejections only. A synchronous throw from a stream
'data' listener fell through to Node's default uncaught-exception path: it
printed and exited without the surface's release hook, and the label and
format differed from every other fatal diagnostic.

installFailLoud now registers the same report for 'uncaughtException' with
the label `fatal uncaught exception`, shares the exit latch and release
timeout with rejections, and never resumes the process. The diagnostic is
util.inspect(err, { depth: 4 }) instead of err.stack so enumerable
properties (a node:fs error's code, syscall, and path) and the cause chain
reach stderr; the `fatal load failure` label for rejections is unchanged
because the Web profile expected-output e2e tests match it.
2026-09-22 12:46:37 +08:00
winewill cfa84ed4e3 fix(subprocess-local): contain spill file failures instead of killing the host
OutputCollector.spillAll ran openSync/writeSync inside the stream 'data'
listener with no containment. When the private per-process spill directory
had been removed by a temporary-file cleaner, the first overflowing chunk
threw ENOENT from Pipe.onStreamRead, became an uncaught exception in the
Desktop Host, and the Electron shell reported it as a fatal failure.

Spilling is best-effort by contract (spillPath is optional; a failed final
close already withholds it). Every filesystem failure while opening or
appending the spill file now discards the spill, reports once through the
owner's logger, and leaves in-memory collection untouched. Spill inputs move
into one SpillOptions object with the reporter, so tail-only collectors no
longer pass an empty directory; prepareManagedProcessBinding is the explicit
resolve step for the directory and reporter defaults, and the runtime and
SSH helper supply their plugin loggers.

Tests cover ENOENT on open (removed directory), ENOTDIR on open, and ENOSPC
on append after the file exists, asserting the tail stays byte-exact, the
spill file is withdrawn, and the reporter fires once.
2026-09-22 12:40:07 +08:00
winewill ab62f09c22 fix(desktop): report Windows extraction failures with 7-Zip evidence
The installer showed "Failed to decompress files" and discarded 7-Zip's
error output, so a failure such as security software quarantining an
extracted file could not be told apart from a full disk or a broken
download.

- InstallerExtract returns negated Win32 errors for launch failures so
  they no longer collide with 7-Zip exit codes; 7-Zip writes UTF-8 errors.
- window-frame.dll composes a report (result, archive, destination,
  Windows version, full 7-Zip output), saves it under the updater cache
  directory, and presents a task dialog with the first error line, a
  collapsible bounded excerpt, and a Copy error details button. Silent
  installs keep only the report; a missing task dialog falls back to a
  message box.
- Unsigned Windows builds name their installer *-unsigned.exe so a
  shared file cannot pass for a release artifact; version discovery
  still counts them.
- The directory smoke asserts the saved report on a broken archive and
  smoke-windows.ps1 accepts the prepared DLL.

Refs #4893
2026-09-22 12:38:05 +08:00
Yichen Jiang dccf989cd8 feat(plugin-manager): prefer the mainland mirror for CN network exits 2026-09-22 12:37:32 +08:00
creatixchu c5ca36387b Merge remote-tracking branch 'origin/master' into fix/4775-multimodal-tool-retention
# Conflicts:
#	packages/spill/spill-policy/package.json
2026-09-22 12:35:56 +08:00
mektpoy 95611fbc63 fix(native-command): encode the Explorer target so a comma stays in the path 2026-09-22 12:24:53 +08:00
mektpoy d6a693796d Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-22 12:21:30 +08:00
mektpoy 19b7de31a6 refactor(tool-fs): persist the read language hint as a short id 2026-09-22 12:21:19 +08:00
Turtle c36a83ff6b Merge pull request #4901 from deepseek-harness/rel/dsh-0.1.7-alpha.1
release(dsh): 0.1.7-alpha.1
2026-09-22 12:12:33 +08:00
lsdsjy f5c96b6340 fix(credentials): identify web account requests with client platform header 2026-09-22 12:09:40 +08:00
creatixchu 670a903237 test: clarify parallel recovery fixture cleanup 2026-09-22 12:08:55 +08:00
creatixchu b74bef5d40 test: exercise image recovery and real PTC retention 2026-09-22 12:03:54 +08:00
lsdsjy 817623750a fix(desktop): match Platform login theme
Opened and copied authorization links carried no palette, so the Platform
login page rendered its own stored preference. Append the effective Desktop
palette as theme=light or theme=dark, resolving system through the theme
source the preload publishes.

The theme source now reaches nativeTheme on Windows as well: the preload
drops its macOS-only guard, since shouldUseDarkColors is read for every
platform, and gates the DOMContentLoaded listener with once.
2026-09-22 12:02:54 +08:00
turtle1999 112ce776ac release(dsh): 0.1.7-alpha.1 2026-09-22 11:59:16 +08:00
Huanqi Cao 8aff71863b Merge remote-tracking branch 'origin/master' into fix/pwsh-prompt-readiness
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-09-22 11:52:42 +08:00
Turtle 6942625430 Merge pull request #4897 from deepseek-harness/fix/web-ui-hide-account-sign-in
fix(web): hide DeepSeek account sign-in outside desktop
2026-09-22 11:50:02 +08:00
winewill 9d91bb01c9 fix(desktop): read the About copy from the live locale
master replaced the startup-bound messages constant with a locale that
follows the settings preference; the About dialog now reads the same
locale as the update prompts so the two never mix languages.
2026-09-22 11:48:33 +08:00
winewill 3305bb1938 Merge remote-tracking branch 'origin/master' into feat/desktop-update-ui-2 2026-09-22 11:44:41 +08:00
sjw1231 5ac920e50c chore: merge latest master into message and review fixes 2026-09-22 11:39:33 +08:00
lsdsjy adbb0e0dc4 fix(client): update the contact form URL and drop its account UID prefill
The Contact us entry now opens the current Feishu questionnaire, and the URL
no longer carries the signed-in account UID: contactUs stops reading the
account profile, contactUrl stops writing prefill_uid and hide_uid, and the
remaining build and browser context fields keep their existing behavior.

The url, package tests and the bilingual README and account-login note state
the same current facts.
2026-09-22 11:39:14 +08:00
lsdsjy 75546dc8e9 fix(web): hide DeepSeek account sign-in outside desktop 2026-09-22 11:38:43 +08:00
ZiyaZhang 2426d398b5 fix(ui-agent-preset): restore the read-only configuration viewer
The declarative-preset refactor (#4569) removed the registry's read Remote
together with the YAML editor, and with it the 查看配置 card action that
opened a preset's composition read-only. #4850 brought the Creator entry
back and had to leave 查看配置 out because `agentPresets/read` was gone.

Give the registry a read-only `read` Remote that renders a declaration's
child plugin list from the in-memory definition in the Loader's own
entry-list dialect, so `!!js` conditions read as declared, and put the card
action back at the right end of each card footer: an icon that opens the
YAML in a read-only dialog titled after the preset. Nothing accepts YAML
back, and a broken preset stays readable because its diagnostic points into
that YAML.

Fixes #4895
2026-09-21 20:38:30 -07:00
Turtle 1c96299173 Merge pull request #4831 from deepseek-harness/worktree/voice-input-icon
fix(voice-input): improve plugin icon and setup diagnostics
2026-09-22 11:35:32 +08:00
creatixchu de45804084 test: refresh tool projection API snapshot 2026-09-22 11:32:07 +08:00
imccyu 1e9c7b410a Merge pull request #4891 from deepseek-harness/worktree/release-vendor-4.0.2
release(vendor): cordis 4.0.3, cosmokit 1.8.4, group 1.0.3, hmr 1.0.1…
2026-09-22 11:31:17 +08:00
Huanqi Cao 091db6c8c3 Merge remote-tracking branch 'origin/master' into fix/pwsh-prompt-readiness
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.zh.md
2026-09-22 11:30:34 +08:00
creatixchu 94728ebd23 fix: repair multimodal retention CI resolution and coverage 2026-09-22 11:28:51 +08:00
creatixchu 06923b8868 Merge remote-tracking branch 'origin/master' into fix/4775-multimodal-tool-retention 2026-09-22 11:25:47 +08:00
imccyu efa63a7fc4 release(vendor): cordis 4.0.3, cosmokit 1.8.4, group 1.0.3, hmr 1.0.18, include 1.0.8, loader 1.0.4, logger-console 1.0.3, schemastery 3.18.3, timer 1.1.5 2026-09-22 11:21:12 +08:00
Yichen Jiang d20c90a091 Merge remote-tracking branch 'origin/master' into worktree/voice-input-icon 2026-09-22 11:19:32 +08:00
Turtle 1d1b033f77 Revert "feat(shortcuts): add configurable Web and desktop shortcuts" (#4886) 2026-09-22 11:17:24 +08:00
_Kerman ad83cce36a fix(session): repair missing turn ends during V3 migration (#4689)
* fix(session): repair interrupted turns during V3 migration

* docs(session-format-v3-to-v4): state reference remapping in the summary and code

The frontmatter summary still promised preserved references after the edge
began remapping audited same-artifact references around an inserted
interrupted turn/end. Two local comments record why the opaque branch moves
only `seq` and why the open-step flag needs no reset at a turn boundary.

* docs(session-format-catalog): describe the V3-to-V4 edge as a converting link

The catalog listed the edge as an identity conversion, which stopped being
true once it inserted an evidenced interrupted turn/end and remapped the
audited local references that follow.
2026-09-22 11:13:54 +08:00
Yichen Jiang 2fb7c881db Merge remote-tracking branch 'origin/master' into worktree/voice-input-icon 2026-09-22 11:13:49 +08:00
Turtle 2c95550e87 Revert "feat(shortcuts): add configurable Web and desktop shortcuts" 2026-09-22 11:04:01 +08:00
Yichen Jiang 577ccabb96 fix(voice-input): match microphone support and capsule stroke widths 2026-09-22 11:03:25 +08:00
creatixchu 6b227a81a7 docs: sync plugin inventory after master merge 2026-09-22 11:00:31 +08:00
Yichen Jiang 9799132631 fix(voice-input): outline the capsule without changing microphone proportions 2026-09-22 10:59:08 +08:00
Yichen Jiang dc1e6e967b fix(voice-input): use the outline microphone icon 2026-09-22 10:53:06 +08:00
creatixchu 4137d1d628 Merge remote-tracking branch 'origin/master' into fix/4775-multimodal-tool-retention
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
2026-09-22 10:52:21 +08:00
Dudu-0223 d08aac9db2 fix(agent-team): read current projections through standard hooks 2026-09-22 10:46:06 +08:00
Dudu-0223 5ca4fea9b5 Merge master into feat/agent-team-projection-panel 2026-09-22 10:45:10 +08:00
Yichen Jiang 8c022b8013 fix(voice-input): use waveform artwork and filled microphone 2026-09-22 10:42:59 +08:00
流光 08b73684d0 feat(shortcuts): add configurable Web and desktop shortcuts (#4847)
- Add shortcut discovery, search, recording, and customization.
- Persist device-local bindings with conflict detection and reset support.
- Integrate shortcuts with desktop menus, workspace actions, and sidebar focus.
- Add unit coverage and browser regression snapshots.
2026-09-22 03:46:10 +08:00
Xinyu Yang a0d453d3c6 fix(shortcuts): complete CI coverage and browser regressions 2026-09-22 03:27:55 +08:00
imccyu a68c1f6539 Merge pull request #4852 from deepseek-harness/feat/chat-process-groups-product
feat(chat): grouped work details and scoped rendering optimizations
2026-09-22 02:57:17 +08:00
imccyu c7b9c91497 fix(chat): preserve steering order and limit expanded mode to live turns 2026-09-22 02:34:16 +08:00
Huanqi Cao 44900be005 docs(native-command): name explorer.exe in the Windows open note
The Agent Note title said 'the shell's own application resolution', which names a layer instead of the command the opener runs.
2026-09-22 02:07:32 +08:00
Huanqi Cao 68e43b173e fix(native-command): open Windows paths through the shell's resolution
The settings sheet's Open configuration file action opened nothing on Windows when the user's default lived only in the Explorer per-user record (FileExts\\<ext>\\UserChoiceLatest), which Explorer honors and the association resolver inside the host process does not. Invoke-Item also exits 0 when it finds no application, so the Remote answered { opened: true } and the sheet rendered no error.

Windows opens now hand the path to explorer.exe as one argv element - the resolution a double-click performs - and revealNativePath shares that invocation rule. The shared helper accepts Explorer's delegate exit 1 for an open and a reveal alike; every other failure and every cancellation still rejects. The PowerShell command string and powershellLiteral are gone: the path crosses the process boundary as argv, with no escaping step.

Fixes #4428
2026-09-22 01:57:21 +08:00
imccyu 504013def1 refactor(chat): simplify process titles and clarify grouping notes 2026-09-22 01:32:38 +08:00
imccyu 5d62f82bc0 fix(chat): preserve cross-client pending input order 2026-09-22 01:08:15 +08:00
imccyu 809e0942b9 fix(session): retire confirmed steering echoes on resync 2026-09-22 01:08:15 +08:00
imccyu 12d9dd6aa4 test(web): refresh chat process group snapshots 2026-09-22 00:45:46 +08:00
imccyu 3bf26d0954 docs(chat): consolidate grouping rationale and review status 2026-09-22 00:45:46 +08:00
imccyu 9ad25a6ab6 fix(chat): cover turn triggers and preserve reading anchors 2026-09-22 00:45:46 +08:00
imccyu 3b4ecc9d20 fix(chat): retain assistant nodes and steering echoes 2026-09-22 00:45:46 +08:00
imccyu 92046a8abc fix: snapshots 2026-09-22 00:45:46 +08:00
imccyu 275008d324 fix: static 2026-09-22 00:45:46 +08:00
imccyu b12a72867a fix(chat): keep early turn controls after opening input 2026-09-22 00:45:46 +08:00
imccyu 4d4af31d16 fix(chat): retain typed source receivers and paging results 2026-09-22 00:45:46 +08:00
imccyu 22cd2cd387 test(chat): align turn presentation and deterministic clock fixtures 2026-09-22 00:45:46 +08:00
imccyu 99c0e8dcf6 test(plan): cover scoped card binding and availability failures 2026-09-22 00:45:46 +08:00
imccyu ee3526059e docs(chat): complete grouping and viewport API comments 2026-09-22 00:45:46 +08:00
imccyu a0bf09f629 docs(chat): remove the obsolete work-details migration tracker 2026-09-22 00:45:46 +08:00
imccyu 19e5af7ded perf(chat): locate visible turns with outer-row binary search 2026-09-22 00:45:46 +08:00
imccyu 97daa6a799 perf(conversation): ignore idle width-handle pointer movement 2026-09-22 00:45:46 +08:00
imccyu 5ff9ab8757 perf(plan): subscribe cards to turn-local plan data 2026-09-22 00:45:45 +08:00
imccyu a7fc7d4f56 perf(chat): restore preference focus before publishing updates 2026-09-22 00:45:45 +08:00
imccyu 3a046413de perf(locale): avoid unchanged document language writes 2026-09-22 00:45:45 +08:00
imccyu 376f68199e perf(chat): narrow group title updates and defer edge measurements 2026-09-22 00:45:45 +08:00
imccyu 1bcb633c3f feat(chat): add grouped work details and stable history paging 2026-09-22 00:45:45 +08:00
imccyu e17e1ac801 feat(client): present turn triggers and completed-turn footers 2026-09-22 00:45:45 +08:00
imccyu 4b78b6577c feat(client): inject reset-aware disclosure hooks 2026-09-22 00:45:45 +08:00
imccyu b47cef687e Merge pull request #4863 from deepseek-harness/fix-excel
fix(web): 修复含绘图的 XLSX 文件预览
2026-09-22 00:41:02 +08:00
Xinyu Yang 76ab2a32d1 fix(shortcuts): align settings launcher and browser regressions with master 2026-09-22 00:20:29 +08:00
imccyu d49f2b1bf8 test(client): make rebuild generations independent of clock precision 2026-09-22 00:18:59 +08:00
imccyu 5270b7ffa1 test(hmr): wait for filesystem ctime before polling assertions 2026-09-22 00:01:10 +08:00
Xinyu Yang 7b564f61e7 fix(shortcuts): integrate current desktop guests and client APIs 2026-09-21 23:57:50 +08:00
Xinyu Yang 069c370987 fix(shortcuts): address review findings and modal focus 2026-09-21 23:57:49 +08:00
Xinyu Yang 49fc4f0e5b refactor(shortcuts): remove unused state and tighten command context 2026-09-21 23:57:49 +08:00
Xinyu Yang f815d6c733 fix(shortcuts): stabilize recording, focus, and desktop dispatch 2026-09-21 23:57:49 +08:00
Xinyu Yang 365ef73c7c feat(client): prioritize action tooltips over workspace previews
Hide an enclosing hover preview while an action tooltip is visible, and restore the preview when the tooltip closes.
2026-09-21 23:57:49 +08:00
Xinyu Yangand神河一号 - 烈焰流光 b7ac0ade10 feat(shortcuts): add fixed stop and approval actions
Add scoped double-Escape cancellation and fixed approval actions. Reserve their input combinations and preserve composition, modal, and input-owner arbitration.

Co-authored-by: 神河一号 - 烈焰流光 <[email protected]>
2026-09-21 23:57:49 +08:00
Xinyu Yangand神河一号 - 烈焰流光 f54744e35b feat(shortcuts): add focused panel and page commands
Route file, terminal, browser, split, fullscreen, close, and refresh commands to the focused panel. Connect native Desktop page and window actions to the same command owners.

Co-authored-by: 神河一号 - 烈焰流光 <[email protected]>
2026-09-21 23:57:49 +08:00
Xinyu Yangand神河一号 - 烈焰流光 a532a687a6 feat(shortcuts): add workspace and session commands
Connect saved bindings to workspace search, creation, session naming, forking, archiving, and external opening. Publish the loaded conversation history needed to select fork targets.

Co-authored-by: 神河一号 - 烈焰流光 <[email protected]>
2026-09-21 23:57:49 +08:00
Xinyu Yangand神河一号 - 烈焰流光 efdf8e5b6d feat(shortcuts): add configurable Web and desktop shortcuts
Add the keyboard registry, device-local preferences, and searchable shortcut editor. Support Web routing and native Desktop single-key and two-key bindings.

Co-authored-by: 神河一号 - 烈焰流光 <[email protected]>
2026-09-21 23:57:28 +08:00
imccyu 2d236df56f test(client): wait for filesystem ctime before revision checks 2026-09-21 23:49:42 +08:00
imccyu 6ba92b3f05 fix(web): preview XLSX workbooks with unsupported drawings 2026-09-21 23:26:50 +08:00
imccyu d7c238a98d Merge pull request #4855 from deepseek-harness/fix/client-revisions-server-restart
fix(web): preserve sessions across server restarts
2026-09-21 23:24:51 +08:00
lsdsjy 099eacf108 Merge pull request #4475 from deepseek-harness/feat/desktop-welcome-and-window-controls
feat(desktop,credentials): add Welcome and DeepSeek account sign-in
2026-09-21 23:04:14 +08:00
lsdsjy 5b9a33fa61 test(account): align browser flows and diagnose stalled transport 2026-09-21 22:48:12 +08:00
imccyu d1fb051e0f test(web): stamp bootstrap artifacts before rebuild checks 2026-09-21 22:41:17 +08:00
yixiangihsiang f114233545 fix(web): cover code-card overflow and refresh browser expectations 2026-09-21 22:40:55 +08:00
lsdsjy 2a1eb24285 fix(account): cover lifecycle failures and restore CI compatibility 2026-09-21 22:32:30 +08:00
Turtle d1255ab1a4 docs(agent-preset): enumerate and verify skill files with Host file tools only (#4856)
* docs(agent-preset): enumerate and verify skill files with Host file tools only

* docs(agent-preset): list template files instead of enumerating the skill directory

The glob and search tools spawn a native ripgrep process, which cannot read
inside app.asar any more than a shell can; the skill now carries the complete
template file list and forbids enumeration.
2026-09-21 22:30:57 +08:00
lsdsjy 0d985d55a2 merge: sync master into desktop welcome branch 2026-09-21 22:11:39 +08:00
lsdsjy 43ff526d1e fix(ui-settings-account): retry failed embedded Platform pages 2026-09-21 22:06:05 +08:00
lsdsjy f8175d5989 fix(desktop): synchronize embedded Platform locale 2026-09-21 21:59:10 +08:00
yixiangihsiang 8d2cd0cf72 feat(web): unify code block styling and icon controls 2026-09-21 21:57:35 +08:00
lsdsjy 9d0b8da486 fix(desktop): use medium weight for welcome brand 2026-09-21 21:53:05 +08:00
imccyu 092ae937b7 test(web): cover session recovery across server restarts 2026-09-21 21:47:52 +08:00
imccyu b1921cf56d fix(client): keep artifact revisions stable across server restarts 2026-09-21 21:47:52 +08:00
Turtle b13bbc027c feat(agent-preset): progressive creator skills and profile shell facts (#4836)
* feat(tool-cordis): inspect live plugin Config schemas

Replace the Host `Builtin` inspect provider, which described a dynamic Host
half the model can no longer define, with a `Config` provider that lists every
live Loader entry with its Config status and projects one entry's native
Schemastery Config into a self-contained JSON Schema document. app-boot exports
its projector, native-schema check, and the shared `loaderExpression`
definition for the live walk; the CLI dump keeps its profile-composition path.

* fix(tool-cordis): refresh config catalog pointer and presets e2e provider list

* feat(agent-preset): progressive creator skills and profile shell facts

Split `cordis-plugin-development` into a short procedure with `references/`
read on demand and copyable `templates/`, replace the source-reading ban in
both creator skills with an ordered list of knowledge sources, and add the
`cordis-composition-reference` skill with the Loader patch dialect and a
generated, doc-sync-gated list of loadable plugin packages. `shell-env`
exposes `DSH_PROFILE` and `DSH_PROFILE_DIR` so skills can address the installed
profile.

* chore(agent-preset): regenerate plugin package list after merging master

* fix(tool-cordis): resolve the Loader at Config query time

A Host composed programmatically without a Loader keeps registering the
inspect providers; `Config.listConfigs` reports the missing Loader when
queried. Refresh the advanced-toolchain recordings whose provider list now
carries `Config` in place of `Builtin`.

* chore(agent-preset): regenerate plugin package list after merging master

* docs: regenerate module graph for the tool-cordis app-boot dependency

* docs: regenerate module graph for the shell-env app-boot dependency

* docs: regenerate event graph pointer for app-boot exports

* fix(agent-preset): address review on creator skills

`Config.listConfigs` reports each entry's resolved `packageDir` through the
profile package lookup, and the skills read READMEs and built declarations
there instead of guessing `$DSH_PROFILE_DIR/node_modules`, which holds only
profile-installed packages. Skills name the PowerShell variable syntax and the
no-profile omission; the composition reference no longer attributes
`overridden` to `list_plugins`; references point at the templates instead of
pasting them. The skills spec renders every skill and bounds it by the pruner
threshold in code points, checks referenced files and the source-reading ban
across all skill files.

* fix(tool-cordis): address review on the Config inspect provider

Report the Loader entry id (unique across include trees) beside the tree-local
patch id, classify group and include carriers as `tree`, treat disabled and
disposed fibers as `inactive`, and drop the unreachable boolean-schema branch
by narrowing the projector's root type. The presets e2e now queries
`Config.listConfigs` over the booted Web profile and projects the shipped
`tools` row; the advanced-toolchain recordings carry the updated manifest.

* fix(tool-cordis): page the Config directory and filter it by plugin name

A full directory of a shipped Web profile exceeds the 50000-byte spill cap
once rows carry more fields, and the spilled preview is no longer JSON.
`Config.listConfigs` now returns pages (`offset`, `limit` up to 100, default
25) with `total` and `nextOffset`, and an exact plugin `name` filter; the
presets e2e reads the shipped rows through the filter.

* chore(agent-preset): refresh skill recordings after the paged Config query

* docs(agent-preset): teach the composition skill to migrate legacy presets

A preset authored before declaration rows lived in
`$DSH_HOME/.agent-presets/<id>/` as `preset.yml` plus `agent.cordis.yml`;
the skill now maps those files onto a declaration bundle and re-checks plugin
names against the package list.

* docs(agent-preset): read skill files through the file-read tool only

Desktop ships the skill directory inside app.asar, which the Host process can
open but shell commands, node, and pnpm cannot. The skills now say to read
references and templates with the file-read tool and copy templates into the
workspace before installing or checking them; the spec rejects shell reads of
skill files.

* docs(agent-preset): document bundle display metadata and package.json icon in the host-plugin reference
2026-09-21 21:28:35 +08:00
mektpoy 6f056da42f chore(deps): keep only the lockfile delta the settings portal needs
The consolidated commit refreshed unrelated transitive resolutions while it
resolved the settings portal's new react-dom dependency. Restore those entries to
their previous versions and keep only the two importer entries the portal needs;
the lockfile already carries both snapshots.
2026-09-21 21:17:55 +08:00
07akioni 8b993f43e0 Merge pull request #4845 from deepseek-harness/dev/desktop-devtools
feat(desktop): enable hidden native DevTools shortcuts
2026-09-21 21:07:26 +08:00
Turtle 1b87a2a889 fix(ui-agent-preset): restore the Creator entry on the preset settings page (#4850)
The declarative-preset refactor replaced the settings section's visible
"让 Agent 帮我创建预设模式" entry with a question-mark icon beside the title
that opened an explanatory modal, and rewrote the section's markup and CSS
along with it.

Restore the section as Ziya's commit 1ed59986f7 had it, minus the copy
(复制预设) and view (查看配置) card actions the refactor removed for good:
the roster keeps its cards, mode help and picker row, the custom group stays
on screen with the Creator entry as its tail, and the question-mark modal is
gone. The creator button stages the cordis preset and starts a task in it,
disabled with the picker's own reason while mode selection is off.

Delete and open-location stay out: the registry exposes only `list` and
`select`, and the roster row no longer carries a trust or a document.

The section spec covers the entry's four paths, and the Web scenario
replaces its help-dialog step with one that drives the entry to a host
session composed from cordis.
2026-09-21 21:05:20 +08:00
07akioni e47e85cce6 test(desktop): remove obsolete overlay DevTools assertion 2026-09-21 20:58:15 +08:00
07akioni fc7c9c2e2f fix(desktop): retain update overlay DevTools availability 2026-09-21 20:57:01 +08:00
07akioni 54f6433357 test(desktop): avoid untyped nested overlay matcher 2026-09-21 20:47:26 +08:00
07akioni 355e43c1f3 refactor(desktop): use hidden native DevTools menu shortcuts 2026-09-21 20:43:38 +08:00
mektpoy 613157c5db Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-21 20:42:39 +08:00
Turtle 8c146d978f feat(tool-cordis): inspect live plugin Config schemas (#4834)
* feat(tool-cordis): inspect live plugin Config schemas

Replace the Host `Builtin` inspect provider, which described a dynamic Host
half the model can no longer define, with a `Config` provider that lists every
live Loader entry with its Config status and projects one entry's native
Schemastery Config into a self-contained JSON Schema document. app-boot exports
its projector, native-schema check, and the shared `loaderExpression`
definition for the live walk; the CLI dump keeps its profile-composition path.

* fix(tool-cordis): refresh config catalog pointer and presets e2e provider list

* fix(tool-cordis): resolve the Loader at Config query time

A Host composed programmatically without a Loader keeps registering the
inspect providers; `Config.listConfigs` reports the missing Loader when
queried. Refresh the advanced-toolchain recordings whose provider list now
carries `Config` in place of `Builtin`.

* docs: regenerate module graph for the tool-cordis app-boot dependency

* docs: regenerate event graph pointer for app-boot exports

* fix(tool-cordis): address review on the Config inspect provider

Report the Loader entry id (unique across include trees) beside the tree-local
patch id, classify group and include carriers as `tree`, treat disabled and
disposed fibers as `inactive`, and drop the unreachable boolean-schema branch
by narrowing the projector's root type. The presets e2e now queries
`Config.listConfigs` over the booted Web profile and projects the shipped
`tools` row; the advanced-toolchain recordings carry the updated manifest.

* fix(tool-cordis): page the Config directory and filter it by plugin name

A full directory of a shipped Web profile exceeds the 50000-byte spill cap
once rows carry more fields, and the spilled preview is no longer JSON.
`Config.listConfigs` now returns pages (`offset`, `limit` up to 100, default
25) with `total` and `nextOffset`, and an exact plugin `name` filter; the
presets e2e reads the shipped rows through the filter.
2026-09-21 20:39:29 +08:00
mektpoy ba88134117 Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-21 20:37:43 +08:00
turtle1999 d52227c135 fix(ui-agent-preset): restore the Creator entry on the preset settings page
The declarative-preset refactor replaced the settings section's visible
"让 Agent 帮我创建预设模式" entry with a question-mark icon beside the title
that opened an explanatory modal, and rewrote the section's markup and CSS
along with it.

Restore the section as Ziya's commit 1ed59986f7 had it, minus the copy
(复制预设) and view (查看配置) card actions the refactor removed for good:
the roster keeps its cards, mode help and picker row, the custom group stays
on screen with the Creator entry as its tail, and the question-mark modal is
gone. The creator button stages the cordis preset and starts a task in it,
disabled with the picker's own reason while mode selection is off.

Delete and open-location stay out: the registry exposes only `list` and
`select`, and the roster row no longer carries a trust or a document.

The section spec covers the entry's four paths, and the Web scenario
replaces its help-dialog step with one that drives the entry to a host
session composed from cordis.
2026-09-21 20:19:06 +08:00
07akioni ff16cf535a fix(desktop): suppress DevTools shortcuts behind update overlays 2026-09-21 20:18:40 +08:00
winewill 53abf11bdd fix(desktop): keep the Windows About dialog on the startup locale
Review pointed out that About read its copy from the renderer-reported
Windows language while the shared update dialog stamps its lang and
close label from the startup locale, so an in-app language switch mixed
languages inside one dialog. About now uses the same startup messages
as Check for Updates. The menu click also logs a dialog that fails to
open instead of leaving an unhandled rejection, and the return type no
longer hides the message-box result behind unknown.
2026-09-21 20:11:05 +08:00
07akioni edae410733 feat(desktop): support Command Option I for macOS DevTools 2026-09-21 20:06:43 +08:00
lsdsjy e8778d413d Merge commit 'e3c84634b4' into HEAD 2026-09-21 20:02:27 +08:00
lsdsjy 3306fac787 merge: include latest master in desktop welcome branch 2026-09-21 20:01:07 +08:00
lsdsjy e682ad3e5b fix(ui-settings-account): keep sign-in errors in the login dialog 2026-09-21 19:56:34 +08:00
lsdsjy a2bc1e412c test(account): type browser popup proxy values 2026-09-21 19:54:43 +08:00
lsdsjy d5db0ff0c4 merge: sync master into desktop welcome branch 2026-09-21 19:53:28 +08:00
Yichen Jiang fcd89f691a fix(voice-input): explain model preparation download failures 2026-09-21 19:50:20 +08:00
07akioni 982fb17754 feat(desktop): open renderer DevTools with F12 in packaged builds 2026-09-21 19:49:04 +08:00
Jiawei Song f384ee7418 Merge branch 'master' into fix/4823-message-overflow-review-menu 2026-09-21 19:48:47 +08:00
Yichen Jiang cbae324bfa feat(workspace): stop a Session's running work before archiving it (#4765)
* feat(workspace): stop a Session's running work before archiving it

Archiving was a pure visibility write, so a Session archived mid-turn kept
running out of sight. The Workspace registry now owns archive admission
through two Host events: `workspace/session-activity` reports what still
runs and refuses the plain archive as `workspace/session-active`;
`workspace/session-stop`, requested with `stopActivity`, stops that work the
way the user's own stop actions do before the archive write. The API Session
Controller reports and stops turns, subagent descendants, and owned jobs and
rejects any model step for an archived Session; the Schedule plugin reports
and deletes active reminders. The sidebar turns the refusal into a
stop-and-archive confirmation listing the Host's answer.

* test(workspace): pin the widened archive signature and prove child liveness by heartbeat

The Client inspect catalog spec pins archiveSession's new options
parameter, and the archive e2e reads the Bash child's liveness from a
heartbeat file instead of a pid: the Linux sandbox runs the tool in its own
PID namespace, so the pid it reports is not comparable from the test.

* test(workspace): cover the archive-admission providers and dialog to the per-file gate

Drop the provider's unused disposer and the dialog's unreachable confirm
guard, read reminders without a catch that no composition can reach, and
add the cases the coverage lane found missing: a stop without a jobs
registry, a looping lineage, a descendant whose projections reject, the
dialog's Escape guard and non-Error reason, and a family merged by another
provider.

* fix(workspace): write the archive before stopping, gate subagent lineage, and delete reminders under the schedule barriers

Review round on #4765. The registry now writes the archive set before it
dispatches `workspace/session-stop`, so the durable set already gates
every wake the stops induce; the controller's `agent/pre-step` gate also
blocks subagent descendants of an archived Session and contains each
cancel or kill on its own. The Schedule plugin's stop listener runs as a
management delete in the agent's transaction queue between the same two
persistence barriers the `schedule_delete` tool uses. The confirm dialog
selects singular or plural English lines and keys list rows by index.
Docs: archive-admission section with type-equiv blocks on the workspace
subsystem page, write-first order and residual windows in the READMEs
and the Agent Note, and the missing zh reminders sentence.

* test(web): scope the question composer's New Session wait to the Sessions tree

The wide sidebar's New Session button carries the same visible label as
a fresh session row, so the unscoped `getByText` either settled on the
button before the row existed or hit a strict-mode violation once the
row rendered first, which is how the snapshots lane failed on
ece68c2ab5. Waiting inside the Sessions tree names the row alone.

* fix(schedule): answer archive admission from the owned runtime's fold, not the projection registry

The `sessionProjections.snapshot` API is the Client projection view and
is not a Host read path (review on #4765). `ScheduleRuntime.activeRecords()`
folds the live log the way every drive does, and the archive-admission
listeners ask the owned runtime for that fold: a session without a live
agent or without an owned runtime has nothing armed to fire, so it reports
nothing and has nothing to stop. Covers the runtime-less agent, a fold that
turns unreadable at the persistence barrier, and the stopping/faulted
runtime answering nothing.

* refactor(subagent): report and stop subagent descendants from the Subagent runtime

The `subagent` family of archive admission moves out of the API Session
Controller into `dsh-subagent`, which records the lineage at delegation
and owns the descriptor (review on #4765): `SubagentRuntime` answers
`workspace/session-activity` with the running descendants, labelled from
each child's descriptor through a live Session observation, and
`workspace/session-stop` by cancelling each of them with the parent
cause. The controller keeps turns, owned jobs, and the lineage step gate,
and composes its provider through `ctx.plugin(SessionActivityProvider)`
with declared injections instead of a bare installer call. `dsh-workspace`
becomes an optional type-only peer of `dsh-subagent`.

* refactor(jobs): answer archive admission for owned jobs from the job registry seam

The `job` family moves out of the API Session Controller into `dsh-jobs`
(review on #4765): the seam's constructor installs the
`workspace/session-activity` and `workspace/session-stop` listeners for
every implementation through the abstract `list` and `kill` alone, so the
controller no longer knows the jobs vocabulary and keeps only the turn
family and the archived-lineage step gate. `dsh-workspace` becomes an
optional type-only peer of `dsh-jobs`.

* refactor(workspace): leave SessionActivityKindMap empty and let each provider merge its family

The workspace package no longer names any activity family (review on
#4765): `SessionActivityKindMap` is empty, and each provider merges its own
key from a module both its faces import — `turn` in the API Session
Controller's types, `job` in the job registry seam's view, `subagent` in
the Subagent runtime's control types, `schedule` in the Schedule plugin's
types. The confirm dialog imports those modules for its cases and keeps
the generic line for any other key; the registry and controller suites
merge test-owned families instead of borrowing the providers'.

* refactor(agent): report and stop the running turn from the Agent registry

The `turn` family moves out of the API Session Controller into `dsh-agent`
(review on #4765): the registry's constructor installs the
`workspace/session-activity` and `workspace/session-stop` listeners for
every Agent it publishes, answering with its own lookup and cancelling the
turn with the user cause, and merges the `turn` key from its client-safe
types. The controller keeps only the archived-lineage step gate, renamed
`ArchivedSessionGate`. `dsh-workspace` becomes an optional type-only peer
of `dsh-agent`; the workspace package depends on none of the providers,
so the edge stays acyclic.

Since #3127 a foreground Bash command is a registered job from its start,
so the archive dialog lists it beside the turn; the e2e and its ARIA golden
expect that row, and the capture keeps the running job by design.
2026-09-21 11:46:13 +00:00
lsdsjy 44b15a3377 fix(desktop,credentials): address sign-in review regressions 2026-09-21 19:39:42 +08:00
winewill 89251dde83 Merge remote-tracking branch 'origin/master' into feat/desktop-update-ui-2 2026-09-21 19:39:37 +08:00
sjw1231 7ebbd370cd test(web): preserve quoted file reference coverage 2026-09-21 19:34:51 +08:00
sjw1231 719cc56276 Merge branch 'master' into fix/4823-message-overflow-review-menu 2026-09-21 19:25:06 +08:00
mektpoy fe09f495a5 Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages
# Conflicts:
#	packages/client/ui-primitives/tsconfig.json
#	pnpm-lock.yaml
2026-09-21 19:19:36 +08:00
lsdsjy 1137e86aef fix(desktop,ui-theme): align bundled Montserrat fonts with onboarding 2026-09-21 19:19:00 +08:00
mektpoy b0ad792e6b fix(web): keep dedicated previews and the read-card lang domain
The shared code-language table must not claim a suffix a dedicated viewer
declares, and the Host read card must keep the `lang` values it already
persisted.

- Drop `csv` from the shared table: Code registers before Spreadsheet, so
  the earlier body would take `.csv` and the browser snapshot gate fails.
- Add `readLangHintForPath`, the read card's legacy projection over the
  shared table: the 43 pre-unification suffixes keep their old short ids
  byte for byte, new suffixes use the canonical id.
- Add an ownership regression test over the full preview registry that
  turns red when `csv` returns, plus byte-level and alias-normalized tests
  for the read projection.
2026-09-21 19:14:08 +08:00
winewill 894f25b91e fix(desktop): source the About product name from the locale
The client UI i18n gate rejects literal message text in main.ts; the
Windows About dialog now reads the product name from the dictionaries
like every other shell string.
2026-09-21 19:03:39 +08:00
mektpoy dc07e5a50d fix(tools): keep surrogate pairs intact when capping tool output
Three tools capped the preview text they return with String.prototype.slice
at a UTF-16 code-unit budget. A cut that lands inside a surrogate pair
leaves a lone high surrogate, which is not well-formed text: a strict JSON
reader rejects the durable Session log carrying it, and the preview shows a
broken glyph. A lone surrogate retained in history has already blocked every
later Messages request for one session.

Centralize the cap in output-retention as
truncateWithoutSplittingSurrogatePair, and use it from the persistent bash
and pwsh shells and the string-replace editor. The cut drops the unpaired
half instead of keeping it, so the retained text stays a prefix and is at
most one code unit shorter than before.

The new dependency edges and the shifted Config sources regenerate
docs/module-graph and docs/config-catalog, including the committed
translation pair.

Refs #4817
2026-09-21 18:51:19 +08:00
Yudong Han f65c15a5cf feat(preview): unify document zoom controls (#4785) 2026-09-21 10:49:45 +00:00
Yudong Han d0ddf939f0 refactor(office): transfer PDFs as multipart bytes (#4830)
* refactor(office): transfer PDFs as multipart bytes

* fix(document-preview): address Office review feedback
2026-09-21 10:30:10 +00:00
Turtle 601d6761e4 feat(settings): project volatile Config through profile-backed forms (#4587) 2026-09-21 18:26:03 +08:00
gengruilin a964bd34b5 fix(tools): 同步原生容器校验并归位回归测试 2026-09-21 18:14:56 +08:00
Yichen Jiang da7ca4265a fix(voice-input): explain model download network requirements 2026-09-21 18:09:31 +08:00
Jiawei Song c63e174b7b Merge pull request #4798 from deepseek-harness/fix/4670-review-tab-scroll-and-filename
fix(ui-deliverables): prevent edge rebound and preserve filename endings
2026-09-21 18:08:50 +08:00
Jiawei Song 08653de38a Merge branch 'master' into fix/4670-review-tab-scroll-and-filename 2026-09-21 17:59:51 +08:00
07akioni c82e40d498 Merge pull request #4809 from deepseek-harness/otel/product-telemetry
feat(telemetry): add explicit product event OTLP exporter
2026-09-21 17:59:21 +08:00
winewill bc4e8bafe6 Merge remote-tracking branch 'origin/master' into feat/desktop-update-ui 2026-09-21 17:58:40 +08:00
sjw1231 5847ff8721 chore: merge master into review tab fixes 2026-09-21 17:58:14 +08:00
Yichen Jiang 645e4faab2 fix(voice-input): add a dedicated plugin icon 2026-09-21 17:54:37 +08:00
07akioni 6d13819fbc docs(telemetry): regenerate module graph after package rename 2026-09-21 17:50:32 +08:00
07akioni 3a3aaaf796 Merge pull request #4804 from deepseek-harness/fix/desktop-ripgrep-unpack
fix(desktop): unpack platform ripgrep executables
2026-09-21 17:50:05 +08:00
sjw1231 5aa21749b9 fix(web): wrap long file references and track floating menus
Fixes #4823
2026-09-21 17:48:27 +08:00
winewill c1edda8a37 fix(desktop): show the Windows About command in the update dialog
Electron's About role on Windows falls back to a bare system message
box, which looks nothing like the shell's dimmed update prompts. Design
asked for the version check to match Check for Updates, so the Windows
menu item now opens the shared update dialog with the application name,
localized version line and a single OK button; macOS keeps the native
panel. The About command follows the renderer's chosen language like
the rest of the Windows caption menu.
2026-09-21 17:46:26 +08:00
07akioni 535cb4aae3 fix(telemetry): isolate collector transport and address review 2026-09-21 17:45:19 +08:00
mektpoy 6945da14cb feat(web): unify the code-highlight language table and extend it
The document Code preview and the Host read card each owned an
extension-to-language table that had drifted: the preview table had 13
extensions the read card lacked, and the two returned different language
ids for the same suffix. Both now resolve through the new zero-dependency
@deepseek-ai/dsh-util-code-language, which also adds common Windows,
config, markup, and language extensions. Every added grammar stays in the
lazy set; the boot grammars are unchanged.

Fixes #4822
2026-09-21 17:42:11 +08:00
winewill 1566f3f5ad fix(desktop): round the Windows app icon corners further
The Windows badge used a 44px radius on its 1024px plate, which reads as
nearly square on the desktop next to other Windows 11 icons. Raise the
radius to 192px (3/16 of the plate, matching Tencent Meeting's corner)
and re-export the transparent 1024×1024 PNG from the SVG; the ICO for
the app, installer and uninstaller and the About panel image all derive
from that PNG.
2026-09-21 17:40:49 +08:00
winewill 481b6b57e5 fix(desktop): simplify the update-available restart notice
The manual check dialog explained that the release bundles its matching
dsh runtime before mentioning the restart. Users only need to know the
app restarts to finish updating; the bundling detail belongs in the
README, not the confirmation. Both locales carry the shorter sentence.
2026-09-21 17:39:50 +08:00
07akioni b2ad3bf020 Merge remote-tracking branch 'origin/master' into fix/desktop-ripgrep-unpack 2026-09-21 17:37:59 +08:00
creatixchu 754733d5d1 test: update shell spill snapshot for the shared token budget 2026-09-21 17:34:29 +08:00
07akioni 8b89200324 Merge remote-tracking branch 'origin/master' into otel/product-telemetry 2026-09-21 17:33:03 +08:00
winewill dcac4c6eac Merge pull request #4792 from deepseek-harness/build/windows-release-scripts
fix(desktop): 修复 Windows 发布脚本阻断缺陷并建立构建版本权威来源
2026-09-21 17:31:45 +08:00
Yichen Jiang b2db503913 Merge pull request #4458 from deepseek-harness/feat/plugin-detail-slots
feat(web): open plugin detail-page slots and move official settings pages to companions
2026-09-21 17:30:26 +08:00
creatixchu f3c6d0c0df test: refresh multimodal tool catalog after master update 2026-09-21 17:28:00 +08:00
gengruilin 9373f74c9c test(web): 补充 WebKit 会话回放回归 2026-09-21 17:25:57 +08:00
Huanqi Cao 68b44d78ba Merge remote-tracking branch 'origin/master' into fix/pwsh-prompt-readiness
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-09-21 17:21:55 +08:00
winewill 5fdad8d838 Merge branch 'master' into build/windows-release-scripts 2026-09-21 17:21:48 +08:00
creatixchu 575dc9add0 Merge remote-tracking branch 'origin/master' into fix/4775-multimodal-tool-retention 2026-09-21 17:21:38 +08:00
Turtle 4eb26f0e71 feat(cli): export JSON Schema for Cordis configuration (#4705)
* feat(cli): dump native Cordis config schemas

* test(cli): include schema dump in launcher help snapshot

* feat(cli): export JSON Schema for Cordis configuration

* fix(cli): preserve config schema discovery and annotations

* fix(cli): conservatively project effectful config validation

* refactor(boot): encapsulate profile config schema generation

* fix(cli): follow Loader disabling and native writeback in config schema

- Dormant group/include rows (disabled without group: true) may omit
  config and are recorded as childless trees; the entry schema skips
  their child declarations, matching the Loader, which never creates them.
- Lazy builders run once per document, and a wrapped null-only projection
  keeps a deduplicated type list so the document stays compilable.
- Union widening applies only when an earlier branch can write adapted
  values back through a container; +Infinity max and -Infinity min
  without a step are treated as the native no-ops they are.
- Projection limitations repeat at every entry sharing a Config, and the
  entry schema documents the boolean/expression domain of disabled.
- Record the schema-dump validation policy as an Agent Note.
2026-09-21 09:19:24 +00:00
creatixchu b0be6e79c2 fix: preserve failed PTC image result forwarding semantics 2026-09-21 17:17:03 +08:00
Yichen Jiang aba8b3a29f Merge remote-tracking branch 'origin/master' into feat/plugin-detail-slots 2026-09-21 17:15:10 +08:00
Yichen Jiang 5882efd7ce test(web): re-record the bundle golden for plugin-owned identity
The bundle page now titles the fixture by its package name, prints the
row id as code under the row's title, and drops the missing-description
line, as master's row and official goldens already record.
2026-09-21 17:13:41 +08:00
Yichen Jiang 4b54e59a52 Merge pull request #3127 from deepseek-harness/worktree/job-kill-delivery
feat(jobs): human job kill, timeout promotion, and workflow run_in_background
2026-09-21 17:13:28 +08:00
Yichen Jiang 873140cff3 test(web): follow master's slot fixture and cast rules after the merge
The Plugins page spec's configuration bodies take the view positionally
as master's fixture does, the companion and section specs read a slot
entry's injected face through a Pick of the members they assert instead
of a double assertion, and the no-unknown-casts baseline drops the
entries retired with the moved settings tests.
2026-09-21 17:13:17 +08:00
winewill 735700c4b5 Merge pull request #4789 from deepseek-harness/feat/windows-clean-uninstall
feat(desktop): Windows 卸载随应用清除 Electron 本机数据,保留 .dsh
2026-09-21 17:12:00 +08:00
creatixchu 14c1fec958 test: record mixed-content retention through the headless profile 2026-09-21 17:11:56 +08:00
creatixchu 79468e26dd test: stabilize multimodal spill recovery locators 2026-09-21 17:08:01 +08:00
winewill d54b000bdb fix(desktop): keep the new specs off the built tree and off unknown casts
The afterPack spec mocked the built runtime tree through a path relative
to the spec, which only resolves once `lib/` exists; on a clean checkout
the hook imported the real module and every case failed. It now mocks
the path the hook actually resolves, as the asar-unpack spec does, and
passes with `lib/` absent.

The toolchain probe assertion reached its matcher through an assertion
to unknown, which `verify-no-unknown-casts` forbids. It compares the
reported tools and detail directly instead.
2026-09-21 17:05:33 +08:00
Yifffan f33b604ca2 Merge pull request #4786 from deepseek-harness/fix/4781-dedupe-open-with-apps
fix(native-command): macOS「从应用打开」菜单去重
2026-09-21 17:05:06 +08:00
winewill 0981cd5924 fix(desktop): harden the Windows uninstall data removal after review
Pinned directories are now opened with listing access so the handle takes
part in share checks and a rename or replacement of the directory under the
helper fails; a metadata-only handle did not participate. A DSH_HOME published
as an environment variable protects overlapping targets, and /KEEP_APP_DATA
retains data alongside --updated, matching the flags electron-builder passes
to an older uninstaller. The remover clears read-only attributes, keeps
deleting siblings after a locked file, and removes only ordinary empty scope
parents below %APPDATA% instead of an NSIS RMDir that would also unlink a
junction. The redundant un.DataInit extraction is gone.

The native regression now runs from the installer test driver and covers the
protected root, rename blocking, read-only and locked files and parent
removal; the uninstaller smoke uses a per-run scope, polls for the temp-copy
handoff, asserts InstallLocation after each silent install, and adds
/KEEP_APP_DATA and DSH_HOME-inside cases. The Agent Note keeps the topic's
2026-09-08 filename, states the amendment in the decision, and defers macOS.
2026-09-21 17:01:54 +08:00
Yudong Han 5b4ca4a29e Merge pull request #4808 from deepseek-harness/fix/pr4346-spreadsheet-review
fix(preview): harden spreadsheet conversion
2026-09-21 17:01:28 +08:00
Yichen Jiang 36a29b424d test(web): settle the transient running-job control before conversation goldens
A foreground shell command is a job while it runs, and its removal reaches
the browser one coalesced roster frame after the tool result, so a
conversation golden captured right after the turn could catch the header's
running-job control; the replay round-trip golden did on CI. captureStableAria
now waits for that control to leave unless a scenario keeps it, which the
two job scenarios that capture a running row do.
2026-09-21 17:01:17 +08:00
creatixchu 4694540e2a Merge remote-tracking branch 'origin/master' into fix/4775-multimodal-tool-retention
# Conflicts:
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
2026-09-21 16:59:45 +08:00
Yichen Jiang ecb66a3497 Merge remote-tracking branch 'origin/master' into feat/plugin-detail-slots
# Conflicts:
#	.agents/notes/implemented/architecture/2026-09-16-plugin-configuration-on-the-plugins-page.i18n.yaml
#	.agents/notes/implemented/architecture/2026-09-16-plugin-configuration-on-the-plugins-page.md
#	.agents/notes/implemented/architecture/2026-09-16-plugin-configuration-on-the-plugins-page.zh.md
#	apps/web/tests/expected/plugin-config/row.expected.md
#	apps/web/tests/fixtures/plugins/fixture-live-client/client.js
#	apps/web/tests/plugin-config.e2e.ts
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/bundle/web-app/package.json
#	packages/client/ui-plugin-manager/README.i18n.yaml
#	packages/client/ui-plugin-manager/README.md
#	packages/client/ui-plugin-manager/README.zh.md
#	packages/client/ui-plugin-manager/src/client/PluginManagerPage.tsx
#	packages/client/ui-plugin-manager/src/client/index.ts
#	packages/client/ui-plugin-manager/src/client/slot-contract.ts
#	packages/client/ui-plugin-manager/tests/components.client.spec.tsx
#	packages/client/ui-settings-plugins/README.i18n.yaml
#	packages/client/ui-settings-plugins/README.md
#	packages/client/ui-settings-plugins/README.zh.md
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
#	pnpm-lock.yaml
2026-09-21 16:59:17 +08:00
creatixchu e52209da40 test: share multimodal snapshot composition 2026-09-21 16:57:59 +08:00
creatixchu 5c1d966c3f test: cover image recovery failures and snapshot registration 2026-09-21 16:55:13 +08:00
Huanqi Cao 74f4c438de test(pty): pin the pwsh fast path by settle reason
The composition suite's idleSilenceMs: 30000 was below the suite's own send
bound (dsh-terminal-bash timeoutMs: 300000), so the comment claiming silence
could settle nothing was wrong: a regressed send still settled as inferred_idle
after ~30 s and only the accumulated case timeout caught it.

The case now records every send's waitReason and requires at least six
stdin_read settlements with no inferred_idle. Reinstating the removed prompt
override fails it in 30 s with 'expected 0 to be greater than or equal to 6'
while the output assertions still pass. The silence tier returns to its product
default.

Also renames the two stale test titles ('private shell prompt', and the
cancellation phase that no longer covers an initialization send), pins the
stdin_read fallback's session retention, and records the interactive-child
consequence of that retention in the package README pair and the Agent Note.
2026-09-21 16:53:15 +08:00
Dudu-0223 552235aab6 docs: align the Chinese config catalog with the regenerated source line 2026-09-21 16:52:05 +08:00
creatixchu c4c18ef0d4 test: align retention checks and catalogs with token budgets 2026-09-21 16:50:35 +08:00
gengruilin 068c552b1e fix(session): 兼容 WebKit 原生构造器文本格式 2026-09-21 16:48:44 +08:00
dsh-agent 2545414c02 test(preview): lock ini admission to the code renderer
The issue reported .ini files with no preview. On master the ini grammar is
already in CODE_HIGHLIGHT_EXTENSIONS, so the code renderer claims the
suffix and .ini previews. No production change is required; this test
records the admission behavior so a future allowlist change cannot silently
drop the reported suffix.
2026-09-21 16:46:45 +08:00
Dudu-0223 38dbb56237 test(agent-team): type Team panel fixtures without unknown casts and regenerate catalogs
The static CI gate rejected four new assertions to unknown in the
rewritten Team panel specs. Build the Session list, Session snapshot,
and injected-callback fixtures as typed values, prune the retired
baseline fingerprints, and regenerate the module graph, config, and
persistence catalogs for the removed Remote dependency edges and the
shifted source lines.
2026-09-21 16:45:40 +08:00
creatixchu ab102138c8 fix: retain ordered tool text and images within a token budget 2026-09-21 16:45:21 +08:00
lsdsjy 4ae923fe6f fix(desktop): refine welcome typography and copy feedback 2026-09-21 16:44:47 +08:00
Dudu-0223 307c75011b Merge master and reconcile declarative presets with activations 2026-09-21 16:41:53 +08:00
dsh-agent 6fa5151d8a fix(ui-open-in-app): keep an application as the default file action
The Host's default marker is best effort: on Windows it comes from the
Shell's ASSOCSTR_EXECUTABLE/APPID answer, which does not always name an
enumerated handler. When no application carried that marker the split
button promoted 显示文件位置 to the primary action even though the menu
listed applications that can open the file.

Select the OS-marked default when present, otherwise the first registered
handler in Shell preference order, and mark it as the menu default.
Reveal is promoted only when no application is registered at all.
2026-09-21 16:39:38 +08:00
dsh-agent d685383ee6 fix(native-command): resolve packaged Windows app icons
Windows 11 ships some applications (Notepad, other Store apps) as MSIX
packages whose Shell handler reports an indirect icon reference such as
@{Microsoft.WindowsNotepad_...?ms-resource://.../NotepadAppList.png}
instead of a file path. SHDefExtractIcon cannot read that reference, so
the menu showed the generic fallback glyph.

Resolve an indirect reference with SHLoadIndirectString before extracting,
and fall back to the handler's executable when the resolved source still
yields no image.
2026-09-21 16:39:34 +08:00
lsdsjy 4e5e1f9c7a fix(ui-settings-account): allow retry after active sign-in errors 2026-09-21 16:39:31 +08:00
Yichen Jiang 131fb841f2 Merge remote-tracking branch 'origin/master' into worktree/job-kill-delivery
# Conflicts:
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
2026-09-21 16:39:19 +08:00
winewill b8050f0251 fix(desktop): finish the review items the first pass missed
Three comments in the same review round went unread and still applied.

A failed tag push left the local tag in place, so the printed recovery
`git tag … && git push …` short-circuited on "already exists" and never
pushed. The result now carries the commands still outstanding, and the
tests cover a failed push and a failed tag separately.

Automatic numbering caught every error from resolving the upload
destination, which turned a misconfigured destination into silent local
numbering that can reuse a published index. It now checks whether a
destination is configured at all and lets an invalid one fail, and the
remaining catch names the error it reports.

`pnpmCommand` fell back to a bare `pnpm`, which on Windows is the batch
shim spawnSync cannot start — the failure this branch exists to fix. It
says so instead, and keeps the fallback where a shim is executable.

The afterPack regression this branch introduced earlier reached review
because nothing exercised that hook: one spec calls it directly for an
ordinary build, a prepared qualification runtime, and a build version,
and it fails when the expected version collapses back to one value.
2026-09-21 16:37:50 +08:00
Dudu-0223 1dc518f217 feat(agent-team): drive the Web Team panel from the agentTeam projection
The Team panel read a Remote snapshot on open and behind an explicit
refresh button, while the subagent catalog panel updates from Host
projection frames. The Team projection was Host-only and its `apply`
mutated state in place, so the projection registry could never publish
a client view for it.

Publish a durable-only `agentTeam` wire view: roster rows with their
durable phase, non-deleted task views through the same readiness,
owner-name, and write-overlap derivation the task board returns to
agents, and `failure` beside the last valid state when a persisted Team
record is rejected. `apply` now returns a new state per applied Team
event and replaces only the touched collection, so mailbox-only events
reuse the previous view reference and publish nothing.

The Web panel derives every row from the shared Session store: the Lead
from the current Session's subagent address, running/inactive from
Session status, and the model from the member Session's durable
`modelSelection` projection. Opening requests the Lead's projection
baseline when the store has none, a failed read shows a retry control,
and the refresh button and Remote mount are gone. The `agentTeams/view`
Remote method remains for callers that need live availability and the
configured model.

The Team panel web e2e now asserts that Host-side task creation and
claiming reach the open panel without any user action.
2026-09-21 16:37:10 +08:00
07akioni 3a3422f517 Merge remote-tracking branch 'origin/master' into otel/product-telemetry 2026-09-21 16:34:37 +08:00
Yichen Jiang 0659ded55b refactor(job-controller): drop the subagent ownership fence from job.kill
The registry's owner fence is the only access rule for a human kill: a job
is killable by the session whose list carries it, and a child session's own
jobs are no exception. The fence had pulled two implementation helpers out
of the Session Controller's package entry (plus a safe-host-export exception
for them) so the job controller could import them; both go, and the job
controller no longer depends on the agent registry or the Session Controller.
2026-09-21 16:34:15 +08:00
Turtle 949e875f7c Merge pull request #4732 from deepseek-harness/turtle/favicon-dark-fix-c387d950b8d9
fix(web): select static favicons with media-qualified links
2026-09-21 16:28:26 +08:00
07akioni 910d52f717 feat(telemetry): add explicit product event OTLP exporter 2026-09-21 16:28:18 +08:00
Jiawei Song 9e87907849 Merge branch 'master' into fix/4670-review-tab-scroll-and-filename 2026-09-21 16:27:08 +08:00
Dudu-0223 0c7450ca51 test(subagent): order sequential snapshot settlement 2026-09-21 16:27:05 +08:00
Huanqi Cao b900840784 Merge remote-tracking branch 'origin/master' into fix/pwsh-prompt-readiness
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-09-21 16:26:08 +08:00
Yif b631804d2b Merge remote-tracking branch 'origin/master' into fix/4781-dedupe-open-with-apps 2026-09-21 16:25:47 +08:00
07akioni c1ad3bb493 test(desktop): align ripgrep packaging checks and fixtures 2026-09-21 16:25:03 +08:00
Dudu-0223 7ea035dc3c Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-21 16:24:57 +08:00
Huanqi Cao 4f74f956ec Merge remote-tracking branch 'origin/master' into fix/pwsh-prompt-readiness
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-09-21 16:24:49 +08:00
Turtle d1e22a7e24 feat(preset): declare Agent compositions in profile YAML (#4569)
* feat(preset): declare Agent compositions in profile YAML

* fix(preset): share scope binding cleanup and refresh module graph

* fix(preset): use host syntax colors in the YAML editor

* fix(preset): write new profile declarations as block YAML

* fix(preset): align eager activation with browser and worker surfaces

* fix(ui-agent-preset): retain the existing preset card layout

* fix(preset): keep rows waiting for a Host service mounted and re-audit after settlement

A preset row whose Host provider was still activating at declaration time
was reported as waiting for a missing service, and the registry recorded the
definition as broken for the rest of the process. Split the mount audit into
failed and pending rows: failures and root-realm leaks still reject the
mount, while pending rows stay mounted and every read and binding re-audits
them after the Host Loader tree settles.

Remove the accidental self-dependency of @deepseek-ai/dsh-web-app and its
lockfile self-link. Archive the copy-only preset authoring note, which the
declarative-preset note fully supersedes, and update the ralph note's
restore recipe to the profile-patch mechanism.

* chore(lint): re-key and prune the unknown-cast baseline after the master merge

* refactor(web-app): ship each Agent preset as its own bundle patch file

`dsh.bundle.patch` accepts an ordered file list, so the four shipped preset
declarations move out of the 1000-line web patch into
`presets/<id>.patch.yml`, one insert per file, applied after the host patch.
The host patch keeps the preset registry row. Gates and test scaffolds that
read the web layer resolve every patch file through `bundlePatchPaths`
instead of one hardcoded path.

* refactor(preset): drop the save notice injected into live Agents

The notice duplicated the save result the Web editor already shows, and
after the producer-owned message sources it would have needed its own
persisted source kind. Saving now only persists and reports the activation
diagnostic; the persistence catalog is unchanged from master.

* docs: regenerate the module graph after dropping the registry's llm dependency

* test(ui-agent-preset): cover the guide dialog's keyboard handling on the declarative section

* fix(preset): address the remaining review comments

Apply the lowercase id rule only when creating a declaration, so presets
declared with other ids stay editable. Export `isBuiltInPreset` from the
display fold and key the client card groups on it. Remove the dead `error`
and `retry` locale keys, the JSDoc orphaned by the `trust` removal, the
`trust` fields in the plugin-inventory test fixtures, and the stale
`dsh-agent-presets` package name in comments and READMEs.

* refactor(preset): make the Web preset page view-and-select only

Remove the child-plugin YAML editor, the `agent_preset` tool and the
registry's read/save Remote methods. Presets are declared and changed only by
bundle patches; the settings page keeps the roster, the new-task default and
the mode help, and its question icon explains that and offers to start a
Creator-mode task. The `editing-cordis-compositions` skill and the Creator
persona describe the bundle-based path, and the authored skill-load Session
and Web snapshots are refreshed for it.

* docs(skill): make the composition skill self-sufficient for preset authoring

State where the shipped declarations live, list every declaration field,
inline a complete minimal bundle and an override example, and name the
verification calls, so Creator mode no longer reads DSH package sources to
infer the format. Refresh the authored skill-load Session for the new text.

* test(tools): drop the removed agent_preset tool from the catalog expectation
2026-09-21 08:24:18 +00:00
winewill 685ed95f17 Merge remote-tracking branch 'origin/master' into feat/windows-clean-uninstall 2026-09-21 16:20:49 +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
Turtle 933d3bf39e Merge pull request #4784 from deepseek-harness/turtle/chip-model-truncate-4889eecc8358
fix(web): collapse model text when composer controls cannot fit
2026-09-21 16:20:18 +08:00
sjw1231 6340df605d refactor(client): share file tree path labels and improve review tests 2026-09-21 16:19:56 +08:00
Dudu-0223 a1da7bcfb9 fix(subagent): close settlement delivery gaps 2026-09-21 16:19:07 +08:00
winewill 0b91ce2126 refactor(desktop): drop the uninstall data-removal log line
Nobody reads the uninstaller details list and NSIS keeps no log file, so the
failure message added no diagnostic value while costing a bilingual string.
Removal failures now leave residue silently; the uninstaller carries no custom
copy.
2026-09-21 16:15:57 +08:00
07akioni b20a383a7a fix(desktop): unpack platform ripgrep executables 2026-09-21 16:15:47 +08:00
winewill 0181baae5b Merge branch 'master' into build/windows-release-scripts
Adopt the `unsignedArtifacts` build path master introduced, in place of
the directory this branch was joining by hand for automatic numbering.
2026-09-21 16:14:26 +08:00
Yichen Jiang 2bba702a6e Merge remote-tracking branch 'origin/master' into worktree/job-kill-delivery 2026-09-21 16:14:21 +08:00
Turtle a9840f055f fix(web): select static favicons with media-qualified links 2026-09-21 16:13:38 +08:00
Yichen Jiang 7a29f57199 chore(session-controller): drop the leftover dsh-jobs type import
The import came with the session.killJob Remote that later moved to the
job controller; nothing in this package reads ctx.jobs any more, and the
package declares no dependency on the seam.
2026-09-21 16:12:14 +08:00
Yif 3cab7723e4 fix(native-command): validate macOS grouping fields without an unsafe any 2026-09-21 16:12:09 +08:00
Turtle 4a2b8486da Merge master to resolve PR #4784 conflicts 2026-09-21 16:11:41 +08:00
Yudong Han 22da693201 Merge pull request #4346 from deepseek-harness/web/excel-frontend-preview
feat(preview): open spreadsheets in the browser
2026-09-21 16:06:37 +08:00
winewill 1b6451a647 fix(desktop): follow the documented release version rules
Review found that `apps/desktop/README.md#release-versions` and the
2026-09-16 version-derivation note already specify this convention, and
that three of their requirements were reversed without saying so. The
rules themselves are right; what was wrong was leaving them undocumented
and rejecting one of the forms they prescribe.

A stable base takes `-test.YYYYMMDD.index`, which validation refused
because such a version ranks below its base. That ordering is the point:
the form belongs to a test feed that never serves the production
release. Both READMEs, the older note, and a new note now record which
requirements this change reverses and why.

Three defects the review found, each reproducible:

- `afterPack` compared the bundled runtime against the product version,
  which broke installed-update qualification: that flow passes a runtime
  whose version was deliberately rewritten. The expected version is now
  a parameter the preparer supplies, and `verifyDesktopRuntime` says
  "bundled X is not the expected Y" rather than naming Electron.
- Upload could only learn the published version from a shell variable,
  conflicting with "release fields come only from the target file". It
  reads the completion record packaging wrote, and a mismatch now prints
  the version that record holds.
- Automatic numbering read one listing page and one fixed directory. It
  now follows every page, discards a listing it could not finish rather
  than reusing an index that would overwrite a published installer,
  bounds the request through the client's own timeout, and reads the
  directory an unsigned build actually writes.

Also: `npm run` and `yarn run` set `npm_execpath` too, so the pnpm
resolution checks the path names pnpm; the argument separator can arrive
after a run script's preset arguments, not only first; and the toolchain
probe, parser, build commit, and tarball readers now have specs.
2026-09-21 16:04:08 +08:00
creatixchu 4e47ba6c1d chore: start multimodal tool result retention work 2026-09-21 16:03:43 +08:00
sjw1231 02a0c70662 fix(ui-deliverables): preserve review fixes in shared file diff 2026-09-21 16:01:02 +08:00
Huanqi Cao 97545d9c8f fix(pty): keep the controlled prompt so persistent pwsh settles fast
tool-pwsh-persistent installs its own `prompt` function after spawn, so
terminal-bash prompt readiness never matched and every send degraded to the
silence tier (idleSilenceMs + handoffGraceMs) under production defaults. This
is the defect the persistent bash tool fixed for the bash stack.

The tool now initializes without a prompt send and detects the no-end-marker
fallback through the seam's stdin_read wait reason instead of matching its own
prompt text. The private prompt constant and its stripping are deleted, so
partial output can carry the backend's own trailing prompt.

Tool calls drop from 8493/3722/3832/3759 ms to 1340/255/251/241 ms (spawn and
initialization plus the first command, then three warm commands; Windows,
production defaults, real Loader composition). The loader composition suite
pushes idleSilenceMs beyond the send bound, so every case fails if prompt
readiness regresses.
2026-09-21 15:57:08 +08:00
yudshj 57bcfac402 Merge remote-tracking branch 'origin/master' into web/excel-frontend-preview 2026-09-21 15:54:49 +08:00
Yichen Jiang 2cbf8df484 Merge pull request #4412 from deepseek-harness/worktree/experimental-voice-input
feat(voice-input): add optional local SenseVoice dictation
2026-09-21 15:53:42 +08:00
winewill ec52049610 docs(desktop): drop the Start menu claim for InstallLocation
On Windows 11 the Start menu context-menu Uninstall opens the installed-apps
list for every Win32 application regardless of the uninstall entry; only MSIX
packages uninstall from there. Keep InstallLocation as standard uninstall-entry
metadata and stop attributing Start menu behavior to it.
2026-09-21 15:48:14 +08:00
yudshj e7287e499e Merge remote-tracking branch 'origin/master' into web/excel-frontend-preview 2026-09-21 15:47:19 +08:00
Yif 1a14166d2b fix(native-command): validate the full handler list and dedupe only for display 2026-09-21 15:46:03 +08:00
Dudu-0223 5e0934ebbb Merge pull request #4698 from deepseek-harness/fix/team-task-board-read-only
fix(web): make Team tasks read-only and contain the panel
2026-09-21 15:45:52 +08:00
Yichen Jiang 080bea0b85 Merge remote-tracking branch 'origin/master' into worktree/experimental-voice-input
# Conflicts:
#	scripts/gen-cordis-catalog.ts
2026-09-21 15:39:45 +08:00
Dudu-0223 a93aa38876 Merge branch 'master' into fix/team-task-board-read-only 2026-09-21 15:38:03 +08:00
yudshj cbe0d84fc1 Merge remote-tracking branch 'origin/master' into web/excel-frontend-preview 2026-09-21 15:37:28 +08:00
CreatixChu 683625b793 Merge pull request #4780 from deepseek-harness/ihsiang/changed-files-hover-preview
feat(web): preview changed-file diffs on hover
2026-09-21 15:36:12 +08:00
yudshj 61a0acc4da fix(preview): satisfy strict spreadsheet lint 2026-09-21 15:35:57 +08:00
Dudu-0223 3324157b7f fix(web): address Team panel review feedback 2026-09-21 15:30:18 +08:00
imccyu 85f16860f5 Merge pull request #4758 from deepseek-harness/feat/chat-step-groups
feat(web): add definition-owned conversation groups
2026-09-21 15:29:30 +08:00
creatixchu e17f505504 Merge master into ihsiang/changed-files-hover-preview 2026-09-21 15:27:19 +08:00
winewill 4ab8fbfacc fix(desktop): name the commit a build records instead of its provenance
The concrete-terms gate forbids "provenance": the repository asks for the
exact source, field, or identity a value holds. The module records one
commit and whether its tree was dirty, so it and its callers say that.

The toolchain step also has to stay out of the way of the packaging
entry's error-recording test, which fakes the host platform and would
otherwise report the absent Windows compilers rather than the failure it
exercises. The test mocks the probe, as it already does for the release
environment and the signing keychain, and expects the new stage.
2026-09-21 15:26:29 +08:00
Yichen Jiang 4c7c7a552f Merge remote-tracking branch 'origin/master' into worktree/job-kill-delivery 2026-09-21 15:26:10 +08:00
Yichen Jiang bb20149360 refactor(shell): register foreground commands as jobs at start and drop the promotion protocol
With a job registry composed, tool-bash and tool-pwsh now register every
command with ctx.jobs as it starts and wait on the job with the registry's
own bounded wait: a command that finishes in time returns the ordinary
foreground result and its record is removed, one that outlives the timeout
returns the same job id it already had, and a kill from outside the call is
reported as `[stopped: <reason>]`. Nothing changes hands at the deadline, so
the shell seam loses `onExpiry: 'offer'`, `ShellExecution.promotion`, and
`ShellPromotionOffer`, and both local executors drop their offer arm.

The registry stays optional: the tools register a foreground-only definition
while no registry is composed and swap to the job-backed one inside a
`ctx.inject(['jobs'])` fork, so a composition without jobs keeps a plain bash
with no job tools in the model's schema. A refused registration at the start
(admission, no controller) runs under the executor's deadline kill, and a wait
that expires before the process spawned ends as the preparation timeout.

JobRegistry gains `remove(id, caller?)` and the `settled` event reports
`awaited`, so dsh-tool-jobs no longer keeps its own wait ledger; it withholds
notices for awaited settlements and for kills the model requested. The tool
catalog harvest composes the registry so the shipped schema stays documented,
and the two compaction fixtures move their context window from 10000 to 10300
tokens because the branch's larger tool schemas pushed their condensed history
over the old trigger, which requested a fourth scripted model call.
2026-09-21 15:23:08 +08:00
Dudu-0223 34a4cbb4e8 Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-21 15:22:59 +08:00
Yichen Jiang 262ee1bc23 fix(voice-input): address lifecycle and provider review feedback 2026-09-21 15:21:16 +08:00
Dudu-0223 6e38051503 fix(subagent): preserve parent answers when cleanup fails 2026-09-21 15:21:09 +08:00
sjw1231 c6e38b364f fix(client): resolve review tab conflicts and path label coverage 2026-09-21 15:19:38 +08:00
Huanqi Cao eb7d3af91c Merge pull request #4582 from deepseek-harness/fix/windows-acl-delete-escape
fix(sandbox): confine Windows deletes to the granted root
2026-09-21 15:18:36 +08:00
winewill 93a65a9a94 feat(desktop): remove Electron data on Windows uninstall without a custom page
Product dropped Harness-home cleanup from the uninstaller, so the opt-in page,
its bilingual dialog, the uninstall.ini home record and the overlap check go
away. The uninstaller now always removes the Electron user-data directory,
the %APPDATA% product directory and the updater cache through the native
helper; the Harness home is never touched. Silent uninstalls remove the same
data, upgrades retain it, and a locked file is logged instead of stopping the
uninstall.

Electron derives user data from the scoped package name, so the removal
targets %APPDATA%\@deepseek-ai\dsh-desktop and removes the empty scope
directory afterwards. The previous fixture used an unscoped name and never
reached that directory; the fixture now uses a scoped package name.

The native uninstall smoke runs end to end on the development host after two
test fixes: the interactive uninstaller was launched hidden, which made every
control invisible to the text search, and the Chinese finish text matched
"已经从" instead of MUI's "已从你". The native remover regression is renamed
data-cleanup-test.exe because UAC installer detection demanded elevation from
the unmanifested uninstall-data-test.exe.
2026-09-21 15:14:44 +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 35489c0f5c fix(web): manage Team panel keyboard focus 2026-09-21 15:09:08 +08:00
Dudu-0223 59b5a4ac0f chore: prune removed Team test assertion baselines 2026-09-21 15:09:07 +08:00
Dudu-0223 253fb5e66d fix(web): make Team tasks read-only and contain the panel 2026-09-21 15:09:07 +08:00
07akioni 7717eb39c0 Merge pull request #4553 from deepseek-harness/07akioni/fix-desktop-office-asar
fix(desktop): unpack native Office engine and verify packaged conversion
2026-09-21 15:08:18 +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
sjw1231 795e5024bc fix(ui-deliverables): fill diff row backgrounds across scroll width 2026-09-21 15:05:43 +08:00
Yichen Jiang d44d899c71 Merge pull request #4783 from deepseek-harness/feat/docs-image-viewer
为文档截图复用 Mermaid 弹层与缩放逻辑
2026-09-21 15:04:42 +08:00
Dudu-0223 c17a1fa189 refactor(subagent): represent external catalog entries by mode 2026-09-21 15:03:34 +08:00
Turtle cf323fdaac docs(web): clarify model collapse contract and geometry ownership 2026-09-21 15:01:04 +08:00
imccyu a67ad91237 feat(client): expose indexed positions to group definitions 2026-09-21 14:56:14 +08:00
Yif 64094e8991 test(web): match the 36px unpreviewable open control height 2026-09-21 14:56:01 +08:00
lsdsjy 0d2fbaad67 fix(session-controller,ui-model-selection,ui-settings): handle catalog and account setup failures 2026-09-21 14:55:08 +08:00
lsdsjy 9cf12959f2 fix(ui-model-selection): retain effort and open unselected models directly 2026-09-21 14:54:51 +08:00
lsdsjy 7dc86578d8 fix(ui-settings-account,ui-model-selection): align with updated primitives and catalog checks 2026-09-21 14:54:51 +08:00
lsdsjy 325e28bfa0 fix(ui-model-selection,llm-deepseek): prioritize account models and simplify provider label 2026-09-21 14:54:51 +08:00
lsdsjy cc478ac70a feat(client,session-controller,llm): track available models and expose account settings 2026-09-21 14:54:51 +08:00
lsdsjy 17825ee8c0 feat(agent,llm-deepseek,ui-settings-account): separate account routing and confirm sign-out 2026-09-21 14:54:50 +08:00
lsdsjy 7079376f28 fix(ui-settings): restore settings panel dimensions and radius 2026-09-21 14:53:25 +08:00
Huanqi Cao 11d36dd102 Merge remote-tracking branch 'origin/master' into fix/windows-acl-delete-escape
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-09-21 14:51:40 +08:00
winewill ee0fc82267 fix(desktop): check the bundled runtime against the product version
Injecting a build version renamed the Electron shell but not the dsh
runtime packed into it, and afterPack required the two to be equal, so
every build carrying a build version failed after packaging finished.
The bundled runtime is the dsh package at the product version, which is
what the check now compares against; the app already reports the shell
version and the bundled runtime version separately to the update policy.

Rename the flag to --build-version. The repository already has
DOWNLOAD_TEST_RELEASE_ID for the opaque test feed directory, so calling
a version a release id invited a reader to confuse the two. Accept a
forwarded `--` as well, because `pnpm run <script> -- --build-version x`
passes the separator through as an argument and every following option
would otherwise parse as a second target.
2026-09-21 14:45:35 +08:00
sjw1231 60cdd547ae fix(ui-deliverables): preserve filename endings in review headers 2026-09-21 14:45:18 +08:00
imccyu 7f382a1e2c Merge pull request #4757 from deepseek-harness/worktree-npmlink
feat(boot): resolve linked plugin peers from the running installation
2026-09-21 14:38:32 +08:00
gengruilin b1d878b33d fix(website): address shared viewer review feedback 2026-09-21 14:31:37 +08:00
yudshj ad9f77db04 fix(preview): compact spreadsheet formula warning 2026-09-21 14:28:15 +08:00
winewill 950ed3f6df feat(desktop): publish a build version without rewriting the manifests
Packaging a build for a test feed or a colleague required bumping the
version in 295 manifests plus the lockfile first, because the version a
build publishes was only ever read from the checkout. Those edits cannot
be committed, so every such build left the working tree dirty, and the
`<version>.<date>.<sequence>` convention behind them lived only in the
operator's memory.

The version a build publishes is now an input. `--release-id` names it,
`--release-id auto` numbers it after the builds already published to the
destination bucket (falling back to local artifacts, since a fresh CI
checkout has none), and it reaches electron-builder through
extraMetadata, the update feed, and the upload validation as one value.
The manifests keep the product version, aligned with the dsh npm
package, and a release still publishes exactly that.

Validation goes through `semver` itself, because `electron-updater`
compares feed versions with `semver.gt` against the installed
`app.getVersion()`: a build version must outrank the product version it
extends, which holds for `0.1.6-alpha.2.20260921.1` over
`0.1.6-alpha.2` and cannot hold on a stable version, where a fourth
release number is not a version at all.

Two things a build could not previously answer for itself:

- Artifacts now carry the commit they were packaged from and whether
  that checkout was dirty, so a build handed to a colleague is traceable
  without a tag.
- A production upload tags that commit as `desktop-v<version>` once the
  artifacts are public, and reports what to run by hand rather than
  failing an upload that already completed. Test and local builds are
  deliberately left untagged.

A toolchain step now probes tar and the Windows installer compiler
before the first build step, so a host that cannot finish the sequence
says so in seconds rather than minutes.
2026-09-21 14:23:48 +08:00
winewill dbbecd2461 feat(desktop): opt-in Windows uninstall data removal
The Windows uninstaller keeps every user file by default and adds a custom
page with unchecked options for desktop browser data and update caches, the
desktop plugin profile, and the complete Harness home. Selecting the whole
home requires a native warning that names the actual folder and the CLI
impact, defaults to Cancel, and forces the desktop child selection. Silent
and upgrade uninstalls never remove data, including through the legacy
--delete-app-data flag, which the adapted upstream template no longer honors.

Packaged Desktop records its resolved home in uninstall.ini under the
Electron user-data directory so a custom DSH_HOME is offered instead of the
default; a length field detects truncated NSIS reads and an invalid record
disables whole-home removal. The native remover in window-frame.dll rejects
protected roots and overlap with retained data, holds directory handles
during traversal, and unlinks reparse points without entering their targets.

Installation now also writes InstallLocation on the Windows uninstall entry,
which Explorer needs to associate the Start menu shortcut with this entry so
that the context-menu Uninstall launches the uninstaller directly instead of
opening the installed-apps list. The upstream template only records the
value under its private key.

Closes #3993
2026-09-21 14:22:39 +08:00
Ziya d7d099c7eb Merge pull request #4772 from deepseek-harness/copy/ptc-description-20260920
fix(web): describe PTC mode by the tasks it suits
2026-09-21 14:19:44 +08:00
Turtle 69fb366034 test(web): provide font events in built-bundle jsdom fixtures 2026-09-21 14:19:02 +08:00
Yifffan f91f461dc6 Merge branch 'master' into fix/4781-dedupe-open-with-apps 2026-09-21 14:16:43 +08:00
Yif 9a485724f6 fix(open-in-app): scale the empty-state opener chevron up and trim its height to 36px 2026-09-21 14:15:11 +08:00
Ziya a95dfea48d Merge branch 'master' into copy/ptc-description-20260920 2026-09-21 14:11:33 +08:00
Yichen Jiang b3d54fcef7 Merge pull request #4605 from deepseek-harness/worktree/model-provider-entry-ux-dde717
feat(models-ui): one add-provider entry with a segmented mode switch
2026-09-21 14:10:47 +08:00
imccyu 7252e5823b fix(boot): keep linked-root removal independent of relinking 2026-09-21 14:00:52 +08:00
imccyu 73e9efbbdf docs(boot): define linked-root removal across generations 2026-09-21 14:00:52 +08:00
imccyu cf41c158ba fix(boot): keep host lookups native and fix source smoke fixtures 2026-09-21 14:00:52 +08:00
imccyu c9d4b7561d fix(boot): apply linked peers at each native lookup position 2026-09-21 14:00:52 +08:00
imccyu 3e7af9cfbb feat(boot): resolve linked plugin peers from the running installation 2026-09-21 14:00:51 +08:00
imccyu a946008275 docs(boot): document linked plugin peer resolution 2026-09-21 14:00:51 +08:00
Yif 6cb1cd921f fix(native-command): collapse duplicate macOS handler copies to one menu entry 2026-09-21 13:58:18 +08:00
Yichen Jiang ed0700ffb5 Merge remote-tracking branch 'origin/master' into worktree/model-provider-entry-ux-dde717 2026-09-21 13:57:38 +08:00
07akioni 818c51f969 Merge remote-tracking branch 'origin/master' into 07akioni/fix-desktop-office-asar 2026-09-21 13:57:30 +08:00
Turtle c136d821dd fix(web): collapse model text when composer controls cannot fit 2026-09-21 13:56:47 +08:00
Turtle 4aba48ec03 fix(cordis): register Host inspect providers once per process (#4742)
`tool-cordis` registered the four first-party Host inspect providers from
every preset row that mounted it. The Host registry rejects a duplicate
provider id, so a second preset carrying `tool-cordis` — or a user preset
copied from a shipped one — failed to mount in the same process.

- Add `@deepseek-ai/dsh-tool-cordis/host` (`cordis-inspect-providers`),
  the host-plane row that registers the providers; the Web host
  composition mounts it beside `cordis-host-runner`. The per-session
  `tool-cordis` row now only registers the tools and its prompt section.
- Gate the `cordis` preset's `tool-plugin-manager` row on `profileContext`,
  the same condition `dsh-base` applies to the host `plugin-manager`
  service, so a profile-less embedding still mounts the preset.
2026-09-21 05:55:09 +00:00
yixiangihsiang 440070e4f8 fix(web): address diff preview review findings 2026-09-21 13:51:53 +08:00
07akioni 4e5aec6a74 Merge remote-tracking branch 'origin/master' into codex/office-package-master 2026-09-21 13:46:31 +08:00
Yifffan b6cb6be3da Merge pull request #4767 from deepseek-harness/fix/desktop-minimize-vibrancy
fix(desktop): 修复 macOS 最小化恢复后侧边栏毛玻璃短暂透明,同时修改 session 跑马灯效果
2026-09-21 13:42:11 +08:00
gengruilin cb718ce9da feat(website): enlarge screenshots with the shared media viewer 2026-09-21 13:40:37 +08:00
07akioni e0b5ab5ebd Merge master into PR #4553 and resolve runtime helper import 2026-09-21 13:39:09 +08:00
imccyu 7dd6d1fc31 docs(client): mark the grouping foundation implemented 2026-09-21 13:30:25 +08:00
imccyu b9252673e9 fix(client): report only changed turn locations 2026-09-21 13:30:25 +08:00
imccyu b3549ee455 fix(client): preserve grouped chat navigation and view lifecycle 2026-09-21 13:30:25 +08:00
imccyu c1c3410cf0 fix(benchmarks): declare grouping runtime dependency 2026-09-21 13:30:25 +08:00
imccyu 0076de86fc test(client): cover group injection and conversation fixtures 2026-09-21 13:30:25 +08:00
imccyu a7d457349f docs(client): record the conversation grouping foundation 2026-09-21 13:30:25 +08:00
imccyu 1b3b56c8f1 feat(client): render stable conversation group references 2026-09-21 13:30:25 +08:00
imccyu c890269a19 feat(client): add definition-owned conversation groups 2026-09-21 13:30:25 +08:00
winewill 766eee63eb fix(release): run pnpm and tar portably on Windows
spawnSync cannot start the pnpm .cmd shim without a shell, so the bump
step's lockfile refresh failed with ENOENT on Windows after rewriting
every manifest. Resolve pnpm to a JavaScript entry executed by the
current Node: the run-script's npm_execpath when present, otherwise the
workspace's own pnpm dependency (located on disk because pnpm's manifest
does not export its bin entry).

GNU tar parses the colon in an absolute Windows path as a remote-host
separator and aborts, so the tarball readers now run tar in the
tarball's directory and pass only its file name.
2026-09-21 13:30:12 +08:00
yudshj 767cb38567 fix(locales): update titles for Office document in Chinese and English 2026-09-21 13:20:45 +08:00
yudshj 15415600d1 fix(preview): render spreadsheet values as literal text 2026-09-21 13:20:45 +08:00
yudshj 9f6434d24b refactor(web): move Office loading into its injected face 2026-09-21 13:20:45 +08:00
yudshj f51092015f refactor(preview): align spreadsheets with shared file preview structure 2026-09-21 13:20:45 +08:00
yudshj e70fa89400 feat(preview): support xls csv and tsv 2026-09-21 13:20:45 +08:00
yudshj 30b6abad5c fix(preview): retain Excel worksheet selections 2026-09-21 13:20:44 +08:00
yudshj 087dc65e89 feat(preview): render Excel workbooks in the browser 2026-09-21 13:20:44 +08:00
yixiangihsiang 90a1b23e4a feat(web): preview changed-file diffs on hover 2026-09-21 13:19:52 +08:00
Yudong Han eaf0f68bb2 Merge pull request #4401 from deepseek-harness/perf/workspace-file-binary-transfer
feat(api): support binary fields in Remote results
2026-09-21 05:18:16 +00:00
Yifffan d7318cb7b5 Merge branch 'master' into fix/desktop-minimize-vibrancy 2026-09-21 13:17:27 +08:00
_Kerman e4fbb92570 Merge pull request #4770 from deepseek-harness/xtr/normalize-agent-cancel-cause
fix(agent-loop): copy the cancel cause before logging turn/end
2026-09-21 13:13:36 +08:00
Yif 8dafa0829b Merge remote-tracking branch 'origin/fix/desktop-minimize-vibrancy' into fix/desktop-minimize-vibrancy 2026-09-21 13:04:29 +08:00
Yif b4886c7e5b feat(workspace): marquee hovered session titles with fades on both cut edges 2026-09-21 13:02:48 +08:00
Yif 44fe86eaf8 test(desktop): cover the minimize backdrop swap and extract the chrome fallback fill 2026-09-21 13:02:45 +08:00
Ziya 63b7a0f7c1 Merge branch 'master' into copy/ptc-description-20260920 2026-09-21 12:53:07 +08:00
Yudong Han e98b5703c7 refactor(api): move Remote result projection to gateway 2026-09-21 12:50:42 +08:00
Yudong 2aac7c8ef5 fix(connection): keep narrowed attachment path type 2026-09-21 12:50:41 +08:00
Yudong 285f0a7005 fix(connection): narrow binary transport values 2026-09-21 12:50:41 +08:00
Yudong 983b89f9a5 refactor(fs): default unsupported file watching 2026-09-21 12:50:41 +08:00
Yudong ecf6acfb15 feat(api): support binary fields in Remote results 2026-09-21 12:50:40 +08:00
_Kerman 2e99e6021d Merge remote-tracking branch 'origin/master' into xtr/normalize-agent-cancel-cause 2026-09-21 12:45:05 +08:00
CreatixChu 6fba9d3bfb Merge pull request #4544 from deepseek-harness/worktree/issue-3881-folder-drop
feat(web): 桌面端支持将文件夹拖入输入框
2026-09-21 12:44:44 +08:00
Turtle 7520fe94e1 refactor(preset): 精简创造模式的 system prompt (#4745)
* refactor(preset): trim the creation-mode system prompt

The `cordis` preset persona repeated what the plugin_manager and
cordis_inspect_* tool descriptions and the two shipped skills already
carry. Keep only identity, the shipped-preset constraint, the visual
request routing rule, and which skill to load for what.

Drop the tool-cordis prompt section, which restated its own tool
descriptions, and the cordis_inspect_query navigation hints that the
provider manifests returned by cordis_inspect_list already state.
Shorten both skill descriptions so the first-turn catalog stays small.

First-turn request for the cordis preset, measured through the DeepSeek
API with deepseek-v4-flash: 9572 -> 8975 prompt tokens.

* docs: regenerate config catalog after section order removal

* docs: regenerate module graph after tool-cordis dependency removal

* refactor(preset): give the cordis preset the standard persona

Creation mode's system prompt now equals standard mode's; the skill
catalog and the shipped skills carry every routing and off-limits rule.
The plugin skill description states the visual-request destination.

First-turn request for the cordis preset: 9572 -> 8815 prompt tokens.

* fix(review): document current tool-cordis state and pin the shared persona

The tool-cordis README pair now states that only the two tool schemas
enter requests, that disposal removes tools and providers, and that
the first-turn skill catalog carries the routing. The Web skill row
test resolves the owner's selected fixture generation instead of a
fixed v3 path. The preset e2e asserts the cordis persona sections
equal standard's.
2026-09-21 04:43:38 +00:00
_Kerman 3773c4f85b docs(agent-loop): correct the owning cancellation note
The 2026-07-16 explicit-turn-cancellation note still described a frozen,
detached signal reason and a two-variant cause union. The README paragraph
added here points readers at that note as the owner of the signal
lifecycle, so the stale mechanism was load-bearing.

It now records why freezing the caller's cause is not an alternative:
undici assigns `stack` from strict-mode code, so a frozen reason makes
fetch reject with `TypeError: Cannot add property stack` in place of the
abort reason.

Also names `turn/end`'s declared `TurnEndCancelCause` in the README and
takes the reviewer's helper-doc wording.
2026-09-21 12:42:36 +08:00
lsdsjy a43da8740d fix(desktop,ui-settings-account): resolve branch hygiene violations 2026-09-21 12:42:03 +08:00
Yichen Jiang b42a93d62f Merge remote-tracking branch 'origin/master' into worktree/job-kill-delivery
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/event-producer-consumer.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/tool-catalog.i18n.yaml
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/src/commands.ts
#	packages/client/ui-jobs/tests/browser-plugin.client.spec.ts
#	packages/client/ui-jobs/tests/job-list-action.client.spec.tsx
#	packages/shell/tool-bash/README.i18n.yaml
#	packages/shell/tool-bash/src/background.ts
#	packages/shell/tool-pwsh/src/background.ts
2026-09-21 12:40:44 +08:00
Ziya f206efb628 Merge branch 'master' into copy/ptc-description-20260920 2026-09-21 12:38:17 +08:00
creatixchu 6ac2d741a6 test(llm): retain pending mock listeners through teardown 2026-09-21 12:36:54 +08:00
creatixchu 6f07deab31 test(llm): preserve coverage timeout budget and drain stalled fixtures 2026-09-21 12:33:59 +08:00
creatixchu 49ff1f815d Merge origin/master into worktree/issue-3881-folder-drop 2026-09-21 12:33:50 +08:00
Yichen Jiang 35a02e1658 Merge pull request #3052 from deepseek-harness/worktree/process-plugin-streaming-72f9b3
feat(jobs): consolidate the job seam around one output ring and stream it to the session-header job list
2026-09-21 12:27:29 +08:00
Yichen Jiang dc1f87e890 Merge branch 'master' of github.com:deepseek-harness/deepseek-harness into worktree/process-plugin-streaming-72f9b3 2026-09-21 12:03:46 +08:00
Yichen Jiang 21d2c8b948 Merge pull request #4768 from deepseek-harness/worktree/input-plugin-extension-hooks
feat(web): expose input plugin extension hooks
2026-09-21 12:03:10 +08:00
winewill 4df3de2075 fix(desktop): sharpen installer brand art and progress-page scaling
Re-render the four installer brand banners from the vector sources:
the badge follows the Figma spec (three-stop gradients, layered drop
shadows) and the whale no longer inherits shape-rendering=crispEdges,
which disabled anti-aliasing and left jagged edges. The wordmark now
reaches its design color instead of a soft #353638.

Draw the progress-page brand with high-quality bicubic interpolation
and half-pixel offset so the always-2x bitmap stays crisp when scaled
down at 96 DPI.
2026-09-21 12:02:49 +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
lsdsjy f0b896aac8 refactor(desktop): render welcome with React and shared assets 2026-09-21 11:58:18 +08:00
Dudu-0223 390fbe8852 refactor(subagent): merge orchestration and activation ownership 2026-09-21 11:58:14 +08:00
creatixchu e30f0c7774 test(terminal): check descendant quiescence instead of PID removal 2026-09-21 11:58:04 +08:00
Turtle a0f59aac40 fix(llm-pi-ai): stop re-parsing streamed tool-call arguments on every delta (#4740)
pi-ai 0.85.1 runs parseStreamingJson over the whole accumulated argument
JSON on every tool-call delta, so one large tool call costs O(n²) CPU on
the event loop and a multi-megabyte argument stream stalls every session
in the process. Patch the six stream adapters to parse once at
toolcall_end, document the patch, and cover both OpenAI protocols.

Fixes #4739
2026-09-21 03:53:37 +00:00
mektpoy a2487e34b7 fix(desktop): lock the development runtime target and complete the resolution
- main-startup: assert primaryRuntime for the unpackaged Host and cover a
  missing DSH_DESKTOP_PRIMARY_RUNTIME_DIR as a fatal startup dialog with no
  Host started.
- test-workspace-updates: pass the prepared primary-runtime directory instead
  of an application/runtime path the runner never creates.
- development-project: derive the descriptor platform/arch from
  resolveDesktopBuildTarget so it matches the prepared payload.
- main: resolve the unpackaged primary runtime once at startup instead of
  inside the Host factory.
- dev: keep the environment override symmetric with its neighbours.
- README: document the variable as required for unpackaged launches and record
  the remaining win32-arm64 payload architecture limitation.
2026-09-21 11:53:32 +08:00
Yichen Jiang bb7e92c999 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	docs/persistence-schema.json
2026-09-21 11:51:54 +08:00
ZiyaZhang e649981497 fix(web): describe PTC mode by the tasks it suits
The PTC card in Settings explained the mechanism (the agent chains tools
through code) rather than which tasks to pick it for, so readers could
not tell it apart from Standard mode the way the Minimal and Creator
cards allow. Reword the Chinese and English card and new-task menu copy
to name the tasks: batch tool calls whose results are then filtered,
organized, deduplicated, counted, or summarized. Update the four ARIA
snapshots that embed this text.
2026-09-20 20:49:56 -07:00
Yichen Jiang 3f17ab99d4 refactor(chat): restore ui-chat import paths to master
Six ui-chat modules carried import-path and line-wrap differences unrelated
to the jobs seam; they now match master byte for byte.
2026-09-21 11:46:55 +08:00
_Kerman 35f3abf1fa fix(agent-loop): copy the cancel cause before logging turn/end
Node's fetch assigns an enumerable `stack` string onto the abort reason
object it receives, and the loop logged that same object into `turn/end`.
The undici trace became durable session data under a field no reader
declares. A transport adding a property JSON discards instead made
`Session.append` reject the ending, leaving a turn with no close.

`abortedCancelCause()` narrows the untyped `AbortSignal.reason` once and
copies the declared fields, replacing the three `as AgentCancelCause`
assertions at the two read sites and the log write.
2026-09-21 11:45:03 +08:00
creatixchu 20be0ff297 Merge origin/master into worktree/issue-3881-folder-drop 2026-09-21 11:41:36 +08:00
Yichen Jiang 4625cd376f Merge branch 'worktree/input-plugin-extension-hooks' into worktree/experimental-voice-input 2026-09-21 11:40:10 +08:00
Yichen Jiang 2ab948a11b Merge remote-tracking branch 'origin/master' into worktree/input-plugin-extension-hooks 2026-09-21 11:39:00 +08:00
creatixchu d0ac0afbe2 fix(composer): recognize pasted directories through entry metadata 2026-09-21 11:38:44 +08:00
CreatixChu c240582109 Merge pull request #4646 from deepseek-harness/feat/4562-file-open-apps
feat: 统一文件和目录的跨平台打开控件
2026-09-21 11:38:41 +08:00
Yichen Jiang 9746e97260 Merge branch 'worktree/input-plugin-extension-hooks' into worktree/experimental-voice-input 2026-09-21 11:36:00 +08:00
Yichen Jiang 9df1b6033a fix(web): keep the empty composer dock collapsed 2026-09-21 11:35:35 +08:00
Yichen Jiang 61719629fc Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	apps/web/tests/expected/agent-preset-selection/header.expected.md
#	docs/architecture.i18n.yaml
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	docs/persistence-schema.json
#	docs/subsystems/web-client.i18n.yaml
#	packages/api/README.i18n.yaml
#	packages/api/README.md
#	packages/api/README.zh.md
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/api/session-controller/src/client/sessions/manager.ts
#	packages/api/session-controller/src/client/sessions/service.ts
#	packages/api/session-controller/tests/manager.client.spec.ts
#	packages/client/locale/tests/language-row.client.spec.tsx
#	packages/client/ui-chat/tests/chat-view.client.spec.tsx
#	packages/client/ui-chat/tests/transcript-view-row.client.spec.tsx
#	packages/client/ui-conversation/tests/conversation-registry.client.spec.ts
#	packages/client/ui-conversation/tests/enter-behavior-row.client.spec.tsx
#	packages/client/ui-conversation/tests/input-bar.client.spec.tsx
#	packages/client/ui-conversation/tests/input-matrix.client.spec.tsx
#	packages/client/ui-conversation/tests/input-scenarios.client.spec.tsx
#	packages/client/ui-conversation/tests/skeleton.client.spec.tsx
#	packages/client/ui-deliverables/tests/deliverables.client.spec.tsx
#	packages/client/ui-jobs/tests/job-list-action.client.spec.tsx
#	packages/client/ui-layout/tests/app-frame.client.spec.tsx
#	packages/client/ui-layout/tests/document-title.client.spec.tsx
#	packages/client/ui-open-in-app/tests/open-in-app-action.client.spec.tsx
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-session/tests/ui-session.client.spec.ts
#	packages/client/ui-settings-general/tests/settings-root.client.spec.tsx
#	packages/client/ui-settings-unarchive-sessions/tests/components.client.spec.tsx
#	packages/client/ui-subagent/README.i18n.yaml
#	packages/client/ui-subagent/README.md
#	packages/client/ui-subagent/README.zh.md
#	packages/client/ui-subagent/src/client/SubagentHeaderLineage.tsx
#	packages/client/ui-subagent/tests/conversation-ui.client.spec.tsx
#	packages/client/ui-theme/tests/appearance-row.client.spec.tsx
#	packages/client/ui-theme/tests/font-size-row.client.spec.tsx
#	packages/client/ui-tool/tests/coverage-tails.client.spec.tsx
#	packages/client/ui-tool/tests/diff-card.client.spec.tsx
#	packages/client/ui-tool/tests/image-card.client.spec.tsx
#	packages/client/ui-tool/tests/read-card.client.spec.tsx
#	packages/client/ui-tool/tests/terminal-card.client.spec.tsx
#	packages/client/ui-trajectory/tests/views.client.spec.tsx
#	packages/client/ui-user-questions/tests/plan-review-panel.client.spec.tsx
#	packages/client/ui-user-questions/tests/user-questions-composer.client.spec.tsx
#	packages/client/ui-workflow-run/tests/workflow-run.client.spec.tsx
#	packages/client/ui-workspace/tests/apply.client.spec.ts
#	packages/client/ui-workspace/tests/tree.client.spec.ts
#	packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx
#	packages/client/ui-workspace/tests/workspace-picker.client.spec.tsx
#	packages/client/ui-workspace/tests/workspaces-service.client.spec.ts
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
#	packages/jobs/tool-jobs/src/index.ts
#	packages/shell/tool-bash/README.i18n.yaml
#	packages/test-support/client-runtime/src/sessions.ts
2026-09-21 11:34:20 +08:00
lsdsjy b6594005f7 fix(ui-settings-account): report clipboard failures without failing sign in 2026-09-21 11:32:33 +08:00
sjw1231 c84c908656 fix(ui-deliverables): prevent split diff edge rebound 2026-09-21 11:29:02 +08:00
imccyu 3834da8602 Merge pull request #4754 from deepseek-harness/desktop-browser
feat(desktop): retain sidebar webviews and restore saved pages
2026-09-21 11:24:48 +08:00
Yichen Jiang 103aee7396 Merge branch 'worktree/input-plugin-extension-hooks' into worktree/experimental-voice-input
# Conflicts:
#	apps/desktop/README.i18n.yaml
#	apps/desktop/README.md
#	apps/desktop/README.zh.md
#	packages/client/ui-plugin-manager/src/client/presentation.ts
#	packages/client/ui-plugin-manager/tests/components.client.spec.tsx
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
2026-09-21 11:15:10 +08:00
Dudu-0223 89e2c7e0ea fix(subagent): report interrupted execution cleanup failures once 2026-09-21 11:12:33 +08:00
creatixchu 62891ca4fc Merge origin/master into worktree/issue-3881-folder-drop 2026-09-21 11:11:36 +08:00
Yichen Jiang 0aa6f94749 feat(web): expose input plugin extension hooks 2026-09-21 11:11:21 +08:00
imccyu 640e26806b docs(sidebar): describe the final retained browser architecture 2026-09-21 11:10:31 +08:00
Dudu-0223 5ca7f533e1 refactor(subagent): own external runs without activation drivers 2026-09-21 11:09:41 +08:00
sjw1231 2c5d49645b docs(ui-deliverables): plan review tab fixes for #4670 2026-09-21 11:09:13 +08:00
lsdsjy 31cce49fff fix(desktop): unify welcome material and action placement 2026-09-21 11:06:59 +08:00
Dudu-0223 554974614f refactor(subagent): restore input delivery type alias 2026-09-21 11:02:51 +08:00
Yichen Jiang 511476782b test(web): complete input action fixture after master merge 2026-09-21 11:02:05 +08:00
Yichen Jiang b3ff0f5dc7 Merge remote-tracking branch 'origin/master' into worktree/experimental-voice-input
# Conflicts:
#	packages/client/ui-plugin-manager/tests/components.client.spec.tsx
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-primitives/README.md
#	packages/client/ui-primitives/README.zh.md
#	packages/client/ui-primitives/tests/icons.client.spec.tsx
#	packages/client/ui-primitives/tests/state-dot.client.spec.tsx
2026-09-21 10:56:23 +08:00
Yifffan 2ced4d130b Merge branch 'master' into fix/desktop-minimize-vibrancy 2026-09-21 10:54:01 +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
creatixchu 82692090c8 Merge remote-tracking branch 'origin/master' into feat/4562-file-open-apps 2026-09-21 09:56:00 +08:00
imccyu 8e441f7da2 test(browser): complete sidebar retention and navigation coverage 2026-09-21 04:12:54 +08:00
imccyu 599f556deb test(sidebar): follow retained DOM layout in browser checks 2026-09-21 04:12:54 +08:00
imccyu 7be9188d20 fix(browser): complete preload fixtures and scrollbar bindings 2026-09-21 04:12:54 +08:00
imccyu 346b27b037 fix(webworker-packer): skip declaration-only export roots 2026-09-21 03:36:52 +08:00
imccyu d8438ecf06 refactor(browser): isolate Electron code and defer native coverage 2026-09-21 03:25:30 +08:00
imccyu 94bc5b25b8 test(desktop): cover webview and sidebar retention lifetimes 2026-09-21 03:13:15 +08:00
imccyu 0e652514ea fix(browser): declare workspace client injection 2026-09-21 02:33:35 +08:00
imccyu 60ef7b1261 fix(ci): refresh sidebar catalog and complete API docs 2026-09-21 02:29:00 +08:00
imccyu e9a0d5ac77 fix(desktop): address sidebar retention and webview review findings 2026-09-21 02:17:37 +08:00
imccyu 5614184902 chore(browser): prune retired unknown-cast baseline 2026-09-21 01:50:16 +08:00
imccyu 1489526281 fix(desktop): import updater declarations through package types 2026-09-21 01:47:28 +08:00
imccyu 37df1ea375 fix(browser): separate desktop types from client compilation 2026-09-21 01:47:20 +08:00
imccyu c402892c1a feat(browser): add manual page recovery and cwd storage grouping 2026-09-21 00:58:23 +08:00
imccyu ab4bd4c630 feat(desktop): enable lease-scoped sidebar webview guests 2026-09-21 00:58:23 +08:00
imccyu cbd866fa72 refactor(browser): separate navigation and presentation providers 2026-09-21 00:58:23 +08:00
imccyu 96b2aca346 feat(sidebar): retain session views across tab presentation changes 2026-09-21 00:58:23 +08:00
imccyu bf712e1404 feat(dockkit): add stable retained tab layout 2026-09-21 00:58:22 +08:00
imccyu 37535cf44a Merge pull request #4753 from deepseek-harness/fix/pr-4749-review
fix(chat): address presentation review findings
2026-09-21 00:46:02 +08:00
imccyu 4533be9531 fix(chat): address presentation review findings 2026-09-21 00:32:43 +08:00
imccyu b173fe1c19 Merge pull request #4749 from deepseek-harness/feat/chat-presentation-channel
feat(ui-chat): restore independent work-detail presentation from #4565
2026-09-21 00:10:18 +08:00
Turtle 3f7016a422 feat(config): add volatile schemas and watcher-driven updates (#4579)
* feat(cordis): add volatile config references without remounting

* refactor(cordis): use internal prefix for volatile updates

* fix(schemastery): preserve metadata-free serialized schemas

* refactor(config): move volatile updates into an opt-in Loader plugin

* refactor(config): reuse Loader context patch for volatile updates

* refactor(config): let the volatile watcher commit equal candidates

* refactor(config): separate comparison from volatile reconciliation

* refactor(loader): extract pure entry option diff

* refactor(loader): compare volatile config through schema metadata

* refactor(loader): make volatile comparison policy explicit

* refactor: name config reload and volatile HMR events

* refactor(loader): compare volatile config in one schema walk; declare hmr/volatile-update in volatile-hmr

Replace the mask/project pair in vendor/loader/src/config/diff.ts with one recursive schema-guided comparison. Absent objects now compare as their declared schema default at every object node, not only under volatile ancestors; both inputs resolve to the same validated config, so the one changed assertion (undefined vs {} under a non-volatile object schema) becomes unchanged. The isJsExpr special case is dropped: expression keys fall through to raw comparison.

Move the hmr/volatile-update Events declaration from vendored Cordis core to its producer, packages/boot/volatile-hmr, matching how dsh-hmr declares hmr/change and hmr/reload. Vendored cordis events.ts returns to upstream content; the inherited Cordis API catalog and the event matrix are regenerated, and the tutorial example imports the package types.

* fix(cosmokit): compare sparse array slots in deepEqual; extend volatile diff coverage

Array.prototype.every skipped holes, so deepEqual(Array(1), ['new']) was true in one direction. Compare every index with holes read as undefined.

config/diff.ts treats expression objects as opaque values even when a schema field shares the marker name, and looks up field schemas with Object.hasOwn so unknown keys named after Object prototype members compare raw. Tests cover absent-object defaults, sparse arrays in both directions, prototype-named keys, metadata-free serialized schema nodes, and a runtime remount check in volatile-hmr. READMEs and the architecture note describe the object-default rule.

* test(schemastery): build serialized schema fixtures without unknown casts

verify-no-unknown-casts rejects the two as-unknown assertions in scripts/volatile-config.spec.ts. Parse the serialized nodes from JSON text instead, matching scripts/loader-config-diff.spec.ts.

* docs(volatile-hmr): drop the scope-scan tag from hmr/volatile-update

verify-scoped-events rejects @dshScopeScan on an event that carries no scoped keys. Catalogs and the event matrix are regenerated.

* docs: regenerate module graph for the volatile-hmr dependency edge

verify-module-graph reports the merged docs stale: volatile-hmr now lists its app-boot dependency.

* test(volatile-hmr): watch the real YAML through an exact config watch

The Windows coverage lane lost the whole spec: its vitest worker exited without a report once this test started a chokidar directory watch (root: ['.']), the only real directory watch in the test suite. Register the include file through hmr.watchConfig instead, the pattern the HMR package's own real-file tests run on Windows, and emit loader/config-reload from the refresh callback as the root-watch path does. packages/boot/hmr/tests/coordination.spec.ts already covers that root-watch emission with a mocked watcher; volatile-hmr and hmr sources stay at 100% coverage.

* test(volatile-hmr): pass the Include path as a file URL

On Windows the plain absolute path made the include subtree fail to load, so the profile-patch test found no consumer entry. Other Include fixtures in this spec already pass file URLs.

* refactor(loader): commit volatile config in Entry.update and remove volatile-hmr

loader/config-reload was emitted from two places (app-boot profile reconciliation and the HMR root watch) and by hand in tests, because a separate plugin needed a "configuration applied" signal to run its own pass. Every update path already funnels through Entry.update, which is where the Loader decides to skip a remount for a volatile-only change. Entry._commitVolatile now parses the candidate through the fiber's internal/config hook and schema, commits the new values into the running references when the ordinary effective values still match, and emits loader/volatile-update to the owning fiber. A changed ordinary effective value falls back to the ordinary remount instead of leaving the instance stale; an invalid candidate is logged and keeps the running references, with the raw config retained for the next activation. Forced group updates take the same path.

Remove packages/boot/volatile-hmr, its event, the app-boot loader/config-reload declaration and emit, and the HMR emission. Loader runtime and real-file tests move to scripts/loader-volatile-update.spec.ts. Docs, catalogs, the event matrix, module graph and the architecture note follow.

* test: share the volatile schema fixture between the schema and Loader specs

The duplication gate flagged the identical Config fixture in scripts/volatile-config.spec.ts and scripts/loader-volatile-update.spec.ts.

* refactor(loader): reduce config/diff.ts to equalExceptVolatile

Entry.update now computes the strict raw option changes itself and only asks diff.ts whether two raw configs differ at most in volatile fields. The ignoreVolatile flag, the options object and the "config is the sole change" rule leave diff.ts; they were the Loader's decision and now sit next to the commit they gate. The raw-config deepEqual in the volatile branch is gone because the strict change list already answers it.

* refactor(loader): type the volatile comparison against Schemastery's Schema

config/diff.ts narrows the plugin's Standard Schema to Schemastery's own Schema type instead of a hand-written structural interface, which makes vendor/loader a type-only dependent of @deepseek-ai/schemastery. The rescope codemod treats the vendor identifier comparison like schemastery's own source and renames the import through an exact edit.

* fix(loader): address review findings on the volatile commit path

Entry.update only replaces the fiber's pending raw config for a volatile-only change, so a noSave direct update survives a no-op entry update. _commitVolatile logs at debug level when ordinary effective values changed and the ordinary update applies, dispatches loader/volatile-update with a Context receiver like Cordis' own filtered emits, and isolates a throwing listener. Schemastery reports unsupported volatile values as ValidationError with their path and validates a lazy inner once when it is built. The inherited-event catalog gains internal/config and corrected source lines; the Loader spec imports dsh-hmr by package name and covers the new behaviors. Docs record that class-instance ordinary fields always take the remount path and that .default() accepts the raw input type.
2026-09-21 00:04:06 +08:00
gengruilin cbd6562506 docs(web): clarify browser dependency installation 2026-09-20 23:45:19 +08:00
gengruilin b79b64f788 Merge origin/master into fix/webkit-model-picker 2026-09-20 23:42:15 +08:00
imccyu c3c3d95608 test(web): align preview and fence checks with chat folding 2026-09-20 23:36:20 +08:00
Yichen Jiang b73a71e89c Merge pull request #4751 from deepseek-harness/worktree/preset-error-session-creation-1b1161
fix(web): report a refused new session through the Workspace notice
2026-09-20 23:30:38 +08:00
Yichen Jiang c7e6e36dd1 fix(web): keep a superseded creation notice silent and add its e2e
Review follow-ups on the refused-creation notice:

- `openWorkspace` raises `createFailed` only while its navigation is
  current, so a refusal that lands after a later navigation or owner
  disposal stays silent — the gate `initializeDefaultWorkspace` already
  uses and what the README states; two service cases pin it.
- `RowActionToast` switches on the closed notice union and ends in
  `assertNever`, so an unhandled kind fails to compile instead of
  rendering another notice's copy.
- `apps/web/tests/new-session-refused.e2e.ts` drives the composed Web
  server with a user preset whose row cannot resolve and compares the
  notice's ARIA golden, beside the default-Workspace failure scenario.
- `@throws` on `openWorkspace` covers every failure (catalog
  regenerated); `RowToast.createFailed` records why the Host code stays
  in the copy; the README states that other failures show their own
  message.
2026-09-20 23:22:13 +08:00
imccyu f1c035b1e9 test(chat): align presentation coverage and snapshots 2026-09-20 23:20:07 +08:00
imccyu 89ee08b781 docs: record completed chat migration and deferred turn-step work 2026-09-20 22:45:29 +08:00
imccyu bcd14d776c perf(ui-chat): memoize tool and command rows 2026-09-20 22:45:29 +08:00
imccyu b6f99fad55 feat(ui-chat): filter system prompts and permission commands 2026-09-20 22:45:29 +08:00
imccyu 007241d2a8 feat(ui-chat): add text shimmer to running rows 2026-09-20 22:45:29 +08:00
imccyu e24805a536 feat(ui-chat): refine reasoning previews and disclosure cues 2026-09-20 22:45:28 +08:00
imccyu 508329fe57 feat(ui-chat): add presentation policy channel 2026-09-20 22:45:28 +08:00
dcc c2be3d9a0b test(web): pin the desktop update chrome's shared palette
Numeric download progress renders without an ellipsis, and a failure keeps the update chip's palette instead of a separate error color. Pin the progress label and the shared badge background, and let the retry label carry the failure distinction.
2026-09-20 22:41:53 +08:00
Yichen Jiang 93ad804bf1 fix(web): report a refused new session through the Workspace notice
An explicit New Session (sidebar and header buttons, the workspace row
button, and the hero workspace pick) whose `session.create` the Host
refuses — for example a default preset whose composition names a
plugin that no longer resolves (`agent-preset/invalid`) — was only
logged with `console.warn`, so the click looked like it did nothing.

`openWorkspace` now shows the failure through the shared Workspace
notice as a `createFailed` toast quoting the Host's stable code and
message on the long hold, then rethrows as before. Startup restoration
does not go through `openWorkspace` and stays console-only.
2026-09-20 22:40:00 +08:00
dcc 5015426866 fix(ui): unify desktop update badge colors 2026-09-20 22:33:00 +08:00
dcc 422ded6f7a fix(ui): align desktop update tag styling 2026-09-20 22:33:00 +08:00
winewill 6446944fa6 Merge pull request #4669 from deepseek-harness/build/test-release-path-id
build(desktop): isolate test downloads by release ID
2026-09-20 22:06:58 +08:00
winewill 338eea071e Merge remote-tracking branch 'origin/master' into build/test-release-path-id 2026-09-20 21:59:07 +08:00
07akioni 287f879d67 Merge pull request #4738 from deepseek-harness/fix/4728-macos-localizations
fix(desktop): 修复 macOS 中文系统首次启动默认英文
2026-09-20 21:50:03 +08:00
winewill b793dd2df6 Merge remote-tracking branch 'origin/master' into build/test-release-path-id
# Conflicts:
#	apps/desktop/scripts/desktop-package-environment.mjs
#	apps/desktop/tests/package-target-stages.spec.ts
2026-09-20 21:46:58 +08:00
creatixchu db10002cdd test(web): include file items in image drop fixture 2026-09-20 21:34:31 +08:00
creatixchu 5953ab2913 test(composer): use explicit void paste handler 2026-09-20 21:24:49 +08:00
creatixchu 444ce0444b fix(composer): type paste regression and refresh slot catalog 2026-09-20 21:14:44 +08:00
creatixchu 52a4a5bdb3 fix(composer): preserve batches and quoted directory references 2026-09-20 21:12:06 +08:00
07akioni 27fa7ed9ff Merge pull request #4681 from deepseek-harness/xtr/default-workspace-first-send
feat(workspace): prepare a default workspace on startup
2026-09-20 21:04:06 +08:00
Christina Lee ea05e57b60 Merge branch 'master' into fix/4728-macos-localizations 2026-09-20 20:56:39 +08:00
gengruilin 06ef26a80f fix(web): preserve focus when toggling the model picker 2026-09-20 20:56:34 +08:00
liyao 942e496ce7 fix(desktop): declare macOS bundle localizations 2026-09-20 20:45:29 +08:00
Turtle 31e6b3f150 fix(client): rotate every ongoing StateDot loader in phase (#4737)
CSS animations start when their element is inserted, so loaders mounted
at different moments rotated out of step in the sidebar session list.
The ongoing loader now pins its spin and dash animations to document
time zero on mount so every visible loader shares one phase.
2026-09-20 20:45:23 +08:00
_Kerman a4fdaebf52 Merge remote-tracking branch 'origin/master' into xtr/default-workspace-first-send 2026-09-20 20:44:25 +08:00
_Kerman 5ec3353af2 refactor(workspace): reuse toast for default initialization failures 2026-09-20 20:42:50 +08:00
Yif d72f85a0ad fix(desktop): paint an opaque base while minimized to cover the vibrancy reattach gap 2026-09-20 20:41:48 +08:00
creatixchu 1790a09f77 Merge remote-tracking branch 'origin/master' into feat/4562-file-open-apps 2026-09-20 20:33:24 +08:00
Turtle f2a22a3108 test(web): provide favicon environment in desktop boot fixture 2026-09-20 20:05:17 +08:00
Turtle 6b9c01996f fix(web): refresh favicon colors with the system scheme 2026-09-20 19:54:54 +08:00
imccyu 2411452433 Merge pull request #4707 from deepseek-harness/subagent-catalog
perf(session): avoid duplicate cold reads on conversation open
2026-09-20 19:27:13 +08:00
winewill 2c233c64f0 Merge pull request #4716 from deepseek-harness/feat/current-version-display
feat(client): 在通用设置展示当前版本号
2026-09-20 19:19:04 +08:00
mektpoy 31a83ebc4b refactor(client): let chrome rows own the macOS window drag
The macOS window's draggable area was a hand-written band: a 52px strip, deepened
to 76px by a marker the Conversation header had to keep in step with its own
height. It drifted from the layout — blank runs inside a chrome row did not drag,
and a control a few pixels away dragged the window instead.

Chrome rows now mark their own element (`data-window-drag`) and the shell declares
the surface once (`html[data-platform='darwin'] [data-window-drag]`), so a row's own
box is its draggable geometry and no fixed band has to match any row's height. The
frame band, its 52/76 figures, the marker, and the per-sheet drag rules are gone;
interactive controls and overlays portal beside `#root` where one rule subtracts
them.

Recollection becomes one shell watcher (`window-drag/recall.ts`): Electron rebuilds
the window's drag rects only when a computed app-region value changes
(electron#32341), so the watcher measures every marked row each frame while the
surface moves, sets `data-window-drag-recall` for the frames whose geometry changed,
and clears it on the frame that finds the geometry settled. The right panel's
hand-written pulse is deleted with it.

Coverage is a contract with executable parts. `window-drag/regions.ts` publishes the
composition rule and the interactive selector that both the sheet and its spec
compare against; the ui-theme gate asserts the package tree declares drag in exactly
two places and pairs every row's mark with its sheet, selector, and authored height;
and the browser lane boots the shipped composition in Chromium with the darwin
marker to assert per-row geometry, a content body under a marked head row, a
covering overlay, and the watcher's pulse. The plugin manager's detail views mark
the head row they share rather than the pane they render in, so their text and form
labels stay content.

Both real machines agree: the macOS matrix ran on a real `hiddenInset` window with
HID-level pointer input and window-frame readback, and the Windows matrix on a
Windows 11 ARM64 VM — chrome rows drag, content and the covering overlay do not,
and the controls keep their clicks.

Refs #4619
2026-09-20 19:01:15 +08:00
imccyu 42f9a76b77 test(client): align remaining navigation refresh expectations 2026-09-20 18:58:22 +08:00
mektpoy 65ba30ab4f refactor(client): name the standard focus-ring width
Every ring that used 2px now reads --dsw-focus-ring-width. The dense tables and
toolbars keep their 1px ring on purpose: at 2px they visibly outweigh the rows
they sit between, so the standard value and the dense exception stay distinct
rather than converging on a number nobody measured.
2026-09-20 18:47:45 +08:00
Yudong Han a25780c63b Merge pull request #4725 from deepseek-harness/fix/sidebar-excel-default-app 2026-09-20 18:45:17 +08:00
mektpoy 5a7b2e6f33 fix(client): ring the workspace header controls inside their clipping boxes
The action cluster animates its width with overflow hidden, and the search pill
clips to its rounded shape, so an outer ring on the add, search and clear
controls was cut to a sliver. This package declared no focus style at all — every
control fell back to the browser default inside those boxes.

Ring the three controls inside the element, the direction issue #4655 allows.
2026-09-20 18:44:58 +08:00
imccyu 045e2f9360 test(client): omit absent optional Session fixture fields 2026-09-20 18:41:30 +08:00
imccyu ad2dad1186 test(client): cover auxiliary reads with retained Session fixtures 2026-09-20 18:41:30 +08:00
imccyu d25490d8b4 test(subagent): replace legacy unknown cast with typed fixture 2026-09-20 18:41:30 +08:00
imccyu 280048d868 fix(client): align navigation callbacks and projection tests 2026-09-20 18:41:30 +08:00
imccyu d088572e11 fix(session): declare persistence identity for Typert analysis 2026-09-20 18:41:30 +08:00
imccyu be0d63661c perf(client): remove redundant projection reads from navigation 2026-09-20 18:41:29 +08:00
imccyu dfff5056f4 perf(client): defer auxiliary reads until history is ready 2026-09-20 18:41:29 +08:00
imccyu 6fef0f0af9 fix(session-query): stabilize persistence cache identity 2026-09-20 18:41:29 +08:00
Turtle 2099andTurtle e8f3d02da8 fix(web): batch session expansion and keep running sessions visible (#4715)
* fix(web): expand workspace sessions in bounded batches

* fix(web): keep running sessions outside overflow quota

---------

Co-authored-by: Turtle <[email protected]>
2026-09-20 10:38:56 +00:00
imccyu 068cf03441 Merge pull request #4648 from deepseek-harness/worktree/remote-duplex-stream
feat(gateway): let every Remote stream carry a client uplink
2026-09-20 18:32:58 +08:00
mektpoy ae59505baf Merge remote-tracking branch 'origin/master' into tmp4500-sync 2026-09-20 18:24:54 +08:00
Turtle 654caa4bbd feat(bundle): accept an ordered patch file list in dsh.bundle.patch (#4722)
* feat(bundle): accept an ordered patch file list in dsh.bundle.patch

`dsh.bundle.patch` now accepts `string | string[]`. A list names patch
files applied in order as one bundle layer; each file's relative plugin
paths still resolve beside that file. `bundlePatchPaths` in dsh-app-boot
is the one resolver from a declaration to absolute paths, and every
reader uses it: profile loading, plugin-manager reconcile and bundle
rows, the client-runtime roster, and the workspace, cordis-config, and
product-isolation gates. `ProfileLayer.patchPath` becomes `patchPaths`.

* fix(bundle): keep declared patch files package-relative in the workspace gate

path.join produced backslash entries on Windows, so the expected files
list did not match package.json files. bundlePatchFiles returns the
validated declaration as written; bundlePatchPaths joins it.
2026-09-20 18:20:24 +08:00
Ziya d495b2e5f2 Merge pull request #4718 from deepseek-harness/copy/preset-language-20260920
feat(web): clarify agent presets and add mode guides
2026-09-20 18:19:26 +08:00
winewill 21e315a7dd docs(client): record the shell's Current version row in ui-settings-general
The shell registers two General rows after #4716, but README.md and
README.zh.md still described only Developer tools in three places each.
Align both sides and re-record the bilingual pairing hashes.

Also close the review nits: assert the settings.general.item rows dispose
on unload, give the localized-label cases distinct titles (%s printed the
dictionary object, so both read "[object Object]"), complete the
CurrentVersionRow @param, and note why current-version orders last.
2026-09-20 18:18:13 +08:00
ZiyaZhang d620c1e4b7 fix(web): soften segmented tab focus styling 2026-09-20 03:08:34 -07:00
ZiyaZhang 5aa0e3f806 test(web): align developer tools check with preset copy 2026-09-20 03:00:57 -07:00
creatixchu 112c9e5749 feat(web): cite dropped folders and files as @ references on Desktop
The Desktop preload reports a picked file's real path through
__DSH_HOST_PATHS__. Where that bridge exists, the composer inserts a dropped,
picked, or pasted folder or non-image file as the same @path reference chip
the user could have typed, so nothing uploads and the model reads the target
with its file tools; images keep uploading. The drop handler names dropped
directories through the entry API, and a browser without the bridge refuses
a dropped folder with product copy instead of failing it as an upload.
2026-09-20 18:00: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
imccyu ffea3c8818 fix(gateway): close the remaining uplink lifecycle gaps 2026-09-20 17:53:18 +08:00
imccyu 5a8d3b7498 docs(agents): state the uplink note in English on both sides and cross-link its neighbours 2026-09-20 17:53:18 +08:00
imccyu 6872651527 docs: regenerate the module graph 2026-09-20 17:53:18 +08:00
imccyu 520c225b87 test(gateway): cover the uplink edge paths 2026-09-20 17:53:17 +08:00
imccyu 755f022ef0 docs: regenerate catalogs and document the mock uplink handle 2026-09-20 17:53:17 +08:00
imccyu 5fbae69d18 docs(agents): pair the Remote uplink stream note in English 2026-09-20 17:53:17 +08:00
imccyu d07182d3d8 docs(agents): record the Remote uplink stream as implemented 2026-09-20 17:53:17 +08:00
imccyu 355df025d4 fix(gateway): harden the Remote uplink lifecycle 2026-09-20 17:53:17 +08:00
imccyu 8ce7c27671 refactor(connection): admit every request as the single operator Peer 2026-09-20 17:53:17 +08:00
imccyu e427600e32 test: pin the scope export roster and map dsh-brand for the proxy type program 2026-09-20 17:53:17 +08:00
imccyu 35602063d7 refactor(typert): name the client stream handle RemoteStreamHandle everywhere 2026-09-20 17:53:17 +08:00
imccyu 77f1a493aa refactor(typert): keep the Remote marker mode as the 'stream' literal 2026-09-20 17:53:17 +08:00
imccyu ebdc1609c6 docs(agents): mark the duplex note's pseudo-code fences as text 2026-09-20 17:53:17 +08:00
imccyu 089004c418 test(gateway): cover the Remote uplink and document it
Tests bring the changed sources to full per-file coverage, the READMEs and
docs describe the uplink, the invocation context, and the Peer registry in
both languages, and the generated catalogs are refreshed.
2026-09-20 17:53:17 +08:00
imccyu 021bd03b70 feat(gateway): let every Remote stream carry a client uplink
Every Typert Remote stream accepts client-to-Host items on the same
logical stream. A method declares the uplink item type in its return
type, RemoteStream<Out, In>, and reads the items through
this.ctx.invocation.uplink(); the invocation also carries the calling
Peer. Client generated methods return a handle that iterates the
downlink and exposes send/end/dispose for the uplink.
2026-09-20 17:53:16 +08:00
fz a1e0ce557d Merge pull request #4460 from deepseek-harness/feat/workspace-dependencies-package
feat(sdk): bundle shared Office Python runtime and configurable skills
2026-09-20 17:50:17 +08:00
winewill 5ff352b0be test(web): include current version without built-in browser 2026-09-20 17:50:05 +08:00
Yichen Jiang a165e82bfc feat(ui-plan): lead the plan chip with the plan glyph and a hover close (#4710)
The composer's plan-mode chip rendered its label followed by a 12px
one-pixel cross, out of step with the sibling access-mode trigger's
glyph-then-label layout. The chip now leads with the 14px plan glyph
(the /plan command's own icon) and swaps it for a new circled close —
IconCloseCircleFill, a filled disc with the cross knocked out — while
the enabled chip is hovered or keyboard-focused, so the pending click
reads as turning plan mode off.

The pill's corners move from a 999px circular capsule to the compact
Button geometry (14px on the 28px row) under the theme's superellipse
curvature, matching every neighbouring control; the lifecycle-chrome
probe now pins that radius and the shared corner-shape.
2026-09-20 17:49:06 +08:00
_Kerman 5294b15b31 docs(workspace): separate constructor parameter tags 2026-09-20 17:48:58 +08:00
_Kerman 78d6f7bc1f test(client): mock default workspace initialization during boot 2026-09-20 17:48:46 +08:00
winewill 9d7e5e30ac Merge remote-tracking branch 'origin/master' into feat/current-version-display 2026-09-20 17:46:50 +08:00
ZiyaZhang 05a229ccc9 feat(web): clarify agent presets and add mode guides 2026-09-20 02:45:48 -07: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
Yudong c1f37fef9d fix(sidebar): open spreadsheets in default app 2026-09-20 17:39:28 +08:00
gengruilin 6613660223 fix(web): keep model picker focus during mouse selection 2026-09-20 17:37:44 +08:00
Dudu-0223 307332baee Merge master and preserve compatible subagent catalog evolution 2026-09-20 17:35:18 +08:00
Yichen Jiang ab9689b2ca fix(web): bind the right Sidebar before same-commit mount effects (#4693)
* fix(web): bind the right Sidebar before same-commit mount effects

A plan review arriving while a global panel was active crashed its opener when the user returned: the frame mounts the Conversation column ahead of the right Sidebar seat, so PlanReviewOpen's mount effect called ctx.sidebarRight.openResource before the seat's passive bindService effect had published the binding. The slot runtime retired the crashed entry for the rest of the page, removing the View full plan link and every later automatic open.

Publish the seat binding from a layout effect, which runs before any passive effect of the same commit regardless of tree order. The seat spec mounts a Conversation-column opener ahead of the seat and returns from a global panel; the plan-review Web scenario delivers a review while the Plugins panel is open and expects the preview and the link after the return. Both fail before the fix.

* fix(web): open the plan review once the Sidebar seat is mounted

Replace the layout-effect binding with an observable: ctx.sidebarRight.mounted publishes the session whose seat is on screen, undefined while a global panel replaces the Conversation. The seat keeps binding from its passive effect. PlanReviewOpen reads the source through a bound hook and opens once a seat is defined, so a review mounting ahead of the seat in the same commit no longer assumes a bound seat and never crashes its entry.

The seat spec's opener stand-in now reads `mounted` the way a slot component does; the service spec pins that only real transitions publish, and the PlanReviewOpen spec covers a review that mounts before any seat and opens once the seat binds.

* test(web): align the plan-review console tripwires and the seat term

The off-screen review case now asserts the reconnect warnings like its siblings and filters crash logs by error level as the other e2e files do. The zh README keeps 席位 for the seat throughout.

* test(plan): keep the review props cast at its baseline fingerprint

verify-no-unknown-casts counts a modified assertion as new. The two PlanReviewOpen specs now share the unchanged baseline cast through one helper and supply the seat hook as a typed value beside it.
2026-09-20 09:35:00 +00:00
fz fa1065b6b2 Merge remote-tracking branch 'origin/master' into feat/workspace-dependencies-package 2026-09-20 17:33:02 +08:00
Dudu-0223 f3a69dff00 refactor(subagent): remove redundant state and settle local results after descendants 2026-09-20 17:27:05 +08:00
_Kerman b21fc2c8d1 Merge origin/master into xtr/default-workspace-first-send 2026-09-20 17:26:38 +08:00
mektpoy 9a74ba5d08 fix(client): give tooltips and focus rings the modality rule each needs
A tooltip asks what the last input was: after any key the user is working from
the keyboard, so a programmatic focus may raise a bubble. A focus ring asks
something narrower — Chromium reveals an already-focused control as soon as any
key arrives, including a modifier or Escape that never navigated anywhere, which
is the ring users report as unexplained.

Record both answers and publish the ring's narrower one, so tooltips keep their
existing behaviour and rings stay silent for a pointer's focus.
2026-09-20 17:26:14 +08:00
winewill 1628c1d030 feat(client): display current version in general settings 2026-09-20 17:23:08 +08:00
_Kerman 2cd03c9758 refactor(workspace): omit unchanged registry state fields 2026-09-20 17:20:54 +08:00
_Kerman 3a7f8f9657 test(web): restore ordinary workspace picker readiness 2026-09-20 17:20:44 +08:00
_Kerman 4d2e420ef8 refactor(workspace): initialize the default workspace on startup 2026-09-20 17:19:54 +08:00
creatixchu 7d002f7eff test: compare Windows file identity and refresh delivery controls 2026-09-20 17:17:40 +08:00
creatixchu e0187ecdf8 Merge remote-tracking branch 'origin/master' into feat/4562-file-open-apps 2026-09-20 17:16:21 +08:00
Yichen Jiang 8d6245bcc8 Merge pull request #4701 from deepseek-harness/fix/settings-navigation-scroll
fix(web): 设置导航支持溢出滚动
2026-09-20 17:14:32 +08:00
winewill 6848f1e118 Merge pull request #4567 from deepseek-harness/fix/windows-mandatory-update-overlay
fix(desktop): Windows 强更使用主窗口内蒙层并修复退出清理
2026-09-20 17:12:17 +08:00
Tianyi Cui 3f33c06f40 Merge pull request #4629 from deepseek-harness/worktree/dynamic-conversation/messages-only
Make the official DeepSeek adapter Messages-only
2026-09-20 17:10:58 +08:00
mektpoy db92970146 fix(client): keep focus rings inside the containers that clip them
The breadcrumb trail and the Miller column scroll, and the column's left edge
carries no padding, so an outer ring on their buttons was clipped to a sliver.
The TurnNavigator marker sits at the scroller's right edge, which clipped three
of its four sides. Ring those inside the element instead — the direction issue
#4655 allows — and change no layout value.
2026-09-20 17:08:43 +08:00
mektpoy 9e7350bb8c fix(client): keep a pointer's focus silent until focus navigation
Clicking a control leaves it focused with :focus-visible false, so nothing is
drawn. Chromium then reveals the ring the moment any key arrives — a modifier,
Escape, a typed character — which is the unexplained focus ring users report:
they never navigated there, yet a ring appears under the pointer's last target.

Record the input modality on the document element, publish the keyboard modality
only for focus navigation (Tab, arrow keys), and let the global focus sheet keep
a pointer's focus transparent. Tooltip's pointer modality moves into the same
module so tooltips and rings follow one rule.
2026-09-20 17:05:51 +08:00
winewill 032394fc48 Merge remote-tracking branch 'origin/master' into fix/windows-mandatory-update-overlay 2026-09-20 17:01:23 +08:00
Turtle 8f0dd55c2c feat(plugins): render icons from package manifests (#4697)
* feat(plugins): render icons from package manifests

* fix(plugins): include declared icons in canonical package payloads
2026-09-20 17:00:17 +08:00
Turtle 2099andTurtle 3eab1714bc feat(web): add chat link opening preference (#4671)
* feat(web): add chat link opening preference

* docs(web): clarify preference-controlled link routing

* fix(web): hide link preference without a browser

* fix(web): make the built-in browser opt-in

* test(web): honor profile-aware browser availability

---------

Co-authored-by: Turtle <[email protected]>
2026-09-20 17:00:03 +08:00
creatixchu 086b64103f test: verify transient feedback and single-action file controls 2026-09-20 16:51:58 +08:00
creatixchu c7a4fae8e5 fix: complete shared menu types and remove obsolete button styles 2026-09-20 16:48:25 +08:00
creatixchu a4148d687f fix: refine file action menus feedback and shared queries 2026-09-20 16:46:58 +08:00
Dudu-0223 05b056f18c Merge pull request #4635 from deepseek-harness/fix/lazy-subagent-migration
fix(session): preserve unreadable children in migrated subagent catalogs
2026-09-20 16:45:25 +08:00
Yichen Jiang 393f72e32e Merge pull request #4690 from deepseek-harness/worktree/web-desktop-startup-commands-a97723
feat(infra): unify Web and Desktop launch commands
2026-09-20 16:35:26 +08:00
gengruilin 47ee608079 fix(web): allow overflowing settings navigation to scroll 2026-09-20 16:34:49 +08:00
07akioni 76427b4c5f Merge remote-tracking branch 'origin/master' into codex/pr-4553 2026-09-20 16:30:59 +08:00
fz 6b1c9c169d Merge remote-tracking branch 'origin/master' into feat/workspace-dependencies-package 2026-09-20 16:30:31 +08:00
lsdsjy 82ae763772 fix(deepseek-account): rename login source parameter 2026-09-20 16:28:21 +08:00
Xu Hanxiang dff5506934 Merge pull request #4499 from deepseek-harness/fix/windows-plugin-list-type-size
fix(client): raise the package identity contrast in the plugin views
2026-09-20 16:27:26 +08:00
Yichen Jiang 7d56ca5cee Merge remote-tracking branch 'origin/master' into worktree/web-desktop-startup-commands-a97723 2026-09-20 16:27:07 +08:00
Yichen Jiang 44cf9b703d docs(readme): point developers at dev:web and the Make targets 2026-09-20 16:25:03 +08:00
mektpoy 230d975a04 docs(client): explain the identity tiers and the detailName scope
The shared rule now states why the collapsed identity and the expanded value keep two label tiers, and the detailName comment names the row identity it also renders.
2026-09-20 16:18:56 +08:00
mektpoy 40edba6a8d Merge remote-tracking branch 'origin/master' into fix/desktop-dev-runtime-target 2026-09-20 16:13:36 +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
Xu Hanxiang 5dc6767d7b Merge pull request #4491 from deepseek-harness/fix/windows-menu-tooltip-overlap
fix(desktop): place Windows caption tooltips below the titlebar
2026-09-20 16:02:54 +08:00
_Kerman 43372b28ce Merge origin/master into xtr/default-workspace-first-send 2026-09-20 16:00:37 +08:00
fz 686986fdea Merge remote-tracking branch 'origin/master' into feat/workspace-dependencies-package 2026-09-20 16:00:35 +08:00
winewill 1e20aecef5 Merge remote-tracking branch 'origin/master' into fix/windows-mandatory-update-overlay 2026-09-20 15:59:42 +08:00
mektpoy 08b310b5a8 fix(client): paint every keyboard focus ring with the brand colour
Focus rings named eight different colours across 54 client stylesheets, and a
control that declared no ring fell back to the browser default, whose colour
follows the operating-system accent — so the same build showed orange on one
machine and blue on another.

Every keyboard focus ring now uses --dsw-alias-brand-primary. A global ui-theme
focus.css sheet reaches the controls that declare no ring of their own, and 49
declarations name the same token. Only the colour changed: each declaration
keeps its width, style and offset.
2026-09-20 15:59:12 +08:00
_Kerman d4d03b7c41 docs(workspace): clarify default directory lookup and cancellation 2026-09-20 15:58:53 +08:00
_Kerman 8e313eaa30 test(workspace): cover first-use configuration and preset failures 2026-09-20 15:58:33 +08:00
_Kerman cfec29eb69 fix(web): show first-use preparation and update browser readiness 2026-09-20 15:58:10 +08:00
_Kerman 6fa56a0cf7 fix(conversation): preserve first drafts across Session retirement 2026-09-20 15:57:45 +08:00
mektpoy 91fcd9180a docs(client): name the caption bubble owner and record the badge gap
The occupying badge chooses its own side, and the update badge keeps a right-opening bubble that the Windows caption menu can cover; ui-settings-general records that as a known limitation.
2026-09-20 15:55:29 +08:00
winewill dc81ed348c Merge pull request #4684 from deepseek-harness/build/windows-cache-concurrency
build(desktop): parallelize Windows signature cache hits
2026-09-20 15:55:23 +08:00
Yichen Jiang 453e8c09ac Merge remote-tracking branch 'origin/master' into worktree/web-desktop-startup-commands-a97723 2026-09-20 15:51:01 +08:00
mektpoy 6f1de05d54 Merge remote-tracking branch 'origin/master' into fix/windows-directory-junction 2026-09-20 15:51:00 +08:00
Yichen Jiang 78dcbc8587 feat(infra): unify Web and Desktop launch commands
Web and Desktop now share one command pair: start:* launches the artifacts
of a prior complete build and dev:* builds first, then launches. start:web
is new and spells out the same source launch vector as `pnpm dsh web`;
dev:web runs `pnpm run build`, the three rebuild watchers, and `dsh web` in
one terminal, with --skip-build and --no-serve for the previous two-terminal
flow. The launcher gate pins both scripts to the dsh CLI, and a root
Makefile names the same commands as make web|dev-web|desktop|dev-desktop|build.

The dev-web stage supervisor waits for stages the terminal already
interrupted, escalates only survivors, forwards SIGTERM once, and reports a
stage that exits on its own. Signal listeners are persistent because the
tsdown watchers bundle signal-exit, which re-raises a signal when it finds
no other listener.
2026-09-20 15:50:41 +08:00
winewill f3e8021eaa Merge remote-tracking branch 'origin/master' into fix/windows-mandatory-update-overlay 2026-09-20 15:48:35 +08:00
fz 9e49d7dbcf Merge remote-tracking branch 'origin/master' into feat/workspace-dependencies-package 2026-09-20 15:46:05 +08:00
Dudu-0223 e848b6226f Merge remote-tracking branch 'origin/master' into codex/fix-migration 2026-09-20 15:45:12 +08:00
Dudu-0223 e44efedeb0 fix(session): isolate corrupt compressed headers during discovery 2026-09-20 15:44:52 +08:00
mektpoy 8b8f10a8c6 docs(ui-sidebar): scope the Windows caption bubble claim
The previous sentence claimed every caption icon bubble opens below the caption, but only the sidebar toggle and New Session derive side=bottom; an occupying sidebar.toggle.badge keeps the default side.
2026-09-20 15:39:48 +08:00
winewill 466aa2232b Merge remote-tracking branch 'origin/master' into build/windows-cache-concurrency 2026-09-20 15:37:42 +08:00
mektpoy 3515c48a37 fix(desktop): resolve the development runtime directory from the build target
The unpackaged shell derived the primary-runtime directory from process.arch, while preparePrimaryRuntime() resolves the target through resolveDesktopBuildTarget(), which fixes Windows to x64. On a Windows ARM64 host the shell looked under targets/win-arm64 while the payload was under targets/win-x64, and the missing office-skills/scripts/check_office.py became a fatal startup dialog.

The launcher now resolves that directory through the same resolver and passes it to the shell as DSH_DESKTOP_PRIMARY_RUNTIME_DIR.
2026-09-20 15:37:38 +08:00
winewill d4c5a1723f test(desktop): isolate update UI in directory-picker preload integration 2026-09-20 15:36:49 +08:00
winewill ecb00a6cd0 Merge remote-tracking branch 'origin/master' into build/windows-cache-concurrency 2026-09-20 15:36:17 +08:00
lsdsjy 1b83e0ff13 Merge pull request #4665 from deepseek-harness/fix/developer-tools-preferences
fix(web): preserve plugin tabs and enable developer tools by default
2026-09-20 15:34:51 +08:00
winewill c193e0dfee Merge pull request #4683 from deepseek-harness/fix/macos-menu-product-name
fix(desktop): localize macOS application menu names
2026-09-20 15:34:32 +08:00
winewill db7ee5f487 build(desktop): parallelize Windows signature cache hits 2026-09-20 15:32:37 +08:00
winewill bea5bde6cc docs(desktop): clarify localized native menu behavior 2026-09-20 15:27:06 +08:00
winewill 015e60ff40 test(desktop): satisfy strict lint in mandatory update regressions 2026-09-20 15:23:36 +08:00
lsdsjy 04debcbd65 feat(ui-settings-account): link to Platform account information 2026-09-20 15:23:26 +08:00
winewill 69ac149090 fix(desktop): isolate mandatory update actions and handle main-window lifecycle 2026-09-20 15:20:04 +08:00
fz 35fe8e0966 Merge pull request #4677 from deepseek-harness/fix/4664-atomic-native-addon-extraction
fix(pkg): make SEA native addon extraction atomic
2026-09-20 15:18:26 +08:00
Kexin Liu 883311e556 Merge pull request #4349 from deepseek-harness/refactor/client-session-presentation
fix(web): prevent session blank rollback after acceptance
2026-09-20 15:16:49 +08:00
Dudu-0223 21ec132c0e test(preview): expect versioned unknown child catalog entries 2026-09-20 15:15:43 +08:00
Huanqi Cao d0f9a5c410 Merge remote-tracking branch 'origin/master' into fix/windows-acl-delete-escape
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-09-20 15:12:34 +08:00
Dudu-0223 a978ad1994 fix(subagent): version unknown catalog payloads locally 2026-09-20 15:09:37 +08:00
winewill fd75c47ae9 fix(desktop): localize macOS application menu names 2026-09-20 15:08:57 +08:00
winewill 12f0608cad Merge master into fix/windows-mandatory-update-overlay 2026-09-20 15:07:10 +08:00
_Kerman b93f55f7ff Merge remote-tracking branch 'origin/master' into xtr/default-workspace-first-send 2026-09-20 15:03:03 +08:00
fz 3085139699 test(runtime): align fixtures with current type-safety gates 2026-09-20 15:02:02 +08:00
_Kerman e71df56b1a feat(workspace): create the default workspace on first send 2026-09-20 14:59:15 +08:00
Dudu-0223 8d28b06ec6 fix(subagent): share delegation scheduling guidance 2026-09-20 14:57:36 +08:00
liukx0205 5e13010b90 test(web): document suite-level browser setup and bound the reconnect polls 2026-09-20 14:54:27 +08:00
liukx0205 b882e7fc20 docs(session): record the client-local engagement memory limits 2026-09-20 14:54:27 +08:00
liukx0205 d8480db9f0 refactor(web): read engagement retention from one identity set
Address review: retention now has a single definition (retainedIds) shared by
the list-refresh sweep and the single-id prune, an already-engaged identity
skips the redundant row mutation, and the ledger documents why Host-asserted
running is recorded before any holder exists while the client-local acceptance
callback requires one.
2026-09-20 14:54:20 +08:00
fz f25957d442 Merge remote-tracking branch 'origin/master' into feat/workspace-dependencies-package 2026-09-20 14:50:54 +08:00
fz 065def9d41 docs: use compliant issue references in native extraction note 2026-09-20 14:50:48 +08:00
Dudu-0223 f984683956 fix(subagent): store unknown mode in the existing catalog event 2026-09-20 14:46:54 +08:00
Tianyi Cui 5a53758b03 test: preserve plugin-manager integration after stack rebase 2026-09-20 14:45:26 +08:00
lsdsjy 4f0ee6b105 fix(settings): defer developer features until host preference resolves 2026-09-20 14:45:24 +08:00
winewill 8e5073ee61 docs(desktop): clarify test release ID reuse and qualification 2026-09-20 14:44:36 +08:00
liukx0205 4bff618b17 docs(web): note the metadata hint applied over the engagement rule 2026-09-20 14:44:25 +08:00
liukx0205 ae58d210eb docs(web): scope the second projection store to a discarded store 2026-09-20 14:44:01 +08:00
liukx0205 7aa2d4b5cc docs(web): note the retained subagent catalog on session removal 2026-09-20 14:44:01 +08:00
liukx0205 e3f0d3fb6e fix(web): preserve session engagement across blank list refreshes 2026-09-20 14:43:46 +08:00
Tianyi Cui ddf11a4f0e fix: name Anthropic Messages in DeepSeek endpoint guidance 2026-09-20 14:37:58 +08:00
Tianyi Cui 0959c5be45 Align provider guides with Messages-only configuration 2026-09-20 14:37:58 +08:00
Tianyi Cui 9ab5c8e672 Fix Messages real-API package resolution and usage assertions 2026-09-20 14:37:58 +08:00
Tianyi Cui 385a540d7e Fix Messages-only consumer validation and document recovery 2026-09-20 14:37:58 +08:00
Tianyi Cui 2b29f31dc6 test(llm): assert native Messages file metadata 2026-09-20 14:37:19 +08:00
Tianyi Cui 99e22ebbeb refactor(llm): make the official DeepSeek adapter Messages-only 2026-09-20 14:37:19 +08:00
Dudu-0223 6f3140d7cf Merge origin/master into fix/lazy-subagent-migration 2026-09-20 14:37:01 +08:00
fz 5992977f2e fix(pkg): make SEA native addon extraction atomic
@yao-pkg/pkg's SEA bootstrap extracts native addons from the VFS into a
per-user cache ($PKG_NATIVE_CACHE_PATH/pkg/<sha256>/) with plain
writeFileSync, so concurrent first starts of the same executable truncate
files another process has already mapped: SIGBUS on Linux, "Library not
loaded" for sharp's libvips on macOS. Extend the existing pnpm patch so the
three write sites go through a same-directory temporary file and
renameSync; a cache path is then either absent or complete, every process
finishes its own copy pass before it loads, and identical content makes
concurrent renames harmless without a lock. Cache location, hash keying,
and per-file comparison are unchanged. The single-exe Agent Note records
the decision and the measured before/after runs.

Closes #4664
2026-09-20 14:36:27 +08:00
07akioni 90f0dc8f7d Check terminal descendant quiescence without requiring PID reaping 2026-09-20 14:31:11 +08:00
Dudu-0223 17a52a8fe3 fix(subagent): retain unreadable children in migrated catalogs 2026-09-20 14:30:02 +08:00
Turtle 8cf9c0eded fix(bash): allow blank justification without escalation (#4662)
* fix(bash): allow blank justification without escalation

* fix(bash): permit empty reasons when repeating the current mode
2026-09-20 14:28:57 +08:00
creatixchu c1ee42cd9c fix: portal file action tooltips outside clipped cards 2026-09-20 14:28:15 +08:00
winewill c05771d828 build(desktop): isolate test downloads by release ID 2026-09-20 14:17:51 +08:00
07akioni 2f4b354253 Fix Office packaging tests for static checks and Windows paths 2026-09-20 14:17:36 +08:00
lsdsjy c7c900a912 fix(settings): enable developer tools by default 2026-09-20 14:15:59 +08:00
lsdsjy a026ab1397 fix(onboarding): scope developer tools to trajectory tab visibility 2026-09-20 14:11:17 +08:00
creatixchu a4cd2f57a0 fix: keep file action feedback visible while hovering delivery cards 2026-09-20 14:07:32 +08:00
creatixchu a6daee84ca test: enable the shared opener in the delivery replay 2026-09-20 14:06:00 +08:00
creatixchu 6f1857ae1b test: refresh delivery snapshots for shared file controls 2026-09-20 14:04:54 +08:00
creatixchu 03fde971e2 build: allow browser-safe file association metadata validation 2026-09-20 14:02:18 +08:00
creatixchu 1f7e491526 docs: describe shared delivery and review file actions 2026-09-20 14:00:41 +08:00
07akioni 552bf8a869 Merge master into desktop Office ASAR fix 2026-09-20 14:00:04 +08:00
creatixchu 28089001a2 fix: complete file action slot contracts and branch coverage 2026-09-20 13:59:00 +08:00
imccyu bc2c9bd11a Merge pull request #4427 from deepseek-harness/session-actions-slot
feat(client): add extensible session menu actions
2026-09-20 13:56:15 +08:00
creatixchu 59fdc2604d test: provide the file action slot runtime in delivery fixtures 2026-09-20 13:56:09 +08:00
creatixchu b80722812b fix: scope shared file actions to their owning views 2026-09-20 13:55:27 +08:00
creatixchu 56d0534c30 refactor: share native file actions across delivery and review views 2026-09-20 13:53:16 +08:00
Huanqi Cao e553344063 test(sandbox): drop new unknown casts after the merge-forward
The no-unknown-casts ratchet landed on master after this branch, so the new stub tables in the ACL failure paths can no longer assert through unknown. Route them through a typed partial stub, type the bigint handles as NativePtr, and prune the three retired baseline entries.
2026-09-20 13:42:58 +08:00
creatixchu 33782150cd fix: name the default application in opening tooltips 2026-09-20 13:42:31 +08:00
creatixchu 6e260998c9 fix: refine shared file controls and native query errors 2026-09-20 13:39:11 +08:00
imccyu ee61acfe7e docs(client): describe session row entries as plain menuitem buttons
The Client Slot catalog serves `cordis-client-runner` closures, which cannot
`require` anything, so the `sidebar.workspaces.session.menu.item` example
now renders a `role="menuitem"` `<button>` and the doc names
`MenuItemButton` as what the shipped rows use rather than what an entry must
render; the README separates the Module Loader lane, which does reach the
primitive through `require`, from the runner lane. The Agent Note and the
contract module doc say the entries read the pin and archive sets through
hooks their own faces inject, that the owner draws no separator, and that
the strip keeps clicks from opening the row. `RowActionToast` gets its
contract sentence and the rename-assembly spec points at the e2e that
exists.
2026-09-20 13:33:58 +08:00
imccyu c4949c4d0c fix(client): isolate row action clicks and collapse submenus from the menu list
The Session row's action strip stops click propagation itself, so a
`sidebar.workspaces.session.row.action` entry that renders a plain button no
longer opens the row as a side effect; the shipped buttons drop their own
handling. `Menu` decides submenu exclusivity on the list's own bubbles, by
DOM: reaching a top-level row that is not a submenu parent, by pointer or by
focus, closes the open card for data rows and component rows alike, which
the per-row handlers only did for data rows. A group start on the list's
first row draws no hairline.

The first live-fixture e2e case registers the scaffold's cleanup right after
launch, as the file's other cases do. The three pin scenarios the browser
spec lost when the order write moved into `UiWorkspace.pinSession` — newer
saved orders during a pending pin, a Workspace disappearing during one, and
members whose summaries are temporarily missing — return as service cases.
2026-09-20 13:33:55 +08:00
creatixchu 27b7fd0e2f fix: preserve Shell reference storage during failed handoff cleanup 2026-09-20 13:26:18 +08:00
creatixchu 7943fb3917 Merge master into file application controls 2026-09-20 13:25:10 +08:00
_Kerman dfcef60d06 Merge pull request #4513 from deepseek-harness/xtr/fix-snapshot-source-ranges
fix(session-snapshot): expand source references before writing fixtures
2026-09-20 13:24:41 +08:00
Yichen Jiang c6bc1a2fab Merge remote-tracking branch 'origin/master' into worktree/experimental-voice-input
# Conflicts:
#	apps/desktop/electron-builder.config.mjs
#	apps/desktop/tests/macos-signature.spec.ts
#	apps/desktop/tests/main-startup.spec.ts
#	apps/web/tests/expected/plugin-config/official.expected.md
#	apps/web/tests/expected/plugin-manager/live-enabled.expected.md
#	apps/web/tests/expected/plugin-manager/manager.expected.md
#	apps/web/tests/plugin-config.e2e.ts
#	apps/web/tests/plugin-manager.e2e.ts
#	apps/web/tsconfig.json
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/client/ui-conversation/src/client/skeleton/InputBar.tsx
#	packages/client/ui-plugin-manager/src/client/locales.ts
#	packages/client/ui-plugin-manager/src/client/presentation.ts
#	packages/client/ui-plugin-manager/tests/components.client.spec.tsx
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-primitives/README.md
#	packages/client/ui-primitives/README.zh.md
#	packages/client/ui-primitives/src/StateDot.tsx
#	packages/client/ui-primitives/src/icons/index.tsx
#	packages/client/ui-primitives/tests/icons.client.spec.tsx
#	packages/experimental/README.i18n.yaml
#	packages/experimental/README.md
#	packages/experimental/README.zh.md
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
#	pnpm-lock.yaml
#	scripts/gen-cordis-catalog.ts
#	tsconfig.host.json
2026-09-20 13:22:11 +08:00
creatixchu 6493cdac9c fix: retain the Windows Shell host until asynchronous handoff settles 2026-09-20 13:14:49 +08:00
_Kerman 1491975dba Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-4513
Re-record the session-snapshot README bilingual pairing sidecar, and admit
the source-reference regression fixture with the v4 producer-owned `user`
message source kind.
2026-09-20 13:09:14 +08:00
imccyu 3821dc58e3 Merge pull request #4639 from deepseek-harness/fix-migration-v4
fix(session): serve cold forked sessions from the projection cache
2026-09-20 13:04:11 +08:00
creatixchu 39af517961 test: evaluate the Windows fixture output path as a PowerShell expression 2026-09-20 12:58:58 +08:00
creatixchu cbc51b5446 test: isolate native application identity and cold-history associations 2026-09-20 12:51:18 +08:00
imccyu 7d1afeccb0 test(web): register the live fixture rows in the session menu list
The fixture plugin's rows join `sidebar.workspaces.session.menu.item` after
the shipped rows, the first one opening the plugin group with
`separatorBefore`, and dismiss the menu through `useMenuOpenState`.
2026-09-20 12:40:35 +08:00
imccyu 4517603c28 fix(client): rename the row rename request type off the Host name
The typert Cordis catalog drops any exported name that two declarations
share, so ui-workspace's `SessionRenameRequest` made the generator remove
Session Controller's request type from the model-facing API catalog. The
row-side pending rename is `SessionRenameTarget`: the Session and the title
the dialog seeds from.
2026-09-20 12:40:11 +08:00
creatixchu 5218958366 test: keep native association expectations strictly typed 2026-09-20 12:35:53 +08:00
creatixchu 4fb9d34275 fix: use the native test task timeout for fixture readiness 2026-09-20 12:32:05 +08:00
creatixchu b689c724d1 docs: describe cross-platform file opening and pin desktop browser fixtures 2026-09-20 12:28:41 +08:00
creatixchu b4b0c4e4c8 test: exercise native Linux file handoff and document shared adapters 2026-09-20 12:24:09 +08:00
imccyu 21586fe28c feat(client): compose session row actions from slot lists
A Session row's "..." menu and its hover buttons become two list slots the
WorkspaceBrowser entry declares, `sidebar.workspaces.session.menu.item` and
`sidebar.workspaces.session.row.action`. The shipped actions register from
apply the way a client plugin does: pin (menu 100, button 200), rename (200),
fork (300), archive (menu 400, button 100). An entry receives only the row
identity, reads the pin and archive sets through Set hooks its own face
injects, decides its own visibility, renders `MenuItemButton` or one icon
button, and dismisses the menu through the slot-level `useMenuOpenState`
hook bound from the row's render occurrence.

Each action's behavior lives in its injected callbacks. `UiWorkspace` gains
`pinSession` and `unpinSession`; the pin write into the saved orders happens
there, through the viewing-store instance the apply creates and hands the
browser's registration as its handle (the ui-layout pattern), reading the
memberships current at completion. The rename dialog and the row-action
notice are `shell.overlay` entries fed by apply-closure observables through
the faces' `hooks`; the archived notice switches the archived filter
directly. WorkspaceBrowser threads no action callbacks, renders no toast,
and hosts no rename dialog; its title double-click raises the same rename
request.

In ui-primitives, `MenuItemButton` is the plain `role="menuitem"` row for
menus whose rows are components: it shares a data row's markup and styling
and needs no shared state, because `Menu` decides the keyboard walk from the
DOM and now runs the post-selection focus return once on the list's click
bubble for every row kind. `Menu` accepts such rows as `children` beside
`items`, which becomes optional together with `onSelect`; `separatorBefore`
lets a row start a group with the same hairline a separator entry draws. The
context-based `MenuAction` goes away with its extension group.
2026-09-20 12:20:24 +08:00
creatixchu aac990d2d4 test: cover desktop lookup fallbacks and cancel native fixture work 2026-09-20 12:20:04 +08:00
mektpoy 63190fc870 fix(client): unify the plugin identity colour on label-tertiary
Review feedback on this PR: keep one identity colour rather than raising the
card subtitle to label-secondary. The detail-page package name moves from
label-caption to label-tertiary; the settings card subtitle keeps its own
colour and shares only the 12px size with the row it expands into.
2026-09-20 12:19:13 +08:00
imccyu 5ca9b77c44 test(client): expect the pin row ahead of the session menu actions
master's session row menu now leads with Pin session and SessionNode
carries pinned/archived, so the slot-action specs and the Web golden take
the row as it is after the rebase.
2026-09-20 12:17:48 +08:00
Magolor d849d656a5 fix(client): use baseline menu primitive 2026-09-20 12:17:48 +08:00
Magolor 4db234b408 fix(client): align session action slot contract 2026-09-20 12:17:47 +08:00
Magolor fec5c888c4 fix(client): preserve session action slot contract 2026-09-20 12:17:47 +08:00
Magolor cfcd3f3b0e test(client): cover session action focus handoff 2026-09-20 12:17:47 +08:00
Magolor e5a72d73df feat(client): add extensible session menu actions 2026-09-20 12:17:47 +08:00
creatixchu a8c5ca85a1 test: cover Linux associations and native Windows Shell handoff 2026-09-20 12:15:15 +08:00
creatixchu a1545a9bf5 feat: share file associations across macOS Windows and Linux 2026-09-20 12:10:54 +08:00
Dudu-0223 f44b78a622 fix(session): complete parent catalogs while isolating child failures 2026-09-20 12:09:57 +08:00
creatixchu 219bbe47c7 feat: reuse the opening menu in a larger preview action 2026-09-20 12:00:03 +08:00
Dudu-0223 c08ead6900 Merge remote-tracking branch 'origin/master' into fix/lazy-subagent-migration
# Conflicts:
#	packages/client/ui-plugin-manager/tests/components.client.spec.tsx
#	packages/client/ui-workspace/README.i18n.yaml
#	packages/client/ui-workspace/README.md
#	packages/client/ui-workspace/README.zh.md
2026-09-20 11:58:21 +08:00
creatixchu 71b7bbeb88 fix: wait for file associations before enabling the default action 2026-09-20 11:55:48 +08:00
creatixchu 6111f879fd test: verify shared opener menu toggling and SSH visibility 2026-09-20 11:50:40 +08:00
creatixchu 5c409c39bc fix: type shared opening fixtures and document default actions 2026-09-20 11:48:58 +08:00
creatixchu e969aaff58 refactor: share compact opening controls for files and directories 2026-09-20 11:46:50 +08:00
lsdsjy c74c8bc471 Merge origin/master into feat/desktop-welcome-and-window-controls 2026-09-20 11:37:38 +08:00
lsdsjy f20c3e6a87 fix(desktop): align welcome typography and action sizing 2026-09-20 11:31:41 +08:00
lsdsjy f0a35eba0d feat(credentials,ui-settings-account): display bonus wallets separately 2026-09-20 11:31:41 +08:00
lsdsjy 0c0789e4df fix(deepseek-account-platform): identify embedded desktop requests 2026-09-20 11:31:41 +08:00
lsdsjy 9b53f0abbb fix(ui-settings-account): center collapsed account avatar 2026-09-20 11:31:41 +08:00
lsdsjy fb829bfc5c fix(desktop): refine welcome sign-in and workspace entry focus 2026-09-20 11:31:41 +08:00
lsdsjy 2d0f431181 feat(deepseek-account,ui-settings-account): display profile avatars with icon fallback 2026-09-20 11:31:41 +08:00
lsdsjy adcd85c08a fix(deepseek-account-platform): preserve client type in login completion redirects 2026-09-20 11:31:41 +08:00
lsdsjy 4232634dd7 fix(desktop): keep workspace hidden during startup activation 2026-09-20 11:31:41 +08:00
lsdsjy 575de9ccbd fix(ui-settings-account,deepseek-account): reset copy feedback and retain successful profiles 2026-09-20 11:31:41 +08:00
lsdsjy 52d5ecd7c6 fix(desktop): update welcome copy and remove forced preview 2026-09-20 11:31:41 +08:00
lsdsjy d952001c8c fix(ui-settings-account,desktop): adopt shared menu styling after master rebase 2026-09-20 11:31:41 +08:00
lsdsjy 68f8d32d83 fix(desktop,deepseek-account): share platform headers for Host API requests 2026-09-20 11:31:40 +08:00
lsdsjy 8cadbe8655 fix(desktop): clean up embedded views and complete packaged startup 2026-09-20 11:31:40 +08:00
lsdsjy d9456b9464 fix(ui-settings-account): fall back to masked contact in sidebar 2026-09-20 11:31:40 +08:00
07akioni 31b9b5cb77 fix(account-controller): declare generated schema dependency 2026-09-20 11:31:40 +08:00
lsdsjy d58c8cfcde fix(desktop): reconcile welcome startup with current update lifecycle 2026-09-20 11:31:40 +08:00
lsdsjy fe6702cb20 feat(credentials): configure inference origin and discard mismatched account grants 2026-09-20 11:31:40 +08:00
lsdsjy b73a2c8d2d fix(desktop,credentials,ui-settings-account): configure embedded deployment and disable label selection 2026-09-20 11:31:40 +08:00
lsdsjy 3402c95291 fix(ui-settings-account): hide account tab while signed out 2026-09-20 11:31:40 +08:00
lsdsjy 5b7195e032 feat(desktop,credentials,client): update sign-in protocol and Platform experience 2026-09-20 11:31:40 +08:00
lsdsjy 048297321a feat(desktop,credentials,client): integrate DeepSeek account sign-in and Platform pages 2026-09-20 11:31:40 +08:00
lsdsjy 753eff67b1 feat(desktop,client): add the native welcome window 2026-09-20 11:31:27 +08:00
Huanqi Cao 94a2d4af28 Merge remote-tracking branch 'origin/master' into fix/windows-acl-delete-escape
# Conflicts:
#	docs/config-catalog.i18n.yaml
2026-09-20 11:17:22 +08:00
creatixchu c6c9da3eba chore: retire the removed path-action unknown-cast baseline 2026-09-20 11:03:54 +08:00
creatixchu dd39d56af5 test: remove legacy unknown assertion from path-action fixture 2026-09-20 11:02:45 +08:00
creatixchu 79798d8c5a fix: satisfy package publication and file-action coverage gates 2026-09-20 11:00:05 +08:00
imccyu 4b02d03ed5 test(session): compare the forked cold row's recency with the list formula
The cold row's updatedAt is the later of the header's creation time and the cached last prompt; the fork's creation time is wall-clock and can trail the inherited prompt by a millisecond, so the restart test asserts the same maximum instead of the prompt time alone.
2026-09-20 10:54:20 +08:00
creatixchu 0c3045d488 fix: validate native metadata and refresh generated source references 2026-09-20 10:45:21 +08:00
creatixchu 5325babc7b test: cover default native command adapter selection 2026-09-20 10:43:06 +08:00
creatixchu e435340eff test: exercise application selection through the recorded Web session 2026-09-20 10:41:48 +08:00
creatixchu 0ae1b2f91c docs: describe native file application selection and platform scope 2026-09-20 10:39:42 +08:00
creatixchu 0839011204 fix: include native association types in client compilation 2026-09-20 10:37:11 +08:00
creatixchu 03d44191b3 fix: expose browser-safe file association metadata to Remote generation 2026-09-20 10:35:56 +08:00
creatixchu 97877bd8b4 test: cover file handler selection and shared path authorization 2026-09-20 10:34:24 +08:00
creatixchu d6d9d47c49 fix: constrain application icon pixels before transport 2026-09-20 10:32:57 +08:00
creatixchu 39bde1a5c9 feat: query file applications for sidebar opening (#4562) 2026-09-20 10:31:32 +08:00
imccyu de055efa9a test(session): list a forked Session's cached title after a Host restart
A real fork made through sessions.fork is checkpointed into the projection cache, the Context is disposed, and a Host booted over the same storage root serves the fork's title and list metadata from the header alone, as a kind: 'cached' block, without inspecting or opening the log.
2026-09-20 02:04:37 +08:00
imccyu fd76c9534f docs(session): sync the client merge-rule prose with cached and sequenced rows
The session-controller README, the per-session store JSDoc, and the projcache predecessor-recovery and durable-web-queue-recovery notes described one higher-seq-wins rule and the asOfSeq -1 title hint. They now state that higher-seq-wins applies among Host-sequenced values, that cached list blocks yield to the connected Session's baseline, and that the predecessor title carries its stored row's watermark under kind: 'cached'.
2026-09-20 01:48:34 +08:00
imccyu 6ab579b643 fix(web): label the assembled-remote fixture's list projection blocks
The built-client fixture served newly created Sessions with a control-baseline block as their list projections. Since SessionProjectionHints requires `kind`, the real client's applyListBlock would have hit assertNever on it; the created Session is live on the fixture Host, so its block is sequenced.
2026-09-20 01:48:33 +08:00
imccyu f3310dc746 docs(session): record the list block kind decision and cross-link the client merge rules
The listing identity note describes the `kind` field, rejects routing on the -1 sentinel, and links the projcache predecessor-recovery and projection-owned client state notes; the latter's client merge rules now distinguish Host-sequenced rows from cached list hints.
2026-09-20 01:31:52 +08:00
imccyu c4d40864fd fix(client): route list projection blocks by kind
A `sequenced` list block merges key by key under higher-seq-wins like any Host-computed value, so a delayed control baseline at a lower cut can neither overwrite nor clear a newer live-session list value. Only a `cached` block goes through applyCached and yields to every sequenced write. The projection store's module docs describe the two row kinds.
2026-09-20 01:31:52 +08:00
imccyu 1b51a1ad2d fix(session): label list projection blocks with their sequence space
SessionProjectionHints gains a required `kind`: `sequenced` when the Host's live registry computed the block for an attached Session, `cached` when a header-only listing viewed it from the persisted projection cache. `asOfSeq` stays the producer's own watermark in that space, so the cache read faces report the lowest served row seq again instead of the -1 sentinel. The two fields are independent: `kind` names the sequence space, `asOfSeq` the position in it.
2026-09-20 01:31:52 +08:00
imccyu 2ef33c7f28 docs(session): record the projection cache listing identity decision
Agent Note for the lifecycle identity read-only face and the client store's cached/sequenced row kinds: mechanism, rejected alternatives, and what stays untouched.
2026-09-20 01:31:52 +08:00
imccyu 9ff8f26450 fix(client): keep list-cached projection rows below sequenced writes
ProjectionValueStore rows are either cached (viewed from the persisted checkpoint by the session list, no comparable seq) or sequenced (computed by the connected Host, seq comparable within the connection). Cached values fill empty keys only; every baseline discards cached rows before seeding, and every frame replaces them regardless of seq, so a connected Session's values always supersede list hints. The list response and api-session/added blocks write cached rows.
2026-09-20 01:31:52 +08:00
imccyu 86ca9de07e fix(session): read cold seeded rows from the projection cache by header
The projection cache read-only face (cachedSnapshot, cachedPredecessorTitle) now matches the lifecycle identity a header witnesses (formatVersion, createdAt, cwd, isSeeded) and serves its rows as a cached block with asOfSeq -1. The fold face (hydratePrepared, write, coldSnapshot) keeps the full identity including the inherited cut. The session list and @ completion drop their isSeeded guards, so forked sessions keep their cached title and list metadata across a Host restart; list-children keeps its body fallback.
2026-09-20 01:31:52 +08:00
Tianyi Cui bfcfc9ed2f Merge pull request #4603 from deepseek-harness/worktree/session-attachment-carriers-20260919
fix(session): restrict attachment discovery to declared event content
2026-09-20 00:38:00 +08:00
Tianyi Cui 85c6e80e0c Merge remote-tracking branch 'origin/master' into worktree/session-attachment-carriers-20260919 2026-09-20 00:27:54 +08:00
Tianyi Cui 4b49137aa6 Merge pull request #4357 from deepseek-harness/worktree/fix-deepseek-files-json-errors
fix(llm): classify malformed Files JSON responses
2026-09-20 00:16:58 +08:00
Tianyi Cui 2319cbe476 Merge pull request #4623 from deepseek-harness/worktree/simplification-skill-survey-20260919
docs: refine simplification discovery and add nine proposals
2026-09-20 00:12:35 +08:00
Tianyi Cui 3f9567a4c9 Merge pull request #4604 from deepseek-harness/worktree/team-opaque-json-20260919
fix(agent-team): preserve opaque JSON in mailbox projections
2026-09-20 00:11:59 +08:00
imccyu 00dac23ba0 Merge pull request #4621 from deepseek-harness/worktree-fix0919
fix: 修复侧边栏 Fork、终端提示与持久 Shell 取消行为
2026-09-19 23:49:59 +08:00
imccyu d8c993a622 docs(shell): clarify queued cancellation regression coverage 2026-09-19 23:31:31 +08:00
imccyu 54b0aae8e6 docs(web): clarify retained subagent status sources 2026-09-19 23:31:31 +08:00
imccyu cdd082c4ae test(web): preserve terminal liveness evidence after layout loss 2026-09-19 23:31:31 +08:00
imccyu a05f2244cf fix(plugins): remove unknown casts from metadata loading and fixtures 2026-09-19 23:05:40 +08:00
imccyu d67545f367 docs: sync catalogs and contracts for session fixes 2026-09-19 23:05:40 +08:00
imccyu 8771607f8b test: cover sidebar fork and persistent shell cancellation regressions 2026-09-19 23:05:40 +08:00
imccyu 9d4fa54c2d fix(shell): settle persistent shell cancellation without throwing its reason 2026-09-19 23:05:40 +08:00
imccyu b7b587692d fix(web): disable terminal recovery and cleanup slots 2026-09-19 23:05:39 +08:00
imccyu a7ce695461 fix(web): position new forks before their source 2026-09-19 23:05:39 +08:00
imccyu 1e48dae2aa fix(web): keep sidebar forks from switching sessions 2026-09-19 23:05:39 +08:00
Dudu-0223 e6e5d95b29 test(session): align migration corpus and CLI expectations with lazy reads 2026-09-19 23:03:38 +08:00
Dudu-0223 2cd032bd28 test(snapshots): retain unchanged child V3 fixtures 2026-09-19 23:00:16 +08:00
Dudu-0223 6362113ef8 Merge master into fix/lazy-subagent-migration 2026-09-19 22:53:29 +08:00
Dudu-0223 1c16bc9a0e test(subagent): use branded descriptor sequence in restored identity 2026-09-19 22:47:59 +08:00
Dudu-0223 a9985b49ae fix(session): migrate historical subagents only when opened 2026-09-19 22:47:01 +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
mektpoy 88ee6039c6 Merge remote-tracking branch 'origin/master' into fix/windows-plugin-list-type-size 2026-09-19 22:33:52 +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
mektpoy bb2326f044 fix(client): raise the plugin package name contrast on the detail page
The package name under a plugin's title is the exact spec that installs it, yet
it was the palest alias in the palette: label-caption, 2.13:1 against white,
lighter than the free-text description below it. Use label-secondary, the same
alias the description uses, for 5.80:1.
2026-09-19 22:24:35 +08:00
imccyu 3863992e67 Merge pull request #4571 from deepseek-harness/worktree-pluginlocale
feat: 插件元信息支持按 export 多语言展示
2026-09-19 22:15:53 +08:00
Xu Hanxiang 128d7d81d0 Merge pull request #4574 from deepseek-harness/fix/4573-browser-use-shared-instances
fix(browser-use): share the installation scope and MCP client instances
2026-09-19 22:04:23 +08:00
Tianyi Cui 4ffc8c7bef docs: clarify survey evidence and proposal cleanup steps 2026-09-19 21:58:03 +08:00
mektpoy faa6986b2b docs(browser-use): use the runtime resolution vocabulary in the instance note
The profile resolution lookup order note, merged today, owns the mechanism this
note describes and names it runtime resolution with an interception layer at
$DSH_HOME/profiles/node_modules. This note adopts that vocabulary and links the
owning record instead of restating the resolution order.

It also records the boundary the sibling experimental providers leave open: a
profile that installs one of them beside this package hoists their
dsh-mcp-client dependency into the profile's own node_modules, so this package's
peer resolves there and the two copies keep separate serverName reservations.
The scope split does not return, because none of them declares dsh-scope.
Issue #4628 tracks moving those declarations to peers.

Refs #4628
2026-09-19 21:53:43 +08:00
mektpoy 3014457c60 fix(client): share one size for the plugin inventory entry identity
Keep the Loader entry id at one size in both places it appears - the card
subtitle and the row the card expands into - by moving the shared code-font
typography into a single rule. The subtitle keeps its own secondary label
colour against the expanded row's primary one.
2026-09-19 21:46:43 +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
Tianyi Cui cf75d1d099 docs: refine simplification discovery and add nine proposals 2026-09-19 21:31:31 +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
Tianyi Cui 3a0d640214 test(llm): show malformed Files payloads in case names
Interpolating an empty body directly produces empty parentheses in the failure title, making the empty-response case harder to distinguish from the truncated JSON case in CI logs.

Use JSON formatting for the existing case object so the operation and body are visible, including an explicit empty string. Keep the same inputs, error classification, original-cause assertions, and single-request checks.
2026-09-19 21:19:46 +08:00
Tianyi Cui 914bd34ea7 test(session-log-export): type attachment fixtures without unknown bridges
The attachment-policy fixtures introduced three assertions to unknown and
changed two previously recorded assertions. The new repository gate rejects
those escape hatches even though the earlier branch CI passed.

Give the user, tool-result, and inbox fixtures their required V4 message
metadata and declared identifier types. Declare the fixture's plugin content
tag through ContentBlockMap, and check the flat tool-result fixture directly
as its concrete SessionEvent type. Keep intentional malformed inbox entries
and opaque extension fields in the existing negative cases.

Remove all five unknown bridges without adding allowances. Delete the two
baseline entries retired by the rewritten existing fixtures; the other
three assertions were never part of the accepted baseline. Attachment
runtime code and the tests' access-denial and complete-log assertions remain
unchanged.

Validation: the Host TypeScript aggregate and all 52 archive tests pass.
verify-no-unknown-casts reports no new or stale entries, with 1575 existing
assertions remaining; the baseline adds zero allowances and retires two.
2026-09-19 21:19:32 +08:00
Tianyi Cui d4ff95c8e2 docs(llm): distinguish Files JSON decoding from metadata validation
The operation, HTTP status, and parser cause added by responseJson belong to JSON decoding failures. Existing metadata validation also uses INVALID_RESPONSE but does not provide those fields, so the broader phrase parsing failures promises too much.

Limit the README guarantee to JSON decoding and keep metadata-validation behavior unchanged. Keep the Agent Note focused on why the existing INVALID_RESPONSE code is used without inferring a transport retry, and link to the README for the error-field details. Update both languages and their pairing records.
2026-09-19 21:19:07 +08:00
Dudu-0223 ec441c1ac9 test(subagent): synchronize delegation snapshots and refresh PowerShell prompts 2026-09-19 21:17:13 +08:00
Tianyi Cui 0c44e5461d fix(session): restrict attachment discovery to declared event content
Attachment reads and ZIP export previously inferred ownership from common
field names on arbitrary events. Opaque ignorable plugin payloads could
therefore cause storage reads, while declared compaction content was missed.

Select attachment-bearing fields by current built-in event type in both
readers. Read direct image and file blocks, including flat V4 tool results
and developer messages, without interpreting extra block fields. Leave
unknown payloads and malformed inbox entries opaque. The archive preserves
the complete logical log even when its payload does not authorize a read.

V4 validates title requests as one text block, so do not treat them as an
attachment carrier. Compaction keeps its declared ContentBlock fields for
valid custom producers; the basic producer's text-only output is documented.
Historical wrappers remain the adjacent converters' responsibility rather
than a second compatibility path in attachment readers.

Adapt the original policy change to master after V4 landed, retaining its
author credit and scope. Cover tool-result export explicitly, keep Team
fixtures free of invented message roles, and verify that denied carriers
never read storage. The 889 owning tests pass with 100% statement, branch,
function, and line coverage for both changed runtime files.

Co-authored-by: Tianyi Cui <[email protected]>
2026-09-19 21:08:29 +08:00
Dudu-0223 955c9d255a fix(subagent): align catalog consumers and integration coverage 2026-09-19 21:04:01 +08:00
mektpoy 4167b60997 Merge remote-tracking branch 'origin/master' into fix/4573-browser-use-shared-instances 2026-09-19 21:03:19 +08:00
Tianyi Cui df3f4477ea test(agent-team): type opaque JSON fixtures without unknown assertions
The new no-unknown-casts check rejects two assertions introduced by these projection regressions. Both fixtures intentionally represent unknown content: malformed input sent to the admission checks, and a cached plugin block whose opaque field was already lost.

Declare those inputs as unknown variables instead of asserting their expressions to unknown. Keep the same malformed values, content assertions, checkpoint replay, and production validation. Do not expand the recorded cast allowances or change any runtime behavior.
2026-09-19 20:59:52 +08:00
Tianyi Cui f56aecb314 test(agent-team): remove an unused store from checkpoint restoration
The cold checkpoint regression calls only the projection registry register and restore methods. Neither needs SessionStore, so mounting and disposing that extra service obscured the fixture dependency. Keep the registry lifecycle and the recovered-content assertion unchanged.
2026-09-19 20:59:52 +08:00
Tianyi Cui 50d38688be docs(agent-team): state the local content validation scope precisely
The Team projector declares only a subset of current content validators; the existing file and image validator gaps are not fixed by opaque JSON preservation. Limit the new prose to those local validators instead of promising full ContentBlockMap validation.

Keep cache behavior in the README and invalidation rationale in the existing decision note. Document why unknown JSON objects pass through by reference without changing any parser branch or expanding this repair into unrelated validation policy.
2026-09-19 20:59:52 +08:00
Tianyi Cui 1e6630a856 fix(agent-team): preserve opaque JSON through mailbox projections
A valid unknown content block can own a __proto__ JSON field. Zod object reconstruction silently drops that key when Team events are projected and when checkpoints are admitted, even though the original Session log still contains it.

Validate the unknown block tag without reconstructing its decoded JSON fields. Keep the current V4 local validators and the rejection of retired tool-result content. Bump only the Team projection cache stateVersion from 3 to 4 so old lossy checkpoints are rebuilt from the unchanged log; this is not a Session format or schema change.

Cover direct and nested opaque JSON fields inside accepted native V4 content, plus public registry restoration from an older lossy checkpoint. Historical tool-result conversion remains owned by the Session migration and is not restored in the Team parser. Update the README and existing Team decision rationale together.

Adapted from the Team JSON preservation work in b8f1da92599123e5d5bae6c174f73b5b778f3554 by Tianyi Cui.

Co-authored-by: Tianyi Cui <[email protected]>
2026-09-19 20:59:52 +08:00
Tianyi Cui d6a0e3323e fix(llm): classify malformed Files JSON responses
Empty or truncated successful Files API bodies currently escape as bare SyntaxError values. They omit which Files operation failed and the successful HTTP status, obscuring the diagnostic while the caller still needs to reject the response.

Route upload, list, retrieve, and delete JSON parsing through one helper that converts only SyntaxError to LlmError INVALID_RESPONSE. Preserve the operation, HTTP status, and original parser cause; transport and cancellation failures retain their original identity. Do not introduce retries or reinterpret malformed JSON as a successful response.

Keep regressions for both Messages and Chat Completions, all four operations, empty/truncated bodies, single request execution, and non-parser error identity. This improves classification and diagnostics without claiming to repair the remote cause of intermittent empty responses.

Co-authored-by: Tianyi Cui <[email protected]>
2026-09-19 20:59:51 +08:00
Tianyi Cui b1dbe92356 Merge pull request #4618 from deepseek-harness/worktree/fix-migration-json-typing-20260919
fix(test): type migrated JSON without an unknown cast
2026-09-19 20:57:47 +08:00
Tianyi Cui 77bcc35adb fix(test): type migrated JSON without an unknown cast
The merged concurrent migration test used an as-unknown widening assertion after JSON.parse. Master now rejects newly introduced unknown casts, so that test blocks the repository gate and unrelated PR validation. Give the map callback an explicit unknown return type instead. Keep the gate baseline unchanged; parsing and assertions have the same runtime behavior.
2026-09-19 20:52:09 +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
mektpoy 76f0422653 Merge remote-tracking branch 'origin/master' into fix/4573-browser-use-shared-instances 2026-09-19 20:32:48 +08:00
Tianyi Cui a22ac3284d Merge pull request #4611 from deepseek-harness/worktree/parallel-v4-corpus-migration-20260919
perf(session): parallelize V4 migration with JSON reports
2026-09-19 20:27:44 +08:00
Tianyi Cui fafa154a14 Merge pull request #4610 from deepseek-harness/worktree/prohibit-as-unknown
feat(infra): prohibit new unknown casts and clean up existing uses
2026-09-19 20:27:11 +08:00
Tianyi Cui 84659abe3d docs(session): clarify bulk migration cache ownership
Name the JSONL backend and explain that its cache reuses recently decoded logs. This makes the bounded-batch rationale concrete without duplicating private implementation constant names in the operational description.
2026-09-19 20:19:43 +08:00
imccyu a9f205c584 refactor(plugins): rename PackageMeta to PluginLocalizedMeta 2026-09-19 20:19:08 +08:00
imccyu acec2ba713 docs(plugins): document PluginLocalizedMeta type name 2026-09-19 20:19:08 +08:00
imccyu 8ceaa725e0 build(plugins): validate locale resources and refresh catalogs 2026-09-19 20:19:07 +08:00
imccyu 0d611ea151 feat(web): display plugin-owned locale metadata 2026-09-19 20:19:04 +08:00
imccyu 0b7cb4102b feat(plugins): resolve installed metadata through runtime resource exports 2026-09-19 20:19:04 +08:00
imccyu f8240240fa docs(plugins): define localized display metadata and fallback rules 2026-09-19 20:19:03 +08:00
Tianyi Cui 0e46c4ed26 docs(session): specify fatal migration job behavior
An unexpected visitor rejection represents a batch-level programming or reporting failure, rather than a normal per-Session refusal. The scheduler already drains its active workers before surfacing it and does not start deferred retries. State that behavior explicitly so callers do not assume the retry pass runs after a fatal batch failure.
2026-09-19 20:18:58 +08:00
Tianyi Cui 0ab7976461 test(session): exercise the source-change retry through the CLI
The parent-child integration case can succeed without observing a race, while scheduler-only tests do not exercise the actual error classification or CLI output. Inject one genuine source-change error at the persistence open boundary in an isolated child process, then delegate to the real backend. Assert DEFERRED, completion of the other input, one RETRY, preserved source bytes and the resulting parent catalog. This adds no production test hook or timing-based race.
2026-09-19 20:18:41 +08:00
Tianyi Cui 33d93ab155 fix(session): accept safe numeric job-count overrides
The command promises any positive safe integer, but its additional decimal-spelling regex rejected valid expert overrides such as 1e2 and +1. Let Number parse the supplied value and retain the positive safe-integer check. This preserves the CPU-based default cap while allowing equivalent numeric spellings and larger explicit values.
2026-09-19 20:16:30 +08:00
Tianyi Cui 0dd9a282b8 test(session): clean migration fixtures without traversing junctions
The source-entry regression creates a Windows junction to the real checkout. Its local unlink normally removes it, but fallback teardown must remain safe if that unlink fails. Use the repository fixture cleanup helper to unlink reparse points before recursive deletion and retain its bounded Windows handle-release retries. This changes only test resource cleanup.
2026-09-19 20:14:54 +08:00
Tianyi Cui e65d349de3 fix(infra): reconcile cast baseline with Session V4 master 2026-09-19 20:13:58 +08:00
Tianyi Cui fd0654e96b fix(infra): stabilize cast fingerprints and reject unknown unions 2026-09-19 20:13:58 +08:00
Tianyi Cui 580bdc7258 refactor: remove redundant unknown casts 2026-09-19 20:13:58 +08:00
Tianyi Cui c5d775d437 feat(infra): prohibit new assertions to unknown 2026-09-19 20:13:58 +08:00
Dudu-0223 bc45bd821a Merge pull request #4530 from deepseek-harness/fix/compaction-threshold-reserves-completion
fix(compaction): reserve output tokens and 64K pressure headroom
2026-09-19 20:10:38 +08:00
Tianyi Cui f476a25de3 feat(session): emit structured corpus migration summaries
A text error list does not show how failures are distributed across historical source versions or let developers aggregate repeated rejection reasons. Emit and save the same JSON report with per-version outcomes, stable failure groups and per-input diagnostics, plus runtime, checkout and report locations. Keep source versions from physical discovery rather than migrated handle headers.

Classify only known diagnostic fields such as unexpected members, unknown events, child prerequisites and sequence gaps. Preserve original messages and use an explicit fallback for other failures; the report makes no inference about historical producer bugs and cannot influence admission or retry decisions. Regression checks cover printed/file/log equality, private report files, grouped distinct sequence coordinates and source-file preservation.
2026-09-19 20:00:11 +08:00
Dudu-0223 ec7030afd3 fix(compaction): default summary output cap to headroom 2026-09-19 19:56:54 +08:00
Dudu-0223 9b016b6425 refactor(compaction): require an explicit output reservation 2026-09-19 19:56:53 +08:00
Dudu-0223 555b664b08 fix(compaction): reserve configurable 64K pressure headroom 2026-09-19 19:56:53 +08:00
Dudu-0223 b02b20d713 fix(compaction): pin output caps and cover proactive reserve replay 2026-09-19 19:56:51 +08:00
Dudu-0223 a1cebebd40 refactor(compaction): drop the spec's reservedCompletionTokens field
Review follow-up: nothing consumed the field. The reserve stays an input to
`resolveCompactSpec`, whose returned budgets already express its effect, so
`ResolvedCompactSpec` keeps its exported shape.

Note the name collision a consumer would have hit: `ResolvedTargetPolicy.maxTokens`
is the compaction *summarization* output cap (default 8192), not the routed
request's cap reserved from the same window.
2026-09-19 19:56:51 +08:00
Dudu-0223 0fadb08fbd fix(compaction): gate pressure on the message budget, not the whole window
Proactive pressure scaled `thresholdRatio` by the routed model's entire
context window, but a request also reserves output tokens the provider
charges to that same window — the LLM service deliberately never clamps
them (`packages/llm/llm/src/index.ts`).

With a 1,000,000-token window and the default 256,000-token request cap the
gate therefore sat at 800,000 while the provider refused any prompt above
792,576. Observed in a real session: three requests died at 792,850 /
797,639 / 793,352 message tokens ("maximum context length is 1048576 ...
you requested 1048850 tokens"), no pressure compaction ever fired, and the
overflow recovery that did run could not condense an ~800k-token history
into the 8192-token summary cap.

Scale both ratios by the message budget left after the reserve, sourced from
the effective request envelope's `maxTokens` and falling back to the
adapter's per-request output default. A reserve that leaves no message
budget reports a target-specific pressure configuration error, matching the
existing per-route warning policy rather than silently disabling proactive
compaction. The headless compaction e2e advertises a coherent capacity/cap
pair so its 8000-token message budget and 4000-token threshold are unchanged.

Related #1841
2026-09-19 19:56:51 +08:00
Tianyi Cui e105557046 perf(session): parallelize V4 corpus migration
Sequential corpus migration waits for each Session to finish I/O and publication verification before starting the next. Use a bounded queue with one shared persistence Context, defaulting to available CPU count capped at 16. Expert --jobs overrides accept any positive safe integer. Stable input indices and separate completion counts keep interleaved progress useful for large corpora without opening every log simultaneously.

A concurrently upgraded child can invalidate its parent evidence. Preserve the backend revision checks and defer only the explicit source-change error for one serial retry after initial work drains. Corruption, unsupported formats and writer locks remain failures; historical files and existing V4 data remain unchanged. Deterministic scheduler tests cover 10,000 inputs, bounded overlap and retry ordering, while real raw/zstd corpora verify parent catalogs and serial-equivalent output. Performance timing was stopped at user request because the host has competing workloads.
2026-09-19 19:49:30 +08:00
Tianyi Cui 0fa88d4875 Merge pull request #4320 from deepseek-harness/release/session-log-v4
feat(session): introduce Session format V4
2026-09-19 19:44:48 +08:00
mektpoy 31925760ca Merge remote-tracking branch 'origin/master' into fix/4573-browser-use-shared-instances 2026-09-19 19:31:56 +08:00
mektpoy 73bf301227 Merge remote-tracking branch 'origin/master' into fix/windows-menu-tooltip-overlap 2026-09-19 19:30:41 +08:00
mektpoy 656066e0a1 Merge remote-tracking branch 'origin/master' into fix/windows-directory-junction
# Conflicts:
#	packages/api/workspace-files/README.i18n.yaml
#	packages/api/workspace-files/README.md
#	packages/api/workspace-files/README.zh.md
2026-09-19 19:28:00 +08:00
Tianyi Cui 8dc1d0e3ed feat(session): add one-time V4 corpus migration command
Give developers one pnpm command to exercise the release migration against their own Session roots. Inventory physical generations so malformed entries remain visible, then reuse JSONL write-open locking, validation, and exclusive successor publication with the full root available for child-catalog evidence. Open existing V4 files read-only and preserve every historical generation.

Report each selected source and outcome, continue after individual failures, repeat all errors at the end, and retain a private temporary report with checkout/runtime details and full causes. A failed run exits nonzero. Explicitly close handles because source-launch await-using lowering inside a loop can retain a previous iteration error. Real-entry regressions cover raw/zstd tool-result conversion, repeated runs, unchanged originals, failure continuation, and unsupported layouts. Document the command in the migration cookbook.
2026-09-19 18:51:42 +08:00
Tianyi Cui b28fca7e87 docs(session): correct incomplete child evidence migration policy
The V4 acknowledgement still said missing child descriptors reject migration. The converter already skips backfill when a child has no single supported own descriptor, while explicit identity, timestamp, and mode conflicts still reject publication. Align both language versions with that behavior so release reviewers and corpus testers do not expect an obsolete refusal. Preserve every machine acknowledgement and schema fingerprint.
2026-09-19 18:51:32 +08:00
Tianyi Cui 370e1efcdb test(session-reference): use declared plugin sources in V4 fixtures
The conversation fixture used an undeclared goal source and forced it
through MessageSource with a double assertion. That bypassed the V4
producer-owned source types instead of exercising an input accepted by
createUserMessage.

Use the fixture's existing declared test source for both injected plugin
messages and remove the unused MessageSource import. The resolver excludes
all non-user, non-checkpoint sources, so these cases do not depend on goal
identity or need a goal-package dependency. Message content, event order,
captured sequence numbers, and every projection assertion stay unchanged.

Validation: all 49 session-reference tests pass, the Host TypeScript
aggregate passes, and the diff passes whitespace checks.
2026-09-19 18:22:32 +08:00
Tianyi Cui fdff56c293 fix(cli): drop retired link-mode override after master integration
The release branch still passed resolutionMode: link from the source CLI
and documented a separate link/runtime selector. The integrated master
has removed that selector and its materializer in favor of one runtime
resolver that also supports source launches. The spread kept compiling
because excess-property checking did not reject it, but the property was
ignored by runProfile and the retained prose contradicted the runtime.

Remove the dead option/comment and its obsolete bilingual paragraph.
The CLI entry and the architecture note now match the integrated master;
keep source-module identity verified through its real source-launch and
tool-execution tests. This retires an old integration workaround, without
changing Session V4 or restoring a second profile resolution backend.
2026-09-19 18:03:33 +08:00
Tianyi Cui 5da1515286 test(cli): inspect flat V4 results in source launch smoke
The new master source-tool smoke reads isError and content from a V3
nested tool-result block. After integration with the V4 release, that
block no longer exists: the durable message itself has role tool,
toolCallId, isError and result content. The old assertions fail to
compile and cannot verify the current writer's output.

Read the existing V4 fields while retaining the real source-profile
launch, single Tools instance, call identity, sandbox error and shell
output checks. Do not impose the old single-wrapper cardinality on the
flat content array. This adapts the incoming regression test without
changing the V4 format, migration implementation or stored recordings.
2026-09-19 18:01:49 +08:00
Tianyi Cui 8b0b2dc1d8 Merge master b86916de into release/session-log-v4
Integrate the master tip observed for the final V4 landing preparation on
top of the already merged migration stack. Preserve the V4 writer, flat
message migration, extension policy, catalog validation and historical
recordings while bringing in upstream profile resolution and desktop/UI
changes.

Resolve four generated translation-pairing records from the combined
English/Chinese text. Keep this master checkpoint separate from any
integration fixes and retain all reviewed parent history. Follow-up
validation covers the affected launch/UI paths and migration replay.
2026-09-19 18:00:36 +08:00
Tianyi Cui 2e061ec93f Merge pull request #4583 from deepseek-harness/worktree/v4-lossless-tool-results-20260919
fix(session): preserve extensions while flattening V3 tool results
2026-09-19 17:51:02 +08:00
Tianyi Cui 56f8c7f51b docs(session): keep migration mappings specific to each edge
The cookbook previously promoted plugin prefixes and owner separation into a general requirement. That overstates the migration policy: direct source kinds and ordinary metadata need no new namespace solely because they are extensible.

Require each edge to document only the mappings its target needs and why, preserve nested opaque data, and permit alpha refusal of unexpected source fields that would otherwise acquire new target meaning. Exact V3 source and ToolSchema choices remain in the V3-to-V4 README; no runtime, schema, or provider behavior changes.
2026-09-19 17:27:14 +08:00
imccyu b3961e06a0 Merge pull request #4608 from deepseek-harness/worktree-removelink-rename
refactor(boot): rename the profile resolution generation to the runtime resolution
2026-09-19 17:25:04 +08:00
Tianyi Cui bb81d312ae docs(session): scope extension prefixes to declared mappings
The convention identifies how an edge preserves the identifiers and extension fields that it explicitly maps; it does not require every extension-owned field in every source slot to be renamed.

Keep the cookbook general enough for preserved stream-start extras while retaining the exact field-owner mappings documented by each migration edge. This changes policy wording only, not the current V4 schema or conversion implementation.
2026-09-19 17:20:53 +08:00
Tianyi Cui 7528528007 test(session): name the wrapper pass-through assertion precisely
This case calls only liftToolResult; the native validator has separate coverage. Name the behavior actually asserted so the test title does not claim both paths are covered by one assertion. Assertions and production behavior are unchanged.
2026-09-19 17:20:53 +08:00
Tianyi Cui 3e31760bc7 docs(session): explain historical result field ownership
The flat result conversion prefixes every extension-owned field, not just names currently colliding with core fields. Correct the cookbook wording to match that complete mapping.

Record why retaining opaque message and wrapper owners does not invent a shared owner or a new core metadata field. The deliberate costs are retaining duplicate opaque values and requiring plugin consumers to use V4 names; the first-class tool-message decision and runtime implementation stay unchanged.
2026-09-19 17:20:53 +08:00
Tianyi Cui 4ab9101271 docs(session): state the flat result converter failure contract
The exported converter rejects malformed wrappers with SessionFormatError in addition to refusing unsupported nesting. Document both failure categories so callers can distinguish corruption from a converter support limit.

Remove the obsolete claim that recorded replay compares serialized field order: the native-writer parity assertion compares parsed objects. The emitted fields and their order remain unchanged.
2026-09-19 17:20:53 +08:00
Tianyi Cui 45ce6ef21d docs(session): clarify converter fixes leave existing successors intact
An incoming converter runs only when a historical generation is selected. Fixing a mapping after the target ships does not revisit already-produced target files, so allowing compatible converter fixes must not imply repairing those files automatically.

Keep the user-approved ability to extend or correct historical conversion without a target version bump. Require documentation of changed accepted mappings and continued support for existing outputs, and distinguish that work from changing target representation or interpretation incompatibly. Keep operational alpha guidance in the cookbook and the owning decision note focused on the runtime facts.
2026-09-19 17:20:53 +08:00
Tianyi Cui c7923096c7 test(session): bind tool-result parity to retained V3 replay
The parity assertion previously compared a fixed V3 log with whichever generation the ordinary scenario selected. A legitimate V4 re-recording could change call ids and make the assertion compare different model inputs.

Run an additional replay-only variant through the existing headless runner with both its replay file and migration expectation bound to the retained V3 recording. Keep the ordinary scenario on its highest generation, retain call ids in the comparison, and preserve every committed recording.

Validation: the ordinary replay, retained-V3 replay, and old-wrapper negative control pass. Changing only the latest V4 call ids makes the former assertion fail but leaves the corrected retained-V3 replay passing; both fixture and source bytes are restored after this control.
2026-09-19 17:20:53 +08:00
Tianyi Cui e90c55e0ab docs(session): distinguish converter support from target compatibility
The compatibility obligation belongs to the released target format.
An incoming converter can be fixed or support more historical inputs after
the target ships, as long as its output preserves that target's meaning.
Alpha releases may reject valid historical cases without an implemented,
evidenced mapping instead of expanding the format for speculative inputs.

Record the native-writer oracle, pre-normalization comparison, supported
flat V4 tool-result representation, uniform plugin naming, owner collision
rules, retained source files and read-only private corpus handling in the
migration cookbook. Align the existing architecture note with this rule;
keep native target changes and source conversion fixes distinct.

This updates contributor guidance only. It does not change finalization
checkpoint machinery, existing V4 schemas, or any released codec.
2026-09-19 17:20:53 +08:00
Tianyi Cui 1e7686b2c9 test(session): compare migration with raw native writer output
The ordinary snapshot comparator prepares both inputs through the current
format catalog. That can hide a writer still emitting an old tool-result
wrapper: both sides become the same normalized representation.

For the existing stock tool-call-turn replay, explicitly migrate its
retained V3 recording and compare result message fields with the freshly
harvested native log before format normalization. Check both generation
headers and remove only the generated message ID from this comparison.
Do not use the scenario's selected V4 successor as the migration input.

Add a negative control whose header claims the current writer while its
body keeps the V3 wrapper; the raw comparison must reject it. The same
shipped headless profile and stock bash tool provide the positive case.
Keep all recordings and their selected generations unchanged.
2026-09-19 17:20:53 +08:00
Tianyi Cui 0c8180c9b6 fix(session): preserve V3 result extensions in flat tool messages
The ordinary V3 writer records a user-role message containing one result
wrapper. V4 writes the same tool output directly in a tool-role message.
Keep that native V4 representation instead of introducing a nested message
content type for hypothetical historical shapes.

Preserve extra historical fields when removing the wrapper. Prefix outer
message fields with plugin:message: and result fields with plugin:result:
so equal names retain their original ownership and cannot overwrite the
interpreted call ID or error flag. Include the complete old name, even
when it is already prefixed, and preserve every JSON value and own key.
Only the validated wrapper supplies the interpreted result fields.

Leave unimplemented nested-result conversion as an explicit refusal that
preserves its source. Describe this as the converter's current limit, not
an impossibility or a reason to extend the established V4 format.

Cover owner/name collisions, opaque special keys, absent error flags,
unchanged sources and strict native reopening through plain and compressed
read/write persistence. No current message type or schema is added.
2026-09-19 17:20:53 +08:00
Tianyi Cui 869367d5d0 test(session): continue catalog backfill after unavailable evidence
Isolated complete/incomplete-child tests did not distinguish skipping one child
from prematurely stopping the entire candidate loop. A stop could therefore
silently omit a later child's fully supported catalog fact.

Pair a complete child with an older unavailable child so deterministic ordering
processes the unavailable evidence first. Cover missing, unsupported-version,
and multiple-descriptor evidence, requiring exactly the complete child's fact
with the correct sequence and timestamp.

A temporary continue-to-break mutation failed all three new cases. Restoring
the implementation passed the focused 19 cases and the complete selected owner
run: 428 passed, one compression-specific skip, with 100% coverage on facts.ts
and migration.ts. This commit changes tests only.
2026-09-19 17:17:29 +08:00
Tianyi Cui e838401a9b docs(session): state incomplete catalog evidence limits
The child-catalog README did not record the lasting missing-entry consequence
under Known Limitations, and its validation wording implied that duplicate or
unsupported descriptors had their discovery fields checked. The converter only
checks those fields when exactly one supported own descriptor is available.

Specify that distinction, retain creation-time checks for existing entries, and
state that current V4 reads do not rescan children to repair an omitted entry.
Document the first-descriptor composition reader and last-descriptor identity
projection accurately: multiple own records violate the establishing provider's
exactly-once rule, so the backfill policy does not choose between those consumer
policies. This corrects the rationale without changing migration admission.

Update the paired English/Chinese package docs and decision note together.
Validation: doc-sync 41/41, full lint, and owner tests passed; production source,
frozen generations, persistence schema, and recorded fixtures are unchanged.
2026-09-19 17:17:29 +08:00
Tianyi CuiandDudu-0223 ade7035fd8 fix(session): preserve parents with incomplete child catalog evidence
A readable V3 child may have no own descriptor, an unknown descriptor version,
or multiple descriptors. Those states do not provide a unique discovery fact,
but they do not make the parent or the retained child history unreadable.
Rejecting the entire parent prevented otherwise valid V3 Sessions from opening.

Append a missing parent catalog row only for exactly one supported own child
descriptor. Keep existing parent entries and every child record when no fact is
available. Retain rejection of mismatched creation times, unambiguous mode/label
conflicts, malformed known fields, unreadable membership and revision drift.

Cover raw and compressed read/write publication, preserved source bytes, late
descriptor availability, inherited descriptors and Preview packing. Document
that unavailable discovery evidence can leave a child absent from its parent
catalog and does not trigger automatic backfill after the V4 successor exists.

Extracts the child-evidence behavior from 7ba7e174dd1 and the Preview regression
from 9c85eb60bd25, preserving the original migration authors' work while keeping
message representation and extension interpretation outside this commit.

Co-authored-by: Dudu-0223 <[email protected]>
2026-09-19 17:17:29 +08:00
Tianyi Cui c6f6aa3293 fix(session): preserve V3 tool-schema metadata keys
The V3 writer on master declares and emits only name, description and
parameters. deferLoading is a first-class V4 persistence addition whose
provider behavior is not implemented yet. Prefixing every historical extra
ToolSchema key changes ordinary plugin metadata without a format need.

Preserve all ordinary tool-definition keys and JSON values unchanged,
including vendor metadata, own __proto__ properties, already-prefixed keys
and nested parameters. Remove the general key-renaming mapper. Reject only
an own top-level deferLoading field in V3 input: there is no established V3
meaning to translate, and the alpha converter may refuse unsupported source
forms rather than invent compatibility semantics. Leave native V4's
optional-true declaration, admission and provider refusal behavior intact.

The regression tests fail on the old mapper for metadata preservation and
unsupported-field refusal. Physical plain/zstd read/write tests verify source
bytes and identity remain unchanged and no V4 successor appears on refusal;
controls preserve nested parameters.deferLoading and native V4 true values.
No Session format/schema change, frozen codec edit, or historical recording
version bump is needed.
2026-09-19 17:15:38 +08:00
Tianyi Cui d5a109c60f fix(session): preserve direct V3 source kinds during wrapper conversion
Convert an unknown legacy plugin wrapper such as
{kind: 'plugin', plugin: 'acme'} into {kind: 'plugin:acme'}, retaining the
complete plugin name after one prefix. Keep the existing explicit
first-party producer renames and preserve all non-identity metadata.

A direct source already records its producer in kind. Reclassifying
unknown direct kinds into plugin:source:<name> needlessly changes that
attribution and forces plugin consumers to adopt new identifiers even
though V4 accepts their existing representation. Return every valid
direct source unchanged, including already-prefixed names. Remove the
obsolete direct-kind table and two-category identity helper rather than
adding collision classification or another mapping layer.

Update the source conversion examples, codec/restore regressions, and
native fixture producers together. Refresh only the owning Python
advanced scenario's unshipped V4 outputs; preserve historical V0-V3
recordings and their generation selection. Event names, content tags,
and ToolSchema migration remain separate concerns.

Refs #2692
2026-09-19 17:11:45 +08:00
imccyu cf3505b88e docs: call the package table the runtime resolution everywhere it is named
The generation note keeps generation for succession only and names the table, the interception, and the routes with the code's words; the CLI reference, Desktop, plugin-package-inventory, and loader-smoke READMEs, the bundled-runtime, agent-teams, plugin-bundles, and source-launch notes, and the client AGENTS guide follow. Pairing records re-recorded.
2026-09-19 17:06:35 +08:00
imccyu f7f22a6b48 refactor(boot): finish the interception vocabulary in code comments and the app-boot README
The Consumer-owned strictness bullet names the Loader subtree that agent presets own instead of the runtime resolution; the service field, its file comment, the dispose JSDoc, and the route JSDoc use interception; the native-after-interception route documents both anchors it can carry; stale module-fallback comments name the runtime resolution; importFromResolution matches its parameter.
2026-09-19 17:06:35 +08:00
imccyu b605d114bd docs(boot): finish the runtime resolution terminology in the generation and desktop notes 2026-09-19 17:06:35 +08:00
imccyu c0f34b4bcd docs(boot): name both installation anchor sources
The CLI derives the installation anchor from import.meta.url and the Desktop Host builds it from its runtime directory; neither is a symlink, so the installation root is kept as given. The note and the traversal comment say so instead of attributing every launcher to import.meta.url.
2026-09-19 17:06:35 +08:00
imccyu 06b0ff9560 docs(boot): describe the installation closure size without point-in-time counts 2026-09-19 17:06:35 +08:00
imccyu 058d1d779b docs(boot): keep the ancestor chain code block language neutral
The numbered chain lists directories only; the legend for ①-⑤ moves into prose so both language sides can read it while the code block stays byte-identical for the pairing gate.
2026-09-19 17:06:35 +08:00
imccyu 9848ac75f2 test(cli): explain the sandbox-unavailable acceptance in the source tool smoke 2026-09-19 17:06:35 +08:00
imccyu 048fc3e580 docs(boot): state that the installation anchor is already a real path
The lookup-order note records that the launcher derives the installation anchor from import.meta.url, so bundle discovery and dependency traversal start from the same real directory.
2026-09-19 17:06:35 +08:00
imccyu 15e07d2721 refactor(boot): rename the profile resolution generation to the runtime resolution
RuntimeResolution, RuntimeResolutionEntry, RuntimeResolutionOptions, and createRuntimeResolution replace the generation-named table types; installRuntimeInterception returns a RuntimeInterception; PluginPackages takes { resolution }; Worker environment data carries { resolution }; routes are native, interception, and native-after-interception. replace() keeps its successor-generation wording.
2026-09-19 17:06:34 +08:00
imccyu 5f48b2fff6 docs(boot): call the package table the runtime resolution
Notes and the app-boot README name the startup package table the runtime resolution and the installed hook the interception; generation remains the word for the additive successor semantics of replace().
2026-09-19 17:06:34 +08:00
imccyu bffd317c8c Merge pull request #4570 from deepseek-harness/worktree-removelink
fix(boot): keep runtime-only profile resolution and real package anchors
2026-09-19 17:04:22 +08:00
Yifffan a30f3a68c8 Merge pull request #4509 from deepseek-harness/feat/macos-sidebar-ui-and-drag-refine
feat(client): frame-owned macOS window chrome with single drag owner
2026-09-19 16:58:41 +08:00
imccyu 109efc7942 test(boot): cover the projection removal edge cases
A profile with the legacy directory but no node_modules, and a symlink whose target parent is gone, exercise the remaining branches of removeLinkProjections; the non-ENOENT realpath failure is a host filesystem fault and is excluded from coverage like its siblings.
2026-09-19 16:49:21 +08:00
Yif 9c48e74409 test(web): capture sidebar snapshots after the track-easing gate settles
The columnTransition probe raced data-animating's transitionend/600ms
settle: checkpoints recorded whichever side of the window the capture
landed on. Waiting for the attribute to drop pins the steady state —
no declared transition (computed 'all') — deterministically.
2026-09-19 16:39:47 +08:00
Yif 45d77b0e8e fix(ui-theme): match the scrollbar sheet exclusion against /-separated scan paths 2026-09-19 16:39:46 +08:00
imccyu 02fec3209e fix(boot): remove link-backend profile projections on profile load
removeLinkProjections unlinks the symlinks under a profile's node_modules whose target lies inside <profile>/.dsh-module-fallback/node_modules and then removes that directory; pnpm-installed packages and every other symlink stay. loadProfile and the Desktop applyRelease call it once per launch. Regression: with bundle A installed but deselected and bundle B selected, B's same-named plugin resolves instead of A's projected copy.
2026-09-19 16:34:07 +08:00
imccyu 0c342a81c4 docs(boot): record the one-time removal of link-backend profile projections
The lookup-order note, the cleanup-removal note, and the app-boot and Desktop READMEs state that profile load removes the .dsh-module-fallback projections the dsh 0.1.5 releases wrote into a profile, so a deselected bundle's projected plugin no longer shadows the same-named plugin the generation selects from another bundle.
2026-09-19 16:34:07 +08:00
Yif 9e95a7b183 fix(client): keep fullscreen sidebar strips draggable via fine-grained dockkit subtraction
Drop the fullscreen panel's whole-box no-drag: it swallowed the strips'
blank-run window drag and made no-drag the steady state, turning the
open/close app-region nudge into a computed-value no-op (electron#32341)
exactly when a hidden panel opens straight into fullscreen. The panel now
declares no steady-state app-region in either presentation, and ui-dockkit
subtracts the one box base.css never matches — the plain-div split divider —
alongside tabs, strip-end chrome, and pane bodies. New specs pin both
contracts against the stylesheets on disk.
2026-09-19 16:19:44 +08:00
Yif c6c1df6869 fix(ui-theme): normalize stylesheet-scan paths to forward slashes for Windows 2026-09-19 16:19:34 +08:00
Yichen Jiang 72d5194ce4 test(settings-models): drop an unnecessary JsonValue assertion in the add-card spec 2026-09-19 16:10:26 +08:00
Yichen Jiang f7fe7a1060 test(docs): re-record the translation prompt after the model-provider terminology rows 2026-09-19 16:08:17 +08:00
Yichen Jiang 7d06fcdc05 fix(settings-models): derive the add panels, lock the switch in flight, pair tabs with panels
The add card's panels are now derived from the shown mode and the modes
visited since it opened, and each renders only while its mode is still
offered, so a refresh that changes which modes are offered — every
configurable row gone, the pi-ai namespace unmounted, a route freed
after the catalog was exhausted — can neither leave the card without a
panel nor keep a form whose write the Host would refuse. The catalog
draft resolves to the chosen row while its namespace can take the
write, else to the first addable row; closing either panel forgets it,
so a later refresh cannot open a row editor unasked.

Both cards report a write or an endpoint interrogation in flight, and
the switch and the catalog select lock while one is, since a switch
underneath it would orphan the answer or the picker it opens. The
SegmentedControl takes the owner's id and pairs each tab with its panel
through `aria-controls` and `aria-labelledby`; a card offering one mode
carries that mode as its title instead of an orphan tabpanel, and a
locked segment names its reason as hover text. `fullWidth` goes: no
consumer asked for it.
2026-09-19 16:04:34 +08:00
Yichen Jiang 536a94b188 fix(settings-models): exact Models nav locators, scoped vendor term, review nits
The new "添加模型提供商" button shares a prefix with the Models nav entry,
so every e2e that clicked the nav through a non-exact locator resolved
two buttons once the page rendered; the nav locators are exact now.

The vendor sense of "provider" is registered in the terminology table
as 模型提供商 with its scope — the Models settings copy, the providers
user guide, and this package's README — while the generic provider rows
keep 提供方, and the package's Chinese README uses the vendor term
throughout. The custom card's header comment no longer claims a mode
switch that a custom-only card does not render, and the SegmentedControl
suite gains a positive Home/End case whose first enabled option is not
the first option.
2026-09-19 15:48:10 +08:00
Tianyi Cui ec2c4f2a42 test(session): isolate vocabulary fixture Git commands from caller paths
The new vocabulary fixture helper set cwd to a private repository but still
inherited GIT_DIR, GIT_WORK_TREE and GIT_INDEX_FILE. A negative control with
two disposable repositories demonstrated that git add/commit changed the
foreign repository's HEAD instead of the intended fixture repository.

Remove only those three location variables from the child environment.
Leave the caller's environment untouched and retain the existing identity,
hook and signing overrides. The regression checks the foreign HEAD and work
tree remain unchanged while the intended target commits its private file.
This is confined to the test helper; it adds no production Git abstraction
or Session-format behavior.
2026-09-19 15:43:10 +08:00
Tianyi Cui 696aa5f97c docs(session): describe retained source kinds by historical admission
The preserved direct-source set is the predecessor migration's accepted set
without the plugin wrapper. It includes older coordinator and subagent-report
identities even though those names have no current producer declaration.
Describe that historical admission fact instead of implying every retained
identity has a live V4 owner. No mapping or runtime behavior changes.
2026-09-19 15:43:10 +08:00
Tianyi Cui 4d9c4e7a12 fix(session): reject retired tool results in V4 Team checkpoints
Central V4 event admission already rejects tool-result content in Team
queue records, but projection checkpoints use the Team state schema directly.
After restoring the baseline Team parser during extraction, the production
SessionProjectionRegistry.restore() path accepted a decoded native V4
checkpoint containing the retired wrapper without reading an event.

Remove only that V4-incompatible schema arm. Keep the existing unknown-JSON
parser unchanged; its independent own-key preservation fix remains in the
standalone master PR, where recursive V3 tool results are still valid.

Exercise the real checkpoint restoration recipe with a valid text state and
an invalid retired-result state, plus queued-event projection. The new
checkpoint rejection failed before this change; central event admission and
the complete Team owner suite pass afterward with 100% projection coverage.
No Session schema, format version or projection state version is changed:
the rejected value is already outside the native V4 content vocabulary.
2026-09-19 15:43:10 +08:00
Tianyi Cui 88897a16c6 refactor(session): separate Team opaque JSON preservation from migration
Retaining own keys in the Team projection/checkpoint parser fixes a generic
JSON reconstruction defect. It is independent of V3-to-V4 identifier
conversion and can be reviewed directly against master, where recursive V3
tool-result content is still valid.

Restore the Team implementation, tests and paired README to this layer's
parent after the standalone owner captured the exact delta from 85737364be9.
The standalone port retains V3 validators and applies only the non-cloning
unknown-JSON repair. Migration content handling for team/message/queued and
all approved namespace, delivery and source-admission rules remain intact.

This removes an independent runtime/parser policy from the format stack;
it does not change any Session schema, codec, version or stored source file.
2026-09-19 15:43:10 +08:00
Tianyi Cui d5302e33f8 refactor(session): separate attachment carrier policy from V4 migration
The event-type allowlist and opaque-payload attachment policy change live
Session authorization/export behavior independently of a format upgrade.
They belong in a focused PR against master, where supported native V3 nested
tool-result content must also be handled deliberately.

Restore the session-controller and archive implementation, tests and README
pairs to this layer's parent. Remove the test-only session-format-catalog
dependency and its lock entry with the migration-specific attachment tests.
The original changes are captured from immutable commit 85737364be9 for the
standalone work; migration identifier conversion and reader checks are intact.

This extraction keeps the integration stack's existing attachment behavior
until the separate policy change is reviewed. It makes no Session-format,
schema or version change.
2026-09-19 15:43:10 +08:00
Tianyi Cui 11ef33b336 fix(session): reject unknown required V3 events before target interpretation
The physical V3 codec admits an unclassified event envelope without deciding
whether its type is required. The V3-to-V4 stage then used shared message
walkers and target vocabulary, so an invalid required developer/message could
acquire the V4 developer role although historical V3 restoration rejects it.
Generic required unknown events were also left to the wrong version's reader.

After preserving explicitly ignorable extensions, require every remaining
source type to belong to the fixed V3 vocabulary before interpreting payloads.
This is a fail-loud check for invalid or nonconforming source data, not new
compatibility handling for third-party events, which carry ignorable:true.
The approved plugin identifier conversion and native V4 readers are unchanged.

Exercise a complete developer-event sequence through direct migration,
historical/current catalogs, ignorable conversion and native V4 restoration;
add a generic unknown type. Both negative controls accepted the invalid source
before this guard. Plain/zstd read/write regressions verify refusal preserves
the source generation and never publishes a partial V4 successor.
2026-09-19 15:43:10 +08:00
Tianyi Cui fc74dbf4ea fix(session): limit delivery migration checks to the V4 target
A V3 delivery marker claiming generation 4 would become active when its
header advances to V4. The integration baseline already refused that case.
Renaming every higher-generation marker instead introduced a general
conversion policy for future formats that this V3-to-V4 edge does not own.

Restore the targeted generation 4 refusal. Keep other delivery event names,
payloads and coordinates unchanged, including generations 5 and 99, which
remain inactive in V4. Their future activation checks belong to a concrete
later format edge. Preserve the separate plugin-event identifier policy.

Cover read/write opens for both plain and zstd storage: target-generation
refusal preserves source bytes and publishes no successor, while later
markers survive V4 publication and native reopening unchanged. Update the
snapshot-normalizer cases and document the alpha converter coverage limit:
unsupported histories may fail without source mutation, and later converter
fixes may expand support without a new version when V4 output stays compatible.
2026-09-19 15:43:10 +08:00
Tianyi Cui 28b209867f fix(session): preserve historical stream-start extension field names
V3 and V4 declare the same block-start fields: type, index and blockType.
The migration's identifier policy can qualify an extension blockType, but
prefixing every additional field has no current V4 field collision to solve.
That rewrite changed captured keys to anticipate hypothetical future fields.

Retain every non-blockType field and value exactly, including already
prefixed names and own JSON keys. Keep the approved blockType identifier
prefix and the separate ToolSchema field policy unchanged. Update the local
conversion tests to verify both known and extension starts retain metadata
and to use the actual raw-record time field. Later field-specific conversion
belongs to a concrete source/target change instead of this edge.
2026-09-19 15:43:09 +08:00
Tianyi Cui 2833ff566e test(session): expect prefixed V3 opaque event identities on JSONL open
The JSONL retired-content admission matrix covers both historical V3 input
and native V4 input across read/write and plain/zstd storage. V3 migration
now prefixes unknown ignorable event identities with plugin:, while native
V4 reads retain their stored identity. The shared expectation still required
the unchanged V3 event tag and caused four deterministic CI failures.

Select the expected event type by input generation while retaining the full
payload, envelope, and immutable source-byte assertions. This corrects the
test for the intended migration without weakening native admission or
changing runtime behavior. The focused 20-case matrix now passes; restoring
the old expectation reproduces the same four failures locally.
2026-09-19 15:43:09 +08:00
Tianyi Cui bf29247fad fix(session): namespace historical V3 extensions with plugin prefixes
V3 permits external event, source and content identities and additional
request-tool fields. Copying those values into V4 can give an old plugin
named tool a core source identity, turn old tool-addition content into a
registry instruction, or activate formerly ignored deferLoading and delivery
metadata. Rejecting such collisions would instead refuse valid source logs.

Keep historical extensions in the existing extensible JSON representation.
Prefix unknown content and ignorable event tags with plugin:, preserving
all other content fields and opaque event payloads. Prefix external source
identities with plugin:plugin: or plugin:source: so wrapper and direct kinds
cannot collide even when original names already contain a category prefix.
Known first-party mappings remain explicit and unchanged.

Prefix extra request-tool field names and block-start field names with
plugin:, retaining exact values and existing-prefix doubling. Core schema
parameters, arguments, replay state and nested plugin data are not traversed.
Keep future-generation delivery records inactive after header promotion.
Pin the V3 event vocabulary independently of the current writer and provide
an offline verifier against an explicitly selected historical source commit.

Attachment authorization and export inspect declared event content only.
Team checkpoints preserve all own keys of unknown JSON blocks while still
rejecting malformed known content and retired core tool-result blocks.
Exercise physical read/write/reopen, prefix injectivity, own __proto__ keys,
provider opacity and retained source-identity snapshots.

No generic extension block, metadata wrapper or new schema-tooling type is
introduced. V4 type declarations, persistence schema, checkpoint and frozen
V0-V3 codecs remain unchanged. Canonical tool-result lifting and incomplete
child-catalog policy remain separate concerns.

Adapted from the extension-preservation work in 7ba7e174dd1 by Tianyi Cui.
Co-authored-by: Tianyi Cui <[email protected]>
2026-09-19 15:43:09 +08:00
Tianyi Cui cc970738d8 docs(session): scope checkpoint JSON preservation to domain reads
The cache reader preserves opaque JSON keys, but each projection still
parses the returned checkpoint through its own stateSchema before hydration.
State that ownership explicitly so documentation does not imply this reader
fix also changes projection-defined transformations or cloning behavior.

Distinguish the synthetic V7 StorageDomain regression fixture from released
cache archives. Describe its read, put and reopen path directly, and group
its JSON validation checks separately from archived-version recovery.
Translate the Chinese Agent Note headings and keep the paired docs aligned.
The note retains the borrowed-value tradeoff and links the independent
predecessor-format and lifecycle-identity decision.

Production expressions and all test assertions remain unchanged; only
contracts, fixture descriptions, test labels and grouping are clarified.
The fix does not add another persistence format or broaden migration scope.
2026-09-19 15:43:09 +08:00
Tianyi Cui df0145271d fix(session): preserve opaque checkpoint keys on domain reopen
The projection-cache writer preserves lossless JSON, including own keys named
__proto__. The z.json reader rebuilds objects and drops those keys, so opening
the same stored checkpoint can produce state different from Session replay.
This affects embedded result metadata and opaque extension payloads as well
as other projection state.

Validate with the existing isJsonValue predicate used by the writer's
snapshotJsonValue rules. It rejects non-JSON and lossy values without
rebuilding valid borrowed records. Keep the stored representation and domain
version unchanged: this is a reader correction, not a new cache format.

Exercise a fixture captured through the actual pre-fix writer with a real
StorageDomain open, rewrite, close and reopen. Preserve nested prototype-named
keys and retain negative coverage for invalid JSON values. Document why this
validation matches the storage-domain immutable borrowed-value contract.

Use neutral arbitrary JSON in the new opaque-state fixture so this reader
regression stays independent of Session message representation. Its own
prototype-named keys and nested arrays are unchanged in purpose. Confirm
the fixture matches the pre-fix StorageDomain writer output and that the
old z.json reader fails its key-preservation assertion. No released Session
recordings or historical cache fixtures are edited.
2026-09-19 15:43:09 +08:00
Tianyi Cui d7e523b8b8 perf(session): traverse stored JSON arrays by index
Cold current-generation reopen freezes the complete decoded event graph
before publishing shared-frozen history. Compact assistant streams carry
125,000 text values and 124,600 time deltas in the required benchmark;
for-in traversal enumerates their array indexes as string property keys.
An open-only profile attributes about 4.2 ms to complete event freezing.

Use numeric indexing for arrays produced by JSON decoding and the fixed
migration catalog. Those arrays contain indexed JSON values only. Keep
every Object.freeze call and every nested-object visit, preserve the
object-key path including own __proto__ and constructor data, and never
infer deep immutability from a shallow Object.isFrozen result. No decoding,
admission, relationship validation, or freezing moves past open().

The unchanged five-sample V4 reopen median falls from 22.6 to 17.7 ms on
M4 Pro / Node 24.19. Restoring and rebuilding the exact old traversal gives
21.7 ms. First-history and resume also improve; Agent retained heap stays
4.5 MB and every 128 MB case completes. Keep the existing 63 ms gate,
fixture dimensions, cold-process setup, and all other budgets unchanged.
Local measurements establish removed work; hosted CI remains the required
runner verdict.

Cover nested opaque arrays and objects, special JSON keys, rejected
mutations, and shared event identity through historical V3 and native V4
reads. Record the before/candidate/restored samples and the local-versus-CI
limit in the existing performance note.
2026-09-19 15:43:09 +08:00
Tianyi Cui 1613a10c03 merge: integrate pinned master into session-log-v4
Merge master 7e2b049d8e2523127a3b4fba38cab4748ef0c72f, observed on
2026-09-19 at 07:38:37 UTC, into release/session-log-v4 at
c4663e8671e33bc2cfdbc868b0b18d979508d39b. Keep this base integration
separate from the five persistence repair PRs so their review diffs
remain focused and can be rebased without moving their fixes here.

Combine master's pin ordering and archived-session filter with V4's
parent-owned direct child catalog. Both grouped and flat sidebar rows
must pass the Session list to the V4 activity calculation; restoring
master's summary-lineage traversal would reintroduce the removed
subagent ownership and count unrelated descendants.

Keep master's removal of the archived-session settings page. Its only
release-side test change renamed a Session list fixture field, so no
runtime behavior is lost by deleting that obsolete test. Adapt the
release-side direct-child-status regression to the new row/filter
arguments and preserve its assertions.

Retain master's workspace ordering and row-motion documentation while
keeping the V4 child-catalog wording. Reconcile the generated bilingual
records against the merged documents. Frozen V0-V3 codecs, recorded
Session JSONL inputs, and the current V4 persistence schema are unchanged.

Refs #2692, #3273
2026-09-19 15:42:11 +08:00
Yif 699d06a7eb feat(client): widen overlay top margins to the frame's top clearance
Publish --dsh-frame-top-clearance on html[data-platform='darwin'] so
body-portalled overlays inherit it; useAnchoredMaxHeight and the portalled
Menu widen their 12px viewport margin to it, Modal centralizes the vertical
padding its cards previously each computed, and the trigger menu keeps an
84px margin on every platform so it stops below the conversation header.
Reduce Transparency replaces the sidebar tint with a 90%-opaque fill.
2026-09-19 15:37:47 +08:00
imccyu 45417197c6 refactor(boot): name routes and collectors after the interception layer
Resolution routes are native, generation, and native-after-generation: Node keeps the importer's lookup, answers from the generation entry at the interception layer, or resumes its chain at that layer. The profile module collects installation-scope and profile-scope packages and reads package manifests under those names; the generation types describe the interception layer instead of a fallback table.
2026-09-19 15:34:09 +08:00
imccyu f34f8ef04d docs(boot): name the native lookup after the generation in the generation note 2026-09-19 15:34:09 +08:00
imccyu 82337a2e71 test(boot): canonicalize temporary roots with the native realpath
Windows tmpdir spells the user directory with an 8.3 short name. Generation anchors and Node's own resolution report the long name, so the resolver, generation, and real-launch fixtures now create their roots through realpathSync.native and compute expected paths the same way.
2026-09-19 15:19:32 +08:00
Yichen Jiang 8a320a276b feat(settings-models): one add entry with third-party and custom-API modes
The Models page offered two side-by-side buttons, "Add provider" and
"Add a custom provider", which asked a new user to classify their
provider by an implementation fact — whether it is in the installed
pi-ai catalog — before seeing anything. One "Add model provider" button
now opens one card whose segmented mode switch chooses between a
third-party model provider (the catalog select over the provider
editor) and a custom model API (the create form for a relay, a
self-hosted server, or any other OpenAI- or Anthropic-compatible
endpoint), with a one-line purpose beneath the switch. A panel mounts
the first time its mode is shown and stays mounted, hidden, while the
card is open, so switching modes discards neither draft.

A mode is offered only while its namespace is mounted and disabled
while it has nothing to offer, which keeps the old per-button
availability; with one mode the card shows that form alone. The
protocol pickers name each protocol by its product name while the
stored value stays the schema identifier, and an unnamed protocol shows
that identifier. The Chinese copy of this page calls a provider 提供商
throughout.

The e2e scenarios drive the single entry and its custom-API mode, and
the ARIA goldens that carry the page copy are re-recorded. The user
guide describes the one entry with fresh screenshots in both languages.
2026-09-19 15:14:52 +08:00
Yichen Jiang 6840878bf2 feat(ui-primitives): add SegmentedControl
A tablist of two or more equal-width segments with one sliding
indicator, for switching a card or panel between a few mutually
exclusive modes. The owner holds the selection; `label` names the list
and every segment label is owner-localized. Arrow keys, Home, and End
walk the enabled segments with a roving tabindex, and the keyboard
follows the selection once the owner adopts it.

Segments are equal grid tracks sized to the widest label when the
control hugs its content, which is what lets the indicator be placed
arithmetically from the segment count and selected index rather than by
measuring the DOM. The indicator draws its stroke inside the soft
elevation shadow, as every elevated surface does.
2026-09-19 15:14:37 +08:00
imccyu 03e3a3bca0 refactor(desktop): note the runtime descriptor validation in applyRelease
applyRelease keeps readDesktopRuntime for its fail-loud validation after the cleanup consumer was removed.
2026-09-19 15:06:26 +08:00
imccyu 1c806e5a16 docs(desktop): record the profile cleanup removal
A simplification note records why production Desktop no longer cleans core-package copies out of the profile, keeps the 2026-09-15 motivation and rejected alternatives, and names the capability given up and the reintroduction conditions; the superseded 2026-09-15 note is consolidated into it. The bundled-runtime note drops its cleanup qualification paragraph, and the Desktop README describes launch preparation without the cleanup step.
2026-09-19 15:06:26 +08:00
Tianyi Cui fe46abc02f Merge pull request #4594 from deepseek-harness/worktree/guard-ci-bubblewrap-pin-20260919
test(ci): reject prunable Ubuntu bubblewrap URLs
2026-09-19 15:03:37 +08:00
imccyu 71c7f6cc09 refactor(boot): name the interception layer parent and note intentional anchors
routeScoped names the profile parent whose node_modules is the interception layer. The installation traversal records why the installation root keeps its caller-supplied directory and why generation construction keeps its Promise return type.
2026-09-19 14:39:45 +08:00
imccyu 0e2097ac18 docs(boot): describe the interception layer in the generation note and README
The generation note and the app-boot README no longer claim that runtime lookup hides the shared position or recognizes profile projections: generation entries occupy their package names at $DSH_HOME/profiles/node_modules and every other name sees that directory as an ordinary ancestor. Pairing records re-recorded.
2026-09-19 14:39:44 +08:00
Huanqi Cao 08217140b8 Merge remote-tracking branch 'origin/master' into fix/windows-acl-delete-escape 2026-09-19 14:31:47 +08:00
imccyu 81b6934804 docs(boot): add the English lookup-order note and refresh the wrapper note
Translate the profile lookup-order Agent Note section for section and record its pairing. The desktop-web-wrapper note names the runtime resolution generation instead of module fallbacks and drops the one-time desktop-runtime-state cleanup that no longer exists.
2026-09-19 14:28:07 +08:00
Huanqi Cao 7201569aef docs(config-catalog): carry the source-line refresh to the zh pair
The generated catalog is a bilingual pair, so the regenerated English side
must be brought over with its Chinese counterpart before the pairing record
is re-written.
2026-09-19 14:17:59 +08:00
imccyu d71b8a2f1c refactor(boot): narrow legacy-links exports and refresh resolution JSDoc
isPackagedExecutable has one caller in its own module; the installation traversal comment names the runtime resolver instead of the removed fallback directory.
2026-09-19 14:12:02 +08:00
Yif a80f5186a6 Merge remote-tracking branch 'origin/master' into feat/macos-sidebar-ui-and-drag-refine 2026-09-19 14:05:21 +08:00
Huanqi Cao 85724fb5b0 docs(config-catalog): refresh the sandbox-local Config source line
The comment edit in sandbox-local/src/index.ts moved the Config block from
line 44 to 45, and the generated catalog records that line.
2026-09-19 14:05:18 +08:00
Huanqi Cao 4753e45f95 test(sandbox): probe cmd's own > NUL redirection
The CI Windows runner reports an empty \0 for a PowerShell-level
'>nul' redirection around the cmd call, and PowerShell's '>nul' opens a file
named nul rather than exercising cmd's redirection. Pass the whole command
to cmd so it parses '>NUL' itself and prove it with cmd's own output.
2026-09-19 13:54:48 +08:00
Yif de74a45f60 feat(desktop): raise the main window minimum width to 520 2026-09-19 13:42:52 +08:00
Yif 3f7a209835 revert(ui-primitives): drop the tooltip pointer-focus suppression 2026-09-19 13:42:50 +08:00
Huanqi Cao 3d5ba3b83f fix(sandbox): scope the delete deny to containers, clearing the review round
The inheritable `Deny Everyone FILE_DELETE_CHILD` also reached FILES, and
0x40 is a member of FILE_ALL_ACCESS: measured against a real runner, a
Medium caller's CreateFileW(GENERIC_ALL) on every file, directory, and temp
root inside a granted root returned ACCESS_DENIED. The deny now carries
CONTAINER_INHERIT_ACE, so files keep working; a FullControl open of a
DIRECTORY inside a granted root stays denied and is pinned as the residual
cost of denying a right the full-access mask contains.

Also from the review:

- Leaks on fail-closed paths: the label ACL on both early SetEntriesInAclW
  exits, the read descriptor when the label build fails, and the parsed
  capability SID when either well-known-SID creation fails.
- `revokeWrite` keeps the shared Low label while another capability grant
  remains on the directory, so two grants on one path stay independently
  revocable; `hasExactLabel` delegates to hasExactEntry.
- The delete probe uses process.execPath, restrictTokenIntegrity guards a
  zero-length SID, and verify/abi-probe.cpp covers the new constants
  (compiled; static_asserts pass).
- Consumers updated in the same change: sandbox-local source comments and
  README pair, pwsh-sandbox README pair, docs/subsystems/sandbox pair, and
  the 2026-07-06 sandbox note pair no longer cite the Everyone-write
  boundary as a current partial reason.
- New Agent Note records the mandatory-integrity decision, the deny scoping,
  the standing label with its externality (other Low-integrity processes
  running as the user, surviving the session), and the rejected
  alternatives; the 2026-08-08 note cross-links it.
- New runner pins: NUL stays writable under the Low token, the FullControl
  file/directory split, and the shared-label revoke. Per-file coverage back
  to 100%.
2026-09-19 13:42:47 +08:00
Yichen Jiang ff3d162401 Merge pull request #4600 from deepseek-harness/worktree/fix-markdown-preview-images
fix(web): render local images in Markdown previews
2026-09-19 13:31:42 +08:00
Yif c8e3cb2b87 test(web): track breadcrumb text crumb and shell.leading seat in e2e and goldens 2026-09-19 13:31:41 +08:00
imccyu 938b62c0aa refactor(desktop): drop link-era profile cleanup
Remove cleanProfileCorePackages and migrateDesktopProfileLinks with their specs; applyRelease keeps runtime validation, settings migration, and profile creation. A regression pins that installed packages, declarations, legacy state, and the lockfile survive a launch.
2026-09-19 13:29:13 +08:00
imccyu a311386983 test(cli): cover shared-layer packages in real profile launches
The src/lib x installed/npm-link fixture adds a stale @deepseek-ai/dsh-tools link in profiles/node_modules, a plugin dependency absent from the generation with nested external leaves, and byte-for-byte preservation of profile files and link targets.
2026-09-19 13:29:13 +08:00
imccyu 6f57030958 fix(boot): occupy the interception layer instead of hiding it
The generation stands in for $DSH_HOME/profiles/node_modules/<name> only for names it carries; other names see that directory as an ordinary ancestor. The interception layer is the first ancestor node_modules above the importer's profile directory, so application-owned profiles follow the same rule. Stale .dsh-module-fallback projections are ordinary symlinks: their shape recognition leaves the resolver, the local package names, and the bundle dependency traversal.

The resolver spec gains a table-driven matrix over importer, package kind, ancestor layers, and directory or symlink form, with readable fixture names.
2026-09-19 13:29:13 +08:00
imccyu db831733da docs(boot): record the profile lookup order and interception layer
Add the Chinese Agent Note describing profile resolution as Node's ancestor node_modules chain with the generation occupying the package directories at $DSH_HOME/profiles/node_modules, the ESM/CommonJS, web/desktop, and npm-link scenarios, and the developer onboarding guide.
2026-09-19 13:29:13 +08:00
imccyu 518c7a604b fix(boot): preserve runtime fallback precedence 2026-09-19 13:29:13 +08:00
imccyu fcc6cc8c12 docs(boot): align runtime-only resolution contracts 2026-09-19 13:29:13 +08:00
imccyu 0bac274273 test(cli): run source tool smoke after build 2026-09-19 13:29:13 +08:00
imccyu 4b79c744ab docs(cli): clarify source smoke build prerequisites 2026-09-19 13:29:13 +08:00
imccyu 6d8aac066d fix(boot): resolve profile dependencies from real package directories 2026-09-19 13:29:13 +08:00
imccyu 4b9141a89e docs(boot): document runtime-only profile resolution 2026-09-19 13:29:13 +08:00
imccyu 9fd0a5ad52 refactor(boot): keep runtime-only profile resolution 2026-09-19 13:29:13 +08:00
Yif 8f2f13bc48 Merge remote-tracking branch 'origin/master' into feat/macos-sidebar-ui-and-drag-refine 2026-09-19 13:26:16 +08:00
imccyu bd2247c510 Merge pull request #4505 from deepseek-harness/feat/session-pin-archive
feat(workspace): 会话置顶与侧边栏归档筛选
2026-09-19 13:25:57 +08:00
Yichen Jiang 7951cee0d5 fix(web): render local images in Markdown previews 2026-09-19 13:21:37 +08:00
Huanqi Cao 688d7b694b test(sandbox): drop the host-dependent whoami integrity assertion
whoami /groups reports the mandatory label on this workstation but produces
no matching line on the CI Windows runner, so the assertion pinned the host
rather than the product. The lowered integrity level stays covered by the
unit pin on restrictTokenIntegrity and by the behavior that only holds with
it: the Everyone-Modify denial, the outside-delete denial, and the
cross-root delete denial. README records the cmdlet as host-dependent
diagnostic noise again.
2026-09-19 13:05:01 +08:00
imccyu 7e4045c4c0 test(client): align sidebar interactions and browser snapshots 2026-09-19 12:54:14 +08:00
imccyu 7baccf5d85 fix(workspace): unify pin IDs and preserve complete session order 2026-09-19 12:54:13 +08:00
imccyu f1e06a69ef fix(ui-primitives): preserve toast lifetime across rerenders 2026-09-19 12:54:13 +08:00
imccyu 842bf71350 perf(workspace): replace auto-animate with scoped row motion 2026-09-19 12:53:24 +08:00
Yichen Jiang 320e961122 test(jobs): refresh background tool snapshot headers 2026-09-19 12:22:46 +08:00
Tianyi CuiandLegGasai 766e6f9176 test(ci): reject prunable Ubuntu bubblewrap URLs
The merged dependency repair in #4589 uses a recorded Launchpad build,
but #4591 also requires a regression guard against restoring the live
Ubuntu package pool. Those pool URLs disappear when versions are
superseded, even when the content digest is pinned.

Adapt LegGasai's URL guard from closed PR #4590 to the build-specific
endpoint that landed in #4589. Check the endpoint structure without
copying the current build number, version, or checksum into the test,
and reject Ubuntu pool downloads anywhere in the script so adding a
pool fallback cannot bypass the guard.

Negative controls restore the original archive URL and inject security
and ports pool fallback URLs; each fails the new guard. The original
script is restored byte-for-byte before all 44 workflow tests pass.
This adds only a static regression test, with no network calls or
changes to the download script or CI execution behavior.

Co-authored-by: LegGasai <[email protected]>
2026-09-19 12:08:11 +08:00
Yif 34d78d843d feat(workspace): restore the hover title reveal with an 8px jitter floor
Hovering a session row again scrolls a clipped title to its far edge
(the #4423 reveal), but overflow of at most 8px stays put so barely
clipped titles do not jitter. The hover mask fade yields back to plain
clipping — at the scrolled extent the fade would cover the revealed
tail. Row action buttons tighten from gap 12 to 10.
2026-09-19 12:04:07 +08:00
Yif 1d221f9723 fix(workspace): end-aligned action tooltips, slower hover cards, archived-row alignment 2026-09-19 12:04:07 +08:00
Yif 9ca19474ab fix(workspace): tooltip the row hover actions and open the sliders glyph 2026-09-19 12:04:07 +08:00
Yif 94c62ea564 fix(client): draw the sidebar new-chat glyph at the regular weight 2026-09-19 12:04:07 +08:00
Yif 5474efe890 fix(client): lighten the ellipsis glyph and adopt the Toast success tone 2026-09-19 12:04:07 +08:00
Yif bd0461c894 fix(workspace): give the compact-label row spec the pin/archive props 2026-09-19 12:04:07 +08:00
Yif 3e96ed79a7 fix(workspace): steady hovered session titles and polish the sidebar controls
Hovering a session row no longer scrolls its clipped title (the mask fade
stays), the one-time archived-filter callout and the content-search
unavailable notice are gone, the group-row new-session button shares the
new-chat glyph, and the view-options trigger uses the two-slider icon with
a 200px menu floor and a visible separator hairline.
2026-09-19 12:04:07 +08:00
Yif 33d496951c feat(workspace): session pinning and the sidebar archived filter
Pin sessions to the top of the sidebar and reach archived sessions
through the view-options filter instead of a settings page; archiving
gains an undo/filter toast, and row motion stays reserved for pin jumps
and archive fades.
2026-09-19 12:04:07 +08:00
Tianyi Cui df65ea84ee Merge pinned master 386ed6b6 into session-log-v4
Include the user's merge of #4589 so Linux CI uses the available, verified
Ubuntu bubblewrap 0.12.0 build instead of the pruned 0.9.0 archive URL.
The user explicitly authorized this CI-prerequisite refresh without waiting
for the ordinary hourly master-following interval.

Preserve the reviewed upstream commit and exact one-file patch. The recorded
Launchpad build URL, checksum, extraction and namespace probe match #4589,
whose supported Ubuntu 24.04 preparation and execution checks passed. Bash
syntax and merge whitespace checks pass; no product runtime, Session format
or snapshot generation changes are introduced by this merge.
2026-09-19 12:01:04 +08:00
Yichen Jiang 37b31ba0d4 Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127 2026-09-19 11:58:57 +08:00
Yichen Jiang 8eb96113c7 Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052 2026-09-19 11:58:01 +08:00
Tianyi Cui c167f6d3e0 Merge pull request #4589 from deepseek-harness/worktree/fix-ci-bubblewrap-012-20260919
fix(ci): pin a compatible bubblewrap 0.12.0 build
2026-09-19 11:55:07 +08:00
Tianyi Cui 32ec78c79e fix(ci): pin a compatible bubblewrap 0.12.0 build
Ubuntu removed the superseded 0.9.0-1ubuntu0.1 payload from its live
archive pool, so the shared Linux CI preparation step fails with HTTP
404 before tests start. Address Ubuntu's recorded Launchpad build so
future pool pruning does not invalidate the pinned download location.

Select upstream's 0.12.0 security release for CVE-2026-87766 instead of
Ubuntu's isolated 0.9.0 backport, whose regressions and support limits
are documented by upstream in Launchpad bug 2166359. Keep checksum
verification, direct extraction, and the existing namespace probe.

Verify build 33546835 against its published SHA256 and archive SHA512.
Its amd64 ELF requires at most GLIBC_2.38 and x86-64 baseline; its
packaging requires Linux 5.10. Ubuntu 24.04 provides glibc 2.39, Linux
6.8, and the required libcap2/libselinux1 versions. This changes only
the CI helper's pinned payload, not product sandbox configuration.
2026-09-19 11:39:05 +08:00
Tianyi Cui 91212afc00 Merge pinned master e83fbddc into session-log-v4
Include the user's merge of #4586 so the V4 integration and its child PR
exercise the corrected spill-policy synchronization tests. Preserve the
upstream commit and authorship and keep this master checkpoint separate from
migration changes and the remaining benchmark investigation.

The merge changes only the spill-policy test file. Its added and removed
lines match the reviewed upstream fix exactly, while the release branch's
existing V4 fixture adaptations remain intact. No runtime source, persisted
format, or snapshot generation changes.

Validation: all 31 spill-policy owner tests pass with 100% package coverage.
2026-09-19 11:30:48 +08:00
Tianyi Cui f863b47a48 Merge pull request #4586 from deepseek-harness/worktree/fix-spill-policy-gates-20260919
test(spill-policy): synchronize slow-backend regressions on events
2026-09-19 11:23:10 +08:00
Yichen Jiang 3bcac0b878 test(web): expect three startup plugin batches in the keyless smoke
The application phase's map-form combo URL passes the 3 KiB limit once
the four settings companions join the composition, so the module system
partitions that phase into two combos beside the bootstrap one, as the
loading model allows. The smoke pins the three immutable batches and
still checks every combo's script, map, and cache header.
2026-09-19 10:46:51 +08:00
Yichen Jiang 08c3189c3c Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127
# Conflicts:
#	apps/web/tests/snapshots/live-job-stream/settled.expected.md
#	apps/web/tests/snapshots/live-job-stream/streaming.expected.md
#	snapshots/web/background-job-list/running.expected.md
2026-09-19 10:43:19 +08:00
Yichen Jiang 9f3ddc1a19 test(web): re-record the bundle golden after the detail-page chrome change
The crumb, uninstall, and configure controls no longer render an icon child in the accessibility tree; the bundle page golden this branch added follows the row and official goldens master re-recorded.
2026-09-19 10:41:31 +08:00
Yichen Jiang c4bc8b847a Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127
# Conflicts:
#	packages/client/ui-jobs/src/client/JobListAction.tsx
#	packages/shell/bash-local/tests/executor.spec.ts
2026-09-19 10:40:27 +08:00
Yichen Jiang 629c53d5a0 test(jobs): refresh snapshots for decorative icon accessibility 2026-09-19 10:40:25 +08:00
Yichen Jiang 30b882a1b2 fix(jobs): keep client detail tests on the pure renderer 2026-09-19 10:37:48 +08:00
Yichen Jiang 3135e4d612 Merge remote-tracking branch 'origin/master' into feat/plugin-detail-slots
# Conflicts:
#	apps/web/tests/expected/plugin-config/row.expected.md
#	packages/client/ui-plugin-manager/src/client/PluginManagerPage.tsx
#	packages/client/ui-primitives/src/index.ts
#	packages/client/ui-primitives/src/settings-form/fields.tsx
#	packages/client/ui-settings-plugins/package.json
#	packages/client/ui-settings-plugins/src/client/locales.ts
2026-09-19 10:36:07 +08:00
Yichen Jiang 70cacfdcaa test(shell): cover cancellation before reading failed launch results 2026-09-19 10:35:48 +08:00
Yichen Jiang 5c10701df2 Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052
# Conflicts:
#	apps/web/tests/expected/agent-preset-selection/header.expected.md
#	packages/client/ui-chat/src/client/chat/ContextInjectionRow.tsx
#	packages/client/ui-jobs/package.json
#	packages/client/ui-jobs/src/client/JobListAction.module.css
#	packages/client/ui-jobs/src/client/JobListAction.tsx
#	packages/client/ui-jobs/tests/job-list-action.client.spec.tsx
#	packages/client/ui-subagent/README.i18n.yaml
#	packages/client/ui-subagent/README.md
#	packages/client/ui-subagent/README.zh.md
#	packages/client/ui-subagent/src/client/SubagentHeaderLineage.tsx
2026-09-19 10:35:09 +08:00
Tianyi Cui 9f34db2373 test(spill-policy): await observed spill and dispatch stages
The slow-backend regressions start real NodeRuntime subprocesses, but
vi.waitFor silently imposed a one-second deadline on normal scheduling and
tool execution. Under concurrent Linux and Windows coverage this rejected
valid runs before the tested spill or dispatch stage was reached.

Resolve promises at the actual save-entry and dispatch-start observations,
and fail immediately if the run completes before those observations. Queue
all three requests up front in the bounded-backlog case so a missing third
start tests backpressure rather than child request timing. Cleanup releases
both queued and future spill gates and awaits execution completion.

Keep the existing outer test deadlines, product limits, result assertions,
and ordering checks. A temporary 1.2-second tool delay reproduces both old
failures and passes with these tests; temporarily removing the actual
backpressure wait still fails the third-dispatch assertion. No experiment
or product-code change is included.

Fixes #4585
2026-09-19 03:21:10 +08:00
Tianyi Cui 87f0df0550 Merge pinned master 5ec3ffe337 into session-log-v4
Keep the master refresh separate from the V3-to-V4 lossless-conversion and
checkpoint JSON fixes so the release baseline and each feature change remain
independently reviewable. This checkpoint extends the already-published
4435f6f519 merge before the #4583 child is rebased.

Integrate exactly master 5ec3ffe337062ab5bb4955933008afe8d0a0b915. Its #4156
changes add watched file/document refresh, filesystem watch readiness,
directory expansion restoration, and chat bottom-follow fixes. They update
shared filesystem and Client consumers without changing Session format or
snapshot generation.

The merge has no conflicts. Its 114-file scope and line counts match upstream;
code and prose additions/removals are unchanged. Only the two translation
pairing records incorporate the release branch's retained V4 documentation.

Validation: 762 owner tests passed (1 platform skip), 11 focused Web tests
passed, full build passed, and all 41 doc-sync checks passed. Runtime closure
and Client package checks passed; fs-local publint completed with the existing
source-wildcard export warning.
2026-09-19 02:39:04 +08:00
imccyu 29598c7ce9 Merge pull request #4156 from deepseek-harness/feat/issue-3930-preview-refresh
feat(web): refresh previews after turns and native file changes
2026-09-19 02:26:26 +08:00
Huanqi Cao 7450e1eb24 docs(sandbox): tighten the comments added by the delete-confinement fix
One home per fact: the parent-FILE_DELETE_CHILD rationale now lives in the
acl module doc and the package README instead of being retold in
restrictTokenIntegrity, init(), and grantWrite. Drops the duplicated
inline narration; behavior unchanged.
2026-09-19 02:25:01 +08:00
Huanqi Cao 36e632751e fix(sandbox): deny the ambient parent-delete right inside granted roots
The Low integrity label confines writes and deletes to the labeled roots,
but every granted root is labeled Low, so the integrity check alone still
let one confined child delete inside ANOTHER granted root (another
workspace, a live sibling temp directory): Windows authorizes a delete from
the parent directory's FILE_DELETE_CHILD right, which the write-restricted
intersection never reaches.

Each grant now also denies FILE_DELETE_CHILD to the world SID in the same
SetNamedSecurityInfoW call, so the capability ACE's DELETE bit is the only
delete authority inside a granted root. The idempotent skip additionally
requires the exact deny, so a root granted by an earlier build receives it
on its next provision. Delete paths inside the roots keep working; a file
whose own DACL grants no DELETE is no longer deletable through its parent's
rights, for the confined child and for the user's own processes alike.
2026-09-19 02:06:30 +08:00
Huanqi Cao d5ad3baeb5 fix(sandbox): confine Windows deletes with a Low integrity label
The write-restricted token's capability-SID intersection only covers the
write bits of the object's own access check. Windows also authorizes a
write or a delete from the parent directory's FILE_DELETE_CHILD right, and
no restricting SID has to co-sign that authority: the confined child could
therefore delete any file its ambient user SIDs control. `cmd /c del`
outside the workspace succeeded under BOTH modes, and .NET
File.Delete/DeleteFileW did too wherever the ambient DACL held Modify.

Lower the restricted token to Low integrity and apply a Low no-write-up
mandatory label to every granted directory in the same SetNamedSecurityInfoW
call that adds its capability ACE. The kernel evaluates the integrity policy
inside the access check whichever right supplied the authority, so the
granted roots stay writable while everything else becomes delete-proof as
well as write-proof. The label inherits to new children and follows the
existing standing/revocable grant lifecycle.

Also closes the Everyone-Modify ambient write boundary, and pins the delete
paths (cmd, .NET, Remove-Item, libuv) in runner.spec.ts.
2026-09-19 01:38:29 +08:00
imccyu 5c0b43f16e test(web): include connection diagnostics in SVG failures 2026-09-19 01:16:12 +08:00
imccyu 072ea695b9 fix(chat): retain bottom follow during stream updates 2026-09-19 01:16:12 +08:00
Tianyi Cui a7a8fa3c16 Merge pinned master into session log v4
Bring the Browser guide subtitle simplification from master
b605980eb049ce2cc578cdb608f7f8dee66f7b56 onto release checkpoint
2958f0f5cf67f81b18ad690a82c68c606f246d0c.

Keep this upstream synchronization in its own merge commit so the release
refresh can be reviewed independently from the lossless tool-content
conversion. The conflict-free merge contains the exact two-file upstream
patch: shorter English and Chinese guide subtitles and matching assertions.

Validation: all three ui-sidebar-browser apply tests pass, scoped type-aware
lint passes, the Client UI locale gate passes, and the first-parent patch
matches the pinned master delta from 0e9385ad8b in both full-diff and stable
patch-id comparisons.
2026-09-19 00:54:54 +08:00
Turtle 2099andTurtle 29d96fa538 fix(web): simplify Browser guide subtitle (#4561)
Co-authored-by: Turtle <[email protected]>
2026-09-19 00:39:22 +08:00
imccyu 7e09291f15 fix(sidebar): preserve expansion during directory restoration 2026-09-19 00:10:11 +08:00
Tianyi Cui bd5b1cd44f test(session): keep persistence fixture inventory keys portable
The accepted-baseline tests inventory temporary files with keys produced by
the host path.join. On Windows those keys contain backslashes, but the status
lookup and acknowledgement-preservation filters use repository-style slash
paths. Windows coverage therefore reads undefined for the status assertion;
the filtered preservation loops also select no files on that platform.

Use posix.join for logical inventory keys while keeping native path.join for
filesystem access. All platforms now exercise the same status lookup and
preservation assertions. This is confined to the test helper and changes no
production admission rule, compatibility policy, schema, or recorded fixture.
2026-09-19 00:07:18 +08:00
Tianyi Cui e134ba8765 fix(session): format unvalidated row fields explicitly in diagnostics
The retired-content guard runs on parsed physical JSON before normal event
admission so recovery cannot suppress a retired wrapper after another invalid
row. At that point type and sequence fields are still JSON values rather than
validated event fields. Implicit interpolation therefore violates the typed
lint rule on the final combined branch.

Use explicit String conversions only for the error subject. Keep the guard's
ordering and refusal checks unchanged; requiring an already-valid envelope
here would weaken the pre-recovery check. This does not change the stored
representation or add a migration rule.
2026-09-18 23:51:53 +08:00
Tianyi Cui 5152c097bb docs(session): catalog every V3-to-V4 transformation and refusal
The V3-to-V4 README described the main representation changes but did not
enumerate the complete admission and preservation rules. That left reviewers
without a package-owned reference for supported histories, child evidence,
native validation, or cases that must fail without publishing a successor.

Document historical conversion separately from native V4 admission, including
source renames and collisions, first-class tool results, child catalogs,
delivery metadata, retained identities and references, lifecycle checks,
developer-message constraints, fork behavior and recovery entry points.
Explicitly identify the retired-wrapper refusal and the limited scope of
general content validation rather than implying a complete payload validator.

Require this transformation/admission catalog in the version-addition
cookbook so future adjacent migrations document each supported mapping,
unchanged representation, refusal and preservation obligation. Preserve the
accepted-baseline policy: compatible V4 additions use new acknowledgements;
only breaking changes require a new writer version.
2026-09-18 23:49:21 +08:00
Tianyi Cui cbb4df8750 fix(session): refuse retired tool-result content during V4 admission
Released V3 accepts tool-result wrappers in ordinary user content. Leaving
those wrappers in a V4 artifact violates its declared content types and
reaches provider serializers that cannot represent them. Converting such
rows would require a new event, role, or source ownership decision.

Reject retired result tags only in known interpreted content slots and
raw Assistant stream block starts/ends. Reuse the native retired-syntax
admission path before recoverable suffix suppression and target artifact
restoration before successor publication. Preserve the existing system
and tool-result validators and the canonical V3 tool/result wrapper lift.

Known ignorable developer rows receive the same check during encoding;
unaware physical readers still defer their opaque developer payloads.
Tool arguments, replay state, schema parameters, nested metadata, and
unknown ignorable event payloads are not recursively scanned.

Real JSONL regressions cover V3 migration and native V4 read/write in
plain and Zstandard storage, including a corrupt native prefix. Refusals
preserve source bytes and the sole generation; opaque payloads survive.
No declared schema, frozen V0-V3 codec, or snapshot generation changes.
2026-09-18 23:49:20 +08:00
imccyu a77250603c fix(fs): watch parent before acknowledging missing files 2026-09-18 23:45:02 +08:00
Tianyi Cui 0112eaf3a8 feat(session): finalize the accepted V4 compatibility baseline
The integrated V3-to-V4 records contain the header increase that authorizes
their breaking changes. Leaving those terminal records editable would let a
later change reuse that already accepted 3-to-4 increase, so version 4 would
not establish a stable compatibility baseline for persisted user data.

Capture the accepted root classifications and semantic record digests in a
separate finalization checkpoint. Validate that checkpoint before rendering
or writing acknowledgement artifacts, and preserve its accepted records even
after the current writer advances. Keep publication evidence independent:
the verified released version remains 3 until a release establishes otherwise.

Compare future writer-4 schemas with the accepted baseline using the existing
compatibility classifier. Compatible additions remain permitted through new
same-version acknowledgement records. Breaking changes require a higher
writer and their own header transition; comments, aliases and source-location
changes do not alter the accepted semantics. Later unaccepted compatible
records retain the existing update workflow.

Document the distinction between finalization, publication and compatible
evolution, with regression coverage for locked records, incomplete or
inconsistent checkpoints, additive changes and future-version transitions.
2026-09-18 23:40:56 +08:00
imccyu 5b13cba35c test(workspace-files): cover initially missing watch targets 2026-09-18 23:27:30 +08:00
imccyu 4f55590aea fix(sidebar): correct automatic refresh and watch lifecycles 2026-09-18 23:27:30 +08:00
imccyu 9493ed6f61 test(sidebar): cover automatic refresh and watch lifecycle 2026-09-18 23:27:29 +08:00
imccyu 19d1f87492 fix(sidebar): satisfy lint and documentation checks 2026-09-18 23:27:29 +08:00
imccyu cf9213ca5f fix(sidebar): finalize resource auto-refresh behavior and tests 2026-09-18 23:27:28 +08:00
imccyu c71e907490 feat(web): add watched sidebar resource refresh 2026-09-18 23:27:28 +08:00
Yif b46af4d288 Merge remote-tracking branch 'origin/master' into feat/macos-sidebar-ui-and-drag-refine 2026-09-18 23:05:35 +08:00
Yif 1cfb776604 fix(ci): re-record slots pairing, refresh breadcrumb golden, cover null-panel nudge branch
The master merge invalidated docs/subsystems/slots.md's recorded pairing hashes; the minimal-preset UI golden still expected the breadcrumb as a disabled button, which darwin drag-band avoidance intentionally turned into plain text; and the app-region nudge effect's unattached-ref return had no darwin first-render test.
2026-09-18 23:05:24 +08:00
Tianyi Cui 498d0e8ecd merge: refresh session-log-v4 from pinned master
Merge master 0e9385ad8b9e75146f4baec2e731dd961f11c87c, observed when
this final integration step started, into the merged V4 release branch.
Keep the complete upstream history and do not advance to later master
commits during finalization.

Bring the Web trust-domain and relative-route handling, plugin install
cancellation, and npm registry mirror configuration into the common
release baseline. Retain the V4 codecs, producer-source policy,
parent-owned catalogs, and fork/migration behavior from the merged stack.

The merge needs no manual conflict resolution and changes no Session
JSONL inputs, snapshot generations, format packages, or persistence
schema/history files. This checkpoint precedes the separate V4 freeze
and audit fixes so each change keeps its own rationale and validation.
2026-09-18 22:35:14 +08:00
mektpoy 135104fb10 docs(browser-use): record the profile plugin instance-sharing decision
Adds the implemented Agent Note for the rule issue #4573 exposed: an
out-of-tree plugin declares every host runtime whose cross-instance identity
matters as a peer (plus dev), never as a dependency.

Records the mechanism (dsh-scope mints its tag per module instance), what the
duplicate does to a per-Agent registration, the alternatives that lost
(mounting on agent.ctx, a shared Symbol.for tag, version alignment), and the
open coverage gap: verify-package-dependencies selects no packages/experimental
package, so tests/shared-host-runtimes.spec.ts is the only pin.
2026-09-18 22:22:07 +08:00
fz 87cd0d8eb9 fix(skill): validate workspace dependency entry types 2026-09-18 22:19:37 +08:00
Yif d1e7bd0901 fix(client): keep the drag-gate fixture path outside packages/ so verify-package-paths resolves 2026-09-18 22:18:52 +08:00
imccyu 94607e48d6 Merge pull request #4578 from deepseek-harness/revert-4565-ihsiang/work-details-toggle
Revert "feat(web): add work details presentation modes"
2026-09-18 22:12:19 +08:00
imccyu 50460879db Revert "feat(web): add work details presentation modes" 2026-09-18 22:11:53 +08:00
涂轶翔 60f2b1a2c9 Merge pull request #4429 from deepseek-harness/feat/developer-session-changes
feat(session): add developer changes using historical tool schemas
2026-09-18 22:11:29 +08:00
ihsiang 68a684d9c0 Merge pull request #4565 from deepseek-harness/ihsiang/work-details-toggle
feat(web): add work details presentation modes
2026-09-18 22:04:42 +08:00
Yif 6f77b92121 docs(notes): reconcile shell.leading note with the sessionless conversation.header.leading seat
Master's sessionless-sidebar work renamed the conversation leading seat to
root-scoped conversation.header.leading instead of deleting it; the note now
states both seats' current roles rather than claiming outright removal.
2026-09-18 22:01:05 +08:00
Yif 64556a1285 fix(client): restore fullscreen panel drag subtraction, correct seat mount-condition docs
The fixed fullscreen right panel sits over the frame's leading band and the
sidebar logo row's drag rects, so without a whole-box no-drag its
non-interactive content dragged the window; restore the subtraction (darwin).
The shell.leading note and AppFrame comment now state the real mount
condition (darwin && sidebarCollapsed) instead of the platform-agnostic
collapsedWidth === 0 claim, which Windows' caption collapse also satisfies.
2026-09-18 21:51:01 +08:00
yixiangihsiang daa2387546 fix(ui-chat): derive trigger titles from durable sources 2026-09-18 21:47:37 +08:00
fz bffd23d3bc Merge remote-tracking branch 'origin/master' into feat/workspace-dependencies-package 2026-09-18 21:45:56 +08:00
fz 44e4750673 test(sdk): match Office startup wait to conversion deadline 2026-09-18 21:45:15 +08:00
Yif d94aef5214 Merge remote-tracking branch 'origin/master' into feat/macos-sidebar-ui-and-drag-refine 2026-09-18 21:42:09 +08:00
Yif 50f7bc0bc6 fix(client): declare pointerup/pointercancel on Tooltip AnchorProps 2026-09-18 21:41:57 +08:00
Yichen Yan 2708df4a9c Merge pull request #4203 from deepseek-harness/yyc/web-relative-routes-reviewed
fix(web): resolve feature routes from the document directory and gate browser routes
2026-09-18 21:28:35 +08:00
Yif 5467209f8e fix(client): settle tooltip pointer flag, harden drag gate, scope shared-curve doc
Clear pointerFocus on pointerup/pointercancel so a press that never moves
focus cannot swallow the next keyboard focus; match prefixed/unprefixed
app-region with !important tolerance and prove the allowlist path rejects
an offender; scope the ui-layout shared-curve limitation to data-animating.
2026-09-18 21:23:11 +08:00
mektpoy de8b10f8ab fix(browser-use): share the installation's scope and MCP client instances
A profile installs @deepseek-ai/dsh-experimental-browser-use-runtime from npm
beside the dsh installation, and that package declared @deepseek-ai/dsh-scope
and @deepseek-ai/dsh-mcp-client as dependencies, so the install carried its own
copy of both.

dsh-scope mints its scope-tag symbol per module instance, so the copy's
createScope tags a context the host's scopeOf cannot read. Every Agent's MCP
tools then registered in the global tool layer: the first Agent succeeded and
each later Agent's tool synchronization hit a name conflict, which
failOnStartupError turned into a failed creation.

Both are now peer dependencies (plus dev), which is how every other consumer of
ctx.tools and dsh-scope declares them and how a profile install reaches the
installation's single instance through the profiles module fallback.
schemastery stays a dependency: it carries no instance-local state.

Fixes #4573
2026-09-18 21:21:10 +08:00
Yichen Jiang 82c7889b0e Merge pull request #4539 from deepseek-harness/worktree/npm-registry-mirror-config-029a47
feat(plugin-manager): pick a registry and fall back through mirrors when one is unreachable
2026-09-18 20:58:06 +08:00
Yif 8837c532d1 Merge remote-tracking branch 'origin/master' into feat/macos-sidebar-ui-and-drag-refine 2026-09-18 20:54:38 +08:00
Yichen Jiang 61b099b77c fix(client): draw the registry popover's hairline as its elevation stroke
master's elevation contract (elevation-styles.client.spec.ts) rejects a
neutral border beside an lv/elevation shadow: the stroke belongs to the
shadow. The registry options keep their l3 hairline through
--dsw-elevation-stroke-color, as Menu does, with border: 0.
2026-09-18 20:50:04 +08:00
mektpoy 931505a9cc fix(workspace-files): list directory links through their resolved target
Windows directory junctions are reparse points that lstat reports as symlinks, so list refused My Music, My Pictures and My Videos with workspace-file/not-directory while its own listing reported them as directories. list now follows a final link, requires the resolved target to be a directory inside the workspace root, and keeps read's no-follow gate.
2026-09-18 20:45:00 +08:00
Yichen Jiang 5fe06ee64b Merge remote-tracking branch 'origin/master' into worktree/npm-registry-mirror-config-029a47
# Conflicts:
#	packages/client/ui-plugin-manager/src/client/PluginManagerPage.tsx
#	packages/client/ui-plugin-manager/src/client/manager-store.ts
2026-09-18 20:37:39 +08:00
Yichen Jiang 27207bfedb test(plugin-manager): stop an install before its first run deterministically
The cancelled-between-attempts case raced a zero-delay timer against the
file restore between two registries; under parallel load the restore won,
the second attempt started, and the once-only mock let it reach the real
pnpm. The stop now lands while the registries are read, before any run,
which is the same guard and cannot race.
2026-09-18 20:28:15 +08:00
Yichen Jiang 4d75946def Merge pull request #4552 from deepseek-harness/worktree/plugin-install-close
fix(web): allow closing pending plugin installations
2026-09-18 20:25:17 +08:00
lsdsjy 6ad7c991bf test(ui-chat,web): align browser coverage with work details folding 2026-09-18 20:23:46 +08:00
Yichen Jiang 1dfd026b84 Merge remote-tracking branch 'origin/master' into worktree/npm-registry-mirror-config-029a47
# Conflicts:
#	apps/web/tests/expected/plugin-install-cancel/cancelled.expected.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/boot/plugin-manager/README.i18n.yaml
#	packages/boot/plugin-manager/README.md
#	packages/boot/plugin-manager/README.zh.md
#	packages/client/ui-plugin-manager/README.i18n.yaml
#	packages/client/ui-plugin-manager/README.md
#	packages/client/ui-plugin-manager/README.zh.md
#	packages/client/ui-plugin-manager/src/client/PluginManagerPage.tsx
2026-09-18 20:21:59 +08:00
Yichen Jiang 75b20ea98c fix(web): remove unreachable fallback and pin snapshot scroll 2026-09-18 20:17:28 +08:00
mektpoy 771ebf4ace fix(web): scan plain src for a dual-face browser package without src/client 2026-09-18 20:06:44 +08:00
Yichen Jiang e7094c81e2 Merge origin/master into worktree/plugin-install-close 2026-09-18 20:03:08 +08:00
lsdsjy 50b7dd21a2 fix(ui-chat,web): isolate process updates and restore lifecycle details 2026-09-18 20:02:15 +08:00
Yichen Jiang f938ebad64 fix(web): recover lost plugin installation responses 2026-09-18 19:58:04 +08:00
Yichen Yan de2e799b0e Merge pull request #4202 from deepseek-harness/yyc/web-trust-domain-reviewed
feat(web): serve the shell, API and plugin resources from the document directory
2026-09-18 19:46:36 +08:00
lsdsjy afc62255a5 test(ui-chat): include performance settings in migration fixtures 2026-09-18 19:36:48 +08:00
lsdsjy 93caf245b4 fix(ui-settings): enable developer tools by default 2026-09-18 19:34:33 +08:00
lsdsjy f7daba8ca7 fix(ui-chat): map legacy normal work details to detailed 2026-09-18 19:34:33 +08:00
lsdsjy cb561cbe4e fix(ui-chat,web): align work detail labels and Bash snapshot 2026-09-18 19:22:24 +08:00
lsdsjy 6a9febf6fe Merge remote-tracking branch 'origin/master' into fix/pr4565-ci 2026-09-18 19:18:11 +08:00
Tianyi Cui 8913d033dc refactor(chat): match user messages before developer refusal
The input-message definition classifies ordinary user, steering, and injected
context messages. Put that supported path first so readers can follow its
matching rules directly, then handle deferred developer history afterward.

Keep the append/checkpoint predicates, matched identity, null result for
other events, and explicit developer error unchanged. This is a local
readability change with no presentation or persistence behavior change.

Validation: all 61 conversation-node definition tests pass, including user
classification and developer refusal. Scoped lint and whitespace checks pass.
2026-09-18 19:08:11 +08:00
Yixiang TuandTianyi Cui e0bd7e1960 feat(session): add developer changes using historical tool schemas
Session V4 reserves developer-role messages for incremental model-visible
session changes. The role, tool addition/removal blocks, and deferred-loading
marker need a durable representation before independent provider and UI
integrations can emit or consume them. Known developer events must match an
open turn and step; unsupported providers and UI consumers fail explicitly.

Request headers already capture full tool definitions. Persisting another
ToolSchema in each addition would duplicate Session information and create
two definitions that could drift. Additions therefore store toolName, and
the containing developer event uses headerSeq to select one earlier known
request/header for all its additions. A same-name replacement keeps its
historical definition identity through restart, fork and surface changes.
Removals require no definition copy, and ordinary developer messages omit
headerSeq. Generic sourceEventSeqs remains independent derivation metadata.

The rejected inline tool field is optional never with @persistenceReserved.
The schema extractor retains that uninhabited slot, so permitting a future
value requires a format bump instead of being mistaken for compatible
optional metadata. Unrelated optional fields remain additive and readable.

Native and Session admission reject missing, forward, non-header, unknown,
ambiguous and incomplete referenced definitions, and reject the retired
inline tool field. Validate complete schema fields only for referenced
definitions, preserving unrelated header behavior and extra JSON metadata.
Unknown ignorable records remain opaque. Empty developer nodes retain their
surface position without producing a message or shadowing the system head.
No automatic emitter, provider activation, UI implementation, or speculative
public resolver is added.

Keep the core-owned developer source binding beside the introduced role,
including the request-only type rejection and attribution round trips. Update
consumer guards, SDK/snapshot handling, bilingual owner documentation, and
the same unreleased V4 acknowledgement. Keep earlier tool/source migration
work and its documentation in the parent. Preserve the existing recorded
Cordis inspection generation from the original developer change.

Integration keeps the final source layer as the sole parent and preserves
master's Messages input filtering, empty-user omission, empty tool results,
and system-update placement. Developer/deferred guards still run before
conversion. Native V4 admission, header references, reservation declarations,
and generic tooling match the validated marker candidate. Parent-owned
fixture and generator fixes remain in the parent.

Earlier feature validation passed full build, full lint, 41 doc-sync gates,
and 16 hygiene gates. The unchanged native implementation retains that evidence.
The focused Session/V4/request-input run passes 884 tests across 38 files with
100% statement, branch, function and line coverage for the V3-to-V4 package
and Session surface. Consumer tests pass 482 with one existing skip; tool,
message and optional-field tests pass 146. Cordis inspection and compaction
replays pass in both source and built modes (two cases per mode). Ten invalid
referenced-definition/unknown-header controls failed before their scoped
guards and pass after them.

Reservation validation: the actual generated developer root records tool as
optional primitive never. Widening it requires a bump, while traceId remains
additive and preserved; all 85 focused reader/classifier tests pass.

Final-parent validation: 205 tests across eight provider, type, catalog,
Session and native-format files pass. The preserved parent fixture verifies
Messages input-history replay; runtime/declaration and parent-owned-file
comparisons show no loss during the final rebase.

Co-authored-by: Tianyi Cui <[email protected]>
2026-09-18 19:08:11 +08:00
Tianyi Cui b88afa8a72 fix(ptc): name persisted producer attribution ptc-mode
The producer-source refactor introduced the unreleased V4 discriminator
code-mode even though this source identifies images deferred from successful
PTC subcalls. Name it ptc-mode before V4 ships so persisted attribution
matches the producer and does not freeze obsolete terminology into new logs.

Keep the live writer, V3-to-V4 migration output, collision guard, and reserved
producer policy aligned. Both released tools-code-mode and tools-ptc plugin
lookup keys map to ptc-mode. Preserve those historical keys, opaque message
text and IDs, all frozen V0-to-V3 generations, and recorded Session inputs.

Update the owning tests, producer documentation, current catalog, and V4
acknowledgement. The canonical schema audit identifies exactly three changed
roots; reversing only the source literal restores each prior digest. The
large generated JSON diff comes from graph ordering, with 61 roots and 572
types retained.

Validation: the seven-file focused run passed 298 tests and exposed four
stale current-output expectations in two migration files. After correcting
those expectations, both files passed all 23 tests. All 41 documentation
gates and full lint passed; frozen generations and recorded inputs are
unchanged.
2026-09-18 19:07:12 +08:00
_KermanandTianyi Cui fb79a944f5 refactor(llm): separate durable producer sources from request inputs
Give durable user context its producer-owned source kind instead of a generic plugin wrapper. The V3-to-V4 conversion preserves the frozen rename and collision rules, all own JSON metadata, event coordinates, and historical request-only kinds. Native catalog and JSONL admission retain source validation so unknown attribution can survive without its producer while malformed owned sources are refused.

Use an explicit user-only RequestUserInput for auxiliary LLM prompts that do not own durable message identity. Auto Review and compaction remove their request-only source registrations while retaining prompt content and freezing; provider serializers and projections keep the same wire data, assistant replay isolation, image ordering, and tool correlation. Session writes, Agent delivery, and recorded title requests continue to require identified durable messages.

Bind the saved compatibility policy only to user sources and qualify tmux location attribution without weakening fixed system, model, or tool semantics. Rebuild the current inventory and unpublished V4 acknowledgement on the actual tool-role parent, preserving its rationale and all accepted historical records. The catalog format version records tooling metadata; Session remains V4. Developer-role policy and activation belong to their own feature.

The latest-master Messages adapter, serialization, request-input typing, EpochHeader reservation, and attribution checks pass 103 tests across five files. The retained V3 Messages input-history snapshot passes through the source profile; Host/Client typechecks and all 41 documentation gates pass. The generated comparison records four changed roots and 447 unchanged type fingerprints. Latest-master ARIA changes are retained, with producer source labels applied independently; new Messages fixtures retain their producer names as declared source kinds and use the fixed system-message helper; recorded Session generations are unchanged by this regrouping.

Co-authored-by: Tianyi Cui <[email protected]>
2026-09-18 19:07:12 +08:00
Tianyi Cui 29f7e7bdf5 fix(session): reserve retired system text in request-header schemas
Native V4 admission and Session adoption reject every request/header.header.system field because system prompts belong to system/message events. EpochHeader omitted that key, so the generated schema classified adding optional system text as a same-version optional-property addition even though released readers would reject it.

Declare system?: never with the shared persistenceReserved marker so the schema records the existing prohibition. Widening the field to string now changes a forbidden value set and requires a version bump. Keep both runtime guards and all unknown-metadata handling unchanged, and document the reservation alongside the current header type and V4 acknowledgement.

The regression extracts the actual event:request/header schema, checks the optional-never field, widens only that property, and verifies the version-bump diagnostic and native refusal. It fails without marker extraction and passes with the shared tooling support. The focused reservation, retired-syntax, and Session surface suites pass 65 tests; all 436 type-equiv blocks match their source. Generic marker extraction belongs to the foundational tooling change.
2026-09-18 19:05:33 +08:00
_KermanandTianyi Cui f4a32dbd0a refactor(llm): flatten tool results and validate native V4 sessions
Represent tool results as tool-role messages and migrate released wrappers
without losing outer own JSON fields, call identity, error state, or writer
field order. Refuse nested or wrapper-only information that has no lossless
current representation before successor publication.

Validate current event relationships directly instead of projecting V4 data
back into V3. Keep lifecycle, PTC, title/command, compaction, system-field and
retired-syntax checks on catalog restoration and ordinary JSONL opens. The
Worker JSON equality helper must inspect own keys so it cannot admit PTC
arguments that Node rejects.

Keep the source role change, required native admission and consumer fixture
updates in one complete review layer. Explain shared-type changes in the
persistence record and the native reader rationale in its existing note.
Use checked branded fixture identities and discriminant narrowing instead
of unknown double casts; fixture values and assertions remain intact.

This recomposes the original tool-role work by _Kerman with the independently
validated migration and admission repairs by Tianyi Cui. Frozen generations
and snapshot input version selection are retained.

Co-authored-by: Tianyi Cui <[email protected]>
2026-09-18 19:05:32 +08:00
Tianyi Cui c6e62ff971 fix(persistence): retain explicitly forbidden JSON fields
A reader can reject a property name while its type declares that property
as optional never. Dropping it from the extracted schema makes a future
optional JSON value look additive, although the existing reader refuses it.
The type history must retain that explicit prohibition.

Support the argument-free @persistenceReserved marker only on optional
properties whose values are never or undefined. Keep those properties as
optional primitive-never nodes, so later JSON values change an existing
field and require a version bump. Reject invalid placement, arguments,
repeated tags, required or JSON-valued declarations, and mapped uses that
violate the reservation. Keep every unmarked omission rule unchanged.

The classification regression failed before this change with an additive
optional-property result and now requires a type-change bump. All fifteen
focused reservation cases and all 210 tooling tests pass, including inherited
fields, misuse, and unmarked preservation. Host typecheck, scoped lint, and
pairing pass. Regeneration leaves the unannotated baseline catalog and
inventory byte-identical; all 61 roots still match their existing history.
No runtime property is activated in this tooling commit.
2026-09-18 19:05:32 +08:00
Tianyi Cui a6981c56f6 feat(persistence): add stable catalogs and policy-aware schema review
Traversal ordinals and first-owner paths gave shared persistence types
unstable display names. Keep authored names and source locations as metadata,
use structural digests for identity, and render complete kind/form groups
with bounded array labels. Preserve historical rendering and stored graphs.

Record supported source compatibility promises with their property binding,
policy version, discriminator, preservation rule, and qualified kind set.
The extractor and classifier require explicit opt-ins in both compared
schemas; ordinary or unsupported changes retain strict classification.
Policy-bearing graphs use the format-2 fingerprint domain while unannotated
graphs keep their format-1 fingerprints. Runtime owners activate bindings
only with the corresponding reader behavior; this tooling layer activates
none and changes no package source or Session generation.

Provide a read-only before/after review command that groups shared structural
evidence without replacing authoritative compatibility diagnostics. Match
changed alternatives only through unique literal discriminators and retain
ambiguous additions and removals as independent facts.

At the X baseline, all 61 roots and 472 schemas, digests, and source fields
are unchanged. The inventory remains format 1 and removes only 296 synthetic
names. Existing acknowledgement history still matches every root. All 195
focused tooling tests, Host build/full lint, and bilingual pairing pass.
2026-09-18 19:05:32 +08:00
Tianyi Cui bc710ac726 test(web): await the settled branch action in fork snapshots
The merged performance/usage preference hides elapsed-time controls by
default. The release-only mid-turn fork scenario still waited for
"Ran for", so its ARIA check timed out despite a completed child turn.

Wait for the visible, enabled branch action belonging to live turn 2.
That action requires the settled turn tail and directly exercises the
fork affordance this scenario owns. Preserve the existing exact-cut,
synthetic closer, resume-header, completed-turn, and streaming checks.
Keep the default preference rather than enabling unrelated timing UI.

Refresh only the obsolete elapsed-time button in the ARIA expected
output. Session JSONL inputs, historical generations, snapshot versions,
and production code remain unchanged. The former wait failed locally;
the four-case scenario passes in ordinary comparison mode after this fix.
2026-09-18 19:02:10 +08:00
winewill 925f609092 Merge remote-tracking branch 'origin/master' into fix/windows-mandatory-update-overlay 2026-09-18 18:47:20 +08:00
Yif 761f53223a feat(desktop): align main window default and minimum size with Codex (1280x820, min 480x600) 2026-09-18 18:44:24 +08:00
winewill d7fd452e96 test(desktop): exercise embedded mandatory update recovery on Windows 2026-09-18 18:40:31 +08:00
mektpoy 0e23ee6789 Merge branch 'yyc/web-trust-domain-reviewed' into yyc/web-relative-routes-reviewed
# Conflicts:
#	packages/client/ui-chat/tests/assistant-markdown-path-images.client.spec.tsx
#	packages/client/ui-open-in-app/README.i18n.yaml
#	packages/client/ui-open-in-app/README.md
#	packages/client/ui-open-in-app/README.zh.md
#	packages/client/ui-open-in-app/src/client/index.ts
#	packages/session-query/session-log-export/README.i18n.yaml
2026-09-18 18:35:31 +08:00
Yif e9b928d993 Merge remote-tracking branch 'origin/master' into feat/macos-sidebar-ui-and-drag-refine
# Conflicts:
#	.agents/notes/implemented/feature/2026-09-13-macos-hidden-titlebar-vibrancy.i18n.yaml
#	.agents/notes/implemented/feature/2026-09-13-macos-hidden-titlebar-vibrancy.md
#	.agents/notes/implemented/feature/2026-09-13-macos-hidden-titlebar-vibrancy.zh.md
#	docs/subsystems/slots.i18n.yaml
#	docs/subsystems/slots.md
#	docs/subsystems/slots.zh.md
#	packages/client/ui-conversation/src/client/contract/slots.ts
#	packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css
#	packages/client/ui-conversation/tests/skeleton.client.spec.tsx
#	packages/client/ui-sidebar/README.i18n.yaml
#	packages/client/ui-sidebar/README.md
#	packages/client/ui-sidebar/README.zh.md
#	packages/client/ui-sidebar/src/client/HeaderLeadingControls.tsx
#	packages/client/ui-sidebar/src/client/index.ts
#	packages/client/ui-sidebar/tests/apply.client.spec.tsx
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
2026-09-18 18:34:12 +08:00
Yichen Jiang 998d2ce8c9 fix(client): narrow the registry options to their content 2026-09-18 18:33:17 +08:00
mektpoy 2c6f634771 Merge branch 'master' into yyc/web-trust-domain-reviewed
# Conflicts:
#	tsconfig.host.json
2026-09-18 18:31:17 +08:00
Yichen Jiang 78522443f7 fix(client): keep the registry's host to its option
The control beside the guide, the attempt line, the run badges, and
the failure lists name a registry by its name alone; only the option
in the list carries the host it names.
2026-09-18 18:30:37 +08:00
winewill fdc4887c38 fix(desktop): embed Windows mandatory updates in the main window 2026-09-18 18:26:40 +08:00
Yichen Jiang c34e33cbd9 fix(client): title the registries by their hosts and drop the fallback note
The default registry reads as such with the host pnpm names, the
mirror carries its host too, and no line under them repeats it or
describes the order the Host would ask; the order shows only as the
Host asks it.
2026-09-18 18:25:57 +08:00
Tianyi Cui c95d045fdc docs(session): correct fork seed marker ownership
Arbitrary-sequence forks place the inherited end-seed marker before their
synthetic tool, step and turn closers. The Session constructor receives that
whole prepared seed, so firstLiveSeq can follow the inherited marker and the
constructor is no longer its sole producer. The retained documentation still
claimed both facts and could lead a consumer to use the wrong ownership cut.

Name buildForkSeed and the constructor as the two core producers, distinguish
the inherited cut from ordinary restore markers, and retain the warning about
plugins appending their own markers. Correct the subsystem reference's claim
that interrupted is the only synthetic turn ending: forked is also never
emitted by a live loop. Keep the bilingual reference and type-equivalent
excerpts aligned with the source JSDoc.

Refresh the required persistence catalog after the JSDoc change. Its schema
inventory changes only three source-line locations; all 61 roots, 472 types
and fingerprints remain identical. Parsed TypeScript declarations printed
without comments are also identical, so this changes neither runtime behavior
nor persisted fields, historical generations or recorded Session fixtures.
2026-09-18 18:25:39 +08:00
Tianyi Cui 044cd4fb49 merge: integrate pinned master into session-log-v4 base
Merge master 01d96c168a84227374e3aa741e94ddfbb498e27e, observed when
this integration started, after the published 6de3db41 checkpoint. Keep
master's author history and preserve the release writer, adjacent
migrations, historical Session generations, and parent-owned catalogs.

Combine blank Session writer acquisition and superseded-startup
cancellation with the release branch's projection refresh and panel
preservation. A startup acquisition may finish after a later navigation,
but must not retain a stale main Session or reveal its Conversation.
Update the existing regression's retention expectation while preserving
its panel and active-navigation assertions.

Keep the release catalog loading, known-leaf, and parent availability
behavior alongside master's completed-turn status and aligned sidebar
icons. Regenerate the config locations and pair the combined README
contracts. Preserve upstream's Linux process-state assertion repair.
2026-09-18 18:21:47 +08:00
Yifffan afc27869f7 Merge pull request #4532 from deepseek-harness/feat/plugin-refine
refine(plugin-manager): polish install dialog, wizard states, and plugin artwork
2026-09-18 18:05:11 +08:00
Kaige-Gao 0ed5151d0b Merge pull request #4448 from deepseek-harness/feat/session-header-feedback
feat(web): add feedback to session header menu
2026-09-18 18:01:38 +08:00
Kaige-Gao 1b622ae54c Merge master into feat/session-header-feedback 2026-09-18 17:47:22 +08:00
yixiangihsiang ae1cf3106b fix(web): polish work detail interactions 2026-09-18 17:46:32 +08:00
fz 5c263aaaf6 Merge remote-tracking branch 'origin/master' into feat/workspace-dependencies-package 2026-09-18 17:45:01 +08:00
fz defb9c3736 fix(sdk): shorten bundled Python resource paths on Windows 2026-09-18 17:44:15 +08:00
Yif c3226f93e9 Merge remote-tracking branch 'origin/master' into feat/plugin-refine
# Conflicts:
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-primitives/README.md
#	packages/client/ui-primitives/README.zh.md
#	packages/client/ui-primitives/tests/icons.client.spec.tsx
2026-09-18 17:43:20 +08:00
CreatixChu e651d00a9f Merge pull request #4354 from deepseek-harness/worktree/present-changes-dedup
通过提示词减少重复展示
2026-09-18 17:33:28 +08:00
Yif 978e39e94e fix(plugin-manager): align plugin-config e2e and README quotes with revised copy
The plugin-config e2e pinned the old terminal one-liner and its golden still
carried the three pre-revision summaries; the ui-plugin-manager READMEs still
quoted the renamed install-guide button. Refresh the golden, update the
assertion and both READMEs, and re-record the translation pairing.
2026-09-18 17:30:31 +08:00
Kaige-Gao de3f4c24ea fix: address feedback menu review and Linux process assertion 2026-09-18 17:30:19 +08:00
yixiangihsiang 5f90ac119e fix(web): refine live work disclosure presentation 2026-09-18 17:28:59 +08:00
lsdsjy 776efdf321 fix(ui-chat): hide infrastructure rows and retain turn triggers 2026-09-18 17:26:32 +08:00
lsdsjy f2cf7272ef fix(ui-tool,ui-skill): localize Chinese tool step titles 2026-09-18 17:26:31 +08:00
lsdsjy 687ee6e2c7 fix(ui-chat): align work detail modes and disclosure titles 2026-09-18 17:26:31 +08:00
lsdsjy ad1ddfd0b1 fix(ui-chat): hide settled reasoning previews when collapsed 2026-09-18 17:25:57 +08:00
lsdsjy 4216e778f5 fix(ui-chat): place response actions at the turn bottom 2026-09-18 17:25:57 +08:00
creatixchu 6453db05ca Merge remote-tracking branch 'origin/master' into worktree/present-changes-dedup
# Conflicts:
#	packages/client/ui-deliverables/README.i18n.yaml
#	packages/client/ui-deliverables/README.md
#	packages/client/ui-deliverables/README.zh.md
2026-09-18 17:25:53 +08:00
mektpoy c85e1d7b72 fix(client): raise the plugin inventory package identity to 12px
The Plugins settings inventory drew the Loader entry identity (cardIdentity)
at 11px in the code font, one step below the 12px the same identifier gets in
the expanded card's entry row. On Windows the code stack resolves to Consolas,
where 11px reads thin. Raise it to 12px/18px so it matches the sibling
identifier row and the page's other small text.

Fixes #4496
2026-09-18 17:25:40 +08:00
lsdsjy e132da911a fix(ui-chat): hide disclosure arrows for empty turn processes 2026-09-18 17:25:38 +08:00
lsdsjy 0859dca83f fix(ui-chat): show at least one second for completed turns 2026-09-18 17:25:37 +08:00
lsdsjy 55c564f31c feat(ui-chat): show independent notices for non-human turn triggers 2026-09-18 17:25:37 +08:00
lsdsjy fac2a46c02 fix(ui-chat): reset nested disclosures when collapsing a turn 2026-09-18 17:25:36 +08:00
lsdsjy a0c71e9f00 feat(ui-chat): add work details modes and keep retry rows separate 2026-09-18 17:25:36 +08:00
mektpoy 0301a0a062 fix(desktop): place Windows caption tooltips below the titlebar
The Windows caption menu host sits at z-index 1100 in the strip that --dsh-windows-menu-start reserves to the right of the sidebar toggle and New Session, so the sidebar's right-side hover bubbles rendered underneath the Application/Edit text. Render those two bubbles below the 40px caption instead; ordinary Web and macOS keep the default right side.
2026-09-18 17:25:14 +08:00
lsdsjy 0ce6ab6775 feat(ui-chat): reflect turn outcomes in process disclosure titles 2026-09-18 17:24:20 +08:00
lsdsjy b2296f5916 feat(ui-chat): show expanded turn timer from turn start 2026-09-18 17:23:52 +08:00
lsdsjy 97514daa23 feat(ui-chat): refine process titles and expose retry activity 2026-09-18 17:23:51 +08:00
lsdsjy fab6622abb feat(ui-chat): fold consecutive process steps and complete paginated turns 2026-09-18 17:23:51 +08:00
Yichen Jiang 2b168ce1ae fix(client): float the registry options over the install dialog and let its content scroll
With the guide open, unfolding the registry options pushed the dialog
past the viewport, and the card did not scroll. The options now float
from their toggle in a portal, right-aligned to it, folded by Escape
(claimed before the dialog's own Escape) or a pointer outside them,
and by the store when a run starts; useAnchoredPosition gains end
alignment for this. The dialog's content region scrolls under its
footer. The mirror reads as the mainland China mirror without a tag.
2026-09-18 17:20:10 +08:00
ihsiang 669bc2036f Merge pull request #4545 from deepseek-harness/ihsiang/refine-web-review-subagent-status
feat(web): refine review and subagent status UI
2026-09-18 17:19:52 +08:00
Turtle 5c8933fbe3 fix(session): acquire blank Session writers before reuse (#4392)
* fix(session): keep blank session discovery local to each host

* fix(session): acquire blank writers before reusing sessions

* refactor(workspace): separate saved selection restoration from blank lookup

* fix(workspace): create after the selected blank writer is held

* test(web): align blank reload snapshot with current icons
2026-09-18 17:19:40 +08:00
fz 9d66716e50 Merge remote-tracking branch 'origin/master' into feat/workspace-dependencies-package 2026-09-18 17:19:26 +08:00
fz 37983d9298 feat(sdk): bundle shared Office authoring resources 2026-09-18 17:17:46 +08:00
creatixchu ac0a042f08 Merge remote-tracking branch 'origin/master' into worktree/present-changes-dedup 2026-09-18 17:16:34 +08:00
creatixchu ba98bcbf08 test: refresh presentation guidance after review 2026-09-18 17:12:03 +08:00
creatixchu 223385954d fix: recommend at most four files per presentation 2026-09-18 17:10:38 +08:00
creatixchu 63c1e04b93 fix: keep file access available across presentation clients 2026-09-18 17:09:02 +08:00
Yichen Jiang cb2750019a fix(plugin-manager): read pnpm's own registry, its stdout refusals, and lay failures where they belong
Review of #4539. A refusal pnpm view prints as JSON on stdout was read
as unknown, so no registry was ever asked after a dead one; stderr and
stdout are now read alike, and a lookup killed at its bound is a
network refusal. pnpm's own registry joins the fallback plan only once
pnpm config get registry names npm's own or a configured fallback, so
a company registry in .npmrc is never followed by a public one, and a
registry pnpm already names is asked once. The Host lays each failure
at the registry or the spec's own host, reading the host off error
lines only, and reports it as ChangeResult.failedAt; a stop that lands
between attempts is cancelled, not failed. The package publishes its
registry rule through ./registry so the dialog plans with the Host's
own function, starts from the registry the Host asks first until one
is remembered, tags that one as the default, labels pnpm's own by the
host it names, and words and offers a change of registry from the
Host's attribution. ERR_PNPM_NO_OFFLINE_META is no longer a network
failure.
2026-09-18 17:03:04 +08:00
07akioni 6d7a5f9cc3 fix(desktop): verify archived descriptors and harden Office resolution 2026-09-18 17:01:17 +08:00
yixiangihsiang a0c7299f8b feat(web): refine review and subagent status UI 2026-09-18 17:01:04 +08:00
fz 1e3afc63ad Merge remote-tracking branch 'origin/master' into feat/workspace-dependencies-package 2026-09-18 16:58:33 +08:00
winewill f5b0f56ce6 Merge pull request #4528 from deepseek-harness/perf/macos-packaging
perf(desktop): speed up macOS packaging with verified signature caching
2026-09-18 16:56:48 +08:00
Yichen Jiang 6e456264a9 test(web): wait for sidebar collapse before reopening 2026-09-18 16:47:24 +08:00
Tianyi Cui d40f3fb658 test(hooks): synchronize inspection of an unpublished install lock
The Windows coverage job can schedule the test after the old 200 ms
publication delay has elapsed. File existence then no longer proves an
empty lock, so the setup assertion fails even though the installer is
correct. The original implementation reproduces that failure when parent
inspection is held until the record has been published.

Replace the delay-only test hook with two opt-in fixture barriers. Hold the
publisher after exclusive creation, and acknowledge the contender only
after it has observed an incomplete record. The test checks the empty bytes
before releasing both processes and always releases and awaits them during
cleanup. Existing normal-path lock and initialization budgets are unchanged;
no test barrier is entered without its explicit environment setting.

The focused barrier case and all 38 installer tests pass, as do scoped lint
and whitespace checks. This changes test synchronization rather than
loosening lock ownership or increasing production timeouts.
2026-09-18 16:40:25 +08:00
winewill 870b0099c6 fix(desktop): retain packaging errors and restore unconfigured proxies 2026-09-18 16:36:33 +08:00
creatixchu 13692e9179 test: refresh selective presentation prompt snapshots 2026-09-18 16:35:51 +08:00
Turtle de662ee010 fix(boot): skip failed profile bundles and retain recovery controls (#4516) 2026-09-18 16:35:50 +08:00
creatixchu 2e55564e02 fix: specify absolute paths for inline image rendering 2026-09-18 16:32:56 +08:00
creatixchu 28fbe7433d fix: guide selective file presentation through prompts 2026-09-18 16:31:13 +08:00
Yif a6267c8d90 fix(plugin-manager): per-instance artwork ids, detail error feedback, coverage
Give every plugin artwork per-instance SVG def ids via useId so repeats on
one page keep their gradients and clips; drop the dead agent-team-web-profile
artwork row; keep the read-failure alert and retry visible on detail pages;
cover the new artwork components and the default-artwork branch; document the
artwork exports in the ui-primitives READMEs; refresh the plugin-manager and
plugin-install-cancel web expected outputs for the revised copy.
2026-09-18 16:30:25 +08:00
creatixchu c19d1f12fb Merge remote-tracking branch 'origin/master' into worktree/present-changes-dedup 2026-09-18 16:26:45 +08:00
07akioni 54d46ad4d4 fix(desktop): unpack and verify native Office conversion 2026-09-18 16:25:29 +08:00
Tianyi Cui 959164f157 test(headless): align catalog diagnostic status with inactive state
Master's agent-target update reports non-running children as inactive. The
release-only descriptorless-child regression still expected ready, so CI
failed before comparing the persisted result. Update only that status in
the assertion and its expected output; direct catalog discovery and the
absence of corrupt-child diagnostics remain asserted.

The expected log retains version 3 and every other byte. A built assembled
headless run passes in normal comparison mode, preserving the older input
format and its upgrade/reconstruction coverage rather than refreshing the
snapshot generation.
2026-09-18 16:21:57 +08:00
winewill 6ed957ec33 Merge origin/master into perf/macos-packaging 2026-09-18 16:08:38 +08:00
Yichen Jiang 736730c3fd fix(web): allow closing pending plugin installations 2026-09-18 16:00:47 +08:00
Yif 92101e1a5b fix(ui-conversation): render the current crumb as text so the title joins the drag band
The current session's breadcrumb was a disabled button: the global darwin
no-drag rule subtracted it from the window drag band while its disabled state
and button user-select kept it from doing anything else, leaving the title a
dead zone that neither dragged the window nor selected. Plain text keeps the
native titlebar behavior — the title drags the window; ancestor crumbs stay
buttons.
2026-09-18 15:59:27 +08:00
CreatixChu bedcb7b58c Merge pull request #4373 from deepseek-harness/worktree/sidebar-open-in-default-app
为不支持预览的侧边栏文件提供本地打开操作
2026-09-18 15:59:19 +08:00
winewill fa6941971a Merge origin/master into perf/macos-packaging 2026-09-18 15:58:57 +08:00
Tianyi Cui c3cfe83d2e merge: update the session-log-v4 integration base from master
Merge a2acc7d3eb620bb52f09f7ea3b5a3a1c23353e18 after preserving the earlier
master checkpoint and its successful CI. Carry current provider input-history
handling, UI controls, agent targeting, and runner-concurrency changes into
the integration base without changing the Session migration feature layers.

Keep durable direct-child catalog semantics alongside the upstream running /
inactive vocabulary. Resolve the snapshot description conflicts by retaining
that upstream status text and the existing descendants-only diagnostic rule;
the source and all 53 JSON tool descriptions agree. Preserve parent-session
availability handling with the upstream stale-blank and batched-history fixes.

The merged application builds, all 41 documentation gates pass, and focused
provider, tool-control, and Session Controller tests pass (98, 29, and 125).
Recorded input changes come from master: one refreshed v3 list-agents sample
and three new v3 scenarios; no migration bumps an existing snapshot generation.
2026-09-18 15:52:56 +08:00
creatixchu e22005ae10 Sync session controller configuration catalog translation 2026-09-18 15:51:49 +08:00
creatixchu 1902842b6c Merge remote-tracking branch 'origin/master' into worktree/sidebar-open-in-default-app 2026-09-18 15:50:51 +08:00
winewill bba78f0534 Merge pull request #4514 from deepseek-harness/perf/windows-signature-cache
feat(desktop): share Windows runtime signature cache across worktrees
2026-09-18 15:48:55 +08:00
CreatixChu 4960abd402 Merge pull request #4371 from deepseek-harness/worktree/issue-4370-code-diff-sidebar
fix(web): 左右滚动同步
2026-09-18 15:40:22 +08:00
Yichen Jiang 66c1c5fadd fix(client): drop the sync-lag clause from the npmmirror registry line 2026-09-18 15:39:23 +08:00
winewill 545ccdb6f9 test(desktop): load proxy lock fixture from source 2026-09-18 15:37:33 +08:00
winewill 750bf4988e fix(desktop): initialize Windows cache under stage ownership 2026-09-18 15:37:05 +08:00
winewill 1a7308fbaa test(shell): synchronize background process completion 2026-09-18 15:37:05 +08:00
winewill 7754a6fd49 test(desktop): isolate Windows cache path from host platform 2026-09-18 15:37:05 +08:00
winewill d4ed1d93d8 feat(desktop): share Windows runtime signature cache across worktrees 2026-09-18 15:37:05 +08:00
creatixchu 363343fb83 Refresh config locations and satisfy typed fixture lint 2026-09-18 15:36:56 +08:00
Yichen Jiang e303efe017 fix(client): align an offered registry's line under its title
The indent meant for the typed address's field and line also reached
the line under each offered registry, pushing it past the title.
2026-09-18 15:36:41 +08:00
lsdsjyandlsdsjy 3e216c3d64 feat(ui-chat): add performance and usage display preference (#4478)
* feat(ui-chat): add performance and usage display preference

* fix(ui-chat): address performance preference review findings

* test(ui-chat): refresh Chinese turn footer snapshots

* docs(ui-chat): clarify completed-turn timing visibility

* test(ui-chat): capture preference failure screenshots

* fix(ui-chat): align performance preference with current icons

---------

Co-authored-by: lsdsjy <[email protected]>
2026-09-18 15:35:50 +08:00
creatixchu dd8c4b817b Keep fixture slot adapters explicitly typed 2026-09-18 15:33:47 +08:00
creatixchu ed4d95482b Assert the retained file action path in toolbar coverage 2026-09-18 15:32:55 +08:00
creatixchu 04d0235673 Verify local file opening and address sidebar review findings 2026-09-18 15:31:50 +08:00
Yifffan 54b76da126 Merge branch 'master' into feat/plugin-refine 2026-09-18 15:30:26 +08:00
fz 32524892a3 Merge origin/master into feat/workspace-dependencies-package 2026-09-18 15:27:45 +08:00
winewill 8dca1b7713 Merge master to synchronize desktop update dialogs 2026-09-18 15:27:03 +08:00
creatixchu 8f2a183514 fix(web): document paired column ref lifetime 2026-09-18 15:26:22 +08:00
creatixchu 12c0cbb56d Use document preview client config and shorten README summary 2026-09-18 15:24:51 +08:00
Yichen Jiang e06c7852ff Merge remote-tracking branch 'origin/master' into worktree/npm-registry-mirror-config-029a47 2026-09-18 15:24:42 +08:00
creatixchu 2cea45edc6 Remove duplicate guard from custom renderer fixture 2026-09-18 15:24:00 +08:00
creatixchu c538c4ec8f Adapt Office renderer fixture to file action slots 2026-09-18 15:23:13 +08:00
creatixchu 419d7c57c7 fix(web): make scroll frame callback return explicit 2026-09-18 15:23:00 +08:00
winewill 3bd8cfdf20 Merge pull request #4523 from deepseek-harness/fix/modal-backdrop-transition
fix(desktop): keep update dialog backdrop stationary across prompts
2026-09-18 15:22:22 +08:00
creatixchu 9e1635b6b6 Merge master and refresh sidebar file-opening integrations 2026-09-18 15:21:47 +08:00
Yichen Jiang 398a4247ae feat(client): pick and remember the registry a plugin install asks first
The install dialog folds a registry control beside the guide: the
official registry, the mirrors the Host configured, and a typed
address, remembered in this browser and passed to the check and the
run. The installing screen names the registry the Host moved on to,
each pnpm run carries its registry, and a failed run names every
registry asked, or the host a git or tarball spec could not reach,
with a shortcut back to the registry options. The Host answers the
spec's own host and the registries it asked so the dialog can say so.

Also documents the registry plan in the package READMEs, the boot
subsystem page, the catalogs, and an Agent Note; pins the flow through
a real Host/browser e2e and refreshes the tool-schema snapshots.
2026-09-18 15:21:44 +08:00
Yichen Jiang 716e2e2683 feat(plugin-manager): ask configured registries in turn while one is unreachable
Add registry and fallbackRegistries to the manager Config, ask them in
order from inspect and installBundle with --registry, and move on only
for failures another registry can change: unreachable, timed out, or a
copy the registry lacks. A git or tarball spec's own host is never
retried through a registry, and a registry outside the configured set
is asked alone. The lookup runs without pnpm's retries so a dead
registry is reported within inspectTimeoutMs; the install keeps pnpm's
defaults. Results carry the registries asked, the install-state event
names each attempt, and the plugin_manager tool takes a registry.
2026-09-18 15:21:44 +08:00
Yifffan a363f7b5af Merge branch 'master' into feat/plugin-refine 2026-09-18 15:21:20 +08:00
creatixchu cc9caed57b fix(web): type browser regression style cleanup as Node 2026-09-18 15:19:50 +08:00
winewill a051fed540 Merge latest master into perf/macos-packaging 2026-09-18 15:18:13 +08:00
creatixchu b5cbcad854 fix(web): preserve split diff scroll offsets across clamped peers 2026-09-18 15:17:13 +08:00
Yichen Jiang 3e206546fd Merge pull request #4351 from deepseek-harness/worktree/fix-new-session-stale-blank
fix(web): reconcile stale blank session hints from projections
2026-09-18 15:17:11 +08:00
winewill 7313e8dcc7 Merge master and fix desktop packaging proxy locking and checks 2026-09-18 15:17:03 +08:00
Yifffan 0c4f554d6e Merge branch 'master' into feat/plugin-refine 2026-09-18 15:16:13 +08:00
winewill 0c38f6fe43 Merge branch 'master' into fix/modal-backdrop-transition 2026-09-18 15:15:51 +08:00
creatixchu 79677e4824 Merge remote-tracking branch 'origin/master' into worktree/issue-4370-code-diff-sidebar 2026-09-18 15:15:11 +08:00
Yif e67aca993e docs(notes): align window-chrome notes and sidebar README with shipped drag ownership
The seat note claimed a plugin-manager inline clearance formula that never
shipped (entry pages pad by the unconditional --dsh-frame-top-clearance) and
omitted the 84px fullscreen clearance tier. The vibrancy note still called the
sidebar top strip a drag region after that declaration moved to the frame's
.leadingBand, said drag lives in "exactly two places" while the Windows caption
::before is a third, and lacked the dsh-desktop:window-fullscreen relay that
drives html[data-fullscreen]. The ui-sidebar README carried the same stale
top-strip drag claim. Chinese sides follow; pairings re-recorded.
2026-09-18 15:14:59 +08:00
Yichen Jiang ce4810cacb Merge pull request #4533 from deepseek-harness/worktree/custom-provider-url-placeholders
fix(web): match custom provider URL placeholders to protocol
2026-09-18 15:14:28 +08:00
Yif b42bb09420 Merge remote-tracking branch 'origin/master' into feat/plugin-refine 2026-09-18 15:10:18 +08:00
Kaige-Gao fa009c79e4 Merge master into feat/session-header-feedback 2026-09-18 15:10:02 +08:00
winewill 021a3c6065 Merge branch 'master' into fix/modal-backdrop-transition 2026-09-18 15:08:00 +08:00
fz ce09d8a293 Merge origin/master into feat/workspace-dependencies-package 2026-09-18 15:06:49 +08:00
Yichen Jiang 27eec0a247 Merge remote-tracking branch 'origin/master' into worktree/fix-new-session-stale-blank
# Conflicts:
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/api/session-controller/src/client/sessions/manager.ts
#	packages/api/session-controller/tests/manager.client.spec.ts
2026-09-18 15:05:52 +08:00
Turtle 2099andTurtle f83800530c fix(web): recolor the plan chip and align it with the control row (#4399)
* fix(web): make the plan chip a business-accent control at row height

The chip borrowed the warn-state pair for a plain mode flag, so it read as
a warning, and its 2px vertical padding left it 4px shorter than the + and
select controls beside it. It now uses the business accent pair, takes the
row's 28px height, and carries Chinese copy; the unused chip.off.*
dictionary entries had no surface and are dropped.

* docs(web): re-record the plan chip README pair

* docs(web): state the plan chip's close glyph and drop stale copy claims

The READMEs described the chip without the × the component renders, and the
zh side still quoted the English accessibility string after this branch gave
the namespace its own Chinese one.

* test(web): pin the plan chip's accent tokens, height, and Chinese copy

The lifecycle-chrome lane asserted the chip's warn pair; it now asserts the
business pair plus the 28px row height, and a zh plan-active golden records
the 「计划」 label the chip shows under the Chinese locale.

* fix(web): color claimed command tokens with the business accent

The draft's claimed token still used the warn label color while the plan chip
moved to the business pair, so a claimed /计划 read orange above a blue chip.
The claim decoration and the tests asserting its inline style now use
state-business-primary.

* fix(web): keep the composer control row on one line at narrow widths

The fixed-width mode chips and send circle left the row's 12px gaps deciding
between a slack first line and a wrapped trailing group: beside the plan chip,
a long model name moved the model trigger and send circle to a second line
while the first line still had room. Narrow rows now use 8px gaps, which holds
the row together down to the icon-only model trigger.

* fix(web): drop the context ring in the narrow composer row

With plan mode on and a long model name, the 28px occupancy ring plus its gap
was what pushed the trailing group onto a second line. The ring yields at the
same row width that already hides the access-mode label, so the fixed controls
keep one line; the reading stays reachable from a wider window.

---------

Co-authored-by: Turtle <[email protected]>
2026-09-18 15:04:54 +08:00
Yif c52400ad72 test(ui-primitives): count the new check-circle glyph in the icon set 2026-09-18 15:01:43 +08:00
Yichen Jiang 98c083bb31 fix(web): match custom provider URL placeholders to protocol 2026-09-18 15:01:24 +08:00
winewill 0c3eb28276 test(desktop): await mandatory overlay fade after policy clearance 2026-09-18 14:59:30 +08:00
winewill 72d93cbcc2 fix(desktop): reset scroll when replacing update prompts 2026-09-18 14:59:30 +08:00
winewill a666209a59 fix(desktop): fade mandatory update overlays in place 2026-09-18 14:59:30 +08:00
winewill 299101077a fix(desktop): keep update dialog backdrop stationary across prompts 2026-09-18 14:59:30 +08:00
fz b51e64d70e refactor(skill): flatten primary runtime version metadata 2026-09-18 14:57:12 +08:00
07akioni 3f5b1e283b Merge pull request #4464 from deepseek-harness/07akioni/fix-sessionless-sidebar-controls
fix(client): keep sidebar navigation available without a session
2026-09-18 14:55:25 +08:00
Yif 76fa3860c6 fix(plugin-manager): drop guide item background that surfaced in dark mode 2026-09-18 14:54:12 +08:00
Yif 3065e75d08 Merge remote-tracking branch 'origin/master' into feat/plugin-refine
# Conflicts:
#	packages/client/ui-plugin-manager/src/client/locales.ts
#	packages/client/ui-primitives/src/icons/index.tsx
2026-09-18 14:45:13 +08:00
Yichen Jiang b1cf410e0c Merge pull request #4520 from deepseek-harness/worktree/windows-observational-reuse
refactor(ci): reuse Windows builds for observational checks
2026-09-18 14:42:43 +08:00
_Kerman 8fe06cfb24 Merge pull request #3956 from deepseek-harness/xtr/tool-card-details
feat(web): render compact details for recorded tool results
2026-09-18 14:42:13 +08:00
fz b16b116408 Merge origin/master into feat/workspace-dependencies-package 2026-09-18 14:41:15 +08:00
Dudu-0223 eb570e306a Merge pull request #4251 from deepseek-harness/fix/4246-agent-targets
fix: expose Team targets and simplify model agent statuses
2026-09-18 14:39:52 +08:00
07akioni d6002c1018 Merge master and preserve compact conversation header layout 2026-09-18 14:39:32 +08:00
_Kerman 7bd832675a Merge latest master into xtr/tool-card-details 2026-09-18 14:34:46 +08:00
_Kerman 91679f8351 Merge remote-tracking branch 'origin/master' into xtr/fix-snapshot-source-ranges 2026-09-18 14:33:25 +08:00
Dudu-0223 66846bf8c0 test: refresh agent guidance in sidecars added on master
subagent-activation-limit and plugin-manager-mcp landed after this branch
diverged and still pinned the idle/ready descriptions; regenerate both
through their owners so every pinned header carries the shipped text.
2026-09-18 14:29:35 +08:00
Dudu-0223 cda99db4c0 docs: align remaining agent availability prose with the shipped vocabulary
Sync the pinned schedule-catalog tool-schema sidecar with the refreshed
list_agents, send_message, subagent, and subagent_fork descriptions; the
catalog e2e does not compare it, so the refresh missed it. Rewrite the
Agent Teams note's Steer sentence and the ownership-release limitation so
`idle` no longer appears where the roster vocabulary is running/inactive,
and fix the two-clause comma splice and a zh full-width spacing slip.
2026-09-18 14:29:35 +08:00
Dudu-0223 563d040d23 test: refresh subagent guidance in plugin manager snapshot 2026-09-18 14:29:35 +08:00
Dudu-0223 b9e59cbaee refactor: unify Team availability in the service 2026-09-18 14:29:35 +08:00
Dudu-0223 8b6831daa0 test: refresh agent guidance embedded in PTC prompts 2026-09-18 14:29:35 +08:00
Dudu-0223 507e0e6dfe fix: expose Team targets and simplify model agent statuses 2026-09-18 14:29:35 +08:00
Yif e509dd9341 fix(client): pulse an app-region nudge at the right panel's open/close edges
Electron recollects window drag rects only when a style or layout pass
dirties an app-region value, and Blink skips hidden boxes when collecting
them, so the first open of the slid-off panel left the strip swallowed by
the drag band until an unrelated layout ran.
2026-09-18 14:28:12 +08:00
Yif 9ae6f0defa fix(client): mount the shell.leading seat on macOS only and cover the fullscreen relay 2026-09-18 14:28:07 +08:00
Yichen Jiang ed50586256 refactor(ci): remove unused Windows observational entry 2026-09-18 14:27:45 +08:00
imccyu 21e31ac05e Merge pull request #4494 from deepseek-harness/perf/chat-navigation-history
perf(chat): 虚拟化轮次导航并聚合历史跳转
2026-09-18 14:21:32 +08:00
winewill 5ef7023b6c perf(desktop): cache verified macOS runtime signatures 2026-09-18 14:15:47 +08:00
imccyu 462c354792 test(web): await both subagent settings saves 2026-09-18 14:13:48 +08:00
imccyu 6f66437de4 fix(ui-chat): prioritize submissions over pending scroll samples 2026-09-18 14:13:48 +08:00
imccyu d53c305224 fix(ui-chat): preserve turn rail follow and preview behavior 2026-09-18 14:13:48 +08:00
imccyu 8f62fc8ebd test(web): separate rail wheel input from keyboard preview assertions 2026-09-18 14:13:48 +08:00
imccyu 0a8702b216 docs: record chat navigation performance and ownership decisions 2026-09-18 14:13:47 +08:00
imccyu 3d360e7fdb perf(session-controller): publish historical jump pages as one batch 2026-09-18 14:13:47 +08:00
imccyu e22b0d75e8 refactor(ui-chat): separate viewport and scroll navigation policies 2026-09-18 14:13:47 +08:00
imccyu f89cd786aa perf(ui-chat): virtualize fixed-pitch turn navigation 2026-09-18 14:13:47 +08:00
Yichen Jiang 235db2a031 Merge remote-tracking branch 'origin/master' into worktree/windows-observational-reuse
# Conflicts:
#	.github/workflows/ci.yml
2026-09-18 14:13:26 +08:00
Tianyi Cui 1dd0ec6ac5 test(web): retain fork snapshot coverage with decorative icons
The release-only mid-turn fork scenario retained the old accessibility
children after master switched common icons to decorative presentation.
Refresh its expected tree from the built scenario: the same top-level
button names, failure text, parent/child prompts, and response remain.
Only redundant icon and label children disappear.

CI reproduced the mismatch. All four fork cases pass after refresh and
again in normal comparison mode. A mechanical comparison confirms that
removing nested children and their now-unused parent colons is the entire
expected-output change. The recorded Session generations and production
code are untouched.
2026-09-18 14:13:20 +08:00
Yichen Jiang 965e2c2995 Merge pull request #4512 from deepseek-harness/worktree/messages-input-history-compat
fix(llm): tolerate assistant blocks in Messages input history
2026-09-18 14:10:47 +08:00
Turtle 5459be6656 ci: halve core-seconds in static and Windows observational lanes (#4521)
* ci: trial smaller Blacksmith static and observational runners

* ci: measure the 16-vCPU control for runner sizing

* ci: use 4-vCPU static and 8-vCPU observational runners

* ci: retain 8-vCPU static runner for completion time
2026-09-18 14:01:46 +08:00
Yif bd6447479d refine(plugin-manager): polish install dialog guide, input, and wizard states 2026-09-18 14:00:50 +08:00
Yichen Jiang a116bf73c6 Merge master and name combined Windows checks 2026-09-18 13:41:06 +08:00
_Kerman b53fda5961 Merge latest master into xtr/tool-card-details 2026-09-18 13:33:54 +08:00
Yif 02bb08ecd9 fix(client): compensate menu fills for the blur the transparent window disables 2026-09-18 13:33:00 +08:00
Yif 8072511aad fix(client): subtract dockkit strip runs and pane bodies from the macOS drag band 2026-09-18 13:32:55 +08:00
Yif e44345c044 test(desktop): stub syncWindowFullscreen in preload-platform mocks 2026-09-18 13:32:53 +08:00
Yichen Jiang 51d8c45413 Merge pull request #4477 from deepseek-harness/worktree/unify-agent-team-bundle
fix(agent-team): enable tools and Web UI with one bundle
2026-09-18 13:21:45 +08:00
Tianyi Cui 4375f6cd83 test(web): align catalog button snapshot with decorative icons
The latest master hides the catalog chevron from the accessibility tree.
The release-only catalog-push snapshot still expected that image child,
although the button retains its complete "2 subagents" accessible name.
Refresh that expected output after the actual built Web scenario; its
recorded Session input and all interaction assertions remain unchanged.

The old expectation failed against the merged application. The refresh
changed only this three-line snapshot, and the normal read-only rerun
passed all 11 subagent conversation cases with every replay call consumed.
2026-09-18 13:21:30 +08:00
Turtle 9d5fc30632 ci: adapt concurrency to available runner CPUs (#4518)
* ci: adapt worker pools to available runner CPUs

* ci: preserve local snapshot worker defaults

* test: isolate CI worker overrides in gate fixtures

* docs: clarify shared Windows worker limits
2026-09-18 13:17:34 +08:00
Yichen Jiang 46f7ab097f refactor(ci): reuse Windows builds for observational checks 2026-09-18 13:14:35 +08:00
Tianyi Cui 8306ddaa14 merge: refresh session-log-v4 base from master
Merge master 0fdadce5189dcf13a00c2ed8293be95b9bb29c2c into the reviewed
Session V4 integration base. Preserve its V4 persistence and direct-catalog
subagent navigation while carrying forward current UI controls, decorative
icons, Desktop signing/runtime changes, and upstream tests.

Resolve lineage conflicts by retaining interaction-time catalog authority,
known-leaf handling and row order together with the shared status icons.
Keep both Desktop shell-routing regressions and one production route; master
now includes the route repair previously carried by this integration branch.

The full build, 41 documentation gates, two Desktop shell tests and 34 focused
Client lineage tests pass. Further built Web and packaging checks precede
publication. Preserve this pinned merge checkpoint before taking a newer
master tip, and propagate it through the reorganized feature stack.
2026-09-18 13:11:25 +08:00
Yichen Jiang 19e6e7b81b test(agent-team): verify browser activation and document bundle composition 2026-09-18 12:53:31 +08:00
Turtle de742f7f45 Prune active Agent Notes and preserve historical archive formatting (#4431) 2026-09-18 04:50:47 +00:00
_Kerman 9ee0d1257b test(session-snapshot): cover source-reference projection directly 2026-09-18 12:44:35 +08:00
Yichen Jiang 5daaaea3c0 Merge pull request #4457 from deepseek-harness/worktree/plan-tab-text-icon
fix(web): align plan sidebar with file previews
2026-09-18 12:41:32 +08:00
Yichen Jiang ae180d1d24 test(llm): document Messages input compatibility limits 2026-09-18 12:40:44 +08:00
Yudong Han fee816628f Merge pull request #4506 from deepseek-harness/fix/office-font-warning
fix(web): move Office font warnings into the document toolbar
2026-09-18 12:34:15 +08:00
Yichen Jiang 231798102a Merge remote-tracking branch 'origin/master' into worktree/unify-agent-team-bundle 2026-09-18 12:32:38 +08:00
Yichen Jiang 732f198cf4 Merge remote-tracking branch 'origin/master' into worktree/plan-tab-text-icon
# Conflicts:
#	apps/web/tests/expected/plan-review/temporary.expected.md
#	packages/client/ui-plan/src/client/PlanPreview.tsx
#	snapshots/web/plan-review/preview.expected.md
2026-09-18 12:31:05 +08:00
Turtle 3164e3c616 ci: right-size Blacksmith runners by workload (#4489)
* ci: right-size Blacksmith runners by workload

* ci: retain static runner capacity supported by utilization

* ci: retain observational runner for peak CPU and memory demand

* ci: restore Windows build to 16 vCPU after runtime regression

* ci: trial 4-vCPU runtime packaging to reduce CPU time allocation

* ci: trial 2-vCPU Linux packaging and serial Windows tests

* ci: include Windows packaging in 2-vCPU trial
2026-09-18 12:28:51 +08:00
Yif fd04c0c4be feat(client): make the macOS sidebar wordmark a window-drag surface
On darwin the expanded brand renders as a plain span instead of the New
Session shortcut button, so it stops matching the global interactive
no-drag rule and inherits the logo row's drag region; the dedicated New
Session button keeps the action.
2026-09-18 12:25:05 +08:00
winewill 1e390797e8 Merge branch 'refactor/desktop-update-domain-config' into perf/mac-packaging-timing 2026-09-18 12:08:57 +08:00
yudshj da37b69fb9 Merge master into fix/office-font-warning 2026-09-18 12:07:58 +08:00
yudshj 19736552c0 fix(web): align Office font warning with shared toolbar styles 2026-09-18 12:03:54 +08:00
Yif b9bc99b675 Merge origin/master (#4451 developer tools setting)
The view tab strip keeps the data-conversation-tabs marker on upstream's
showTabs condition, so the deepened drag band follows the compact header.
2026-09-18 12:01:55 +08:00
std4453 215226753d Merge pull request #4451 from deepseek-harness/feat/developer-tools-preference
feat(client): add shared developer tools setting
2026-09-18 12:00:10 +08:00
Yif 994e998b7d feat(client): deepen the conversation drag band to the header block
While the Conversation is selected and its header shows the view tab strip,
the macOS window drag band grows from 52px to the 76px header block (title
row plus tab strip), so blank header space drags. The band matches the
strip's data-conversation-tabs marker via :has, so a compact header (single
view, per #4451's developer-tools setting) falls back to the 52px strip.
2026-09-18 11:59:45 +08:00
winewill 76a592e3ab refactor(desktop): configure test policy login origins 2026-09-18 11:57:56 +08:00
winewill e0264148b0 perf(desktop): configure macOS packaging concurrency and retain phase logs 2026-09-18 11:54:54 +08:00
fz 4d34cd87dd fix(skill): address shared runtime review findings 2026-09-18 11:52:04 +08:00
_Kerman 449c679892 fix(session-snapshot): expand source references before writing fixtures 2026-09-18 11:47:09 +08:00
Yichen Jiang 82c6a5e4f4 fix(llm): tolerate assistant blocks in Messages input history 2026-09-18 11:44:40 +08:00
fz 3ebd70020c Merge origin/master into feat/workspace-dependencies-package 2026-09-18 11:42:26 +08:00
Yif c8b17dd4d0 refine(plugin-manager): per-plugin artwork, trailing load-failure notice, friendlier copy 2026-09-18 11:38:45 +08:00
Yif d66b9c81b1 fix(desktop): drop superseded preload.ts after merge
Upstream removed the standalone plugin manager and replaced this bridge
with preload-app.ts; the fullscreen sync it carried already lives there.
2026-09-18 11:36:21 +08:00
Yichen Jiang dd8d39c843 Merge remote-tracking branch 'origin/master' into worktree/unify-agent-team-bundle
# Conflicts:
#	packages/experimental/agent-team-profile/package.json
#	packages/experimental/agent-team-web-profile/package.json
2026-09-18 11:34:21 +08:00
07akioni 21c347913d fix(client): preserve sessionless header geometry across platforms 2026-09-18 11:30:37 +08:00
Yif e9def243e2 Merge origin/master into feat/macos-sidebar-ui-and-drag-refine
Keeps both window-chrome features: this branch's macOS shell.leading seat,
single drag owner, and fullscreen sync alongside upstream's Windows desktop
titlebar (#4407). ipc.ts and preload-app.ts merge both platforms' channels
and preload wiring; Tooltip merges upstream's suppression context with this
branch's pointer-focus suppression; slot-catalog regenerated.
2026-09-18 11:27:06 +08:00
07akioni e0c8b1dfca Merge remote-tracking branch 'origin/master' into 07akioni/fix-sessionless-sidebar-controls
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.md
#	packages/client/ui-conversation/README.zh.md
2026-09-18 11:23:23 +08:00
Yif 8019d37d3f feat(client): frame-owned macOS window chrome with single drag owner
One 52px leadingBand in the AppFrame (frame's first child) plus the sidebar
logoRow are the only -webkit-app-region drag surfaces; everything interactive
subtracts itself through two global base.css rules (interactive elements and
body > :not(#root) overlay portals), so header controls, breadcrumb chips, and
strip tabs stay clickable under the band. A ui-theme stylesheet gate pins the
two-file drag allowlist. The frame publishes --dsh-frame-top-clearance (48px)
for entry pages (plugin manager list and detail) beside the existing
--dsh-frame-leading-clearance, replacing per-page hardcoded insets. The
shell.leading window-chrome seat moves the collapsed-sidebar reopen controls
from the conversation header to the frame. Sidebar vibrancy tint drops the
blue cast in dark mode and halves its fill opacity, light mode softens the
blue mix, and the logo row tightens 4px above New Session.
2026-09-18 11:08:13 +08:00
yudshj 9b27cc0587 fix(web): move Office font warnings into the document toolbar 2026-09-18 11:06:09 +08:00
zhc fb2be52104 fix(client): compact conversation headers without view tabs 2026-09-18 11:03:07 +08:00
zhc 4429a672b7 refactor(client): keep developer preference in settings scope 2026-09-18 11:03:06 +08:00
zhc caaaf89b1e fix(client): separate developer tool policy and harden static previews 2026-09-18 11:03:06 +08:00
zhc 54e6aabf0c test(client): cover developer tools row settings injection 2026-09-18 11:03:06 +08:00
zhc 07e3619ec3 test(web): enable developer tools in trajectory image fixture 2026-09-18 11:03:06 +08:00
zhc 012f993ed4 fix: address developer tools preference review 2026-09-18 11:03:06 +08:00
zhc cdaafbc456 feat(client): add shared developer tools setting 2026-09-18 11:03:05 +08:00
winewill 831ea36f2c Merge pull request #4461 from deepseek-harness/ihsiang/unify-web-ui-visual-language
Unify the Web UI visual language
2026-09-18 11:00:11 +08:00
winewill bf34d10e23 Merge pull request #4455 from deepseek-harness/fix/windows-native-dependency-signing
fix(desktop): sign native dependencies, cache signatures and restore startup dialogs
2026-09-18 09:26:22 +08:00
Tianyi Cui 863ffe83a6 test(desktop): type the application path mock as string
The shell asset regression substitutes a real package path through getAppPath, but the shared test harness inferred only the literal desktop-test-app. Vitest executed the test successfully while the repository TypeScript build rejected the path override.

Declare the mock return type as string to match Electron getAppPath and permit both fixture and real package paths. This changes only test typing; it adds no casts or production behavior. The focused production-routing regression passes after the correction.
2026-09-18 02:00:08 +08:00
Tianyi Cui 64c669fc79 fix(plan): open embedded plan previews in the visible sidebar
A child conversation rendered in a parent Sidebar keeps the child Session identity for reading its plan. Routing navigation through openResourceIn(child) confused that document identity with the layout owner: a child with no adopted Sidebar store silently opened nothing, and an existing child store was invisible.

Use the mounted Sidebar navigation service for both logged and temporary plan previews. Keep the complete child Session resource address, so reads and reload still target the correct document. A real-controller regression adopts only the visible parent store and proves both child entry points populate it without creating child layout state; it fails before the fix.

All 47 ui-plan owner tests and all four built Web plan-review cases pass, along with the full build, scoped typed lint, and bilingual pairing. No Session event, stored document, fixture generation, or resource-address format changed.
2026-09-18 01:56:04 +08:00
Tianyi Cui 13cbe34fc0 docs(subagent): use the registered sidebar chat address
The imported conversation note names a chat resource host that the current parser rejects. The provider is registered under subagentchat and its existing helpers and reference documentation use that host. Correct both language examples without changing addresses, parsing, or persisted layouts.
2026-09-18 01:53:37 +08:00
Tianyi Cui 12e3d45cdc fix(desktop): stop copying the retired management preload
The workspace-update qualification runner still copied lib/preload.cjs after the standalone management preload and its build entry were removed. A clean Desktop build emits only the application, mandatory-update, and update-dialog preloads, so qualification failed with ENOENT before Electron could start; stale outputs could conceal that failure.

Remove only the obsolete copy-list entry. Keep all three current preloads required and retain ordinary copy failures. Executing the actual copy loop against artifacts from a fresh isolated Desktop build now copies exactly those three files byte-for-byte while lib/preload.cjs is absent; the same loop failed at that missing file before this change.
2026-09-18 01:53:37 +08:00
Tianyi Cui 8ae136f402 fix(desktop): serve shell-owned update assets
Ordinary and mandatory update windows still load dsh-app://shell documents after the standalone plugin manager was removed. The production protocol handler handled only the app hostname, so their existing HTML, scripts, and styles returned 404; mandatory-load failure deliberately retains the modal block.

Route the shell hostname to the packaged renderer directory through the existing static-asset helper. Retain its GET/HEAD, path-containment, MIME, and missing-file rules; keep isolated preloads and owned-window IPC authorization unchanged.

The regression imports the real main entry, captures its registered protocol callback, and reads all seven actual update assets through the real static helper. It fails with 404 before the fix and passes afterward, including HEAD, rejected methods, malformed paths, traversal, and unknown resources. Sixteen adjacent static/dialog/overlay tests pass, and the Desktop package builds from a fresh worktree.
2026-09-18 01:53:37 +08:00
Tianyi Cui 371c804336 test(cli): run the headless profile through source and built launchers
The expected-output CI lane sets DSH_EXAMPLE_MODE=lib. Selecting tsx/esm
alone did not exercise the source bin there, and the compatibility test
only checked --help, so removing source profile link resolution could
silently restore duplicate source/lib Tools instances in a green CI run.

Run the existing real headless-profile tool round trip explicitly in both
src and lib modes. The explicit mode overrides the CI environment default;
the source case uses the supported tsx/esm entry. Both cases retain the
real profile, shell tool, persisted Session assertions, stdout, and stderr
expectations, with isolated temporary directories. No recorded generation
or output normalization changes are needed.

After a full build, both cases pass with DSH_EXAMPLE_MODE=lib. Negative
control: removing only the source bin link-resolution selection makes the
source case fail at scheduler.prepare while the built case still passes.
Restoring the implementation makes both cases pass again. Scoped lint
passes. This puts the regression in the existing post-build expected-output
CI lane without adding artifact requirements to compatibility-only jobs.
2026-09-18 01:53:37 +08:00
Tianyi Cui 8b5a78e9ac test(loader-smoke): observe the forwarded source hook in the child
The success fixture can run under either tsx hook, so its previous output
assertions stayed green when runLoaderSmoke stopped forwarding sourceImport.
Line coverage therefore did not protect the supported ESM-only launcher.

Include the actual child process execArgv in the fixture output and assert
the resolved tsx/esm hook requested by the caller. The regression observes
Node launch arguments rather than reproducing the helper implementation.
Align the optional sourceImport spread with the adjacent mode spread;
this keeps the same behavior for defined and absent values.

Negative control: removing forwarding passed the old test but failed the
new assertion because the child loaded tsx/dist/loader.mjs instead of
esm/index.mjs. With forwarding restored, all 25 loader-smoke tests pass
and src/index.ts retains 100% statement, branch, function, and line coverage.
Scoped lint passes.
2026-09-18 01:53:37 +08:00
Tianyi Cui 6205c2be70 test(web): wait for both Subagent settings saves
The shared Subagent card submits the model-selection and limits namespaces
independently. The model-selection write can finish first, so its presence
in settings.yaml does not establish that maxDepth has reached disk. CI
observed subagent: {} with the completed model allowlist at that point.

Move the existing exact-label disabled Save wait before the persistence
assertions. The form uses a distinct Saving label until every namespace
save finishes, so this observes the shared operation's completion before
checking both results. Retain every assertion, timeout, and expected file.

A diagnostic barrier on the real subagent settings mutation reproduced the
original missing-maxDepth failure with both correct requests recorded and
the form still saving. With the relocated wait, releasing that same write
persisted maxDepth without another user action. The barrier run passed all
10 cases, and the unchanged whole plugin-config Web suite also passed 10/10.
2026-09-18 01:41:08 +08:00
winewill 6088ac7a85 perf(desktop): cache verified Windows signatures and isolate timestamps 2026-09-18 01:15:59 +08:00
Tianyi Cui 335c5cbe26 fix(cli): keep source profile imports in one module graph
The runtime profile default is correct for installed applications, but the
supported TypeScript CLI also runs tsx workspace aliases. In that launch,
profile resolution loaded both packages/core/tools/src/index.ts and
packages/core/tools/lib/index.js. The ToolRuntime instance and agent-loop
consumer therefore held different private TOOL_RUNTIME_SCHEDULER symbols;
the first tool call failed while reading scheduler.prepare.

The source bin now explicitly selects linked profile resolution using its
own .ts module identity. Built and packaged launches keep runtime resolution,
and explicit runProfile overrides remain unchanged. No service or symbol
identity is widened to conceal duplicate module instances.

Forward the existing sourceImport option through runLoaderSmoke and select
tsx/esm for headless source snapshots. This exercises the actual supported
source-launch vector while retaining the same recorded Session and expected
outputs. The loader-smoke subprocess test covers forwarding that hook.

Evidence: the official tsx/esm compaction replay failed before the fix while
loading both Tools module URLs. After the fix it loads only src/index.ts and
prints COMPACTION RECOVERED. The same focused replay passes under both
DSH_EXAMPLE_MODE=src and lib after rebuilding Host artifacts. The 43 CLI and
loader tests passed, including runtime defaults and explicit link/dual/runtime
overrides. Loader-smoke coverage passed 25 tests with 100% statements,
branches, functions, and lines. Host build, full lint, and all 41 doc-sync
gates passed. Recorded JSONL generations and snapshot normalization are
unchanged; temporary diagnostics were removed from built artifacts.
2026-09-18 00:06:26 +08:00
Tianyi Cui 7e42e8aa65 fix(release): align V4 migration package with master version
The pinned master merge updates the DSH package family to 0.1.6-alpha.2, but the release-only V3-to-V4 migration package has no master counterpart to carry that manifest change. Match the family package version so installed artifacts and hygiene describe one release identity. Session format remains V4; migration schemas, committed generations, and snapshot input versions do not change.

The combined source passes the full build, 93 Client tests, 631 persistence tests with one skip, all 41 documentation gates, all 16 hygiene gates, and full lint. The original pinned-master merge checkpoint remains in history.
2026-09-17 23:28:32 +08:00
Tianyi Cui d66b21894c merge: integrate latest master into session-log-v4
Merge master 62b700bba7bb71e66d2d5a3b850ba8f4dd0fd6b4 into release/session-log-v4 at 4825bc01a999f564e79172a6af28e34fc757c540. Preserve this pinned integration checkpoint before any later upstream movement so the dependent session-format repairs have an immutable rebase base.

Keep release projection-backed child catalogs, independent Session references, exact fork behavior, V4 writer, and existing migration data. Adapt the incoming subagent sidebar chat to refreshProjections rather than the removed dedicated catalog API, preserve title projections in complete projection fixtures, and retain both sidebar actions and release lineage/status behavior. Remove the duplicate SessionProjectionMap import introduced by automatic merging.

Preserve both disjoint archive seals without changing any existing hash. Regenerate current Cordis and documentation catalogs from the combined source, retaining release session methods plus master slot factories. The frozen V0-V3 runtime paths are unchanged. Initial validation passed the full build, 93 focused Client tests, and all 1905 archived artifact seals; remaining integration and snapshot checks follow on this checkpoint.
2026-09-17 23:23:48 +08:00
Tianyi Cui b6156b90fe Merge pull request #4389 from deepseek-harness/worktree/merge-master-session-v4-20260917-2
merge: sync master into session-log-v4
2026-09-17 23:03:02 +08:00
yixiangihsiang 0f7a507fbd test(web): assert stopped summary tone 2026-09-17 21:41:12 +08:00
winewill aa181c66e5 fix(desktop): preserve unpacked PE files and target runtime descriptors 2026-09-17 21:31:34 +08:00
winewill 702f9e4ff1 Restore desktop shell dialogs and guard destroyed windows on exit 2026-09-17 21:31:33 +08:00
winewill 3d2876f046 Run packaged smoke with production profile resolution 2026-09-17 21:31:32 +08:00
winewill 4d46bff152 Normalize dependency metadata before sealing desktop runtime 2026-09-17 21:31:32 +08:00
winewill 5a409fc771 fix(desktop): sign all Windows native dependencies before packaging 2026-09-17 21:31:31 +08:00
yixiangihsiang 938436e7bc fix(web): preserve tool-specific stopped summaries 2026-09-17 21:28:44 +08:00
yixiangihsiang 870388e2c0 test(web): refresh file link snapshot 2026-09-17 21:17:02 +08:00
fz be8040d042 test(sdk): align Office checks with runtime profile resolution 2026-09-17 21:15:55 +08:00
fz ef4a7efa91 Merge origin/master into feat/workspace-dependencies-package 2026-09-17 21:11:58 +08:00
fz 8fad9ccd8c feat(skill): complete shared Office runtime builds for SDK carriers 2026-09-17 21:10:12 +08:00
yixiangihsiang 488e438277 fix(web): address review feedback 2026-09-17 21:04:42 +08:00
Yichen Yan e699b482fe Merge branch 'yyc/web-trust-domain-reviewed' into yyc/web-relative-routes-reviewed 2026-09-17 20:56:41 +08:00
Yichen Yan 8256c84630 chore(docs): regenerate the Cordis catalog after merging master 2026-09-17 20:48:53 +08:00
Yichen Jiang 9f21d7842a fix(agent-team): enable tools and Web UI with one bundle 2026-09-17 20:41:39 +08:00
Yichen Yan 8e93da68f3 test(web): pin route-gate violations by line and match feature routes exactly
The gate spec asserts line and rule per violation instead of counts; the
open-in-app fake carriers match the relative route exactly so a re-absolutized
route cannot pass; the root and mount cases of the markdown file route share
one table; a fixture echo of its own icon URL is dropped.
2026-09-17 20:24:49 +08:00
Yichen Yan d607e185ad Merge branch 'yyc/web-trust-domain-reviewed' into yyc/web-relative-routes-reviewed 2026-09-17 20:21:54 +08:00
Yichen Jiang 02dbcc3ef3 Merge remote-tracking branch 'origin/master' into feat/plugin-detail-slots 2026-09-17 20:17:19 +08:00
Yichen Yan 9ed3d642e1 test(web): tighten the public-mount fence and drop unused fixture branches
Any request outside the mount is an escape, not only same-origin ones; the
socket presence check is superseded by the frame polls; the redirect landing
is asserted by pathname. The scaffold's unused mount host option, hostFetch
mount routing, and the proxy's bare-mount redirect had no caller.
2026-09-17 20:16:58 +08:00
Yichen Jiang caa0c99be1 docs(web): follow up the review on the companion move and detail slots
The maintained docs now name the four companion packages where they
still credited `ui-settings-plugins`: the web-app row comment, the
Plugins page README, the ui-settings README, and the client group
README, which gains a row per companion. The ui-settings README states
the `whileServed` lifetime and disposer ownership beside `bind`, and the
JSDoc says the caller owns the disposer. The settings-page cookbook
keeps the one home of the lazy-CJS build limitation for packages outside
this repository, its JSX example is a tsx fence, and the architecture
index and website label follow the page's title. The Agent Note records
the shell page's `plugins.item` id, the two companions that use
`ctx.remote` list api-remotes in `dsh.client.inject`, and the moved form
model test speaks of the form.
2026-09-17 20:13:26 +08:00
Yichen Jiang fd01a407b2 test(web): update plan preview snapshots after removing copy button 2026-09-17 20:12:42 +08:00
Yichen Yan b62a9f5c27 Merge branch 'master' into yyc/web-trust-domain-reviewed 2026-09-17 20:09:23 +08:00
Yichen Jiang 29126c0a32 fix(web): align plan preview copy controls with Markdown files 2026-09-17 19:57:18 +08:00
07akioni 1628e911c8 fix(client): keep sidebar navigation available without a session 2026-09-17 19:38:57 +08:00
yixiangihsiang 4937343a5e feat(web): unify the client visual language 2026-09-17 19:14:41 +08:00
fz 6e49ccad18 feat(skill): extract the workspace-dependencies tool into a package
Move `load_workspace_dependencies` and the primary-runtime payload logic out
of `apps/desktop-host` into `@deepseek-ai/dsh-tool-workspace-dependencies`
so profiles other than Desktop can mount the same tool. Desktop keeps its
behavior through the package.

Two additions for carriers that are not Electron applications:

- `root` is optional: without it the payload is validated and used in place
  (no copy under the Harness home), which suits read-only container layers.
- `runtime.json` accepts `linux`, and the `node` / `pnpm` components are
  optional; the returned paths and the tool output omit what the payload
  does not ship.

The `sdk` profile mounts the tool and `@deepseek-ai/dsh-skill-office` when
`DSH_PRIMARY_RUNTIME` names a payload directory (its sibling `office-skills/`
carries the skill resources); both rows stay disabled otherwise. Both
packages join the Python runtime closure.
2026-09-17 18:16:47 +08:00
Yichen Jiang 93e67201dd refactor(web): move the official settings pages into companion packages
Each official settings page now lives in a client package of its own:
`ui-settings-shell`, `ui-settings-agent-loop`, `ui-settings-subagent`
and `ui-settings-web-search` register into `plugins.item` while the Host
serves their namespaces, through the new `settingsScope.whileServed`
watch, each with its own dictionary and styles. The form model, the
fields and the form move to `ui-primitives` as the shared settings kit,
so a community package's browser half builds a page the same way.
`ui-settings-plugins` keeps only the Built-in plugins section shell
around the inventory tab.

The companions hold Loader rows in `web-app` behind the section; the
client catalog, config catalog and module graph regenerate; the
settings-card cookbook walks through a companion package.
2026-09-17 17:59:12 +08:00
Yichen Jiang a815a7f2a9 feat(web): open action, badge and section slots on plugin detail pages
The Plugins page declares three list slots as children of its main
entry: `plugins.detail.actions` renders at the head of a detail page
before its switch and uninstall controls, `plugins.detail.badge` after
the tags beside the title, and `plugins.detail.section` below the page's
own content. Every entry receives a `subject` owner prop naming what the
open page is about — a bundle, one row of a bundle, or an official item —
so one entry serves any page and renders nothing elsewhere. A row's page
still opens only for rows with a `plugins.row.config` entry.

The `plugin-config` web lane drives the three slots through the live
fixture on its bundle page and its row page, records a new bundle
golden, and shows the fixture contributing nothing to an official page.
2026-09-17 17:58:29 +08:00
Yichen Jiang 0495ad9846 fix(web): use the plain text file icon for plan tabs 2026-09-17 17:52:08 +08:00
Yichen Jiang 3d345d27bc Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127 2026-09-17 16:52:55 +08:00
Yichen Jiang 0d734a8fe7 fix(jobs): adapt desktop update checks to session callers 2026-09-17 16:52:09 +08:00
Yichen Jiang de617e2d0b Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127 2026-09-17 16:50:14 +08:00
Yichen Jiang 4b299845e0 Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052 2026-09-17 16:49:48 +08:00
Yichen Jiang c2fb2bd4e8 Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127
# Conflicts:
#	.agents/notes/implemented/feature/2026-08-08-web-background-job-display.i18n.yaml
#	docs/config-catalog.i18n.yaml
#	docs/event-producer-consumer.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/subsystems/jobs.i18n.yaml
#	docs/subsystems/shell.i18n.yaml
#	docs/subsystems/shell.md
#	docs/subsystems/shell.zh.md
#	docs/tool-catalog.i18n.yaml
#	packages/api/session-controller/README.i18n.yaml
#	packages/context/tmux-context/tests/tmux-context.spec.ts
#	packages/e2b/e2b/tests/fixtures/composition/bin.ts
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/shell/bash-local/README.i18n.yaml
#	packages/shell/bash-local/README.md
#	packages/shell/bash-local/README.zh.md
#	packages/shell/bash-local/src/index.ts
#	packages/shell/bash-local/tests/executor.spec.ts
#	packages/shell/bash-sandbox/README.i18n.yaml
#	packages/shell/bash-sandbox/README.md
#	packages/shell/bash-sandbox/README.zh.md
#	packages/shell/bash-sandbox/src/index.ts
#	packages/shell/bash-sandbox/tests/bwrap.e2e.ts
#	packages/shell/bash-sandbox/tests/landlock.e2e.ts
#	packages/shell/bash-sandbox/tests/partial-landlock.spec.ts
#	packages/shell/bash-sandbox/tests/sandbox.spec.ts
#	packages/shell/bash-sandbox/tests/seatbelt.e2e.ts
#	packages/shell/pwsh-local/README.i18n.yaml
#	packages/shell/pwsh-local/README.md
#	packages/shell/pwsh-local/README.zh.md
#	packages/shell/pwsh-local/src/index.ts
#	packages/shell/pwsh-local/tests/executor.spec.ts
#	packages/shell/pwsh-sandbox/README.i18n.yaml
#	packages/shell/pwsh-sandbox/README.md
#	packages/shell/pwsh-sandbox/README.zh.md
#	packages/shell/pwsh-sandbox/src/index.ts
#	packages/shell/pwsh-sandbox/tests/sandbox.spec.ts
#	packages/shell/shell/README.i18n.yaml
#	packages/shell/shell/README.md
#	packages/shell/shell/README.zh.md
#	packages/shell/shell/src/index.ts
#	packages/shell/shell/tests/service.spec.ts
#	packages/shell/tool-bash/README.i18n.yaml
#	packages/shell/tool-bash/src/index.ts
#	packages/shell/tool-bash/tests/tools.spec.ts
#	packages/shell/tool-pwsh/README.i18n.yaml
#	packages/shell/tool-pwsh/src/index.ts
#	packages/shell/tool-pwsh/tests/background.spec.ts
#	packages/shell/tool-pwsh/tests/tools.spec.ts
#	packages/workflow/tool-workflow/README.i18n.yaml
#	packages/workflow/tool-workflow/package.json
#	packages/workflow/tool-workflow/tests/tool-workflow.spec.ts
#	snapshots/session/ptc-python-turn/system-prompt.expected.md
2026-09-17 16:48:06 +08:00
Kaige-Gao 9ce43f925c feat(web): add feedback to session header menu 2026-09-17 16:40:13 +08:00
Yichen Jiang 5ad77a9532 Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052
# Conflicts:
#	packages/api/remotes/src/client/index.ts
2026-09-17 16:30:09 +08:00
Yichen Jiang d2b277286f refactor(jobs): drop unrelated client refactors 2026-09-17 16:24:12 +08:00
Yichen Jiang 80c0a5c1e8 test(voice-input): complete waking state fixture 2026-09-17 16:05:13 +08:00
Yichen Jiang 9644155c4e fix(voice-input): handle capture failures and queued wakeups 2026-09-17 16:03:02 +08:00
Yichen Yan 29182514ed fix(web): resolve feature routes from the document directory and gate browser routes 2026-09-17 16:00:36 +08:00
Yichen Yan eeb9b03465 feat(web): serve the shell, API and plugin resources from the document directory 2026-09-17 16:00:15 +08:00
Yichen Jiang f3644dcdf3 fix(voice-input): keep waveform below recording controls 2026-09-17 15:37:07 +08:00
Yichen Jiang 0055d993fc docs(voice-input): clarify setup and cover microphone permissions 2026-09-17 15:24:49 +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
Yichen Jiang 5ccf1c57d2 fix(voice-input): align CI fixtures and source-only coverage 2026-09-17 14:23:25 +08:00
Yichen Jiang 7e12403d84 fix(voice-input): reduce recording action icon sizes 2026-09-17 14:11:11 +08:00
Yichen Jiang 018c0e5156 fix(voice-input): align dictation toolbar controls 2026-09-17 13:57:51 +08:00
Dudu-0223 776a675197 Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-17 13:46:45 +08:00
Yichen Jiang 8d37a43316 Merge remote-tracking branch 'origin/master' into worktree/experimental-voice-input 2026-09-17 13:45:00 +08:00
Yichen Jiang 9d0f475a47 fix(voice-input): keep preparation status in plugin details 2026-09-17 13:33:38 +08:00
Yichen Jiang 23d21e2fde fix(voice-input): restore cached readiness and preserve composer controls 2026-09-17 13:28:26 +08:00
Yichen Jiang 8d62caf7fa Merge remote-tracking branch 'origin/master' into worktree/experimental-voice-input 2026-09-17 12:40:38 +08:00
Yichen Jiang 47ae64ee68 feat(voice-input): add optional local SenseVoice dictation 2026-09-17 12:39:53 +08:00
Tianyi Cui 85022b5c46 merge: sync Office conversion from latest master 2026-09-17 12:33:52 +08:00
_Kerman 83b2ff7aa1 fix(client): preserve tool detail navigation and layout 2026-09-17 12:04:19 +08:00
_Kerman f32c0cc3d9 refactor(client): simplify recorded tool detail models 2026-09-17 12:03:41 +08:00
Tianyi Cui 490a79c693 fix(client): release replaced sidebar store adoptions 2026-09-17 11:57:25 +08:00
_Kerman 566be5ae1b Merge latest origin/master into xtr/tool-card-details 2026-09-17 11:35:39 +08:00
_Kerman 68825ecc57 Merge origin/master into xtr/tool-card-details 2026-09-17 11:32:23 +08:00
Tianyi Cui 2fb2a5cc65 merge: sync desktop menus and startup diagnostics from master 2026-09-17 11:31:06 +08:00
_Kerman b91c96c5ee fix(client): avoid duplicate expanded tool receipt statuses 2026-09-17 11:21:33 +08:00
_Kerman cba87e84d5 fix(client): distinguish recorded tool status colors 2026-09-17 11:21:11 +08:00
Tianyi Cui 27389e0899 fix(client): preserve unmounted settings and composer ownership 2026-09-17 11:19:07 +08:00
Yichen Jiang 321bce2627 Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052
# Conflicts:
#	packages/api/session-controller/src/client/sessions/manager.ts
#	packages/api/session-controller/src/client/sessions/service.ts
#	packages/api/session-controller/tests/manager.client.spec.ts
#	packages/api/session-controller/tests/sessions-service.client.spec.ts
#	packages/client/locale/tests/language-row.client.spec.tsx
#	packages/client/ui-chat/tests/chat-view.client.spec.tsx
#	packages/client/ui-chat/tests/transcript-view-row.client.spec.tsx
#	packages/client/ui-conversation/tests/conversation-registry.client.spec.ts
#	packages/client/ui-conversation/tests/enter-behavior-row.client.spec.tsx
#	packages/client/ui-conversation/tests/input-bar.client.spec.tsx
#	packages/client/ui-conversation/tests/skeleton.client.spec.tsx
#	packages/client/ui-deliverables/tests/deliverables.client.spec.tsx
#	packages/client/ui-jobs/tests/job-list-action.client.spec.tsx
#	packages/client/ui-layout/tests/app-frame.client.spec.tsx
#	packages/client/ui-layout/tests/document-title.client.spec.tsx
#	packages/client/ui-session/tests/ui-session.client.spec.ts
#	packages/client/ui-settings-unarchive-sessions/tests/components.client.spec.tsx
#	packages/client/ui-subagent/tests/conversation-ui.client.spec.tsx
#	packages/client/ui-theme/tests/appearance-row.client.spec.tsx
#	packages/client/ui-theme/tests/font-size-row.client.spec.tsx
#	packages/client/ui-tool/tests/coverage-tails.client.spec.tsx
#	packages/client/ui-tool/tests/diff-card.client.spec.tsx
#	packages/client/ui-tool/tests/read-card.client.spec.tsx
#	packages/client/ui-tool/tests/terminal-card.client.spec.tsx
#	packages/client/ui-trajectory/tests/views.client.spec.tsx
#	packages/client/ui-user-questions/tests/plan-review-panel.client.spec.tsx
#	packages/client/ui-user-questions/tests/user-questions-composer.client.spec.tsx
#	packages/client/ui-workflow-run/tests/workflow-run.client.spec.tsx
#	packages/client/ui-workspace/tests/tree.client.spec.ts
#	packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx
#	packages/client/ui-workspace/tests/workspace-picker.client.spec.tsx
#	packages/client/ui-workspace/tests/workspaces-service.client.spec.ts
#	packages/test-support/client-runtime/src/sessions.ts
2026-09-17 11:11:25 +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 c840ac431d fix(client): settle preset selections and isolate generation stores 2026-09-17 10:43:21 +08:00
Tianyi Cui fa3e5cbaf6 fix(client): preserve state across Session reference updates 2026-09-17 09:38:24 +08:00
Tianyi Cui 5c25efba91 merge: integrate Client Session references into session-log-v4 2026-09-17 08:59:42 +08:00
Tianyi Cui a23331ba17 Merge pull request #4382 from deepseek-harness/worktree/session-log-v4-master-4304-20260917
merge: integrate subagent capacity settings into session-log-v4
2026-09-17 01:23:33 +08:00
Tianyi Cui 2d94201ef1 merge: integrate subagent capacity settings into session-log-v4 2026-09-17 01:14:07 +08:00
Tianyi Cui 5872c51d2b Merge pull request #4381 from deepseek-harness/worktree/merge-master-into-session-log-v4-20260916
merge: sync master into session-log-v4
2026-09-17 00:50:45 +08:00
Tianyi Cui 038c36b138 merge: update master integration with released fork support 2026-09-17 00:40:09 +08:00
Dudu-0223 22b942bb19 Merge pull request #2687 from deepseek-harness/feat/session-fork-arbitrary-seq
feat(session): fork exact event prefixes with synthetic tail results
2026-09-17 00:31:22 +08:00
Tianyi Cui d97a2e858e test(snapshot): align imported MCP fixture with release tool prose 2026-09-17 00:26:47 +08:00
Tianyi Cui 0a1e2691ab merge: integrate master into session-log-v4 2026-09-17 00:12:27 +08:00
Tianyi Cui 8696ec6cef feat(session): fork exact event prefixes with synthetic tail results 2026-09-17 00:00:44 +08:00
Tianyi Cui 88229fac33 Merge pull request #4378 from deepseek-harness/worktree/fix-release-windows-coverage-20260916
test(windows): avoid taskkill after descendant exit
2026-09-16 23:56:09 +08:00
Tianyi Cui 1ccef293fa fix(tests): keep Windows Job fixture cleanup with its owner 2026-09-16 23:29:08 +08:00
Dudu-0223 e2107a0394 Merge pull request #4311 from deepseek-harness/feat/parent-catalog-consumers-rebuilt
feat(subagent): migrate direct catalog consumers to parent projections
2026-09-16 23:12:01 +08:00
Yichen Jiang 3c394440ab Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	docs/persistence-schema.json
2026-09-16 22:05:51 +08:00
Dudu-0223 e55093b47d feat(subagent): migrate direct catalog consumers to parent projections 2026-09-16 22:05:17 +08:00
Dudu-0223 1d1ae1a5af fix(session): migrate historical subagent catalogs to V4 2026-09-16 22:00:38 +08:00
creatixchu dcf2b67896 feat(web): open Sidebar-previewed files in the default application
The document preview declares two child slots handing the previewed file
and its Host path to other plugins: the header actions after its own
controls, and the empty state of a file it cannot render, where Retry stood.
Empty-state read failures now name their recourse: not-text and too-large
offer the handoff, not-found and non-regular paths offer nothing, and the
rest keep Retry. The unsupported-suffix empty state offers the same seat.

ui-open-in-app fills both seats with an "Open" split button (default
application, or the file manager reveal from its menu) and an empty-state
"Open in default app" button. Both call the Session Remote the Host already
publishes: canOpenWorkspacePath once per page decides whether they render,
openWorkspacePath runs each gesture. Only the pressed control disables while
its gesture settles; a failure announces once through a transient toast.

The delivery cards keep their own opener this iteration. The design, slot
pair, failure classification, and toast rule come from Yifffan's PR #4120.
2026-09-16 21:00:57 +08:00
Yichen Jiang 55d57d33b6 fix(session): initialize blankness from retained metadata 2026-09-16 20:22:14 +08:00
creatixchu a4493ceb39 fix(deliverables): scroll the split review columns together on both axes
Each unwrapped split column is its own scroll container, and only the
horizontal offset was mirrored onto the other side, so wheel-scrolling one
column left the other behind and the paired rows drifted apart. Mirror the
vertical offset the same way.
2026-09-16 20:15:40 +08:00
Yichen Jiang f65799a236 docs(session): clarify blank-state projection guarantees 2026-09-16 20:05:48 +08:00
creatixchu f92f984d3d docs(notes): propose one card per delivered changed file 2026-09-16 19:48:48 +08:00
Yichen Jiang fa2abdd6f1 fix(web): reconcile stale blank session hints from projections 2026-09-16 16:39:53 +08:00
Yichen Jiang 6e41857b2e Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/api/remotes/src/client/index.ts
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/api/session-controller/src/client/sessions/manager.ts
#	packages/api/session-controller/src/control.ts
#	packages/api/session-controller/src/types.ts
#	packages/api/session-controller/tests/client-apply.client.spec.ts
#	packages/api/session-controller/tests/manager.client.spec.ts
#	packages/api/session-controller/tests/projection-store.client.spec.ts
#	packages/api/session-controller/tests/queue-store.client.spec.ts
#	packages/api/session-controller/tests/sessions-service.client.spec.ts
#	packages/api/session-controller/tests/transport.client.spec.ts
#	packages/client/ui-jobs/package.json
#	packages/client/ui-primitives/src/TerminalBlock.module.css
#	packages/client/ui-primitives/src/TerminalBlock.tsx
#	packages/client/ui-primitives/tests/terminal-block.client.spec.tsx
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/test-support/client-runtime/src/assembly/remote-default-responses.ts
2026-09-16 16:05:59 +08:00
Yichen Jiang 1596097147 Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052
# Conflicts:
#	apps/web/tsconfig.json
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/api/remotes/package.json
#	packages/api/remotes/src/client/index.ts
#	packages/api/session-controller/tests/client-apply.client.spec.ts
#	packages/api/session-controller/tests/control-jobs.host.spec.ts
#	packages/api/session-controller/tests/fake-api.client.ts
#	packages/api/session-controller/tests/manager.client.spec.ts
#	packages/client/ui-jobs/package.json
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
#	packages/jobs/jobs-local/README.i18n.yaml
#	packages/jobs/jobs-local/README.md
#	packages/jobs/jobs-local/README.zh.md
#	packages/jobs/jobs-local/src/index.ts
#	packages/jobs/jobs-local/tests/jobs.spec.ts
#	packages/jobs/tool-jobs/tests/tool-jobs.spec.ts
#	packages/shell/shell/README.i18n.yaml
#	packages/shell/shell/README.md
#	packages/shell/shell/README.zh.md
#	packages/shell/tool-bash/README.i18n.yaml
#	packages/shell/tool-bash/README.md
#	packages/shell/tool-bash/README.zh.md
#	packages/shell/tool-bash/src/background.ts
#	packages/shell/tool-bash/src/index.ts
#	packages/shell/tool-pwsh/src/background.ts
#	packages/shell/tool-pwsh/src/index.ts
2026-09-16 15:53:02 +08:00
Tianyi Cui 3bde1a56e3 fix(test): prepare preview generations and preserve embedded stream timing 2026-09-16 13:46:05 +08:00
Tianyi Cui 8a46149577 fix(test): validate retained V3 layouts and current reference captures 2026-09-16 13:21:19 +08:00
Tianyi Cui 9c10de50a6 fix(test): compare native Python delivery generations without rewriting goldens 2026-09-16 13:02:13 +08:00
Tianyi Cui d3dbcfe710 Merge master into release/session-log-v4 2026-09-16 12:58:34 +08:00
Tianyi Cui 669b724a78 feat(session): add the V4 integration format and retain V3 replay inputs 2026-09-16 12:50:34 +08:00
Tianyi Cui 5e4cfe670f chore(session): initialize V4 release integration PR 2026-09-16 12:16:01 +08:00
Tianyi Cui c042eb2560 fix(benchmarks): sample Trajectory readiness on animation frames 2026-09-13 14:03:32 +08:00
_Kerman 2832077b2c test(web): refresh tool details golden 2026-09-11 11:32:52 +08:00
_Kerman 6744f21a43 test(client): cover invalid detail locales 2026-09-11 11:20:25 +08:00
_Kerman 27e4529d15 fix(client): guard detail date localization 2026-09-11 11:18:01 +08:00
_Kerman bd16c3c89e fix(client): complete compact tool details review 2026-09-11 11:14:32 +08:00
_Kerman b59d3605b7 fix(client): address compact tool details review 2026-09-10 18:29:12 +08:00
_Kerman 10029b995f feat(web): add compact details to recorded tool rows 2026-09-10 17:18:49 +08:00
Yichen Jiang 72e6329267 Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127
# Conflicts:
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.zh.md
#	packages/shell/bash-sandbox/README.i18n.yaml
#	packages/shell/bash-sandbox/README.zh.md
#	packages/shell/pwsh-local/README.i18n.yaml
#	packages/shell/pwsh-local/README.zh.md
#	packages/shell/pwsh-sandbox/README.i18n.yaml
#	packages/shell/pwsh-sandbox/README.zh.md
#	packages/shell/shell/README.i18n.yaml
#	packages/shell/shell/README.zh.md
#	packages/shell/tool-bash/README.i18n.yaml
#	packages/shell/tool-bash/README.zh.md
#	packages/workflow/tool-workflow/README.i18n.yaml
#	packages/workflow/tool-workflow/README.zh.md
2026-09-10 14:09:55 +08:00
Yichen Jiang 1bd194ac17 Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	packages/api/README.i18n.yaml
#	packages/api/README.zh.md
#	packages/api/remotes/src/client/index.ts
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.zh.md
#	packages/client/README.i18n.yaml
#	packages/client/README.zh.md
#	packages/client/ui-jobs/README.i18n.yaml
#	packages/client/ui-jobs/README.md
#	packages/client/ui-jobs/README.zh.md
#	packages/client/ui-jobs/package.json
#	packages/jobs/jobs-local/README.i18n.yaml
#	packages/jobs/jobs-local/README.md
#	packages/jobs/jobs-local/README.zh.md
#	packages/jobs/jobs/README.i18n.yaml
#	packages/jobs/jobs/README.md
#	packages/jobs/jobs/README.zh.md
#	packages/jobs/tool-jobs/README.i18n.yaml
#	packages/jobs/tool-jobs/README.zh.md
#	packages/shell/bash-local/README.i18n.yaml
#	packages/shell/bash-local/README.zh.md
#	packages/shell/pwsh-local/README.i18n.yaml
#	packages/shell/pwsh-local/README.zh.md
#	packages/shell/shell/README.i18n.yaml
#	packages/shell/shell/README.zh.md
#	packages/shell/tool-pwsh/README.i18n.yaml
#	packages/shell/tool-pwsh/README.zh.md
2026-09-10 14:06:59 +08:00
Yichen Jiang 2e0106498e Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127 2026-09-09 14:53:12 +08:00
Yichen Jiang a8fc15ec85 test(jobs): align built codec smoke with remote method names 2026-09-09 14:52:55 +08:00
Yichen Jiang 4b1db738f5 test(bash): control promotion deadline after output readiness 2026-09-09 14:50:59 +08:00
Yichen Jiang dd7ea38578 fix(tests): adapt spill replay to unified shell execution 2026-09-09 14:46:41 +08:00
Yichen Jiang ab6dacc80e Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127
# Conflicts:
#	packages/shell/pwsh-local/tests/executor.spec.ts
#	packages/shell/shell/README.i18n.yaml
#	packages/shell/shell/README.md
#	packages/shell/shell/README.zh.md
#	packages/shell/tool-bash/README.i18n.yaml
#	packages/shell/tool-bash/README.md
#	packages/shell/tool-bash/README.zh.md
#	packages/workflow/tool-workflow/README.i18n.yaml
#	packages/workflow/tool-workflow/README.md
#	packages/workflow/tool-workflow/README.zh.md
2026-09-09 14:44:14 +08:00
Yichen Jiang b211c87150 Merge remote-tracking branch 'origin/master' into worktree/jobs-api-review-3052
# Conflicts:
#	apps/web/tests/agent-preset-selection.e2e.ts
#	apps/web/tests/expected/agent-preset-selection/header.expected.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.zh.md
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/api/session-controller/package.json
#	packages/client/ui-jobs/package.json
#	packages/jobs/jobs/README.i18n.yaml
#	packages/jobs/jobs/README.md
#	packages/jobs/jobs/README.zh.md
#	pnpm-lock.yaml
2026-09-09 14:42:11 +08:00
Yichen Jiang 9addbf63e6 merge: adapt job controls to the parent registry API 2026-09-08 15:48:59 +08:00
Yichen Jiang 3df99217dc refactor(jobs): restore direct calls and align remote names 2026-09-08 15:44:48 +08:00
Yichen Jiang 29418faf62 fix(shell): settle a live handle's post-termination rejection as its outcome
The subprocess runtime rejects a handle's done with the cancellation reason
when it terminated the managed range before the target started, which the
Windows runner does whenever an abort or kill() races the launch. Both
executors filed that rejection as a provider failure, so result() re-threw
the caller's own AbortError instead of resolving the aborted or killed
classification. A live handle whose rejection follows this execution's own
kill() or spawn-signal abort now settles as that terminal outcome; a
synchronous spawn throw, which never produced a handle, stays a failure.
2026-09-08 14:45:41 +08:00
Yichen Jiang 9a8ea5eaf1 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-08 14:39:29 +08:00
Yichen Jiang f2f696c358 test(bash-sandbox): expect the merged provider-failure note for a synchronous ENOEXEC
The background branch of the synchronous ENOEXEC case still looked for the
pre-merge `spawn failed:` note; the merged providers render master's
stage-neutral `subprocess failed before reporting an outcome:` on that
path.
2026-09-08 14:38:35 +08:00
Yichen Jiang fe24dddea8 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3 2026-09-08 14:36:54 +08:00
Yichen Jiang f3cf2efc97 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-08 13:53:00 +08:00
Yichen Jiang 80fa0bee05 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	packages/shell/bash-local/README.i18n.yaml
#	packages/shell/bash-local/README.md
#	packages/shell/bash-local/README.zh.md
#	packages/shell/bash-local/src/index.ts
#	packages/shell/bash-local/tests/executor.spec.ts
#	packages/shell/pwsh-local/README.i18n.yaml
#	packages/shell/pwsh-local/README.md
#	packages/shell/pwsh-local/README.zh.md
#	packages/shell/pwsh-local/src/index.ts
#	packages/shell/shell/README.i18n.yaml
#	packages/shell/shell/README.md
#	packages/shell/shell/README.zh.md
#	snapshots/session/pwsh-tool-turn/tool-schemas.expected.json
2026-09-08 13:52:08 +08:00
Yichen Jiang 1f4d165aa2 test(snapshot): release the ACP diagnostic hold from the caller-bound wait
The scenario's barrier plugin patched ctx.jobs.wait, which the consolidated
seam no longer has: waits live on the operations forCaller hands out, so
the hold file was never removed and the mock ACP server never released the
prompt. The barrier now wraps forCaller and releases on that view's wait.
2026-09-08 13:51:16 +08:00
Yichen Jiang 1242fdfdef Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	docs/subsystems/shell.i18n.yaml
#	docs/subsystems/shell.md
#	docs/subsystems/shell.zh.md
#	packages/api/remotes/package.json
#	packages/api/remotes/src/client/index.ts
#	packages/api/session-controller/src/control.ts
#	packages/api/session-controller/tests/control-jobs.host.spec.ts
#	packages/bundle/web-app/cordis.patch.yml
#	packages/bundle/web-app/package.json
#	packages/client/ui-chat/src/client/details/DetailsPanel.tsx
#	packages/client/ui-chat/src/client/details/tool-node-reader.ts
#	packages/client/ui-chat/tests/gate-branch-tails.client.spec.tsx
#	packages/client/ui-jobs/package.json
#	packages/client/ui-tool/tests/diff-card.client.spec.tsx
#	packages/client/ui-tool/tests/read-card.client.spec.tsx
#	packages/client/ui-tool/tests/search-card.client.spec.tsx
#	packages/client/ui-tool/tests/terminal-card.client.spec.tsx
#	packages/client/ui-tool/tests/web-card.client.spec.tsx
#	packages/shell/bash-local/README.i18n.yaml
#	packages/shell/bash-local/README.md
#	packages/shell/bash-local/README.zh.md
#	packages/shell/bash-local/src/index.ts
#	packages/shell/bash-local/tests/executor.spec.ts
#	packages/shell/pwsh-local/README.i18n.yaml
#	packages/shell/pwsh-local/README.md
#	packages/shell/pwsh-local/README.zh.md
#	packages/shell/pwsh-local/src/index.ts
#	packages/shell/shell/README.i18n.yaml
#	packages/shell/shell/README.md
#	packages/shell/shell/README.zh.md
#	packages/shell/shell/src/types.ts
#	packages/terminal/tool-terminal/tests/tools.spec.ts
#	tsconfig.client.json
2026-09-08 13:34:53 +08:00
Yichen Jiang 6371bc4a41 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.zh.md
2026-09-07 10:44:53 +08:00
Yichen Jiang bf91cd855e Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	.agents/notes/archived/manifest.json
#	.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml
#	.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.md
#	.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md
#	.agents/notes/implemented/bug-fix/2026-09-05-nested-terminal-cards.i18n.yaml
#	.agents/notes/implemented/feature/2026-08-11-background-job-completion-wakes-an-idle-owner.i18n.yaml
#	.agents/notes/implemented/testing/2026-09-06-standard-hosted-benchmark-runner.i18n.yaml
#	docs/architecture.i18n.yaml
#	docs/capability-seams.i18n.yaml
#	docs/config-catalog.i18n.yaml
#	docs/cookbook/adding-a-tool.i18n.yaml
#	docs/event-producer-consumer.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/persistence-catalog.i18n.yaml
#	docs/subsystems/shell.i18n.yaml
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/jobs/jobs-local/README.i18n.yaml
#	packages/jobs/jobs/README.i18n.yaml
#	packages/jobs/jobs/README.md
#	packages/jobs/jobs/README.zh.md
#	packages/jobs/tool-jobs/README.i18n.yaml
#	packages/shell/tool-bash/README.i18n.yaml
#	packages/shell/tool-pwsh/README.i18n.yaml
2026-09-07 10:39:56 +08:00
Tianyi Cui c9cd76464a fix(release): isolate packed-install npm cache 2026-09-06 21:40:21 +08:00
Yichen Jiang 51d1df5c4d test(pwsh-local): expect the spawn-failure note on the observed stderr stream
The Windows-only synchronous spawn-throw case still expected empty observed
readers, the behavior before a rejected spawn started serving its note as the
whole observed stderr stream. It now mirrors the bash-local case: the note is
the stream at every offset, stdout stays empty, and the consuming read folds
the note in exactly once.
2026-09-05 14:53:50 +08:00
Yichen Jiang 57d51b3802 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-05 14:34:41 +08:00
Yichen Jiang f3b538cf8f Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3 2026-09-05 14:32:14 +08:00
Yichen Jiang 3be4761178 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	packages/api/job-controller/README.i18n.yaml
#	packages/api/job-controller/README.md
#	packages/api/job-controller/README.zh.md
2026-09-05 14:31:23 +08:00
Yichen Jiang 4baea3bb83 fix(jobs): spill paths as source metadata, live wait claims, narrower entries
Three review follow-ups on the consolidated jobs seam.

The spill file a pull source keeps is job metadata now: the pump reports it
to the registry on every read (present or withdrawn), the projection lists
it under output.spillPaths, and the model's dropped-output notice names it
from there. Attached to a gap chunk it was lost whenever the ring itself
evicted (a pump that kept up never produced a gap) or whenever the gap chunk
was evicted later, and it could not follow a source that withdrew its file.

A job_output wait's claim on the settlement now carries a live flag that
the caller's abort clears synchronously from the abort event. The registry
rejects an aborted wait on a later microtask, so a settlement announced in
between used to find the claim counted and skip the notice the tool result
was not going to carry either.

The job-controller client entry and the tool-jobs entry stop exporting
implementation classes and render helpers nothing outside the packages
consumes; the client entry keeps IJobs, which also carries the ctx.jobs
Context augmentation to consumers.
2026-09-05 14:28:28 +08:00
Yichen Jiang 206e5c6545 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	apps/web/tests/background-job-list.e2e.ts
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.zh.md
#	packages/api/job-controller/README.i18n.yaml
#	packages/api/job-controller/README.md
#	packages/api/job-controller/README.zh.md
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
2026-09-05 14:06:00 +08:00
Yichen Jiang 8bcd6f7519 refactor(jobs): rename visibleTo/VisibleJobs to forCaller/CallerJobs
The caller-bound operation set now says what it is: the jobs one caller
may operate on. The caller argument is required (SessionId | undefined),
so an anonymous view has to be requested explicitly instead of falling
out of a forgotten argument.
2026-09-05 14:00:47 +08:00
Yichen Jiang e001a9d2e4 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	packages/client/ui-jobs/package.json
2026-09-04 17:33:19 +08:00
Yichen Jiang d3b1f2d1bc Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/api/remotes/package.json
#	packages/api/remotes/src/client/index.ts
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/api/session-controller/tsconfig.host.json
#	packages/client/ui-approval/src/client/contract/slots.ts
#	packages/client/ui-chat/src/client/chat/MessageItem.tsx
#	packages/client/ui-chat/src/client/conversation-nodes/assistant.ts
#	packages/client/ui-chat/src/client/conversation-nodes/partial.ts
#	packages/client/ui-chat/src/client/conversation-nodes/tool.ts
#	packages/client/ui-chat/src/client/model/tool-call-tree.ts
2026-09-04 17:28:12 +08:00
Yichen Jiang a444460ad4 fix(shell): never offer cancelled work from the offer arm
The offer arm relayed the caller signal only through an abort listener, which a signal that was already aborted never fires, so a command cancelled before execute() spawned anyway, ran to its deadline, and was offered for promotion. The deadline callback also offered regardless of an earlier caller abort, so a process still in its termination grace could be promoted after the tool call was aborted. Both providers now relay an already-aborted signal immediately and settle the promotion undefined at the deadline once the caller aborted; the seam JSDoc states that an already-aborted signal counts as fired. Real-process and hanging-backend cases cover both providers.
2026-09-04 14:03:24 +08:00
Yichen Jiang b0cf8cc1d9 fix(tool-workflow): narrate background runs on the log channel
The record mirror appended phase, log, and member lines without a channel, and the model's job_output renders channel-less chunks as stdout, so a job_output before settlement returned observer narration the README promised it would not. The four appends now carry channel: 'log', which the registry keeps out of model reads while observers still stream it; the spec pins the channels and the status-only early read.
2026-09-04 14:03:23 +08:00
Yichen Jiang 58d4050cb6 docs(tool-workflow): state why the background branch has no pre-abort check
ToolRuntime re-reads the caller signal immediately before execute(), and the workflow tool reaches jobs.start synchronously from there, so an in-tool check would be unreachable; bash and pwsh need theirs because they await a sandbox escalation approval before registering.
2026-09-04 13:52:24 +08:00
Yichen Jiang 600b780b97 chore(shell): align the pwsh mirror comments and the promotion read JSDoc
renderProcessRead and renderPwshProcessRead described themselves as the job_output renderer; their only caller is the timeout promotion embedding one consuming read, while job_output reads come from the registry ring. The pwsh presenter comment gains the promotions clause bash already has, and pwsh-sandbox drops a stray blank line.
2026-09-04 13:52:23 +08:00
Yichen Jiang 15cbcad1eb docs(notes): rewrite the three delivery notes to the shipped mechanisms
The timeout-promotion, workflow run_in_background, and human-job-kill notes kept their bodies in the present tense over ctx.activities, RunningJob/updateDetail, and the registry's reported bit, with Update headers doing the correcting. Their mechanism sentences now state the shipped facts (observed streams as pull sources, JobHandle/updateProgress, the tool-jobs delivery ledger), the Update headers shrink to cross-links, and the testing paragraph names the current specs.
2026-09-04 13:52:22 +08:00
Yichen Jiang 9fe106693c docs(shell): describe timeout promotion through the job ring, not ctx.activities
The tool-bash and tool-pwsh READMEs still said a promoted run is mirrored into ctx.activities, a seam the jobs consolidation deleted, and the shell README still called the observed readers optional and named the activity plane. The promoted run now feeds the registry's ring from the observed streams' current offsets and the Web list streams it through job.rows and job.observe; observed readers are required and carry the spawn-failure note.
2026-09-04 13:52:22 +08:00
Yichen Jiang ca3d9af0a7 Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	packages/shell/bash-sandbox/tests/sandbox.spec.ts
#	packages/shell/pwsh-local/tests/executor.spec.ts
2026-09-04 13:42:20 +08:00
Yichen Jiang 7e5627f8e3 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3 2026-09-04 13:39:42 +08:00
Yichen Jiang 3d5431a862 Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-04 13:30:34 +08:00
Yichen Jiang 063ef188a6 chore(jobs): regenerate the catalogs after the review fixes
The settled-retention JSDoc, the required observed streams, and the session-controller type shifts changed what the config, persistence, Cordis, and event catalogs embed; CI's static and coverage lanes compared the stale copies. Regenerated, with the zh mirrors updated in step.
2026-09-04 13:29:54 +08:00
Yichen Jiang 42858723a6 Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	packages/api/job-controller/README.i18n.yaml
#	packages/api/job-controller/README.md
#	packages/api/job-controller/README.zh.md
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/shell/bash-local/src/index.ts
#	packages/shell/pwsh-local/src/index.ts
#	packages/shell/tool-bash/src/background.ts
#	packages/shell/tool-bash/tests/tools.spec.ts
#	packages/shell/tool-pwsh/src/background.ts
#	packages/shell/tool-pwsh/tests/background.spec.ts
#	snapshots/web/approval-composer/session.v2.jsonl
#	snapshots/web/feedback-command/session.v2.jsonl
#	snapshots/web/fresh-round-trip/session.v2.jsonl
#	snapshots/web/goal-multi-turn-actions/session.jsonl
#	snapshots/web/lifecycle-chrome/session.v2.jsonl
#	snapshots/web/live-interactions/session.v2.jsonl
#	snapshots/web/minimal-preset/session.v2.jsonl
#	snapshots/web/permission-policy-context/session.v2.jsonl
#	snapshots/web/plan-review/session.jsonl
#	snapshots/web/ptc-round/session.v2.jsonl
#	snapshots/web/question-composer/session.v2.jsonl
#	snapshots/web/steering/session.v2.jsonl
#	snapshots/web/turn-tail-actions/session.v2.jsonl
#	snapshots/web/web-search-round/session.v2.jsonl
2026-09-04 13:27:34 +08:00
Yichen Jiang 3a03d68891 fix(shell): serve a background spawn failure on the observed stderr stream
A rejected background spawn produces no process output, so the observed stderr reader the job registry pumps was empty and the model's job_output after such a failure showed only killed before exit, where master's consuming read rendered [stderr] followed by spawn failed: … with the cause. The local providers now serve the note as the whole observed stderr stream once the spawn rejected, and the consuming read still folds it in exactly once, so the model's first read after the failure is byte-identical to master's. ShellProcess.observed and both of its readers are required: every background process exposes offset readers, and the shell tools' pull sources no longer carry a no-readers branch.
2026-09-04 12:59:41 +08:00
Yichen Jiang 1c2d7771aa fix(job-controller): close an observation on the job's removal instead of a failed read
An owner's teardown settles and removes the record within one microtask chain, while the observation generation sleeps its flush window after the wake and then reads an id the registry no longer returns, failing the stream and flashing an error in the panel until the roster frame drops the row. The subscription now records a removed event for the observed id and the generation closes with that terminal projection.
2026-09-04 12:47:22 +08:00
Yichen Jiang 80bbdba617 fix(jobs): restore the dropped-output notice with its spill files for the model
The consuming shell read on master told the model where a truncated stream's complete text lived: [some output was dropped from memory; full output: <paths>]. The ring-backed read rendered a notice only for the ring's own eviction and ignored the gapBefore mark the pump puts on a chunk whose source lost bytes between two polls, so a fast producer's tail read as continuous output and no path survived. A lossy source read now carries the source's spillPath onto its gap chunk (JobSourceRead, JobAppendOptions, JobChunk), the pump forwards it, the ring retains it, and the model renderer emits master's notice for a producer-side gap or a ring eviction, listing the distinct spill files in offset order. The bash and pwsh sources already returned the subprocess reader's spillPath; the type now admits it.
2026-09-04 12:47:21 +08:00
Yichen Jiang c673796496 docs(jobs): record the review follow-ups in the consolidation note 2026-09-04 12:27:17 +08:00
Yichen Jiang e680fbc3a0 refactor(jobs): check the announced event protocol in the invariant companion
The companion validated fields of single JobView projections, which the invariant rule rejects as a check without independent observations. It now tracks each job's announced protocol (registered first, one settlement, removal last, no progress after settlement), adopting a job first seen late, and compares every announced projection with the registry's own read of the same job: identity, output total, and the settled status and time. An output event announced before registration, which the registry emitted until the previous commit, is one of the cases it rejects.
2026-09-04 12:27:16 +08:00
Yichen Jiang 5f1d53640b fix(job-controller): show an observation failure that precedes the anchor
An observation stream that failed before its opened frame left no observed state, so the expanded row rendered nothing: no output, no notice. The client model now records such a failure as an errored, non-streaming view with no resume cursor, and the panel renders the interruption notice it promises.
2026-09-04 12:25:16 +08:00
Yichen Jiang 9f0600d11b fix(tool-jobs): count wait claims per call
Two concurrent job_output waits on one job shared a single ledger entry, so the first wait's timeout withdrew the claim the second wait still held and the settlement injected a completion notice the model had already received through that wait. Claims are counted per call now; a withdraw releases only its own.
2026-09-04 12:25:15 +08:00
Yichen Jiang 0712a4cc68 fix(jobs-local): keep unconsumed settled output for the model and announce registration first
Settlement trimmed the ring to settledRetainBytes before releasing waiters, so a job that finished before its first job_output handed the model only the last 16 KiB plus a dropped-output notice where master's consuming read kept the executor's whole tail. The ring now keeps every byte the model cursor has not consumed on top of the settled cap, and the first terminal model read trims to the cap.

The registered event was emitted after startPump, whose first drain runs synchronously and may announce output, so a source readable at once produced an output event for an id no subscriber had seen registered. The announcement now precedes the pump; the events JSDoc states that a job's first event is registered.
2026-09-04 12:25:14 +08:00
Yichen Jiang 2c0ca45f76 fix(jobs): carry the projection kind as an open string on the wire
JobView.kind was typed as the merge-extensible JobKind, so the job-controller program, which compiles only the merges it can see, generated a strict codec of bash | subagent for job.rows and job.observe. The first pwsh, pty-send, or workflow job failed frame validation on both ends and the browser dropped the whole roster. The projection now carries kind as a string; JobSpec.kind keeps the Host-side JobKind. A built-artifact smoke parses a pty-send row through the generated schemas, and the seam spec pins the open type.
2026-09-04 12:10:22 +08:00
Yichen Jiang b76bfbcc1f docs(notes): align the job runtime notes with the consolidated seam
The registry seam, runtime, admission, wake, and web display notes named JobStart, JobSnapshot, onJobDone, onJobsChanged, and the registry-owned reported bit as current facts. Rewrite those sentences to the shipped JobSpec/JobView contract, the events stream, and the tool-jobs delivery ledger; the wake note gains an Update header pointing at the consolidation note, and the display note's disposal paragraph now states the per-job removed event the registry emits.
2026-09-04 12:05:44 +08:00
Yichen Jiang 70a37b6cc1 chore(jobs): drop the formatting-only hunks left by the seam refactor
Revert the two brace-only rewrites in tool-workflow to master's one-line form and collapse the blank lines left where SessionJob was removed from the session-controller types.
2026-09-04 12:05:43 +08:00
Yichen Jiang 424c8457d9 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/api/session-controller/tests/control-jobs.host.spec.ts
#	snapshots/web/fresh-round-trip/session.v2.jsonl
#	snapshots/web/ptc-round/session.v2.jsonl
2026-09-04 12:02:02 +08:00
Yichen Jiang b7632168cc test(tool-pwsh): pin the integration suite to the executor's timeout kill
With owners resolved by session id, the suite's id-less fake agent no
longer makes the timeout promotion fail admission, so a per-call timeout
promoted the run and the timed-out-marker assertion broke. Promotion over
a scripted executor stays covered by background.spec.
2026-09-03 18:20:33 +08:00
Yichen Jiang 59b16ed0e3 Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-03 18:01:12 +08:00
Yichen Jiang 14dc38b2fd test(session-controller): cover the cold-session baseline queue
The roster spec that exercised a session without a live agent left with
the roster; the queue baseline's empty arm needs its own case.
2026-09-03 18:00:42 +08:00
Yichen Jiang d81c5048db chore(jobs): regenerate the catalogs and re-record the job goldens after the seam merge
The merged tree carries promoteOnTimeout, the workflow run_in_background
config, and tool-jobs' pre-refactor requirement set; the settled job
goldens show the folded finished section, a static row for a job with no
retained output, and the human kill's reason in the detail.
2026-09-03 17:48:21 +08:00
Yichen Jiang ae28d2cc6d Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-03 17:46:07 +08:00
Yichen Jiang cd3a9ac881 Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	apps/web/tests/background-job-list.e2e.ts
#	apps/web/tests/live-job-stream.e2e.ts
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/subsystems/jobs.i18n.yaml
#	docs/subsystems/jobs.md
#	docs/subsystems/jobs.zh.md
#	packages/api/job-controller/README.i18n.yaml
#	packages/api/job-controller/README.md
#	packages/api/job-controller/README.zh.md
#	packages/api/job-controller/src/client/index.ts
#	packages/api/job-controller/src/client/service.ts
#	packages/api/job-controller/src/index.ts
#	packages/api/job-controller/src/types.ts
#	packages/api/job-controller/tests/client-apply.client.spec.ts
#	packages/api/job-controller/tests/model.client.spec.ts
#	packages/api/job-controller/tsconfig.host.json
#	packages/api/session-controller/tests/control-jobs.host.spec.ts
#	packages/client/ui-jobs/README.i18n.yaml
#	packages/client/ui-jobs/README.md
#	packages/client/ui-jobs/README.zh.md
#	packages/client/ui-jobs/src/client/JobListAction.tsx
#	packages/client/ui-jobs/src/client/index.ts
#	packages/client/ui-jobs/tests/browser-plugin.client.spec.ts
#	packages/client/ui-jobs/tests/job-list-action.client.spec.tsx
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/jobs/jobs-local/src/index.ts
#	packages/jobs/jobs-local/tests/jobs.spec.ts
#	packages/jobs/jobs/README.i18n.yaml
#	packages/jobs/jobs/README.md
#	packages/jobs/jobs/README.zh.md
#	packages/jobs/jobs/src/index.ts
#	packages/jobs/jobs/src/types.ts
#	packages/jobs/tool-jobs/src/index.ts
#	packages/shell/tool-bash/src/index.ts
#	packages/shell/tool-bash/src/render.ts
#	packages/shell/tool-bash/tests/background.spec.ts
#	packages/shell/tool-bash/tests/tools.spec.ts
#	packages/shell/tool-pwsh/src/index.ts
#	packages/shell/tool-pwsh/src/render.ts
#	packages/subagent/tool-subagent/tests/tool-subagent.spec.ts
#	snapshots/web/background-job-list/settled.expected.md
2026-09-03 17:45:44 +08:00
Yichen Jiang 08a51f6d88 fix(tool-jobs): keep the agent registry optional
An owned job cannot start without the agent registry, so the plugin only
needs it to resolve a notice destination; requiring it left compositions
that run unowned jobs — the PTC harness, the pwsh loader and integration
suites — without an attached controller. The inject list, catalogs, and
README return to the pre-refactor requirement set.
2026-09-03 17:45:27 +08:00
Yichen Jiang fec81b7295 test(web): re-record the job goldens for the ring-backed rows
A settled job that retained no output is a static row, and a killed row
shows the kill reason in its detail. The live-stream scenario's idle
locator now matches the settled trigger exactly, so its settled capture
cannot race the roster refresh.
2026-09-03 17:20:06 +08:00
Yichen Jiang 9e8f3ce987 fix(tool-jobs): restore the background-job guidance text
The rewrite carried an older wording of the system-prompt section; the
recorded-session snapshots pin the current one. Model-visible text is
byte-identical to the pre-refactor plugin again.
2026-09-03 17:17:30 +08:00
Yichen Jiang 7b607ae6a2 fix(tool-jobs): build the notice status line from the public projection
The notice and its summary passed an optional detail as string | undefined,
which the build's exactOptionalPropertyTypes rejects while the test lane's
transform does not; publicJob() already carries the conditional.
2026-09-03 17:16:32 +08:00
Yichen Jiang cbb0ec0296 docs(jobs): describe the consolidated seam
- docs/subsystems/jobs.md (+zh) records JobSpec, JobHandle, JobHooks,
  JobOutcome, the pull-source types, JobChunk, JobOutputRead, JobView,
  JobRead, VisibleJobs, and the event types as type-equivalence blocks; the
  manifest and the cordis catalog link map follow
- the jobs, jobs-local, and tool-jobs READMEs (+zh) describe the ring, the
  caller-bound view, the event stream, and the notice ledger; the
  architecture table and the adding-a-tool cookbook drop record: true and
  readOutput
- Agent Note 2026-09-03-jobs-seam-consolidation owns the decision; the
  2026-09-01 record note and the 2026-08-08 web display note carry
  Superseded pointers and the display note links the rows spec
- regenerated catalogs (cordis, api, inspect, client, tool, config,
  persistence, doc graphs, module graph) with their Chinese mirrors; the
  cordis catalog drops the jobOutput exemption and the tool catalog mounts
  the agent registry for tool-jobs; the client model imports JobView from
  its leaf so the typert analyzer resolves it
2026-09-03 17:15:07 +08:00
Yichen Jiang 84efac2c42 refactor(ui-jobs): read rows and observations from ctx.jobs
The header list watches its session's roster through ctx.jobs.watchRows
while mounted and reads rows and observed views from one jobs snapshot. A
row is expandable while the job is live or once it left retained output
behind; it shows the live progress line or the terminal detail. The web
e2e drivers kill through visibleTo(), and the client fixtures the roster
removal missed drop their jobs baselines.
2026-09-03 17:00:51 +08:00
Yichen Jiang b7ce934b29 refactor(job-controller): own the roster stream and the browser jobs service
- job.rows({ sessionId }) streams the jobs one session can see as whole-set
  frames: once on open, then after each coalesced burst of lifecycle
  commits; output appends never refresh it
- job.observe reads through visibleTo(sessionId) and carries JobView in its
  opened and status frames; the wire chunk is the registry's JobChunk
- the client installs ctx.jobs (ClientJobs over ClientJobsModel): watchRows
  and observe are reference-counted streams, rows drop with the last
  watcher or a terminal failure, observations keep their render tail
- the controller no longer needs the agent registry
2026-09-03 17:00:49 +08:00
Yichen Jiang 2132b7beeb refactor(session-controller): drop the job roster from the control stream
The control baseline and frames carry queues and projections only; the
SessionJob row type, the jobs frame, the registry subscription, and the
client jobsBySession mirror are gone, and every client fixture drops the
empty mirror. The roster moves to dsh-api-job-controller's job.rows
stream in the next change.
2026-09-03 16:43:15 +08:00
Yichen Jiang 10d76fbd03 refactor(producers): subagent and terminal jobs use session owners, results, and pull sources
- tool-subagent registers the parent session id as the owner and settleRun
  reports the child's final text as the job result, which the first read
  after settlement carries once
- tool-terminal hands the registry one pull source over the backend's
  consuming send reader (sendSource in background.ts) instead of a
  readOutput hook; the truncation marker stays in the delivered text
- the model's kill reason now shows in a killed job's status line, as the
  registry records it as the terminal detail
- test call sites move from jobs.list(owner) to visibleTo(owner).list()
2026-09-03 16:37:35 +08:00
Yichen Jiang 053d302210 refactor(shell tools): hand the job registry pull sources and terminal outcomes
tool-bash and tool-pwsh no longer render their own background reads.
processSources() wraps the process's observed offset readers as registry
pull sources, pumped at dsh-jobs-local's pumpPollMs, and processOutcome()
folds the settled sandbox facts into the terminal detail. observe.ts and
the recordPollMs config field are gone; READMEs and pairings follow.
2026-09-03 16:30:57 +08:00
Yichen Jiang 0e35952802 refactor(tool-jobs): render model reads from the ring and own the notice ledger
- job_output reads the per-job ring through visibleTo(): stdout, then one
  [stderr] section, log narration excluded, a dropped-output notice on a
  lossy read, and the result exactly once after settlement
- completion notices come from the registry event stream subscribed with
  { owners: 'scope' }; a wait claims its job when it starts and withdraws
  on timeout or abort, job_kill claims on 'requested', teardown settlements
  and unowned jobs are skipped, and a removal drops the ledger entry
- the notice destination is the agent registered for the owner session at
  settlement, so tool-jobs now injects the agent registry
- JobView exposes the producer's outputLimitBytes for the tool-result bound
- lint: hub disposer identity comment, unknown-typed matchers in seam tests
2026-09-03 16:30:57 +08:00
Yichen Jiang 6626c74dbc refactor(jobs-local): contain a throwing pull source instead of freezing the job 2026-09-03 16:09:07 +08:00
Yichen Jiang f55e9805c7 refactor(jobs-local): one ring, two cursors, and event routing
Every job owns an `OutputRing`; the model's `read` consumes from a
registry-kept cursor while `readAt` reads at absolute offsets. Pull
sources named by the spec are pumped by the registry and drained once
more before settlement. `visibleTo(caller)` binds the session fence
once; the three listener families become one event hub with explicit
filters; `reported` is gone and settlements announce their cause.
2026-09-03 16:03:16 +08:00
Yichen Jiang 1b97207150 refactor(jobs-local): extract the output ring and the registry-owned pump 2026-09-03 15:53:59 +08:00
Yichen Jiang 07941fe5e2 refactor(jobs): consolidate the seam into JobSpec, VisibleJobs, and one event stream
The registry seam keeps three members plus the controller handshake:
`start(spec)`, `visibleTo(caller)` (one authorization, then list / get /
read / readAt / kill / wait without a caller argument), and `events`
(one typed stream with an explicit filter instead of three listeners).
Every job owns an output ring: `JobSpec.output` names pull sources the
registry pumps, `JobHandle.append` pushes, and the model's consuming
`read` and observers' `readAt` read the same bytes through separate
cursors. `reported`, the `record` declaration, the producer `readOutput`
hook, and the `JobStart`/`RunningJob` split are gone; `JobView` is the
one projection, split into `progress` and terminal `detail`. The
client-safe `./view` leaf carries the projection vocabulary.
2026-09-03 15:51:39 +08:00
Yichen Jiang 1307d66e70 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-03 13:45:24 +08:00
Yichen Jiang 09bd6bcf54 chore(http-proxy): align the package version with the 0.1.2-rc.1 bump 2026-09-03 13:45:09 +08:00
Yichen Jiang a2b9b8b03b Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3 2026-09-03 13:42:07 +08:00
Yichen Jiang d0b9167dba Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	.agents/notes/implemented/feature/2026-08-25-unified-task-list.i18n.yaml
#	packages/jobs/jobs-local/src/index.ts
#	snapshots/web/cordis-tool-round/session.jsonl
2026-09-03 13:19:22 +08:00
Yichen Jiang b48c05d117 refactor(jobs): type the producer face by the record declaration, tidy review residue
- `JobStart` is a union discriminated by `record`: `RecordingJobStart.run`
  receives `RecordingJob` (with `append`), `PlainJobStart.run` receives the
  plain `RunningJob`, and the registry builds the plain face without the
  method, so the former warn-and-drop path is unrepresentable.
- Remove the duplicated JSDoc opener in the registry seam and correct the
  job-list slot comment (order 20 sits before the subagent catalog's 30).
- Restore the `cordis-tool-round` session fixture whose only change was a
  re-recorded `createdAt`.
- Update the 2026-08-08 job-display note's stale service-disposal and slot
  ordering facts; archive the superseded 2026-08-25 unified-task-list note
  and point its remaining inbound links at the archived snapshot.
2026-09-03 13:15:23 +08:00
Yichen Jiang 07d9d5b5cd Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-03 11:33:34 +08:00
Yichen Jiang 6a4d7ee242 chore(job-controller): align the package version with the 0.1.2-rc.1 bump 2026-09-03 11:33:05 +08:00
Yichen Jiang 6d65c12ef2 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	packages/client/ui-jobs/package.json
2026-09-03 11:30:41 +08:00
Yichen Jiang dd3ac9f7bf test(web): re-record the job goldens for the barrier-held scenarios after the merge 2026-09-03 11:28:13 +08:00
Yichen Jiang 5295b25073 Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	apps/web/tests/background-job-list.e2e.ts
#	apps/web/tests/live-job-stream.e2e.ts
#	apps/web/tests/snapshots/live-job-stream/settled.expected.md
#	apps/web/tests/snapshots/live-job-stream/streaming.expected.md
#	packages/api/job-controller/README.i18n.yaml
#	packages/api/job-controller/README.md
#	packages/api/job-controller/README.zh.md
#	snapshots/web/background-job-list/running.expected.md
#	snapshots/web/background-job-list/settled.expected.md
2026-09-03 11:25:17 +08:00
Yichen Jiang 761282724b fix(jobs): constant pump waits, quiescent client disposal, record flag on the roster
Review corrections on the observation record:

- `pumpJobOutput` subscribes to `done` once and keeps one pending timer;
  racing the same pending promise every poll round retained a reaction
  per round for the life of the job.
- The `ctx.jobOutput` effect disposer is async and awaits every open
  carrier's `dispose()`, so the fiber reports unloaded only once the old
  iterators are quiescent.
- `SessionJob.record: true` replaces `outputTotal`: `append` never commits
  a roster change, so the mirrored count was stale while output flowed;
  the live offsets ride the observation stream's `opened` anchor.
- The record is documented as a best-effort live preview whose
  cross-stream reordering is bounded by the poll interval.
- The web e2e scenarios hold their background job on a test-owned barrier
  file instead of a wall-clock sleep, and each is one test rather than a
  chain sharing a job id.
2026-09-03 11:23:41 +08:00
Yichen Jiang e8469d6f6c refactor(jobs): move the human kill to the job namespace
`session.killJob` becomes `job.kill` on `dsh-api-job-controller`, beside
`job.observe`, so the Session Controller carries only session control and
the roster while every per-job Remote lives on the job namespace. The
client `ctx.jobOutput` gains `kill(sessionId, jobId)`; `dsh-client-ui-jobs`
routes its stop control through it and no longer requires `sessions`.
Unknown or foreign jobs reject with `job/not-found`; the controller
requires `ctx.jobs` to load, so `jobs-unavailable` disappears. The two
subagent ownership-fence helpers are classified duplicate-install-safe
Host exports of the Session Controller for the cross-controller import.
2026-09-02 23:18:08 +08:00
Yichen Jiang 121db081a4 Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-02 22:59:43 +08:00
Yichen Jiang 294c11715e Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	scripts/gen-cordis-catalog.ts
#	snapshots/web/cordis-tool-round/session.jsonl
#	snapshots/web/fresh-round-trip/session.jsonl
#	snapshots/web/ptc-round/session.jsonl
2026-09-02 22:59:20 +08:00
Yichen Jiang e42eb13655 test(web): drop the stray slash after the sourceRoot token in three prompt pins 2026-09-02 22:58:24 +08:00
Yichen Jiang 7ec142a325 refactor(jobs): move job observation into api-job-controller
Review asked for the observation wire and its client service to leave
session-controller: a job should reach the Host only through its own
Remote namespace, and the session plugin's apply had to materialize
{ $stream, session } for a service that is not session state.

@deepseek-ai/dsh-api-job-controller now owns the Host JobController
(job.observe over ctx.jobs, requiring the agent and job registries) and
the client ClientJobOutput (ctx.jobOutput) over ClientJobOutputModel,
resolving both Remote faces in its own apply. The remotes assembly
mounts the job namespace; ui-jobs injects the new package; the wire
types drop their Session prefix and spell the status union out so the
client face pulls no Host declaration merges into browser programs.
session-controller keeps the jobsBySession roster and loses observe-job,
job-output, and the observe cadence config.

ui-chat's slots and snapshot-builder import CommandNode and friends from
the declaring package: the typert analyzer's cross-package rule trips on
the snapshot re-export as soon as another client face joins the root
Client program (the new controller does), which is why this branch
carried the change before. JobPumpSource documents why it is an offset
snapshot reader rather than a Node.js Readable.
2026-09-02 22:53:36 +08:00
Yichen Jiang 4db24c642d Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/client/ui-chat/src/client/contract/slots.ts
#	packages/client/ui-chat/src/client/conversation-nodes/chat-snapshot-builder.ts
#	packages/client/ui-jobs/package.json
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
2026-09-02 22:04:03 +08:00
Yichen Jiang d1ec8baaf5 Merge remote-tracking branch 'origin/master' into worktree/job-kill-delivery
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/client/ui-chat/src/client/contract/slots.ts
#	packages/client/ui-chat/src/client/conversation-nodes/chat-snapshot-builder.ts
#	packages/client/ui-jobs/package.json
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
#	snapshots/web/ptc-round/session.jsonl
#	snapshots/web/ptc-round/system-prompt.expected.md
2026-09-02 21:40:24 +08:00
Yichen Jiang 374baa2621 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
Carries the session seq-brand master sync forward; unions the seq/offset
imports with this branch's jobs augmentation in commands.ts and
regenerates the catalogs and zh ports over the merged source.
2026-09-01 22:20:21 +08:00
Yichen Jiang c1e6d09305 Merge branch 'master' into worktree/process-plugin-streaming-72f9b3
Absorbs the session seq-brand refactor and the turn-rail preview layer;
regenerates the catalogs and graph docs from the merged source and
re-ports the zh config/event rows this branch owns.
2026-09-01 22:13:35 +08:00
Yichen Jiang a5af861041 fix(ci): finish the background-workflow snapshot fallout
Regenerates the module graph for tool-workflow's new dsh-jobs edge (the
doc-sync aggregate does not run that gate), refreshes the web lane's own
schema/prompt pins for the run_in_background tool text, re-packs every
session fixture the keyless refresh had left off the canonical packed
layout, covers pwsh-local's never-spawned empty observed readers, and
rewrites the pwsh-sandbox sync-rejection start() test to the seam's
actual containment contract — execute() never throws; the sync spawn
throw settles the handle killed and result() carries the attribution
split. That test sits behind the pwsh probe, so only the Windows lane
had ever executed it.
2026-09-01 22:03:37 +08:00
Yichen Jiang 12957a106e feat(workflow): run_in_background registers the run as an observed job
The workflow tool gains run_in_background (enableRunInBackground config,
default on): the run registers on ctx.jobs as an owned 'workflow' record
job and the call returns { kind: 'background', jobId, runId } immediately.
The run belongs to the job — job_kill, the list's stop control, and owner
teardown cancel it; no tool-step signal is bridged. Settlement maps the
stop reason onto the job outcome, with a completed run's rendered return
value riding output to the completion notice and job_output. A record
mirror streams workflow/phase, workflow/log, and member lifecycle lines
into the job record, replacing the removed activity mirror; the output
schema becomes a kind-discriminated union and 'workflow' joins JobKindMap.
Snapshot expected outputs are refreshed for the schema, prompt, and PTC
stub changes (the keyless refresh also migrates fixtures to the current
session write format: range sourceEventSeqs and reasoning-delta chunks).
2026-09-01 21:24:37 +08:00
Yichen Jiang d23fdf8ab7 test(ci): port the offer-expiry executor suite to pwsh-local
The promotion machinery was copied from bash-local without its tests;
runners without pwsh skip and exempt the file, so only the Windows
coverage lane surfaced the gap.
2026-09-01 21:06:34 +08:00
Yichen Jiang e578d07354 Merge remote-tracking branch 'origin/worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-09-01 20:53:38 +08:00
Yichen Jiang 592dfd8854 test(ci): cover the owned promotion paths
An agent-attributed timeout promotion fences the job to the calling
session in both shell tools, and the pwsh promoted job's cancel hook is
exercised through a registry kill.
2026-09-01 20:53:32 +08:00
Yichen Jiang 1cec452f09 test(ci): close the observe-job coverage gaps
Covers the woken-wait fast path (a wake landing while the generator is
suspended on a yield), the opened frame's live-detail arm, and the
sessionId-less caller resolution over an unowned job.
2026-09-01 20:51:18 +08:00
Yichen Jiang da48f65160 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
Carries the hairline-elevation sweep forward; the settled-section heading,
chevron box, and stop control move to 0.5px borders while keeping this
branch's padding.
2026-09-01 20:36:55 +08:00
Yichen Jiang 2540fd8b78 Merge branch 'master' into worktree/process-plugin-streaming-72f9b3
Absorbs the superellipse-corner and hairline-elevation sweep; keeps the
data-with-body header divider on TerminalBlock at the new 0.5px width and
brings the job-list settled-section rule onto the hairline standard.
2026-09-01 20:34:59 +08:00
Yichen Jiang 4ee1e1af25 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
Carries the master sync forward (invariant-companion cleanup, alpha.3 bump);
regenerates the client api catalog so ISession lists both killJob and the new
loadThrough, and refreshes the new ptc-python-turn scenario's system-prompt
pin for this branch's bash timeout-promotion schema text.
2026-09-01 20:30:36 +08:00
Yichen Jiang 891b45bf7f Merge branch 'master' into worktree/process-plugin-streaming-72f9b3
Absorbs the repo-wide no-op invariant companion removal (ui-jobs loses its
placeholder companion, export, and devDep), the 0.1.2-alpha.3 release bump,
and the tool-subagent-report package retirement; regenerates the client slot
catalog for the shifted contract line numbers.
2026-09-01 20:22:52 +08:00
Yichen Jiang b5c29ece22 fix(ci): regenerate catalogs and settle the merged job-list evidence
Catalog line references and the re-landed promoteOnTimeout blocks follow
the merge in both languages; the ordering test narrows getAttribute's null
before startsWith so the client face compiles.
2026-09-01 19:42:18 +08:00
Yichen Jiang a2fb67d06c Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	apps/web/tests/background-job-list.e2e.ts
#	apps/web/tests/live-job-stream.e2e.ts
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	packages/client/ui-activity/README.md
#	packages/client/ui-activity/README.zh.md
#	packages/client/ui-activity/src/client/index.ts
#	packages/client/ui-jobs/README.i18n.yaml
#	packages/client/ui-jobs/src/client/JobListAction.tsx
#	packages/client/ui-jobs/tests/browser-plugin.client.spec.ts
#	packages/client/ui-jobs/tests/job-list-action.client.spec.tsx
#	packages/jobs/jobs-local/src/index.ts
#	packages/jobs/jobs/README.i18n.yaml
#	packages/jobs/jobs/README.md
#	packages/jobs/jobs/README.zh.md
#	packages/jobs/jobs/src/index.ts
#	packages/shell/tool-bash/src/index.ts
#	packages/shell/tool-bash/tests/observe.spec.ts
#	packages/shell/tool-pwsh/src/index.ts
#	packages/shell/tool-pwsh/tests/observe.spec.ts
#	packages/workflow/tool-workflow/tests/activity-mirror.spec.ts
#	pnpm-lock.yaml
2026-09-01 19:35:23 +08:00
Yichen Jiang 419a985fc9 fix(api): capture the session namespace for job observation at apply time
Observation (re)opens run on caller stacks — a React expand click, a
carrier retry — whose dynamic context has not declared remote.session, so
the ClientJobOutput wiring resolves the namespace to a concrete value while
the plugin's own context is current, exactly as the activity client did.
Caught by the live-job-stream web e2e, whose goldens (with the
background-job-list pair) now carry the ui-jobs list name; the client-apply
spec gains a jobOutput wiring smoke.
2026-09-01 19:04:25 +08:00
Yichen Jiang d2e9be4086 test(api): stub session.observeJob on the fake client namespace
The regenerated session namespace requires the new stream; the fake serves
a never-yielding generator, and job-output.client.spec exercises the real
consumer.
2026-09-01 18:36:29 +08:00
Yichen Jiang 3c79e71cdc docs(i18n): mirror the record refactor across the bilingual pairs
Chinese sides of the jobs, jobs-local, tool-bash, tool-pwsh, tool-workflow,
session-controller, and ui-jobs pages follow their English edits; the
generated en-only catalogs (config catalog, capability seams, event
producer/consumer) get the same section surgery by hand; the activity
subsystem page triplet is fully removed and the jobs page carries the
record contract in both languages with fresh type-equiv manifest entries.
The three prior activity notes point at the superseding note. Web e2e label
assertions follow the ui-jobs copy, and the three test call sites that
invoked run() bare pass the producer face.
2026-09-01 18:34:36 +08:00
Yichen Jiang 0dca00b425 refactor(api,client)!: delete the activity plane; one job roster with record observation
packages/activity/* and packages/api/activity-controller are removed. The
web roster is the session control stream's jobs frames alone; per-job output
observation rides session.observeJob and the client ctx.jobOutput service.
ui-activity returns to its upstream name ui-jobs and renders the single
roster — a row is expandable exactly when its job declared a record
(outputTotal present). Composition rows, dependency-policy exemptions,
tsconfig aliases and references, generated catalogs, and the docs pages
follow; the activity subsystem page is deleted and the jobs page gains the
record contract. The superseding Agent Note records the decision and points
the three prior notes at it.
2026-09-01 18:22:04 +08:00
Yichen Jiang 6e8a7a50ea feat(api): serve job-record observation from the session namespace
SessionJob rows carry outputTotal exactly for record-declaring jobs, and a
new session.observeJob stream serves one job's retained record from an
absolute offset (anchor, coalesced output frames, terminal status) with the
fenced read resolved from the request's session — the same authorization
shape as the jobs roster. The client half gains ctx.jobOutput: the
reference-counted per-job observation service and its accumulated view
model, ported from the activity controller this replaces.
2026-09-01 18:03:09 +08:00
Yichen Jiang 8537b8d5bb refactor(shell,workflow): produce into the job record instead of ctx.activities
bash and pwsh background runs declare record: true and pump their observed
streams straight into the job through observeProcessRecord — the open/end
pairing, outcome mapping, and registry-absent degradation branches are gone,
and the pump's final drain folds into hooks.done so the record holds its
last bytes before settlement closes it. activityPollMs becomes recordPollMs.

tool-workflow drops its foreground activity mirror deliberately: a
foreground run's live phase/log narration had the mirror as its only
carrier, and the transcript keeps the recorded run/member lifecycle events.
Live narration returns with backgrounded runs when workflow gains
run_in_background.
2026-09-01 17:52:42 +08:00
Yichen Jiang e580c0b333 feat(jobs): fold the streaming observation record into the job registry
A job can now declare record: true and stream raw output into a bounded
per-job ring through the RunningJob face its starter receives: readRecord
serves any number of observers at absolute byte offsets without touching
the consuming model cursor or notice state, onOutput signals advancement,
and updateDetail publishes a live progress line into every snapshot. Job
settlement is the record's only end: it trims retention to the settled cap
and fires the final output signal, so producers no longer reconcile two
terminal states. pumpJobOutput ports the offset-reader pump beside the
seam. This is the first step of merging the standalone dsh-activity
observation plane into jobs.
2026-09-01 17:45:43 +08:00
Yichen Jiang b684ae215f Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-08-31 11:49:23 +08:00
Yichen Jiang 48939ba742 test(ci): pin the activity controller in the Host relay roster
The roster spec mirrors CLIENT_FACE_EXCLUDE; the activity controller
joined the excluded Host relays in the previous commit.
2026-08-31 11:49:00 +08:00
Yichen Jiang 8f031b9a71 fix(ci): declare ui-activity's dsh-session dev dependency under the flattened policy
ActivityListAction imports dsh-session types; the flattened client-face
policy wants that relationship recorded as a devDependency, and the
peer-slimming merge round dropped the entry.
2026-08-31 11:42:51 +08:00
Yichen Jiang f26eb7844e fix(ci): follow the merged kill-detail rendering and pack the refreshed fixtures
- tool-subagent's two job_kill scenarios now see the model's kill reason
  in the killed detail — the registry has merged kill reasons into the
  killed outcome since the human-kill work, and the master merge routed
  subagent aborts through that same settle path; the specs pin the new
  text.
- 112 session fixtures re-recorded by the earlier snapshot refresh
  predate master's canonical packed layout; migrate:packed-session-fixtures
  rewrote them mechanically and the keyless replay stays green.
- ActivityListAction's clear-while-expanded arm gets its missing client
  spec case (per-file coverage gate).
2026-08-31 11:41:17 +08:00
Yichen Jiang 8479c73102 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-08-31 11:41:16 +08:00
Yichen Jiang 8aa2dfa3a5 fix(ci): exempt the activity controller from flattened client-face dependencies
The master merge brought the published dependency policy: a package
declaring dsh.client flattens its non-Cordis peers unless excluded.
api-activity-controller is the same species as the excluded session and
workspace controllers — a Host Remote controller whose host half relays
real runtime peers (dsh-activity for the registry service and its brand
constructor at the wire boundary, dsh-invariants for the companion) —
so it joins CLIENT_FACE_EXCLUDE rather than dropping those peers.
2026-08-31 11:40:11 +08:00
Yichen Jiang 922c80ce66 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/api/session-controller/src/commands.ts
#	packages/api/session-controller/tests/session.client.spec.ts
#	packages/client/ui-activity/package.json
#	packages/shell/tool-bash/src/index.ts
#	packages/shell/tool-bash/tests/tools.spec.ts
#	packages/shell/tool-pwsh/src/index.ts
2026-08-31 11:22:11 +08:00
Yichen Jiang 6b2cc74984 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/api/remotes/package.json
#	packages/client/ui-activity/package.json
#	packages/workflow/tool-workflow/src/index.ts
2026-08-31 11:18:10 +08:00
Yichen Jiang 74fa4be0a3 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/api/session-controller/src/types.ts
#	packages/api/session-controller/tests/fake-api.client.ts
#	packages/client/connection/src/rpc.ts
#	packages/extensions/cordis-client-runner/src/client/api-catalog.ts
#	packages/extensions/tool-cordis/src/api-catalog.ts
2026-08-29 14:23:22 +08:00
Yichen Jiang e47580f604 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/event-producer-consumer.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-primitives/tests/use-dismiss-on-outside-pointer.client.spec.tsx
2026-08-29 14:13:36 +08:00
Yichen Jiang 02ef5e408f Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/shell/bash-sandbox/tests/sandbox.spec.ts
#	packages/shell/tool-pwsh/tests/tools.spec.ts
2026-08-28 17:33:17 +08:00
Yichen Jiang 70311bc517 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/architecture.i18n.yaml
#	docs/config-catalog.i18n.yaml
#	docs/event-producer-consumer.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	knip.json
#	packages/bundle/web-app/cordis.patch.yml
#	packages/bundle/web-app/package.json
#	packages/client/README.i18n.yaml
#	packages/client/README.md
#	packages/client/README.zh.md
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
#	packages/shell/tool-bash/package.json
#	packages/shell/tool-pwsh/package.json
#	packages/workflow/tool-workflow/package.json
#	scripts/verify-package-readme-model-experience.ts
#	tsconfig.base.json
#	tsconfig.client.json
2026-08-28 17:29:41 +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
Yichen Jiang 48bbaa3e31 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/api/session-controller/src/types.ts
#	packages/api/session-controller/tests/fake-api.client.ts
#	packages/api/session-controller/tests/test-remote.ts
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/host/apiproxy/src/api/rpc.schema.ts
#	packages/host/apiproxy/src/api/rpc.ts
2026-08-28 10:27:00 +08:00
Yichen Jiang d4683d5552 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/capability-seams.i18n.yaml
#	docs/capability-seams.md
#	docs/capability-seams.zh.md
#	docs/config-catalog.i18n.yaml
#	docs/event-producer-consumer.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/bundle/web-app/cordis.patch.yml
#	packages/bundle/web-app/package.json
#	packages/client/ui-activity/package.json
#	packages/workflow/tool-workflow/README.i18n.yaml
2026-08-28 10:14:49 +08:00
Yichen Jiang 72efe7f15a Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery 2026-08-27 21:48:33 +08:00
Yichen Jiang 5dcba9f760 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	tsconfig.base.json
2026-08-27 21:48:02 +08:00
Yichen Jiang 9f24670323 test(session-controller): follow the two-argument Session constructor in the killJob specs
The master merge slimmed the client Session constructor to (id, remote,
options); the killJob specs from this branch still passed the FakeApiClient
as a second argument and stopped compiling.
2026-08-27 21:43:34 +08:00
Yichen Jiang df7e779a58 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	packages/shell/tool-bash/tests/observe.spec.ts
#	packages/shell/tool-pwsh/tests/observe.spec.ts
#	packages/workflow/tool-workflow/tests/activity-mirror.spec.ts
2026-08-27 21:41:57 +08:00
Yichen Jiang e5d5d16dd2 Merge branch 'worktree/process-plugin-streaming-72f9b3' into worktree/job-kill-delivery
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/api/session-controller/src/client/sessions/session.ts
#	packages/extensions/cordis-client-runner/src/client/api-catalog.ts
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/host/apiproxy/src/api/rpc.schema.ts
#	packages/session/session-projection-cache/tests/cache.spec.ts
#	packages/shell/tool-bash/tests/observe.spec.ts
#	packages/shell/tool-pwsh/tests/observe.spec.ts
#	snapshots/web/approval-composer/session.jsonl
#	snapshots/web/code-mode-round/session.jsonl
#	snapshots/web/cordis-tool-round/session.jsonl
#	snapshots/web/feedback-command/session.jsonl
#	snapshots/web/fresh-round-trip/session.jsonl
#	snapshots/web/goal-multi-turn-actions/session.jsonl
#	snapshots/web/lifecycle-chrome/session.jsonl
#	snapshots/web/live-interactions/session.jsonl
#	snapshots/web/minimal-preset/session.jsonl
#	snapshots/web/permission-policy-context/session.jsonl
#	snapshots/web/plan-review/session.jsonl
#	snapshots/web/question-composer/session.jsonl
#	snapshots/web/steering/session.jsonl
#	snapshots/web/turn-tail-actions/session.jsonl
#	snapshots/web/web-search-round/session.jsonl
2026-08-27 21:41:16 +08:00
Yichen Jiang 053979cdec test(activity): cover the owner arm and the pwsh outer observation catch
The coverage lanes flag four uncovered locations after the master merge:
the spec.owner spread in tool-bash/tool-pwsh observe, the workflow mirror's
owner spread, and tool-pwsh's outer observation catch. The covering tests
existed only on the stacked job-kill branch; give this branch its own:
an owned background run per shell asserting the fenced ownerSession row,
the owned workflow mirror run, and a throwing open() through the pwsh
outer catch. The windows-only file-reference-local gap reproduces on
master's own windows lane at the merge point and stays upstream.
2026-08-27 21:40:44 +08:00
Yichen Jiang ab75fe2bb6 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/capability-seams.i18n.yaml
#	docs/capability-seams.md
#	docs/capability-seams.zh.md
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/event-producer-consumer.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	knip.json
#	packages/api/remotes/src/client/index.ts
#	packages/api/remotes/tsconfig.client.json
#	packages/bundle/web-app/package.json
#	packages/client/ui-chat/src/client/contract/slots.ts
#	packages/client/ui-chat/src/client/conversation-nodes/chat-snapshot-builder.ts
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-subagent/README.i18n.yaml
#	packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
#	scripts/gen-doc-graphs.ts
#	tsconfig.client.json
#	tsconfig.host.json
2026-08-27 20:03:20 +08:00
Yichen Jiang 32e9f33fd2 feat(web): tighten task-list controls, fold the settled tail, merge the live meta line
Review of the first hierarchy pass in the browser: the 26px bordered controls
read oversized and the card fill visually stopped short of the stop button.
The controls drop to 20px squares, the live card's inner padding now frames
the dot and both controls on the fill, and the hover wash moves onto the card
itself so nothing escapes it. A live row's second line becomes kind + ticking
duration (the redundant 'running' word only returns through a real detail).
The settled tail folds behind a 'Finished N' toggle while live work exists
(auto-expanded otherwise) with a client-side Clear that hides the current
tail without touching the registry; goldens re-recorded for the new tree.
2026-08-26 17:10:26 +08:00
Yichen Jiang 4edf279ed6 feat(web): raise the task list's control affordance and row hierarchy
Live rows read as filled cards (fill-l2, the kind badge pops on the menu
surface instead), the expand chevron and the stop control become persistent
bordered squares (the stop turns danger on hover), and the popover widens to
500px. The settled tail keeps its flat rows, so running work now outranks it
visually — previously the colored settled dots were the loudest thing in the
list and both controls were bare tertiary glyphs invisible before hover.
2026-08-26 17:00:25 +08:00
Yichen Jiang bb1d472e94 fix(web): make the armed stop press legible without hover
The armed state relied on a color swap through --dsw-alias-label-error, a
token the themes never define, so the confirm step was effectively invisible.
The first press now widens the button into a labeled danger pill (确认停止 /
Confirm stop) tinted with the real state-error token StateDot uses; the
stream-failure notice moves off the same phantom token. Component spec pins
the inline label.
2026-08-26 16:35:11 +08:00
Yichen Jiang 8f3103b511 fix(jobs): address review — error scoping, subagent fence, pending kill
- session.killJob maps job-not-found from the lookup only: jobs.get gates the
  same synchronous span, so a producer-cancel throw now propagates per the
  registry contract (job state unchanged) instead of masquerading as a lookup
  failure (threads r3860226021, r3860226047).
- session.killJob applies the service-wide subagent ownership fence exactly as
  cancel does; a subagent-owned live session rejects with the ownership error
  and the child-owned job stays running (thread r3860226041).
- The stop control stays pending on an admitted kill: the unary response and
  the jobs frames have no cross-carrier ordering, so only the authoritative
  frame (the row leaving the killable set) releases the button, closing the
  duplicate-kill window (thread r3860226028).
- One-line comment on the killReason assignment stating last-writer-wins is
  intended, beside the first-claim-wins reported handling (thread r3860225999).

Host spec pins the producer-throw propagation and the fence; the component
spec pins pending-until-frame; the Agent Note records both refinements.
2026-08-26 16:19:34 +08:00
Yichen Jiang d6bebc5783 feat(shell): converge on execute() and promote timed-out commands to jobs
The executor seam collapses run()/start() (and the planned begin()) into one
resolve() + execute(): the handle IS the live process, and the foreground
result, the background cursor, and the deadline's promotion offer are
projections over the same spawn. ShellExecSpec.onExpiry ('kill' default /
'offer' / 'none') replaces the implicit method split; one stdout budget applies
everywhere, the 'start ignores timeoutMs' wart dies, and sync spawn throws are
contained into the same settled-killed handle as async rejections (result()
rejects with the original error, identity preserved for the sandbox
classification).

The promotion offer settles exactly once and never rejects — offer at an
'offer' deadline while running, undefined when the process settles first — so
'await execution.promotion' alone distinguishes the outcomes. An offer must be
answered synchronously; an unanswered one auto-declines back to the
kill-on-timeout behavior. accept() ends the deadline and detaches the caller's
abort signal; decline() kills and classifies timedOut.

tool-bash and tool-pwsh promote on timeout by default (promoteOnTimeout: true,
inert without run_in_background or a job registry): at the offer the running
handle registers as a job with the same hooks as run_in_background, mirrors
into ctx.activities (the web task list streams it, stop control included), and
the call returns { kind: 'promoted', jobId, timeoutMs, output } carrying the
output so far — the job cursor continues exactly after it. Any promotion
failure declines and falls back to the plain timeout kill. Descriptions and
the timeoutMs schema text advertise the semantics only when they hold;
recorded-session and web snapshot fixtures re-recorded with them.

Also repairs the four CI failures from the human-kill push: ui-activity's
missing dsh-session peer declaration (static + windows observational), the
observe owner-arm/outer-catch and killJob-stub coverage gaps, tool-workflow's
owned-run arm, and the timing-dependent projection-cache interval flush test
(now poll-based for coarse Windows timers).

Peer evidence and rejected alternatives (Codex's session model, a third seam
method, a second threshold knob) in the Agent Note
2026-08-26-shell-execute-timeout-promotion.
2026-08-26 16:11:01 +08:00
Yichen Jiang 51f74910ae feat(jobs): human job kill with an unclaimed terminal report
The web task list gains a two-press stop control on running job rows, built on
one seam change: JobRegistry.kill now takes { reason?, reported? } instead of a
positional reason. reported defaults to true (the model's job_kill claims the
terminal report exactly as before); the web path passes reported: false because
a human kill has no model-visible channel, so the settlement flows through the
existing tool-jobs completion notice (wakeup/inject, budgets, truncation all
unchanged). A recorded kill reason merges into a killed settlement's detail
(producer facts first: 'signal: SIGTERM; cancelled by the user'), so the notice
and the web row both say who stopped the work.

- session-controller: session.killJob Remote beside cancel, live-only Agent
  lookup, job-not-found/jobs-unavailable rejections joined to the closed RPC
  error table; ClientSession.killJob and the ISession face carry it to the UI.
- ui-activity: arm/confirm stop button (3s disarm, pending disable, failure
  hint), rendered only on running job rows; standalone activities keep no kill
  handle and the README limitation now says so.
- The background-job-list web e2e now drives the whole human path through the
  button; goldens show the merged killed detail end to end.
- Agent Note 2026-08-26-human-job-kill records the decision against Kimi's
  suppress-own-notification precedent and Claude Code's silent-kill failure;
  the 2026-08-08 blocker note and the unified-task-list note point at it.
2026-08-26 14:15:44 +08:00
Yichen Jiang 47ee13dd74 fix(ci): repair the four failures the master merge left behind
- live-activity-stream.e2e.ts still seeded from the old
  apps/web/tests/snapshots path and navigated to the unauthenticated
  baseUrl; the merge moved session recordings to snapshots/web/ and put
  browser trust behind scaffold.authenticatedUrl, and both updates reached
  the pre-existing background-job lane but not this branch-new file.
- tool-bash/tool-pwsh observe: the settlement-mapping catch introduced by
  the review fix had no covering test; both specs now drive a throwing
  end() through it.
- useDismissOnOutsidePointer lost its only branch coverage when the
  ui-jobs suite was deleted; the hook now has its own unit spec (outside
  close, inside ignore, closed detach, non-Node target).
- THIRD_PARTY_NOTICES.md regenerated at the merged lockfile's
  claude-agent-sdk 0.3.241: stale 0.3.220 store directories made the local
  generator resolve the old payload, so the committed file disagreed with
  a clean install.
2026-08-26 10:54:23 +08:00
Yichen Jiang c8c3540f15 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/capability-seams.i18n.yaml
#	docs/capability-seams.md
#	docs/capability-seams.zh.md
#	packages/bundle/web-app/package.json
#	packages/client/README.i18n.yaml
#	packages/client/README.md
#	packages/client/README.zh.md
#	packages/client/ui-activity/README.i18n.yaml
#	packages/client/ui-chat/src/client/conversation-nodes/retry.ts
#	packages/client/ui-jobs/README.md
#	packages/client/ui-jobs/README.zh.md
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-primitives/README.md
#	packages/client/ui-primitives/README.zh.md
#	packages/client/ui-subagent/README.i18n.yaml
#	packages/client/ui-subagent/README.md
#	packages/client/ui-subagent/README.zh.md
#	packages/jobs/jobs/README.i18n.yaml
#	packages/jobs/jobs/README.md
#	packages/jobs/jobs/README.zh.md
#	packages/shell/shell/README.i18n.yaml
#	packages/shell/shell/README.md
#	packages/shell/shell/README.zh.md
#	packages/shell/tool-bash/README.i18n.yaml
#	packages/shell/tool-bash/README.md
#	packages/shell/tool-bash/README.zh.md
#	packages/shell/tool-pwsh/README.i18n.yaml
#	packages/shell/tool-pwsh/README.md
#	packages/shell/tool-pwsh/README.zh.md
#	packages/workflow/tool-workflow/README.i18n.yaml
#	packages/workflow/tool-workflow/README.md
#	packages/workflow/tool-workflow/README.zh.md
2026-08-26 10:17:30 +08:00
Yichen Jiang 5ee10b3ebd Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	packages/client/ui-chat/src/client/chat/ContextInjectionRow.tsx
2026-08-25 16:50:24 +08:00
Yichen Jiang 69d8b6e7ea fix(activity): bind observation cleanup to its generation and settle before mapping the outcome
Both ds-review-bot criticals verified and fixed:

- ClientActivityFeed release closures resolved the entries map at release
  time, not the entry they were minted for. A late release of a superseded
  observation decremented (and could tear down) the successor's stream, and
  the post-dispose model clear could land after a re-observation inside the
  dispose round-trip re-anchored the view — blanking the panel until the
  popover reopened (React StrictMode's double effect hits the same window).
  Releasers now capture their entry, reconcile the map only when it still
  holds that entry, and skip the view clear whenever a successor owns the
  key. Both regressions fail on the previous code.

- The background observation tap mapped the process outcome as soon as the
  pump settled — including its failure path, where the process is usually
  still running: processOutcome requires a settled handle, so an early
  mapping froze 'exit code: 0' onto a live task and first-wins end discarded
  the real terminal state. The tap now awaits proc.done before mapping (the
  promise never rejects) and swallows mapping failures per the module's
  contract, in bash and its pwsh mirror.

Also applied from the same review: the Remote tier's cross-session
visibility is now stated in the controller README, ActivityRead.next
documents its chunk-boundary nature that client concatenation relies on,
mergeRows records the one-activity-per-job assumption, and the 08-24 Agent
Note now reflects the shipped unified task list.
2026-08-25 15:46:15 +08:00
Yichen Jiang f9c3a6c753 fix(activity): banner divider on live output and headings for both task sections
The TerminalBlock banner divider used to key off the running flag from the
days when a running card was banner-only; a running card that streams live
output now needs the same separation, so the divider follows the rendered
body (data-with-body) instead. The task list labels each non-empty section
(Running / Finished) rather than only dividing the settled tail, and the
leading section drops the divider line above its heading.
2026-08-25 14:58:26 +08:00
Yichen Jiang f10572a85d chore(client): regenerate the slot catalog after the master merge 2026-08-25 14:42:20 +08:00
Yichen Jiang 5cd435e917 Merge remote-tracking branch 'origin/master' into worktree/process-plugin-streaming-72f9b3
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/client/ui-chat/src/client/contract/slots.ts
#	packages/shell/tool-pwsh/package.json
#	packages/workflow/tool-workflow/src/index.ts
#	python/sdk-runtime/package.json
2026-08-25 14:36:33 +08:00
Yichen Jiang e200eadd73 fix(activity): acceptance refinements — header band order and panel presentation
Interactive acceptance produced five presentation decisions:

- Header band order is preset → tasks → subagent catalog. The root-session
  descendant count moves out of the breadcrumb (header.lineage) into the
  actions band (order 30) as SubagentCatalogAction and drops its '/'
  separator — a root session has no hierarchy to breadcrumb. Child
  sessions keep their root/child switcher unchanged.
- The panel's copy control copies the command (TerminalBlock.copyText),
  not the output: a long command ellipsizes in the row, so the control is
  its only complete source, and it stays rendered before any output.
- Commands and output lines wrap in full (--dsl-terminal-command-whitespace
  / --dsl-terminal-line-whitespace: pre-wrap), so the output region never
  scrolls sideways; the region caps at a fixed height and scrolls
  (--dsl-terminal-output-max-height) with maxLines: Infinity disabling the
  head/tail fold.
- The panel draws no run-state dot (TerminalBlock.runStateDot: false) —
  the row above carries the same state — and reclaims the dot gutter via
  --dsl-terminal-gutter, which must target the card element itself because
  the variable is declared on it. The panel's left spine is gone with it.

All TerminalBlock changes are opt-ins (props or --dsl-terminal-* variables);
tool cards keep their shipped fold/ellipsis/dot behavior.
2026-08-25 14:23:12 +08:00
Yichen Jiang 61aadb3abf feat(activity): one session-header task list joining jobs with their activities
Browser acceptance of the activity panel surfaced the product problem: a
background bash registers in both planes, so the header grew two near-
identical popovers — "background jobs" with lifecycle and duration,
"activities" with live output — listing the same work twice.

The service planes stay orthogonal (jobs: model-visible control with a
consuming read cursor; activities: transient non-consuming observation).
The join happens per row in the UI projection instead:

- dsh-client-ui-activity renders the single merged "tasks" list. Each
  jobsBySession row joins the activity carrying its correlation.jobId —
  the job supplies identity, lifecycle (stopping exists only there),
  duration, and the model-visible detail; the activity supplies the
  expandable live-output panel. Standalone activities (workflow runs)
  keep their own rows; without the activity registry, job rows still
  render and the control degrades to the old job list exactly.
- dsh-client-ui-jobs is deleted (pre-release, no shim); the merged entry
  takes its slot order. The job locale namespace folds into activity.
- User-facing copy says "task" (任务): N tasks running / N 个任务进行中.
- Hierarchy: live rows first as two lines (label over kind badge and
  status, ticking duration), a Finished divider when both sections
  exist, settled rows compacted to one de-emphasized line, and the
  output panel hangs behind a spine under its row.

Deliberately not joined: subagent rows stay bare (the subagent panel is
their surface) and foreground commands stay in tool cards.

Both web e2e scenarios now assert one Tasks list; the background-job
scenario's row gained a live-output panel, proving the join end to end.
Agent Note: 2026-08-25-unified-task-list.
2026-08-25 11:58:43 +08:00
Yichen Jiang ddd8baa93a fix(activity): mark evicted heads on fresh observation and fit the popover to the viewport
Browser acceptance against a live scaffold surfaced two defects:

- A fresh observation anchors at the registry's earliest retained byte, so
  the client's gap predicate (anchor behind earliest) never fired for it: a
  viewer who watched eviction live saw the gap notice, while a reload of the
  same activity silently hid that the head was discarded. A fresh view (no
  accumulated text) anchored past offset zero now carries the gap mark;
  resumes keep their recorded state.

- The trigger-anchored popover (left: 0, width 440px) overflowed the right
  viewport edge on narrow windows — max-width alone cannot see the anchor
  offset. The open popover now measures its anchor and shifts left to keep
  the Menu primitive's 12px viewport margin, re-fitting on window resize and
  falling back to the pure CSS anchor when layout reports no width (jsdom).

JobListAction shares the latent overflow; tracked separately.
2026-08-24 23:07:17 +08:00
Yichen Jiang 4a79310339 feat(activity): optional live-output observation seam with a web viewer
Add the activity capability seam: ctx.activities is a pure observation
plane where long-running work (background bash/pwsh, workflow runs) opens a
handle, appends transient output into a byte-offset ring buffer, and settles
exactly once. Nothing model-visible changes: reads are non-consuming and
lossy-by-design (absolute UTF-8 offsets survive eviction and report gaps),
correlation carries {callId, jobId}, and visibility is owner-fenced like jobs.

The seam is strictly optional. Producers tap it through ctx.get('activities')
and contain every observation failure, so an unregistered or broken registry
never affects the underlying job (proven by broken-registry tests).

Ship the full path in one change:
- @deepseek-ai/dsh-activity: Service Definition, pumpActivityOutput pull
  substrate, invariant companion; dsh-activity-local: ring-buffer provider
  with retention config and owner cleanup.
- shell: ShellProcess.observed exposes non-consuming stdout/stderr readers;
  tool-bash/tool-pwsh mirror background jobs into activities.
- tool-workflow: phase/log/agent lines mirrored as a workflow activity.
- api-activity-controller: Typert Remote control (roster baseline+buckets)
  and observe (opened/output/status frames, coalesced and byte-capped)
  streams plus the client feed service with reference-counted observation.
- ui-activity: session-header action rendering live output through
  TerminalBlock, which now shows output while a command is still running.

Docs: activity subsystem page, architecture row, regenerated catalogs, and
the Agent Note (2026-08-24-activity-observation-seam), all bilingual. A
keyless web e2e replays a real run_in_background stream to ARIA goldens.
2026-08-24 22:40:14 +08:00
Yichen Jiang ff5f94d3fb refactor(client): import conversation node types from their declaring package
Adding another client-face project to the client aggregate reshuffles the
typert analyzer's batches, which exposed latent provenance violations in
ui-chat and ui-approval: types consumed through ui-conversation's re-export
path instead of their declaring package, and one slot-contract literal whose
type the analyzer could not name. Import the types from
@deepseek-ai/dsh-client-ui-conversation/client directly and give the approval
interaction kind a named alias so the explicit annotation survives both the
analyzer and lint.
2026-08-24 22:40:00 +08:00
11687 changed files with 802230 additions and 221272 deletions

No files matched your search

+45 -5
View File
@@ -1,6 +1,46 @@
# 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:
# Bilingual-pair consistency record for README.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/README.md
README.md: 9fdb4039b525bbc4051ab3c8058b117e4de5f2f4
README.zh.md: 2d7e07b963d3c4d77da9148b011e1478fa2ae5da
/agent-notes:
en: a10991a192c7b55d
zh: c2e5b938ece4f366
/agent-notes/layout-and-naming:
en: 0a517dfc15d4af0a
zh: 324bd9e13a0295e3
/agent-notes/classification:
en: 055a5e49f9af3dc2
zh: 9f7c78409cccfded
/agent-notes/archiving-and-deletion:
en: 57ccc5fec461ebb0
zh: 69e8f9e79abc53aa
/agent-notes/when-to-write-one:
en: 2beb1b94d8fb633c
zh: 889b5542bb771205
/agent-notes/the-file-format:
en: c8efdd37e51c8746
zh: 0080340005bd31db
/agent-notes/the-file-format/the-header-block:
en: 16fdaab0c74a5bb5
zh: 2553f145a1eb878f
/agent-notes/the-file-format/the-body-skeleton:
en: 740b7e964b9aec37
zh: 8551ddef1ffa776a
/agent-notes/the-file-format/the-body-skeleton/proposed:
en: acc0c035c5ca6fd7
zh: 8a65816dfac9e580
/agent-notes/the-file-format/the-body-skeleton/implemented:
en: f3523d7e40cc4e2f
zh: 574fa8959f8829a1
/agent-notes/the-file-format/the-body-skeleton/rejected:
en: f0ff5d05191f2315
zh: 3f9df0dd01a5cbed
/agent-notes/the-file-format/alternatives-considered-mandatory:
en: fe1bf385aee54033
zh: 37cb4ea86ec6d99d
/agent-notes/the-file-format/moving-between-lifecycles:
en: d3f18ba194dfb677
zh: 3d202868deda2f31
/agent-notes/the-file-format/chinese-counterparts:
en: d72a33b7c63722b2
zh: f8320c91b1f77ae6
+5 -5
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. Low-future-value implemented records 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
@@ -35,11 +35,11 @@ The `architecture` / `process` line: **architecture** is about the source we shi
## Archiving and deletion
Archive an implemented Agent Note when the shipped decision is complete and its rationale is unlikely to guide future work. Keep it active when its alternatives, ownership boundary, negative guarantee, durable or wire semantics, security rule, or reintroduction condition remains useful. Never archive a proposed note: reject an obsolete proposal. Keep a rejected note only while it prevents a plausible mistake; otherwise delete its English, Chinese, and sidecar files together. Use the calibrated [`dsh-archive-agent-notes`](../skills/dsh-archive-agent-notes/SKILL.md) workflow rather than word count, age, or a target quota.
Delete an implemented Agent Note that only describes small UI adjustments or purely mechanical changes; delete its English, Chinese, and sidecar files together and repair or remove inbound links. A local bug fix, performance change, new capability, or substantive behavior decision does not qualify merely because its implementation is small. Archive other implemented notes only when the shipped decision is complete, its rationale is unlikely to guide future work, and the record still has historical decision value. Keep it active when its alternatives, ownership boundary, negative guarantee, durable or wire semantics, security rule, or reintroduction condition remains useful. Never archive a proposed note: reject an obsolete proposal. Keep a rejected note only while it prevents a plausible mistake; otherwise delete its English, Chinese, and sidecar files together. Use the calibrated [`dsh-archive-agent-notes`](../skills/dsh-archive-agent-notes/SKILL.md) workflow rather than word count, age, or a target quota.
The archive is path-encoded as `archived/{class}/yyyy-mm-dd-topic-title.md`; `implemented` is deliberately absent because only implemented notes can enter it. An archival change moves the complete English/Chinese/sidecar triplet, retains `Status: implemented`, inserts the same `Archived: YYYY-MM-DD` line immediately below that status in both language files, re-records the sidecar, and repairs or deletes inbound links. These are the only permitted content changes during archival.
The archive is path-encoded as `archived/{class}/yyyy-mm-dd-topic-title.md`; `implemented` is deliberately absent because only implemented notes can enter it. An archival change moves the complete English/Chinese/sidecar triplet, retains `Status: implemented`, inserts the same `Archived: YYYY-MM-DD` line immediately below that status in both language files, re-records the sidecar, and repairs or deletes inbound links. These are the only permitted content changes during archival. Existing title punctuation, blank-line layout, and language-switcher wording do not block archival; preserve them with the body.
Once sealed, every archived triplet is permanently frozen. Do not edit, translate, reformat, update, move, or delete it, and do not treat it as authority for current behavior. Documentation gates skip archived sources, including their outbound links; active prose may still link into an archived note when it intentionally cites history. [`verify-archived-agent-notes`](../../scripts/verify-archived-agent-notes.ts) enforces the closed class tree, complete triplets, archive metadata, sidecar hashes, and the append-only frozen-content manifest. The [archive-policy Agent Note](implemented/process/2026-07-26-frozen-agent-note-archive.md) owns the rationale.
Once sealed, every archived triplet is permanently frozen. Do not edit, translate, reformat, update, move, or delete it, and do not treat it as authority for current behavior. Documentation gates skip archived sources, including their outbound links; active prose may still link into an archived note when it intentionally cites history. [`verify-archived-agent-notes`](../../scripts/verify-archived-agent-notes.ts) enforces the closed class tree, complete triplets, archive metadata, sidecar hashes, and the append-only frozen-content manifest, except for the exact seal transitions documented in [archive instructions](archived/AGENTS.md). The [archive-policy Agent Note](implemented/process/2026-07-26-frozen-agent-note-archive.md) owns the rationale.
## When to write one
@@ -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
+5 -5
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>
@@ -37,11 +37,11 @@
## 归档与删除
当一份 implemented Agent Note 记录的交付决策已经完整落地,且其决策依据不太可能再指导未来工作时,将其归档。如果其中的备选方案、归属边界、否定性保证、持久化语义或协议语义、安全规则,或者重新引入条件仍有价值,则继续作为活跃记录保留。绝不归档 proposed Agent Note:过时的提案应转为 rejected。仅当 rejected Agent Note 仍能避免一种可能发生的错误时保留;否则一并删除其英文、中文和伴随记录文件。请使用经过校准的 [`dsh-archive-agent-notes`](../skills/dsh-archive-agent-notes/SKILL.md) 工作流,不要根据字数、存续时间或目标配额来判断。
仅描述小型 UI 调整或纯机械变更的 implemented Agent Note 直接删除;一并删除英文、中文和伴随记录文件,并修复或移除入站链接。局部 bug 修复、性能变更、新能力或实质行为决策,不会仅因实现规模小就符合删除条件。其他已实施记录只有在交付决策完整落地、其依据不太可能再指导未来工作,但仍具有历史决策价值时才归档。如果其中的备选方案、归属边界、否定性保证、持久化语义或协议语义、安全规则,或者重新引入条件仍有价值,则继续作为活跃记录保留。绝不归档 proposed Agent Note:过时的提案应转为 rejected。仅当 rejected Agent Note 仍能避免一种可能发生的错误时保留;否则一并删除其英文、中文和伴随记录文件。请使用经过校准的 [`dsh-archive-agent-notes`](../skills/dsh-archive-agent-notes/SKILL.md) 工作流,不要根据字数、存续时间或目标配额来判断。
归档路径编码为 `archived/{class}/yyyy-mm-dd-topic-title.md`;其中有意省略 `implemented`,因为只有 implemented Agent Note 可以进入归档。归档变更会移动完整的英文、中文和伴随记录三个文件,保留 `Status: implemented`,在两种语言的文件中紧接该状态行插入相同的 `Archived: YYYY-MM-DD` 行,重新记录伴随记录,并修复或删除入站链接。归档时只允许对内容做这些更改。
归档路径编码为 `archived/{class}/yyyy-mm-dd-topic-title.md`;其中有意省略 `implemented`,因为只有 implemented Agent Note 可以进入归档。归档变更会移动完整的英文、中文和伴随记录三个文件,保留 `Status: implemented`,在两种语言的文件中紧接该状态行插入相同的 `Archived: YYYY-MM-DD` 行,重新记录伴随记录,并修复或删除入站链接。归档时只允许对内容做这些更改。 既有标题标点、空行布局和语言切换栏措辞不阻止归档;与正文一起保留。
封存后,每组归档文件都永久冻结。禁止编辑、翻译、重新格式化、更新、移动或删除,也不得将其视为当前行为的权威依据。文档门禁会跳过归档源文件,包括其中的出站链接;当活跃文档有意引用历史时,仍可链接到归档 Agent Note。[`verify-archived-agent-notes`](../../scripts/verify-archived-agent-notes.ts) 强制执行封闭的类别目录树、完整的三文件配对、归档元数据、伴随记录 hash,以及仅追加的冻结内容 manifest(元数据清单)。[归档政策 Agent Note](implemented/process/2026-07-26-frozen-agent-note-archive.zh.md) 记录了设计依据。
封存后,每组归档文件都永久冻结。禁止编辑、翻译、重新格式化、更新、移动或删除,也不得将其视为当前行为的权威依据。文档门禁会跳过归档源文件,包括其中的出站链接;当活跃文档有意引用历史时,仍可链接到归档 Agent Note。[`verify-archived-agent-notes`](../../scripts/verify-archived-agent-notes.ts) 强制执行封闭的类别目录树、完整的三文件配对、归档元数据、伴随记录 hash,以及仅追加的冻结内容 manifest(元数据清单),但[归档说明](archived/AGENTS.md)中记录的精确封存哈希转换除外。[归档政策 Agent Note](implemented/process/2026-07-26-frozen-agent-note-archive.zh.md) 记录了设计依据。
<a id="when-to-write-one"></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)。归档记录保留封存时的格式,并增加上述归档日期行。
### 头部块
+2
View File
@@ -5,3 +5,5 @@ Archived Agent Note triplets under the kind directories are frozen historical sn
The archival change may only relocate a complete English/Chinese/sidecar triplet, insert the identical `Archived: YYYY-MM-DD` line below both `Status: implemented` lines, re-record the sidecar, and repair or delete inbound links. Do not inspect, verify, or repair links out of archived notes.
Run the [`dsh-archive-agent-notes`](../../skills/dsh-archive-agent-notes/SKILL.md) workflow and append new artifact hashes with `pnpm run verify-archived-agent-notes --write`. The normal verifier rejects changed or missing sealed artifacts, incomplete triplets, unknown kind folders, and invalid archive metadata.
The authorized Figma-link removal from `feature/2026-08-10-durable-workflow-runs-in-chat` has three exact old-to-new seal exceptions in `scripts/archived-agent-notes.ts` for its English, Chinese, and pairing files. These exceptions permit no other content change, reversal, or deletion.
@@ -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
@@ -0,0 +1,29 @@
# 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)
## Problem
The harness needs one internal language for messages that the loop, session log, and all plugins speak.
## Decision
Own the vocabulary: user, assistant, and system messages are arrays of typed content blocks (`text`, `reasoning`, `tool-call`), with the union derived from the merge-extensible `ContentBlockMap` so plugins add block types via declaration merging. Tool results are first-class tool-role messages whose own content holds result blocks; released Session format v3 retains the historical `tool-result` content block inside a user-role wrapper, and the adjacent V3-to-V4 edge lifts that wrapper into the first-class role. The same merge-extensible-map pattern types every "stringly" field (`MessageSource`, `FinishReason`, `TurnTrigger`, `TurnEndReason`). Streaming is a raw chunk protocol; `BlockAssembler` is the single shared assembly implementation. Adapters translate to provider wire formats — mapping cost lives in adapters, where it belongs.
In-session context injection (`context/message`) and mid-turn steering originally rendered as tagged user-role envelopes (the system-reminder pattern) rather than a new role, so adapters carry zero burden. Both now project as plain user content with no wrapper; see [the injected-content-envelope Agent Note](../simplification/2026-07-20-unwrap-injected-content-envelopes.md). Live-adapter validation confirms this rendering for current DeepSeek behavior; a future provider-specific mismatch belongs in that adapter rather than a new canonical role.
## Alternatives considered
- **Mirror the DeepSeek/OpenAI chat-completions shape** — zero mapping cost for the first provider, but awkward for rich content (reasoning, tool results as structured blocks).
- **Adopt Anthropic's Messages block structure verbatim** — battle-tested, but the canonical types would mirror a third-party API the harness does not target first.
## Consequences
- Reasoning has a core home without provider-specific shapes.
- Multimodal blocks return only with coordinated adapter, UI, and compaction support; see [the drop-image Agent Note](../../archived/simplification/2026-07-04-drop-image-content-block.md).
- Cache hints and assistant prefill remain absent until a shipping adapter can honor them; see the [producer-less variants](../../archived/simplification/2026-07-04-prune-producerless-vocabulary-variants.md) and [inert request knobs](../../archived/simplification/2026-07-04-drop-inert-request-knobs.md) Agent Notes.
- Every adapter pays a translation cost; the first real adapters have since validated the streaming protocol, and new adapters should continue proving their provider-specific mapping in adapter-local tests.
- IDs that cross package boundaries are branded (`ToolCallId`, the shared agent/session `SessionId`) — nominal typing at zero runtime cost.
@@ -0,0 +1,29 @@
# Agent Note: 由 dsh-llm 拥有的提供方无关内容块词汇
Status: implemented
Archived: 2026-09-30
[English](2026-06-11-content-block-vocabulary.md) | 中文
## 问题
harness 需要一套统一的内部消息语言,供 agent loop(智能体循环)、会话日志和所有插件共同使用。
## 决策
自主拥有词汇:user、assistant 与 system 消息是类型化内容块的数组(`text`、`reasoning`、`tool-call`),其联合类型派生自可合并扩展的 `ContentBlockMap`,插件通过声明合并添加新的块类型。Tool result 是一等 tool-role message,结果块属于该 message 自己的 content;已发布的 Session format v3 仍将历史 `tool-result` content block 保存在 user-role 包装中,邻接的 V3 到 V4 边会将该包装提升为一等角色。同一可合并扩展映射模式为所有「字符串化」字段提供类型(`MessageSource`、`FinishReason`、`TurnTrigger`、`TurnEndReason`)。流式输出采用原始分片协议;`BlockAssembler` 是唯一的共享组装实现。适配器负责转换为提供方的协议格式(wire format)——映射成本留在适配器中,正是它该在的地方。
会话内上下文注入(`context/message`)和轮次中途 steering(中途引导)最初渲染为带标签的 user-role 信封(system-reminder 模式),而非引入新角色,因此适配器无需承担额外负担。如今两者都投影为无包装的普通用户内容;见[注入内容信封 Agent Note](../simplification/2026-07-20-unwrap-injected-content-envelopes.zh.md)。实际适配器验证已确认此渲染方式符合当前 DeepSeek 的行为;如果未来某提供方出现不兼容,应在该适配器内处理,而非引入新的规范角色。
## 曾考虑的替代方案
- **镜像 DeepSeek/OpenAI chat-completions 结构**:对第一个提供方零映射成本,但对富内容(推理、结构化块形式的工具结果)处理不便。
- **原样采用 Anthropic Messages 块结构**:经过实战检验,但规范类型将镜像一个 harness 并非首要对接的第三方 API。
## 后果
- 推理(reasoning)在核心层有了归属,无需依赖提供方特有的结构。
- 多模态块只有在适配器、UI 和上下文压缩(context compaction)三方协同支持后才会回归;见 [drop-image Agent Note](../../archived/simplification/2026-07-04-drop-image-content-block.md)。
- 缓存提示与 assistant prefill 在有实际适配器能兑现之前保持缺席;见[无生产者的词汇变体](../../archived/simplification/2026-07-04-prune-producerless-vocabulary-variants.md)与[无端到端可用路径的请求旋钮](../../archived/simplification/2026-07-04-drop-inert-request-knobs.md) Agent Note。
- 每个适配器都需承担翻译成本;首批真实适配器已验证了流式输出协议,新适配器应继续在适配器本地测试中验证其提供方特有的映射。
- 跨包边界的 ID 使用品牌类型(`ToolCallId`、agent 与会话共享的 `SessionId`)——零运行时开销的名义类型。
@@ -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)
@@ -27,7 +28,7 @@ The literal types live on the [tasks subsystem page](../../../../docs/subsystems
The process-local provider also owns bounded admission, whose rationale is recorded in the [bounded background job admission decision](../../archived/bug-fix/2026-08-11-bounded-background-job-admission.md). Its positive-safe-integer `maxConcurrentJobsPerOwner` config defaults to `10`; `start()` derives each exact `Agent` object's active count from `running` and `stopping` records, while every unowned task shares one service bucket. Capacity rejection occurs before `run()` and id allocation, and producer `done` settlement is the only event that releases a stopping task's place. The provider does not queue, preempt, or retain a second mutable count.
`outputLimitBytes` is producer-owned presentation policy, not a registry buffer. The registry validates and projects it unchanged into `JobSnapshot`; generic control APIs apply the cap to complete model-facing output after adding their own status or notice metadata. Omitting it preserves the existing controller behavior, so the runtime does not impose a hidden default on unrelated producer families.
`outputLimitBytes` is producer-owned presentation policy, not a registry buffer. The registry validates and projects it unchanged into `JobView`; generic control APIs apply the cap to complete model-facing output after adding their own status or notice metadata. Omitting it preserves the existing controller behavior, so the runtime does not impose a hidden default on unrelated producer families.
A model-facing producer exposes that committed id in its canonical success value, normally `{ kind: 'background', jobId }`; Native rendering may keep human-readable prose. A pre-aborted background call fails rather than returning a no-op because no task exists to satisfy the promised handle. Once registration publishes the id, cancellation belongs to the task's own controller and the job runtime: later cancellation of the producing tool call must not kill the published task. `job_kill`, owner disposal, and service teardown request cancellation; foreground execution remains coupled to the call's `exec.signal`.
@@ -62,7 +63,7 @@ For contract-compliant producers, `AgentHandle.dispose()` resolves only after ow
- `read(id, caller?)` for a consuming stream delta or an idempotent final result.
- `kill(id, caller?, reason?)` for cancellation.
- `wait(id, timeoutMs, caller?, signal?)` for bounded terminal waiting.
- `onJobDone(listener)` for effect-scoped observation with exact-owner delivery and listener containment.
- `events.subscribe(filter, listener)` for effect-scoped observation of registration, progress, output, settlement, and removal, filtered by owner or owner scope, with listener containment.
- `attachController(name)` for the task-controller availability fence.
`wait` returns the terminal snapshot when the task settles or the live snapshot when its timeout expires. Aborting a wait cancels only that wait. If settlement has already assigned terminal delivery to the waiter, the terminal snapshot still wins. Waiters unregister synchronously on abort so a same-tick settlement cannot suppress a completion notice on behalf of a reader that receives nothing.
@@ -81,7 +82,7 @@ Stream reads share one task-scoped consuming cursor because the owning model is
The system prompt tells the model to retain job ids, continue independent work instead of busy-polling or duplicating a running task, collect relevant tasks before its final answer, and kill work that no longer matters. Completion delivers a logged message to the exact owner's session. A busy owner is injected; an idle owner is woken, under the bounded policy the [idle-owner wake decision](../feature/2026-08-11-background-job-completion-wakes-an-idle-owner.md) owns.
The runtime marks a terminal task `reported` when a read or wait delivers it, when a live waiter has claimed delivery at settlement, or when the model explicitly kills it. Reported tasks do not inject redundant completion notices. Listener failures are logged independently, do not stop later listeners, and are not awaited by waiters or teardown. When a snapshot carries `outputLimitBytes`, `dsh-tool-jobs` preserves UTF-8 boundaries and reuses an existing producer truncation marker rather than duplicating it. Reads reserve status suffixes and retain the output tail; completion notices reserve the stable `background job <id>` prefix and `job_output` instruction before truncating variable kind, label, status, detail, or the truncation marker itself, so the minimum PTY cap still identifies the task to collect. The job controller resolves the caller-visible producer cap in a prepended pre-execute listener before policy can deny or short-circuit dispatch, then applies it through the task definitions' last-mile `finalizeContent` callback so normalized tool errors, outer pipeline failures, and single-text policy results cannot escape the bound; deliberately structured multi-block policy results retain policy ownership of their shape and size.
`dsh-tool-jobs` keeps the delivery ledger: a wait claims the task when it starts (and withdraws if the task outlives the wait) and a `job_kill` claims it when accepted, so a settlement the model already received through a tool result injects no redundant completion notice; teardown settlements and unowned tasks are never announced ([seam consolidation](2026-09-03-jobs-seam-consolidation.md)). Listener failures are logged independently, do not stop later listeners, and are not awaited by waiters or teardown. When a view carries `outputLimitBytes`, `dsh-tool-jobs` preserves UTF-8 boundaries and reuses an existing producer truncation marker rather than duplicating it. Reads reserve status suffixes and retain the output tail; completion notices reserve the stable `background job <id>` prefix and `job_output` instruction before truncating variable kind, label, status, detail, or the truncation marker itself, so the minimum PTY cap still identifies the task to collect. The job controller resolves the caller-visible producer cap in a prepended pre-execute listener before policy can deny or short-circuit dispatch, then applies it through the task definitions' last-mile `finalizeContent` callback so normalized tool errors, outer pipeline failures, and single-text policy results cannot escape the bound; deliberately structured multi-block policy results retain policy ownership of their shape and size.
## Producer opt-in
@@ -105,7 +106,7 @@ Separate bash and subagent output/stop tools duplicate ids, isolation, cleanup,
### An immediate abstract task-runtime backend
The current `JobStart.run()` contract passes in-process callbacks and exact `Agent` objects. A durable backend changes identity, restart, ownership, and observation semantics, so at introduction time the registry stayed one concrete service rather than freezing the wrong boundary. The [task-registry contract Agent Note](../../archived/architecture/2026-07-26-job-registry-seam.md) later separated the contract from the process-local implementation without changing these in-process semantics.
The current `JobSpec.run()` contract returns in-process hooks and pushes output through an in-process `JobHandle`, and owners resolve to live `Agent`s in-process. A durable backend changes identity, restart, ownership, and observation semantics, so at introduction time the registry stayed one concrete service rather than freezing the wrong boundary. The [task-registry contract Agent Note](../../archived/architecture/2026-07-26-job-registry-seam.md) later separated the contract from the process-local implementation without changing these in-process semantics.
### Consumer-owned authorization or cleanup events
@@ -1,6 +1,7 @@
# Agent Note: 后台任务运行时(`ctx.jobs`)与通用任务控制工具
Status: implemented
Archived: 2026-09-30
[English](2026-06-20-generic-long-running-tool-runtime.md) | 中文
@@ -27,7 +28,7 @@ Status: implemented
进程内 Service Provider 还拥有有界准入,其理由记录在[有界后台任务准入决策](../../archived/bug-fix/2026-08-11-bounded-background-job-admission.md)中。它的 `maxConcurrentJobsPerOwner` 配置必须是正的安全整数,默认值为 `10`;`start()` 从 `running` 与 `stopping` 记录派生每个确切 `Agent` 对象的活动数量,而全部无 owner 任务共享一个服务级桶。容量拒绝发生在 `run()` 与 id 分配之前,处于 stopping 的任务只有在生产方 `done` 结算时才释放名额。Service Provider 不排队或抢占任务,也不保留第二份可变计数。
`outputLimitBytes` 是生产方拥有的呈现策略,而非注册表缓冲区。注册表校验该值,并将其原样投影到 `JobSnapshot`;通用任务控制器添加自身的状态或通知元数据后,再将该上限应用于完整的面向模型输出。省略该值时保持现有控制器行为,因此运行时不会向无关的生产方类别施加隐式默认值。
`outputLimitBytes` 是生产方拥有的呈现策略,而非注册表缓冲区。注册表校验该值,并将其原样投影到 `JobView`;通用任务控制器添加自身的状态或通知元数据后,再将该上限应用于完整的面向模型输出。省略该值时保持现有控制器行为,因此运行时不会向无关的生产方类别施加隐式默认值。
面向模型的生产方会在规范成功值中暴露已提交的 id,通常为 `{ kind: 'background', jobId }`;Native 渲染仍可保留便于人类阅读的行文。预先被中止的后台调用会失败,而不是返回空操作,因为不存在可履行所承诺句柄的任务。一旦注册过程发布 id,取消就归任务自身的控制器与任务运行时所有:随后取消生产工具调用不得终止已发布的任务。`job_kill`、所有者资源释放和服务拆除会请求取消;前台执行仍与调用的 `exec.signal` 耦合。
@@ -62,7 +63,7 @@ job id 在运行时全局可见且可预测,因此注册表会授权每次访
- `read(id, caller?)`:消费式流增量或幂等的最终结果。
- `kill(id, caller?, reason?)`:取消。
- `wait(id, timeoutMs, caller?, signal?)`:有界的终止等待。
- `onJobDone(listener)`:effect 作用域内的观察,具有精确所有者投递和监听器隔离。
- `events.subscribe(filter, listener)`:effect 作用域内对注册、进度、输出、结算与移除的观察,按所有者或所有者 scope 过滤,具有监听器隔离。
- `attachController(name)`:任务控制器可用性防线。
`wait` 在任务完成时返回终止快照,在等待超时时返回当前快照。中止一次等待只取消该次等待。如果结算已经将终止投递分配给该等待方,终止快照仍然优先。等待方在中止时同步注销,因此同一 tick 内发生结算时,不会代表一个实际未收到任何内容的读取方压制完成通知。
@@ -81,7 +82,7 @@ job id 在运行时全局可见且可预测,因此注册表会授权每次访
系统提示词要求模型保留 job id、在后台工作运行时继续处理独立工作而非忙轮询或重复启动同一任务、在给出最终答案前收集相关任务,并终止不再重要的工作。完成时,系统会向确切所有者的会话交付一条已记录的消息:繁忙的所有者走注入,空闲的所有者会被唤醒,其有界策略由[空闲所有者唤醒决策](../feature/2026-08-11-background-job-completion-wakes-an-idle-owner.zh.md)负责。
当读取或等待交付终止任务、尚在等待的等待方在结算时认领了投递,或模型显式终止任务时,运行时将终止任务标为 `reported`。已报告的任务不会注入冗余的完成通知。监听器失败会独立记录,不会阻止后续监听器,也不会被等待方或资源销毁过程等待。当快照携带 `outputLimitBytes` 时,`dsh-tool-jobs` 会保持 UTF-8 边界,并复用生产方已有的截断标记,而不会重复添加。读取会为状态后缀预留空间并保留输出尾部;完成通知会先为稳定的 `background job <id>` 前缀与 `job_output` 指令预留空间,再截断可变的 kind、label、status、detail,乃至截断标记本身,因此 PTY 的最小上限仍能标识需要收集的任务。任务控制器在策略有机会拒绝或短路分发之前,于最先执行的 pre-execute 监听器中解析调用方可见的生产方上限;随后通过任务定义最后一道的 `finalizeContent` 回调应用该上限,使规范化的工具错误、外层流水线失败与单文本策略结果都无法绕过该边界;经特意结构化的多块策略结果仍由策略拥有其形状与大小。
`dsh-tool-jobs` 持有投递台账:等待在开始时认领任务(任务比等待活得更久则撤回),`job_kill` 被接受时也认领,因此模型已经通过工具结果收到的结算不会再注入冗余的完成通知;teardown 结算与无主任务从不播报([seam 收敛](2026-09-03-jobs-seam-consolidation.zh.md))。监听器失败会独立记录,不会阻止后续监听器,也不会被等待方或资源销毁过程等待。当视图携带 `outputLimitBytes` 时,`dsh-tool-jobs` 会保持 UTF-8 边界,并复用生产方已有的截断标记,而不会重复添加。读取会为状态后缀预留空间并保留输出尾部;完成通知会先为稳定的 `background job <id>` 前缀与 `job_output` 指令预留空间,再截断可变的 kind、label、status、detail,乃至截断标记本身,因此 PTY 的最小上限仍能标识需要收集的任务。任务控制器在策略有机会拒绝或短路分发之前,于最先执行的 pre-execute 监听器中解析调用方可见的生产方上限;随后通过任务定义最后一道的 `finalizeContent` 回调应用该上限,使规范化的工具错误、外层流水线失败与单文本策略结果都无法绕过该边界;经特意结构化的多块策略结果仍由策略拥有其形状与大小。
## 生产方显式启用
@@ -105,7 +106,7 @@ bash seam 暴露 `resolve`、`run` 和 `start`。`start(spec)` 返回一个 `She
### 立即抽象任务运行时后端
当前 `JobStart.run()` 约定传入进程内回调与确切的 `Agent` 对象。持久化后端会改变身份、重启、所有权与观察语义,因此在引入之时注册表保持为单一具体服务,而非固化错误的边界。[任务注册表约定 Agent Note](../../archived/architecture/2026-07-26-job-registry-seam.md)后来在不改变这些进程内语义的前提下,将约定与进程内实现分离。
当前 `JobSpec.run()` 约定返回进程内钩子并经进程内的 `JobHandle` 推送输出,所有者也在进程内解析为存活的 `Agent`。持久化后端会改变身份、重启、所有权与观察语义,因此在引入之时注册表保持为单一具体服务,而非固化错误的边界。[任务注册表约定 Agent Note](../../archived/architecture/2026-07-26-job-registry-seam.md)后来在不改变这些进程内语义的前提下,将约定与进程内实现分离。
### 由消费方负责授权或清理事件
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-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)
@@ -12,7 +13,7 @@ The [initiating Agent scope decision](2026-07-15-agent-initiator-scope.md) inten
## Decision
Agent owns the runtime-only `AgentCancelCause` union `{ kind: 'user' } | { kind: 'parent' }`; `agent.cancel()` defaults to `user`. TypeScript enforces that vocabulary at this typed same-process boundary, with no runtime validator, fallback, or special compatibility contract for untyped callers. An active `TurnCancellation` copies the typed discriminant into a fresh frozen signal reason; idle cancellation has no holder to mutate and does not arm later work.
Agent owns the runtime-only `AgentCancelCause` union `{ kind: 'user' } | { kind: 'parent' } | { kind: 'hook'; reason: string } | { kind: 'disposed' }`, and `agent.cancel()` requires one. TypeScript enforces that vocabulary at this typed same-process boundary, with no runtime validator, fallback, or special compatibility contract for untyped callers. The holder aborts with the caller's own object rather than a detached copy, so a transport reaching that signal can extend it: Node's fetch assigns a `stack` onto the reason it receives. The loop therefore copies the declared fields where the cause becomes durable data. Freezing the cause at `cancel()` is not an alternative — undici performs that assignment from strict-mode code, so a frozen reason makes `fetch` reject with `TypeError: Cannot add property stack` in place of the abort reason. Idle cancellation has no holder to mutate and does not arm later work.
An interrupted live turn ends with the coarse durable `{ kind: 'aborted' }` outcome. The terminal event records what happened to the turn, while the runtime signal identifies who requested cancellation; it does not duplicate `user` or `parent` into replay. Session seed/load rejects legacy aborted records with a reason or any other extra field, so replay cannot reintroduce caller-owned cancellation detail. The process-local `agent/cancel-requested` notification is not durable; a future audit requirement uses a separate durable control-request event so a request and its eventual outcome remain distinct. Durable events contain no stack, signal, error object, free-form cancellation text, or backend-private detail.
@@ -22,7 +23,7 @@ The driver keeps only a cause-less pre-run marker for queued work cancelled befo
The explicit event signatures pass a single payload object: agent-scoped events carry `agent` and `signal` in the payload with `next` last, and the remaining APIs keep `signal` immediately before a waterfall's final `next`. `PreStepContext` and `RequestFailureContext` are retired, with their fields folded into the `agent/pre-step` and `agent/request-error` payloads ([payload-object events](../../archived/architecture/2026-08-06-agent-event-payload-objects.md)). Pre-step entry, request configuration, request-error recovery, model generation, tool execution, approval, turn stopping, and subagent or workflow requests all receive the current signal. Hook bridges must also supply `RunHookOptions.signal`, so a turn cancellation reaches the bash executor's provider-managed termination and join boundary; the [native-containment decision](2026-08-28-subprocess-native-containment.md) owns the supported local scope, Job, and fallback mechanics. `SystemPrompt.assemble()` carries `signal?: AbortSignal` in `AssembleContext` because that object is an explicit request value that can also represent signal-less assembly outside a turn. Listeners may cooperate with the signal but must not retain it to control another turn.
`ctx.agents` continues to carry only the initiating Agent. Ambient Agent presence does not imply liveness, a current turn, or cancellation authority. The cause reader is private to the loop and states the machine-private slot invariant (only `cancel()` aborts a turn controller, always with a canonical frozen cause) instead of re-validating the reason structurally; no public helper reads a cause off an arbitrary signal. Concurrent Agents isolate both their initiator identities and their turn signals; a child driver shadows the parent initiator while its parent request signal still travels through the subagent seam.
`ctx.agents` continues to carry only the initiating Agent. Ambient Agent presence does not imply liveness, a current turn, or cancellation authority. The cause reader is private to the loop and states the machine-private slot invariant (only `cancel()` aborts a turn controller, always with a typed cause) instead of re-validating the reason structurally; no public helper reads a cause off an arbitrary signal. Concurrent Agents isolate both their initiator identities and their turn signals; a child driver shadows the parent initiator while its parent request signal still travels through the subagent seam.
Agent disposal requests the runtime-only `{ kind: 'disposed' }` interruption on the active holder. If cancellation already won the controller reason, the reason cannot be rewritten, so terminal classification first checks lifecycle state: disposed wins, then a supported `user` or `parent` cause becomes the coarse aborted outcome, and unrelated exceptions retain the existing error path. ACP cancellation maps to `user`; in-process spawn and fork propagation map to `parent`. Remote ACP subagents retain their existing wire protocol.
@@ -30,7 +31,7 @@ Cancellation remains cooperative. The loop checks interruption before and after
## Verification
Contract tests verify the typed caller union, frozen detachment, default and first-wins behavior, the coarse Session JSON round trip and legacy-record rejection, ACP `user`, in-process subagent `parent`, and disposal precedence. Loop tests make cooperative listeners wait on the signal at pre-step, system-prompt assembly, request, model stream, request-error recovery, tool execution, and turn stopping; they assert one signal within a turn, a fresh signal across turns, and no cancellation authority during terminal publication or a blocked durability flush. A real hook bridge test cancels and reaps a blocked prompt hook before idle.
Contract tests verify the typed caller union, field copying where the cause becomes durable data, default and first-wins behavior, the coarse Session JSON round trip and legacy-record rejection, ACP `user`, in-process subagent `parent`, and disposal precedence. Loop tests make cooperative listeners wait on the signal at pre-step, system-prompt assembly, request, model stream, request-error recovery, tool execution, and turn stopping; they assert one signal within a turn, a fresh signal across turns, and no cancellation authority during terminal publication or a blocked durability flush. A real hook bridge test cancels and reaps a blocked prompt hook before idle.
Initiator-scope tests assert that every hook still observes the exact Agent and no ambient turn signal, concurrent Agents retain independent identities and signals, and a nested child driver shadows only identity. Race tests cover idle cancellation, pre-run cancellation, replacement submission from a `running` listener, repeated cancellation, and cancel-versus-dispose quiescence.
@@ -1,6 +1,7 @@
# Agent Note: 显式轮次取消能力
Status: implemented
Archived: 2026-09-30
[English](2026-07-16-explicit-turn-cancellation.md) | 中文
@@ -12,7 +13,7 @@ Status: implemented
## 决策
Agent 拥有仅用于运行时的 `AgentCancelCause` 联合类型 `{ kind: 'user' } | { kind: 'parent' }`;`agent.cancel()` 默认使用 `user`。TypeScript 在这个类型化的同进程边界中强制执行该词汇,不提供运行时校验器、后备行为,也不为无类型调用方提供特殊兼容性约定。活跃的 `TurnCancellation` 会把类型化判别字段复制为一个全新且已冻结的 signal 原因;空闲状态下没有可修改的持有者,也不会让后续工作预先进入取消状态。
Agent 拥有仅用于运行时的 `AgentCancelCause` 联合类型 `{ kind: 'user' } | { kind: 'parent' } | { kind: 'hook'; reason: string } | { kind: 'disposed' }`,`agent.cancel()` 必须显式传入其一。TypeScript 在这个类型化的同进程边界中强制执行该词汇,不提供运行时校验器、后备行为,也不为无类型调用方提供特殊兼容性约定。持有者中止时携带的是调用方自己的那个对象,而非一份分离的拷贝,因此能接触到该 signal 的传输层可以向其添加属性:Node 的 fetch 会给它收到的 reason 赋一个 `stack`。所以循环在 cause 成为持久数据的那一步拷贝已声明字段。在 `cancel()` 处冻结 cause 并非可选方案——undici 是在严格模式代码中执行该赋值的,被冻结的 reason 会让 `fetch` 以 `TypeError: Cannot add property stack` 取代中止原因而拒绝。空闲状态下没有可修改的持有者,也不会让后续工作预先进入取消状态。
正在运行的轮次被中断后,以粗粒度的持久化结果 `{ kind: 'aborted' }` 结束。终态事件记录轮次发生了什么,运行时 signal 标识谁请求了取消;回放不会重复保存 `user` 或 `parent`。会话 seed/load 会拒绝携带取消原因或任何其他额外字段的旧式中止记录,因此回放无法重新引入由调用方持有的取消细节。仅限进程内的 `agent/cancel-requested` 通知不会持久化;未来若有审计需求,应使用独立的持久化控制请求事件,让请求与最终结果保持为两项事实。持久化事件不包含调用栈、signal、错误对象、自由文本取消原因或后端私有细节。
@@ -22,7 +23,7 @@ AgentLoop 为每个待启动轮次私有地持有一个 `TurnCancellation`。它
显式事件签名传递单个 payload 对象:agent 作用域事件在 payload 中携带 `agent` 和 `signal`,`next` 位于最后;其余 API 保持 `signal` 紧邻 waterfall(瀑布式事件)的最终 `next` 之前。`PreStepContext` 与 `RequestFailureContext` 已退役,其字段并入 `agent/pre-step` 与 `agent/request-error` 的 payload([payload-object 事件](../../archived/architecture/2026-08-06-agent-event-payload-objects.md))。进入 pre-step 时、请求配置、请求错误恢复、模型生成、工具执行、审批、轮次停止以及 subagent 或工作流请求都会收到当前 signal。钩子桥接器也必须提供 `RunHookOptions.signal`,使轮次取消能够到达 Bash 执行器由提供方管理的终止与等待边界;[原生 containment 决策](2026-08-28-subprocess-native-containment.zh.md)负责受支持本地路径上的 scope、Job 与 fallback 机制。`SystemPrompt.assemble()` 在 `AssembleContext` 中携带 `signal?: AbortSignal`,因为该对象是显式请求值,也可表示轮次之外不携带 signal 的组装。监听器可以配合该 signal 取消,但不得保留它来控制其他轮次。
`ctx.agents` 仍只携带发起 Agent。环境中的 Agent 并不代表存活、当前轮次或取消权限。cause 读取器是 loop 私有的,它直接陈述机器私有的 slot 不变量(只有 `cancel()` 会中止轮次控制器,且总是携带规范的冻结 cause),而不是对 reason 做结构化再校验;不存在从任意 signal 读取 cause 的公开辅助函数。并发 Agent 会同时隔离各自的发起方身份和轮次 signal;子驱动会遮蔽父发起方,而父请求 signal 仍通过 subagent seam 传递。
`ctx.agents` 仍只携带发起 Agent。环境中的 Agent 并不代表存活、当前轮次或取消权限。cause 读取器是 loop 私有的,它直接陈述机器私有的 slot 不变量(只有 `cancel()` 会中止轮次控制器,且总是携带类型化的 cause),而不是对 reason 做结构化再校验;不存在从任意 signal 读取 cause 的公开辅助函数。并发 Agent 会同时隔离各自的发起方身份和轮次 signal;子驱动会遮蔽父发起方,而父请求 signal 仍通过 subagent seam 传递。
Agent dispose(资源释放)会在活跃持有者上请求仅用于运行时的 `{ kind: 'disposed' }` 中断。若取消已经先占用控制器的中断原因,该原因便无法改写,因此终态分类会先检查生命周期状态:资源释放结果优先,之后受支持的 `user` 或 `parent` 取消原因形成粗粒度的中止结果,其他异常保留现有错误路径。ACP(Agent Client Protocol)取消映射为 `user`;进程内 spawn 和 fork 的传播映射为 `parent`。远程 ACP subagent 保持现有协议。
@@ -30,7 +31,7 @@ Agent dispose(资源释放)会在活跃持有者上请求仅用于运行时
## 验证
约定测试验证类型化调用方联合类型、冻结且与调用方分离、默认行为与首次请求优先行为、粗粒度的会话 JSON 往返与旧式记录拒绝、ACP `user`、进程内 subagent `parent` 以及 dispose 优先级。AgentLoop 测试让协作式监听器在 pre-step、系统提示词组装、请求、模型流、请求错误恢复、工具执行和轮次停止处等待 signal;并断言同一轮次使用一个 signal,不同轮次使用全新的 signal,终态发布期间和持久化刷新受阻期间不存在取消权限。真实钩子桥接器测试会在报告空闲状态前取消并回收受阻的提示词钩子。
约定测试验证类型化调用方联合类型、在 cause 成为持久数据处拷贝字段、默认行为与首次请求优先行为、粗粒度的会话 JSON 往返与旧式记录拒绝、ACP `user`、进程内 subagent `parent` 以及 dispose 优先级。AgentLoop 测试让协作式监听器在 pre-step、系统提示词组装、请求、模型流、请求错误恢复、工具执行和轮次停止处等待 signal;并断言同一轮次使用一个 signal,不同轮次使用全新的 signal,终态发布期间和持久化刷新受阻期间不存在取消权限。真实钩子桥接器测试会在报告空闲状态前取消并回收受阻的提示词钩子。
发起方作用域测试断言所有钩子仍观察到同一个 Agent 且没有环境中的轮次 signal,并发 Agent 保持独立的身份与 signal,嵌套子驱动只遮蔽身份。竞态测试覆盖空闲状态取消、运行前取消、从 `running` 监听器提交替代提示词、重复取消以及取消与 dispose 竞争下的完全停稳。
@@ -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)
@@ -26,9 +27,9 @@ The reference-owned lifetime and Provider targeting now follow [Client Session r
Host-side `session.create(workspaceId)` produces Session + Agent + cwd in one piece (an atomic bundle, never split); the client side is the mirror of that birth — the instant a session row enters the list mirror, the client mints its Agent scope (actx + provide + the full input surface mounted):
- Session identity is the host's true form from birth: the sessionId arrives via the `session.create` response / the `host/session-added` frame, and every client-side address (the scope tag, slot store keys, RPC addressing) uses that same id.
- The materialization moment = the instant the user picks a Workspace (cwd settled): the client calls `session.create({workspaceId})` on the spot and receives the complete entity.
- A manual Workspace pick or successful [first-use startup initialization](../feature/2026-09-20-default-workspace.md) establishes cwd before the client calls `session.create({workspaceId})` and receives the complete entity.
- "New Session with no workspace picked" is a **pure view state** (a navigation position) corresponding to no session/scope entity; until the pick, the composer is locked whole (no slash, no plain text).
- A "blank session" is just an ordinary materialized session whose log is still empty; to every Agent-scope plugin on the host (goal/plan/skill/…) it is indistinguishable from any session, so slash/plan are all naturally live.
- A "blank session" is an ordinary materialized session with no turn yet; to Agent-scope plugins on the host (goal/plan/skill/…) it remains an ordinary Session, so slash/plan are naturally live.
### Agent scope: the actx is the sole session carrier in the client-side cordis world
@@ -63,21 +64,21 @@ Session instances share the scope's lifecycle, while the catalog reports discove
A session "materialized but with no first prompt" is governed by the summary-derived bit `blank` (a derived column, not a header field; SessionHeader stays immutable):
- The host criterion: `session.seq === 0` (zero log events = no user message yet). A live session reads `summarize()` straight from memory; a cold session is always `false` — the JSONL provider's lazy-create contract guarantees a never-appended session never enters `persistence.list()`, so blank never touches disk.
- The Host criterion is absence of `turn/start`: the `sessionListMetadata.blank` projection starts true and only that event clears it, so slash-command, configuration, and creation-checkpoint events leave it true even after they reach disk — blank does not mean unpersisted. Missing metadata falls back to `session.seq === 0` for live Sessions and false for cold ones; cold summaries otherwise read cached metadata, leaving cache misses visible as unknown. Reuse acquires the writer under [blank Session acquisition](2026-09-17-process-local-blank-sessions.md).
- The wire carries it in two places: the required `SessionSummary.blank` column, and the required `blank` field on the `host/session-added` frame (always true at creation, letting other tabs enter the same blank-session state into their mirrors).
- The client mirror only lowers, never raises (monotonic), flipped from three sources, all reusing existing wire signals:
- The sender's own tab: the **successful response** to the first `prompt()` flips false (acceptance proves the user/message is already in the host log — this flip is confirmation, not optimism; `onEngaged` synchronously updates the list mirror, converting the current `New Session` row in place to an ordinary title, adding no list row). A rejected first prompt keeps the session blank: aligned with host authority, still shown as `New Session`, keeping its connectWorkspace reuse eligibility while it remains a Workspace member.
- Other tabs: the `host/session-status (running:true)` frame flips it — a blank session never runs, so the first running necessarily means no longer blank;
- Reconnect alignment: `session.list`'s summary.blank is authoritative, so a tab that missed frames aligns naturally on its next pull; a stale blank:true can never mark a converted session back to blank.
- Client display also reflects accepted/running observations, whose retention the [blank rollback decision](../bug-fix/2026-09-15-client-session-blank-reconciliation.md) owns:
- The sender's own tab: the **successful response** to the first `prompt()` converts the current `New Session` row in place, adding no list row — acceptance is display memory, not proof that a turn or user message reached durable history. A rejected first prompt keeps the session blank: aligned with host authority, still shown as `New Session`, keeping its connectWorkspace reuse eligibility while it remains a Workspace member.
- Other tabs: the `host/session-status (running:true)` frame converts it — a blank session never runs, so the first running necessarily means no longer blank;
- Reconnect alignment: a list pull updates Host summaries while the Manager keeps those observations, and a `sessionListMetadata` hint of existing history prevents re-blanking on top of that; an empty-history response cannot mark a converted session back to blank.
- List discipline: the store retains every row; the Workspace browser's grouping, flat view, search, and counts share one visible projection — every non-blank session shows, while blank sessions show only the row retained by the `mainView` source, with its title forced to `New Session`. After a Workspace switch, the old blank entity stays in the mirror but is hidden from the list while the target Workspace's main blank shows; the user-visible surface therefore holds at most one blank row globally.
- The residue ledger takes zero GC: after a refresh, blank sessions come back with the bit intact and are reused on the next same-workspace connect while they remain members, so the ordinary single-tab path keeps at most one per workspace; after a host restart, blanks leave no disk trace and simply evaporate; the extra empty shells from multi-tab races only become non-current hidden rows, digested by later reuse, with no coordination.
- Blank Sessions can persist through creation checkpoints and command events, and have no automatic garbage collection: browser reloads, Host restarts, and Workspace connections reuse eligible blanks after acquiring their writer and skip occupied candidates, while list-loading and multi-tab races can still create additional blank Sessions, whose old logs remain on disk.
### connectWorkspace: the sole entry point of New Session
`workspaces.connectWorkspace(workspaceId): Promise<SessionId>` (owned by WorkspaceRuntime — it holds both the workspace canonical path and the sessions reference):
- The reuse arm: the list mirror is searched for `blank && cwd == workspace.path && sessionIds.includes(id)` — the host's own membership rule, never cwd alone. A cwd match without the account slot (a CLI/TUI session birthed at the host cwd, or a deleted/recreated registration) would open a session no grouping surface can show under this Workspace, so it falls through to the create arm instead (see the [membership reuse fix](../../archived/bug-fix/2026-08-05-workspace-blank-session-reuse-membership.md)); a hit returns that id directly, creating nothing.
- The create arm: on a miss, `session.create({workspaceId})` returns the new id.
- The reuse arm: the list mirror is searched for `blank && cwd == workspace.path && sessionIds.includes(id)` — the host's own membership rule, never cwd alone. A cwd match without the account slot (a CLI/TUI session birthed at the host cwd, or a deleted/recreated registration) would open a session no grouping surface can show under this Workspace, so it falls through to the create arm instead (see the [membership reuse fix](../../archived/bug-fix/2026-08-05-workspace-blank-session-reuse-membership.md)); a hit is adopted with explicit-id `session.create`, which acquires and retains the writer before returning. Only writer contention skips a candidate.
- The create arm: when no candidate can be acquired, `session.create({workspaceId})` returns the new id.
- An unknown workspaceId fails loud (never silently creating somewhere else).
- The resolution guarantee (one contract for both arms): when the promise resolves, the returned id is already in the list store. The view owner then retains it synchronously, so a draft mover can write text through that binding before history readiness without waiting for a notifier flush.
- The caller takes the id and installs a `mainView` reference; sending the first prompt is an ordinary `session.prompt` — the Session already exists, a failure is an ordinary prompt failure, the draft text is still in the machine, and a retry is simply sending again.
@@ -129,12 +130,13 @@ Blank Sessions retain the header's leading and corner slots so navigation contro
| Components receiving wiring-callback bundles (two-layer inject→props pass-down) | The standard-kit channel lets components fetch their own; the public API converges to hooks + stable props |
| Swapping the no-session Hero view for the entire session Conversation | Even with the outer layout unchanged, the Hero, picker, and composer subtrees would remount together, making the whole UI region jump |
| Making InputBar itself `session-maybe` | The input state machine, keyboard command surface, and actions would all have to accept absent values; replacing only the disabled input body keeps optionality at the shell boundary |
| A dedicated conversion frame | `session-status(running:true)` semantically implies conversion (a blank session never runs); adding a frame buys zero information for one more wire type |
| A dedicated conversion frame | Existing acceptance and running signals provide the observations used by the display rule; a new frame is unnecessary for that rule |
## Consequences
- Plugins gain session context isomorphic to the host's: per-session state hangs on the actx and mounts/tears down in one piece with the scope fiber, making leaks structurally impossible; two-session isolation is structurally guaranteed by the scope filter.
- The client object layer converges to a wire mirror: session identity, lifecycle, and capability adjudication all defer to the host entity — the input system (the next layer) always faces a session with a real Agent, and providers like slash/skill uniformly address by sessionId directly.
- Blank-session governance takes zero dedicated mechanisms: state rides one derived bit, visibility rides the unified list projection (only the current blank shows, as `New Session`), reclamation rides lazy persistence's existing contract (evaporation on restart), and the ordinary ceiling rides same-Workspace reuse.
- Blank-session governance takes zero dedicated mechanisms: state rides one derived bit, visibility rides the unified list projection (only the current blank shows, as `New Session`), reuse acquires the persisted writer, and the ordinary ceiling rides same-Workspace reuse. The accepted/running display memory that guards the conversion is Client-local.
- The cost: the id→ctx handoff discipline and provide's Concurrent discipline are conventions rather than type-enforced, pinned by review and tests. The single state axis still withholds machine faces until a Session exists; the [resident conversation shell](../../../../packages/client/ui-conversation/README.md) routes activation to the Workspace picker during that interval.
- Known gaps: approval/question recovery across prune (TODO); model selection returns in live-mutation shape (the host `selectModel` trio is ready-made, its client consumer not yet built).
@@ -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) | 中文
@@ -26,9 +27,9 @@ web client 只有一张全局会话面:slot 全部从根上下文渲染,插
host 侧 `session.create(workspaceId)` 一体产出 Session + Agent + cwd(作为不可拆分的原子整体);client 侧就是这次出生的镜像——会话行进入 list mirror 的瞬间,client 为它铸 Agent scope(actx + provide + 输入面全套挂上):
- 会话身份自出生即为 host 真身:sessionId 由 `session.create` 响应 / `host/session-added` 帧带来,client 侧一切寻址(scope tag、slot store 键、RPC 地址)用的都是同一个 id。
- 实体化时点 = 用户选定 Workspace(cwd 确定)的瞬间:client 当场调 `session.create({workspaceId})`,拿到完整实体。
- 手动选定 Workspace 或完成[首次使用的启动初始化](../feature/2026-09-20-default-workspace.zh.md) 后,cwd 已确定,client 再调 `session.create({workspaceId})`,拿到完整实体。
- 「New Session 且未选 workspace」是**纯视图态**(一个导航位置),不对应任何会话/scope 实体;选定之前 composer 整体锁死(无 slash、无纯文本)。
- 「空会话」就是一个日志还空着的普通实体化会话;对 host 上所有 Agent-scope 插件(goal/plan/skill(技能)/…)它与任何会话无异,slash/plan 天然全活。
- 「空会话」是尚无轮次的普通实体化会话;对 host 上的 Agent-scope 插件(goal/plan/skill(技能)/…)而言,它仍是普通 Session,因此 slash/plan 自然可用。
### Agent scope:actx 是 client 侧 cordis 世界的唯一会话载体
@@ -63,21 +64,21 @@ Session 实例与 scope 同生命周期;catalog 只报告可发现性,不持
「实体化但无首条提示词」的会话经 summary 派生位 `blank` 治理(派生列而非 header 字段,SessionHeader 保持不可变):
- host 判据:`session.seq === 0`(零日志事件 = 尚无用户消息)。live 会话 `summarize()` 内存直读;cold 会话恒 `false`——JSONL provider 的 lazy-create 约定保证 never-appended 会话不进入 `persistence.list()`,所以 blank 从不落盘。
- Host 判据是没有 `turn/start`:`sessionListMetadata.blank` 投影初始为 true,且只有该事件会清除它,因此 slash 命令、配置事件与创建检查点即使已落盘也不会清除——blank 不代表未持久化。metadata 缺失时,live Session 回退到 `session.seq === 0`,cold Session 回退到 false;cold summary 其余情况读缓存元数据,缓存缺失时以未知状态保留在列表中。复用按[空白 Session 获取](2026-09-17-process-local-blank-sessions.zh.md)规则取得写锁。
- wire 承载两处:`SessionSummary.blank` 必填列;`host/session-added` 帧必填 `blank` 字段(创建时恒 true,供别的 tab 按同一空会话状态入镜像)。
- client 镜像只降不升(单调),三来源翻转,全部复用既有 wire 信号:
- 发送方本地:首次 `prompt()` 的**成功响应**翻 false(受理即证明用户消息已入 host 日志——此点翻转是确证而非乐观;`onEngaged` 同步更新列表镜像,当前 `New Session` 行原地转为普通标题,不新增列表行)。首条提示词被拒则会话保持 blank:与 host 权威对齐、继续显示为 `New Session`、在仍为该工作区成员时保持 connectWorkspace 复用资格。
- 其他端:`host/session-status (running:true)` 帧翻转——blank 会话从不 running,首次 running 必然已非 blank;
- 重连对齐:`session.list` 的 summary.blank 是权威,错过帧的端下次拉取自然对齐;陈旧的 blank:true 不能把已转正的会话重新标回 blank。
- 客户端展示还受已观察到的受理/运行影响,其保留期限由 [blank 回退修复决策](../bug-fix/2026-09-15-client-session-blank-reconciliation.zh.md) 拥有:
- 发送方本地:首次 `prompt()` 的**成功响应**把当前 `New Session` 行原地转正,不新增列表行——受理是展示记忆,不证明轮次或用户消息已写入持久历史。首条提示词被拒则会话保持 blank:与 host 权威对齐、继续显示为 `New Session`、在仍为该工作区成员时保持 connectWorkspace 复用资格。
- 其他端:`host/session-status (running:true)` 帧转正——blank 会话从不 running,首次 running 必然已非 blank;
- 重连对齐:列表拉取更新 Host 摘要,Manager 则保留这些观察;在此基础上,`sessionListMetadata` 提示已有历史也会阻止回退 blank,因此空历史响应不能把已转正的会话标回 blank。
- 列表纪律:store 保留全部行;Workspace browser 的分组、平铺、搜索和计数共用同一可见投影——所有非 blank 会话都显示,blank 会话只显示由 `mainView` 来源持有的一行,并强制标题为 `New Session`。切换 Workspace 后,旧 blank 实体仍在镜像中但从列表隐藏,目标 Workspace 的主 blank 显示;因此用户可见面全局至多一条 blank 行。
- 残留账零 GC:刷新后 blank 会话带位回来,下次同 workspace 且仍为成员时复用,普通单端路径使每个 workspace 至多保留一个;host 重启后 blank 无盘痕自然蒸发;多 tab 竞态多出的空壳只会成为非 current 隐藏行,后续复用消化,不做协调。
- blank Session 可以通过创建检查点与命令事件持久化,且没有自动垃圾回收:浏览器刷新、Host 重启与工作区连接会在取得写锁后复用符合条件的空白会话并跳过被占用的候选;但列表加载与多 tab 竞态仍可能创建额外的 blank Session,其旧日志保留在磁盘上。
### connectWorkspace:New Session 的唯一入口
`workspaces.connectWorkspace(workspaceId): Promise<SessionId>`(归属 WorkspaceRuntime——它同时持有 workspace 规范 path 与 sessions 引用):
- 复用臂:list mirror 中找 `blank && cwd == workspace.path && sessionIds.includes(id)`——host 自己的成员规则,绝不只按 cwd。没有账户槽位的 cwd 匹配(CLI(命令行界面)/TUI 在 host cwd 创建的会话,或已删除/重建的注册)会打开一个任何分组表面都无法显示在该工作区下的会话,因此落到新建臂(见[成员复用修复](../../archived/bug-fix/2026-08-05-workspace-blank-session-reuse-membership.md));命中直接返回该 id,不新建。
- 新建臂:未命中则 `session.create({workspaceId})`,返回新 id。
- 复用臂:list mirror 中找 `blank && cwd == workspace.path && sessionIds.includes(id)`——host 自己的成员规则,绝不只按 cwd。没有账户槽位的 cwd 匹配(CLI(命令行界面)/TUI 在 host cwd 创建的会话,或已删除/重建的注册)会打开一个任何分组表面都无法显示在该工作区下的会话,因此落到新建臂(见[成员复用修复](../../archived/bug-fix/2026-08-05-workspace-blank-session-reuse-membership.md));命中后通过显式 ID 的 `session.create` 收养,在返回前取得并持续持有写锁。仅写锁争用会跳过候选。
- 新建臂:没有可获取的候选时,`session.create({workspaceId})`,返回新 id。
- 未知 workspaceId fail loud(不静默创建到别处)。
- 解析保证(两臂同约定):promise resolve 时返回的 id 已在 list store。视图 owner 随后同步 retain,因此 draft 搬运方可以在历史就绪前通过该 binding 写入文本,无需等待 notifier flush。
- 调用方拿 id 安装一份 `mainView` reference;首条提示词发送就是普通 `session.prompt`——Session 本来就在,失败即普通提示词失败,draft 文本还在 machine 里,重试即再次发送。
@@ -129,12 +130,13 @@ blank Session 保留 header 的 leading 与 corner slot,让右侧栏展开入
| 组件收 wiring 回调包(inject→props 两层下传) | 标准件通道让组件自取;公共 API 收敛为 hooks + 稳定 props |
| Hero 无会话视图与会话 Conversation 整支互换 | 即使外层 layout 不变,Hero、picker 与 composer 子树仍会一起重建,界面产生整块抖动 |
| 让 InputBar 自身变成 `session-maybe` | 输入状态机、键盘命令面与动作都被迫接受缺省值;只替换 disabled 输入体能把可选性留在外壳边界 |
| 专用「转正」帧 | `session-status(running:true)` 语义蕴含转正(blank 会话从不 running),加帧是 wire 多一型换零信息 |
| 专用「转正」帧 | 既有受理和运行信号已经提供展示规则所需的观察;该规则不需要新增帧 |
## 后果
- 插件获得与 host 同构的会话上下文:逐会话状态挂 actx、随 scope fiber 一次拆装,泄漏结构性不可能;双会话隔离由 scope filter 结构性保证。
- client 对象层收敛为 wire 镜像:会话身份、生命周期、能力判别全部以 host 实体为准——输入体系(下一层)面对的永远是「有真 Agent 的会话」,slash/skill 等提供方一律以 sessionId 直接寻址。
- 空会话治理零专用机制:状态靠一个派生位,可见性靠统一列表投影(仅 current blank 以 `New Session` 展示),回收靠 lazy persistence 的既有约定(重启蒸发),常规上限靠同 Workspace 复用。
- 空会话治理零专用机制:状态靠一个派生位,可见性靠统一列表投影(仅 current blank 以 `New Session` 展示),复用时获取持久化写锁,常规上限靠同 Workspace 复用。转正所依赖的受理/运行展示记忆仅保留在客户端。
- 代价:id→ctx 换乘纪律、provide 的 Concurrent 纪律都是约定而非类型强制,靠 review 与测试钉住。单一状态轴仍会在 Session 存在前隐藏 machine face;这段时间内,[常驻会话壳](../../../../packages/client/ui-conversation/README.zh.md)会把激活操作转到 Workspace picker。
- 已知欠账:approval/question 跨 prune 恢复(TODO);模型选择以 live-mutation 形状回归(host `selectModel` 三件套现成,其 client 消费方尚未构建)。
@@ -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/implemented/architecture/2026-08-03-per-session-agent-presets.md
2026-08-03-per-session-agent-presets.md: a1f2ad294edfdaaf2dab2d02e858e4dcb0a0c746
2026-08-03-per-session-agent-presets.zh.md: b745c22c91b4017131a32796c085a869a2eabaf0
@@ -1,6 +1,7 @@
# Agent Note: A session's agent is composed from a preset cordis.yml
Status: implemented
Archived: 2026-09-18
English | [中文](2026-08-03-per-session-agent-presets.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 会话的 agent 由一份 preset cordis.yml 组装而成
Status: implemented
Archived: 2026-09-18
[English](2026-08-03-per-session-agent-presets.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)
@@ -195,3 +196,7 @@ The few required Client symbols are mirrored on the test side: `scaffold.ts` exp
- **Capabilities deliberately omitted.** Payload projection and redaction are unsupported, scopes other than Agent are unsupported, and ordinary notifications are not replayed. Recoverable state needs a query, cursor, or opening baseline; a waterfall is replayed only while its original Host invocation remains pending.
- **Some Client packages remain in the Host graph.** Twelve projects, including `connection`, `runtime`, and `ui-slots`, remain reachable through unsplit `directory-picker-browse`/`-native` and `api/gateway → client/connection`. They compile and no longer pull in API Remotes' Client face, so this change does not split them. Direct `dsh-client-runtime/client` imports in two chat e2e files rely on Runtime's current presence in that graph rather than a general guarantee.
- **The package intentionally publishes no invariant companion.** A prior revision asserted delivery form on the live event bus, coupling diagnostics to the allowlist and causing Rolldown to emit a third bundle chunk omitted by the mechanically derived publication list. The Host-face `TypertForwardableEventEntry` assertion already rejects those mismatches at compile time, and the package README records why no independent runtime relation remains.
## Related
- [Remote duplex stream](2026-09-19-remote-duplex-stream.md): every Remote stream carries a Client uplink on the same logical stream; the duplex `$events` listed under its Deferred section replaces the unary `$events/result` path once it lands.
@@ -1,6 +1,7 @@
# Agent Note: Remote 事件投递(ctx.remote.$on)
Status: implemented
Archived: 2026-09-30
[English](2026-08-10-remote-event-delivery.md) | 中文
@@ -197,3 +198,7 @@ Client 要求首项是带非空 `clientId` 与 `host.home` 的 `ready`;后续
- **放弃的能力**:不支持投影或脱敏载荷,不支持 Agent 以外的 Scope,也不为普通通知提供重放。需要可靠恢复的状态必须拥有查询、cursor 或 opening baseline;waterfall 只重放仍处于同一次 Host 调用生命周期内的 pending request。
- **仍有 client 包留在 host 图里**:12 个工程(`connection`、`runtime`、`ui-slots` 等)经未拆分的 `directory-picker-browse`/`-native` 与 `api/gateway → client/connection` 仍可达 host 图。它们都能编译且不再牵连 api/remotes 的 client face,因此没有阻塞本次改动;拆分那些包能减少几个,但经评估后不做。两个 chat e2e 直接引 `dsh-client-runtime/client` 依赖 `runtime` 本来就在图里——属偶然而非保证。
- **本包不发布 invariant companion**:早先的修订曾在活事件总线上断言投递形状(`thisArg === null`、`mode === 'emit'`),这让诊断逻辑与名单值耦合,并使 rolldown 把它提成第三个 bundle chunk——而机械推导的发布文件清单并不携带它。Host 面的 `TypertForwardableEventEntry` 断言已在编译期拒绝这些偏离,包 README 也记录了不再存在独立运行时关系的原因。
## 相关
- [Remote 双工流](2026-09-19-remote-duplex-stream.zh.md):所有 Remote 流在同一逻辑流上承载客户端上行;其「后续」列出的双工 `$events` 落地后取代 unary `$events/result` 路径。
@@ -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
@@ -0,0 +1,42 @@
# 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)
## Problem
Agent Teams needs the real Session log, subagent lifecycle, tools, examples, snapshots, and repository checks while its service and tool contracts continue to change. Users also need to install the complete Team composition from npm without building a source checkout.
Moving the packages into product-role groups would remove their experimental names and imply stable-package ownership. Publishing every package under `packages/experimental/` would instead expose unrelated internal prototypes. The release policy must let users install Agent Teams while keeping internal-only prototypes private.
## Decision
`packages/experimental/agent-team`, `packages/experimental/tool-agent-team`, `packages/experimental/agent-team-profile`, and `packages/experimental/client-ui-agent-team` are public workspace packages. They retain their existing `@deepseek-ai/dsh-experimental-*` names and join the dsh release family. The [publication denylist decision](../process/2026-09-12-experimental-publication-denylist.md) owns the public default and private exceptions; the [experimental package rules](../../../../packages/experimental/AGENTS.md) own dependency isolation and later promotion.
The dsh pack and publish set and the local baseline publisher include these four Agent Teams directories and the [Cua Driver providers](2026-09-12-computer-use-provider-registration.md). Workspace constraints require them to omit `private`, set `publishConfig.access` to `public`, and keep the experimental npm prefix. Release packages and apps outside the experimental group, plus the Python runtime, cannot name experimental packages in `dependencies`, `optionalDependencies`, or `peerDependencies`; experimental packages may depend on release packages and each other.
The generic caller-reserved continuable child identity and selective direct-child drain remain in the stable Subagent service. They own Subagent identity and Activation lifecycle without importing or naming Agent Teams; the experimental Team service consumes them in the permitted direction.
The [single-bundle decision](2026-09-18-agent-teams-single-bundle.md) supersedes the separate Host and Web bundle composition. This note retains publication, dependency isolation, and promotion rationale. The current Team profile remains opt-in and disables the global continuable-child controls whose model-visible names overlap the Team tools; the [optional-bundle decision](../process/2026-09-15-shipped-optional-bundles.md) owns its inclusion in the installation.
Profile startup resolves selected bundles before computing the [immutable runtime resolution](2026-09-09-profile-resolution-generations.md). The runtime resolution retains installation-first precedence, traverses each explicit bundle root completely in profile order, and keeps pnpm-managed profile packages authoritative. The runtime interception enforces the result in memory without materializing fallback links. A private profile layer can therefore carry experimental plugin rows without adding those plugins to a release app, requiring profile users to install transitive packages directly, weakening packaged-runtime module identity, or changing another profile's resolution.
Experimental status changes compatibility and support expectations, not publication for these four packages. They retain the repository's ordinary documentation, invariant, lifecycle, security, unit, real-composition, and snapshot requirements. Promotion still requires review of the public contracts, limitations, test evidence, runtime dependents, and a named owner accepting stable-package obligations.
## Alternatives considered
**Move Agent Teams into product-role groups.** This would remove the requested experimental npm names and imply stable-package ownership before the contracts have stabilized.
**Keep Agent Teams private and source-checkout only.** This preserves the simplest experimental policy but prevents users from installing the complete opt-in composition from npm.
**Publish every experimental package.** Unrelated prototypes remain internal-only and have not accepted a public package contract.
**Move the Subagent prerequisites into the experimental directory.** Child identity allocation and Activation teardown belong to the Subagent owner and contain no Team-specific contract. Moving or duplicating them would invert the dependency or split one lifecycle across packages.
## Consequences
Agent Teams publishes as four installable tarballs in the dsh release family without changing package names or enabling Team in a shipped profile. Public availability does not make the packages stable or supported by default, and stable release packages cannot take runtime dependencies on them.
The release family carries the experimental npm names. Promotion still creates path and npm-name churn as specified by the experimental package rules.
@@ -0,0 +1,42 @@
# Agent Note: 以实验性包名发布 Agent Teams
Status: implemented
Archived: 2026-09-30
[English](2026-08-18-experimental-agent-teams-packages.md) | 中文
## 问题
Agent Teams 的服务与工具约定仍在变化,但它需要使用真实 Session 日志、subagent 生命周期、工具、示例、快照和仓库检查。用户还需要直接从 npm 安装完整 Team 组合,而无需构建源码 checkout。
把这些包移入产品职责组会移除实验性名称,并暗示稳定包 owner 已经就位。发布 `packages/experimental/` 下的所有包又会暴露无关的内部原型。发布策略必须让用户安装 Agent Teams,同时让内部专用原型保持私有。
## 决策
`packages/experimental/agent-team`、`packages/experimental/tool-agent-team`、`packages/experimental/agent-team-profile` 与 `packages/experimental/client-ui-agent-team` 是公开 workspace 包。它们保留现有 `@deepseek-ai/dsh-experimental-*` 名称并加入 dsh 发布系列。[发布拒绝列表决策](../process/2026-09-12-experimental-publication-denylist.zh.md)负责默认公开与私有例外;[实验性包规则](../../../../packages/experimental/AGENTS.md)负责依赖隔离与后续 promotion。
dsh 打包与发布集合以及本地基线发布器包含这四个 Agent Teams 目录和 [Cua Driver 提供方](2026-09-12-computer-use-provider-registration.zh.md)。workspace 约束要求它们省略 `private`、将 `publishConfig.access` 设为 `public`,并保留实验性 npm 前缀。实验组之外的发布包、应用和 Python 运行时不能在 `dependencies`、`optionalDependencies` 或 `peerDependencies` 中引用实验包;实验包可以依赖发布包和彼此。
通用的调用方预留 continuable child 身份和精确 direct-child drain 仍属于稳定 Subagent 服务。它们负责 Subagent 身份与 Activation 生命周期,不 import 或命名 Agent Teams;实验性 Team 服务沿允许的方向消费这些能力。
[单组合包决策](2026-09-18-agent-teams-single-bundle.zh.md)取代了独立 Host 与 Web 组合包的组合方式。本记录保留发布、依赖隔离与 promotion 的理由。当前 Team profile 仍须显式启用,并禁用模型可见名称与 Team 工具重叠的全局 continuable-child control;[可选组合包决策](../process/2026-09-15-shipped-optional-bundles.zh.md)负责其随安装交付的规则。
profile 启动会先解析所选 bundle,再计算[不可变 runtime resolution](2026-09-09-profile-resolution-generations.zh.md)。runtime resolution 保留安装优先顺序,按 profile 顺序完整遍历每个显式 bundle 根,并让 pnpm 管理的 profile 包保持优先。运行时拦截在内存中强制该结果,不物化 fallback 链接。因此,私有 profile 层可以携带实验性 plugin 配置行,而无需把这些 plugin 加入发布 app、要求 profile 用户直接安装传递依赖、破坏 packaged-runtime 的模块身份,或改变其他 profile 的解析结果。
对这四个包而言,实验性状态改变兼容性与支持预期,而不阻止发布。这些包仍须满足仓库的一般文档、不变式、生命周期、安全、单元测试、真实组合测试和快照要求。promotion 前仍须评审公开约定、限制、测试证据、运行时依赖方,并由一名具名 owner 接受稳定包义务。
## 曾考虑的替代方案
**把 Agent Teams 移入产品职责组。** 这会移除要求保留的实验性 npm 名称,并在约定稳定前暗示已有稳定包 owner。
**让 Agent Teams 保持私有且仅供源码 checkout 使用。** 这会保留最简单的实验性策略,但用户无法从 npm 安装完整 opt-in 组合。
**发布所有实验性包。** 其他原型仍只供内部使用,也没有接受公开包约定。
**把 Subagent 前置能力移入 experimental 目录。** child 身份分配与 Activation teardown 属于 Subagent owner,且不包含 Team 专用约定。移动或复制这些能力会反转依赖方向,或把同一个生命周期拆到多个包中。
## 后果
Agent Teams 会作为 dsh 发布系列中的四个可安装 tarball 发布,同时保持包名不变,也不会在随附 profile 中启用 Team。公开可用不代表这些包稳定或默认受支持,稳定发布包也不能对其建立运行时依赖。
发布系列保留实验性 npm 名称。promotion 仍会按照实验性包规则产生路径和 npm 名改动。
@@ -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)
@@ -46,6 +47,8 @@ Linux falls back before target execution when the exact bootstrap, modern readab
Normal Cordis disposal starts direct-result and range observation independently, requests termination, and waits for every owned range. Consumer teardown does not inspect an ordinary PID; it retains the original operation or startup error while attempting terminate and final wait, and preserves cleanup failures in the consumer's existing error order. A confirmed empty range permanently disables later signalling against stale identities.
Native Windows fixtures retain the same Job-owned termination and final wait on success and failure. A descendant PID is observation-only: issuing `taskkill` after its exit can terminate an unrelated process that has reused the number, including another concurrent test worker.
During a JavaScript-observable host exit, `LocalSubprocessRuntime` synchronously force-terminates every still-live handle without promises or timers. Linux sends the existing direct fallback kill and the exact scope kill; Windows kills the runner so its only Job handle closes; PTY fallback scans remain best effort. Per-handle failures are contained and do not change the host's exit result. Termination modes in which JavaScript cannot run remain outside this listener's guarantee.
## Existing decisions and supersession
@@ -1,6 +1,7 @@
# Agent Note: 原生 owner 收容逃逸的 subprocess 后代
Status: implemented
Archived: 2026-09-30
[English](2026-08-28-subprocess-native-containment.md) | 中文
@@ -46,6 +47,8 @@ selector 是 per-spawn locator 或 sentinel,不是凭据或持久格式。Linu
正常 Cordis dispose 会独立启动 direct-result 与 range observation、请求终止,并等待每个自有 range。消费方 teardown 不检查普通 PID;它会保留原始 operation 或 startup error,同时尝试 terminate 与 final wait,并按消费方既有错误顺序保留 cleanup failure。range 一旦被确认为空,就会永久禁止后续向陈旧 identity 发送信号。
原生 Windows fixture 在成功和失败时都通过同一个 Job owner 请求终止并完成最终等待。后代 PID 仅用于观察:进程退出后再执行 `taskkill`,可能终止已复用该编号的无关进程,包括并发运行的其他测试 worker。
在 JavaScript 可观察的 host exit 期间,`LocalSubprocessRuntime` 会同步强制终止每个仍存活的句柄,不使用 Promise 或 timer。Linux 会发送既有 direct fallback kill 与准确 scope kill;Windows 会终止 runner,使其唯一 Job handle 关闭;PTY fallback 扫描仍是 best effort。每个句柄的失败相互隔离,也不改变宿主退出结果。JavaScript 无法运行的终止形态不属于该 listener 的保证。
## Existing decisions and supersession
@@ -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
@@ -0,0 +1,49 @@
# 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.
English | [中文](2026-09-01-jobs-absorb-activity-record.zh.md)
## Problem
The [activity observation seam](../feature/2026-08-24-activity-observation-seam.md) shipped live output streaming as a second registry beside `ctx.jobs`: producers registered the same work twice (a job for lifecycle, an activity for observation), kept the two terminal states consistent by hand (`observeBackgroundActivity` waited for `proc.done` before mapping the outcome so a pump failure could not freeze a wrong terminal state), correlated the rows through `ActivityCorrelation.jobId`, and wrapped every observation call in registry-absent degradation branches. The Web client maintained two rosters (session-control `jobs` frames and the activity control stream) and joined them per row. Measured before the merge: eight pairing call sites, and one producer population — background bash/pwsh (both registries), PTY sends and subagent delegations (jobs only), foreground workflow (activity only).
The one activity without a job was the foreground workflow mirror. Everything else the split enabled — independent observers, absolute-offset reads, bounded retention — is a property of the record, not of the registry split.
## Decision
`ctx.jobs` owns the observation record; `packages/activity/`, `packages/api/activity-controller`, and the correlation vocabulary are removed.
- **`JobStart.record?: true`** declares an observable output record. `run(job)` now receives the job's producer face — `RecordingJob { id, append(text, {channel?, gapBefore?}), updateDetail(detail) }` for a `record: true` start, the plain `RunningJob { id, updateDetail(detail) }` otherwise — so the id is issued before the starter runs (a throwing starter still registers nothing; its ordinal is skipped). Writes staged inside the starter surface at the registration commit. `updateDetail` works for every job and gives `job_list` a live progress line; `append` without a record declaration logs and drops.
- **There is no `end`.** Job settlement — the producer outcome, a kill, or teardown — is the record's only close: it trims retention to the settled cap and fires the final `onOutput` signal. The dual-settlement pairing (`ActivityHandle.end` first-wins against teardown force-ends) is deleted, not reimplemented.
- **`readRecord(id, from, caller)`** is the non-consuming multi-reader view (absolute UTF-8 offsets, `lossy` below the retained window), fenced like every other job read; it never marks the job `reported`. The model-facing `readOutput` cursor is untouched — the two projections serve different readers and stay separate by design.
- **`jobs-local`** absorbs the chunk ring (`retainBytes` 256 KiB live, `settledRetainBytes` 16 KiB settled), and `pumpJobOutput` replaces `pumpActivityOutput` beside the seam. Producers fold the pump's final drain into `hooks.done` so the record holds its last bytes before settlement closes it.
- **The wire splits by role.** `SessionJob.record` (present exactly for record jobs) marks a row observable on the session control stream; `job.follow({sessionId?, jobId, from?})` on the `job` namespace of `api-job-controller` streams anchor/output/status frames with the fenced read resolved from the request's session. `api-activity-controller` is deleted; its roster stream is redundant (the jobs frames are the roster) and its observe machinery lives in `api-job-controller` (`observe.ts`, client `ctx.jobOutput`), which resolves its Remote faces in its own apply.
- **`ui-activity` returns to its upstream name `ui-jobs`** and renders one roster: `jobsBySession` rows, expandable exactly when `record` is present. The two-roster join is deleted.
- **Foreground workflow loses its live panel deliberately.** `tool-workflow`'s activity mirror is removed; a foreground run surfaces through its recorded run/member lifecycle events only, and the per-line `workflow/phase` / `workflow/log` narration has no observer until workflow gains `run_in_background` and registers a record job. Jobs stay a pure background registry — no `foreground` mode bit, no model-invisible rows, no run-less rows.
## Alternatives considered
- **A `foreground: true` job mode** to keep the foreground workflow panel: it needs two coupled enforcement points (reported-at-birth and a `job_list` filter) whose divergence double-delivers or leaks rows to the model, for one edge feature replaceable by `run_in_background`.
- **Serving model reads from the record** (deleting `readOutput`): model reads are producer-formatted (truncation and spill notices, sandbox markers) and consuming; the record is raw, channel-labeled, and non-consuming. Unifying them moves producer-specific formatting into the registry or noise into the observer stream.
- **Keeping the split with shared implementation** (a common registry library): it removes the duplicated skeleton but keeps the real costs — double registration, terminal-state pairing, correlation, a second wire roster, and a second package family.
The [prior seam note](../feature/2026-08-24-activity-observation-seam.md)'s argument against durable session events and control-stream framing for live output still holds and carries over unchanged: the record is process-local observation state, never a session event, so "model-visible ⟺ logged" is untouched.
## Review corrections
Review of the merged design settled five points that the sections above leave implicit:
- **The pump's wait holds constant resources.** `pumpJobOutput` subscribes to the producer's `done` once and keeps one pending timer; settlement clears the timer and wakes the current wait. Racing the same pending promise every poll round retained a reaction per round until the job ended — a day-long job at the default cadence accumulated over a million closures.
- **Client disposal waits for carrier quiescence.** The `ctx.jobOutput` effect disposer is async and awaits every open `RemoteStream.dispose()`, because Cordis awaits async disposers and a fiber that reported unloaded while an old iterator was still closing could overlap the next plugin instance under HMR.
- **The roster flags a record, it does not count bytes.** `SessionJob.record: true` replaced `outputTotal`: `append` commits no roster change (only lifecycle commits fire `onJobsChanged`), so a mirrored count went stale the moment output arrived, and broadcasting the roster per append was rejected as traffic for a number no row needed. The live offsets ride the observation stream's `opened` anchor.
- **The record is a best-effort live preview.** Producers copy stdout and stderr per poll round, so writes inside one window land stdout first; pipe capture cannot recover the true interleaving (only a PTY or `2>&1` can), and the client concatenates chunks regardless of `channel`. `channel` stays on the wire because it is what makes that limit visible and what a distinct stderr rendering would need.
- **The declaration types the face.** `JobStart` is a union discriminated by `record`: `RecordingJobStart.run` receives `RecordingJob`, `PlainJobStart.run` receives `RunningJob` without `append`, and the registry builds the plain face without the method — output the registry has nowhere to keep is unrepresentable instead of warned about and dropped.
- **Web e2e keep-alive is a barrier, not a clock.** The background command holds on a file the test owns in the job's cwd and the scenario kills it explicitly, so no CI stall can settle the job first; each scenario is one test, never a chain of tests sharing a job id.
## Consequences
Every observable row is a killable job; a pure-observation surface with no lifecycle would need a new home (harness diagnostics belong to the inspector plane, not here). A future remote job provider must implement lifecycle and record together. The record's retention config lives on `jobs-local`; the observation wire's cadence config (`observeFlushMs`, `observeMaxFrameBytes`) lives on `api-job-controller`.
@@ -0,0 +1,49 @@
# 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` 的论证仍然成立。
[English](2026-09-01-jobs-absorb-activity-record.md) | 中文
## 问题
[activity 观测 seam](../feature/2026-08-24-activity-observation-seam.zh.md) 把实时输出流做成了 `ctx.jobs` 旁边的第二个注册表:生产者要把同一份工作登记两次(job 管生命周期,activity 管观测),手工保持两个终态一致(`observeBackgroundActivity` 要等 `proc.done` 才映射 outcome,防止 pump 失败把错误终态冻上去),通过 `ActivityCorrelation.jobId` 关联两行,并给每个观测调用包上注册表缺失的降级分支。Web 客户端维护两份名册(session-control 的 `jobs` 帧与 activity control 流)并逐行做 join。合并前实测:八个配对调用点;生产者人口为——后台 bash/pwsh(双注册表)、PTY 发送与 subagent 委托(仅 jobs)、前台 workflow(仅 activity)。
唯一没有 job 的 activity 是前台 workflow 镜像。拆分带来的其他一切——独立观察者、绝对偏移读取、有界保留——都是 record 的性质,不是注册表拆分的性质。
## 决策
`ctx.jobs` 拥有观测 record;`packages/activity/`、`packages/api/activity-controller` 与 correlation 词表被移除。
- **`JobStart.record?: true`** 声明可观测输出 record。`run(job)` 现在收到 job 的生产者面——`record: true` 的 start 收到 `RecordingJob { id, append(text, {channel?, gapBefore?}), updateDetail(detail) }`,其余收到普通的 `RunningJob { id, updateDetail(detail) }`——因此 id 在 starter 运行前签发(starter 抛出仍然不登记任何东西;序号被跳过)。starter 内暂存的写入在登记提交时可见。`updateDetail` 对所有 job 可用,让 `job_list` 也能看到实时进度行;未声明 record 的 `append` 记日志并丢弃。
- **没有 `end`。** job 结算——生产者 outcome、kill 或 teardown——是 record 唯一的关闭:裁剪到结算保留量并发出最后一个 `onOutput` 信号。双结算配对(`ActivityHandle.end` 与 teardown 强结的 first-wins 对账)被删除,而非重新实现。
- **`readRecord(id, from, caller)`** 是非消耗多读者视图(绝对 UTF-8 偏移,低于保留窗口为 `lossy`),围栏与其他 job 读取一致;永不置 `reported`。模型面的 `readOutput` 游标原样保留——两个投影服务不同读者,刻意保持分离。
- **`jobs-local`** 吸收块环(`retainBytes` 运行期 256 KiB,`settledRetainBytes` 结算后 16 KiB),`pumpJobOutput` 在 seam 旁替换 `pumpActivityOutput`。生产者把 pump 的末次排空折进 `hooks.done`,让 record 在结算关闭前握有最后的字节。
- **wire 按角色拆分。** `SessionJob.record`(恰在 record job 上存在)在会话控制流上标记行可观测;`api-job-controller` 的 `job` 命名空间上的 `job.follow({sessionId?, jobId, from?})` 流式发送 anchor/output/status 帧,围栏读取者由请求的 session 解析。`api-activity-controller` 删除;其名册流是冗余的(jobs 帧就是名册),observe 机制位于 `api-job-controller`(`observe.ts`,客户端 `ctx.jobOutput`),它在自己的 apply 里解析所依赖的 Remote 面。
- **`ui-activity` 改回上游名字 `ui-jobs`**,渲染单一名册:`jobsBySession` 行,恰在 `record` 存在时可展开。双名册 join 被删除。
- **前台 workflow 有意失去实时面板。** `tool-workflow` 的 activity 镜像被移除;前台 run 只通过已记录的 run/member 生命周期事件呈现,逐行的 `workflow/phase` / `workflow/log` 叙述在 workflow 获得 `run_in_background` 并登记 record job 之前没有观察者。jobs 保持纯后台注册表——没有 `foreground` 模式位、没有模型不可见行、没有无 run 行。
## 曾考虑的替代方案
- **`foreground: true` job 模式**以保留前台 workflow 面板:它需要两个耦合的执行点(出生即 reported 与 `job_list` 过滤),两者一旦分叉就会双投递或向模型泄漏行,而它换来的只是一个可被 `run_in_background` 替代的边缘特性。
- **用 record 服务模型读取**(删除 `readOutput`):模型读取是生产者格式化的(截断与 spill 提示、sandbox 标记)且消耗型;record 是原始、带 channel 标签、非消耗的。统一二者要么把生产者特有格式化搬进注册表,要么把噪声混入观察者流。
- **保留拆分但共享实现**(公共注册表库):它消除重复骨架,但保留真正的成本——双重登记、终态配对、correlation、第二条 wire 名册与第二个包族。
[先前 seam note](../feature/2026-08-24-activity-observation-seam.zh.md) 反对用持久会话事件或 control 流承载实时输出的论证仍然成立并原样沿用:record 是进程本地观测状态,从不是会话事件,「模型可见 ⟺ 已记录」不受影响。
## 评审修正
对已合并设计的评审确定了上文各节未言明的五点:
- **泵的等待资源恒定。** `pumpJobOutput` 对生产者的 `done` 只订阅一次,同一时刻只保留一个待触发的 timer;结算清掉 timer 并唤醒当前等待。此前每个轮询轮次都对同一个 pending promise 赛跑,每轮留下一个 reaction 直到任务结束——默认节奏下跑一天的任务会累积上百万个闭包。
- **客户端卸载等待载体静止。** `ctx.jobOutput` 的 effect disposer 是异步的,await 每条打开的 `RemoteStream.dispose()`:Cordis 会 await 异步 disposer,而一个在旧 iterator 仍在关闭时就宣告卸载完成的 fiber,在 HMR 下可能与下一个插件实例重叠。
- **名册标记 record,不计字节。** `SessionJob.record: true` 取代了 `outputTotal`:`append` 不提交名册变更(只有生命周期提交触发 `onJobsChanged`),镜像的计数在输出到达的瞬间就陈旧了;而为一个没有任何行需要的数字按 append 广播整份名册被否决。实时偏移随观测流的 `opened` 锚帧到达。
- **record 是尽力而为的实时预览。** 生产者按轮询轮次复制 stdout 与 stderr,同一窗口内的写入先 stdout 落地;pipe 捕获无法还原真实交错(只有 PTY 或 `2>&1` 可以),客户端拼接 chunk 时也不区分 `channel`。`channel` 留在 wire 上,因为它正是让这一限制可见、也是将来区分渲染 stderr 所需要的东西。
- **声明决定生产者面的类型。** `JobStart` 是按 `record` 判别的联合类型:`RecordingJobStart.run` 收到 `RecordingJob`,`PlainJobStart.run` 收到没有 `append` 的 `RunningJob`,注册表给普通 job 构造的面根本没有这个方法——注册表无处存放的输出成为不可表达,而不是警告后丢弃。
- **Web e2e 的保活是 barrier 而非时钟。** 后台命令守在测试拥有的、位于 job cwd 的文件上,由场景显式 kill,因此 CI 卡顿不可能先把任务结算掉;每个场景是一个测试,绝不是共享 job id 的测试链。
## 后果
每个可观测行都是可 kill 的 job;没有生命周期的纯观测面需要新的归属(harness 诊断属于 inspector 平面,不在这里)。未来的远端 job provider 必须同时实现生命周期与 record。record 的保留配置在 `jobs-local`;观测 wire 的节奏配置(`observeFlushMs`、`observeMaxFrameBytes`)在 `api-job-controller`。
@@ -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)
@@ -39,7 +40,7 @@ Declared read compatibility — reads tolerate vouched-for older versions, write
5. **Identity matching is stricter than structural admission**: an absent `formatVersion` never matches a current Session, so predecessor rows cannot seed a projection and refold from the authoritative log. Once the format matches, `identityMatches` normalizes absent lineage to unseeded (`?? false` / `?? 0`): exact for an unseeded session, while a seeded expectation fails the match. Poisoned v5 homes therefore boot safely, but their unbound rows are not exposed as current values.
6. **Schema-validation backstop: `invalidRecords: 'backup-and-skip'` (declared by this domain only)**. A stored record that still fails to parse beyond read compatibility no longer refuses the whole domain: the domain layer calls the backend's `KvUnit.backupRecord` (json per-record implementation = rename the document to `<key>.json.bak.<YYYYMMDDHHmm>`, bytes kept, never read again), prints the concrete failure with `logger.error` (domain, table, key, destination, zod cause), and continues the open with the record absent; the next cold read rebuilds and rewrites that session's cache. **The policy is an explicit per-domain declaration and the default stays fail-loud** — other domains still refuse the whole load on invalid stored data, and a backend without `backupRecord` (single layout, row stores) also falls back to fail-loud. Naming history: quarantine → backup-and-skip (user ruling: the word must carry both "back up" and "skip", sharing its root with the `.bak` suffix; skip-backup was rejected because the CLI `--skip-X` convention reads it as "do not back up"). For this domain it supersedes the reset/destroy recovery path of the [2026-07-28 storage recovery proposal](../../proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.md), which stays live for authoritative and whole-medium damage.
7. **A predecessor title is a listing hint, not a fold shortcut**: Session-list startup remains metadata/cache-only and never opens cold log bodies. The log header is authoritative; a lifecycle-matching checkpoint is a durable-prefix witness that may lag but cannot lead the log. `cachedPredecessorTitle` therefore exposes only a predecessor `title` row that still passes the current title unit's `stateVersion` and schema. Both adjacent Session-format edges preserve title text. The hint uses `asOfSeq: -1` rather than the stored row sequence because a cardinality-changing log migration can remap that coordinate. Other predecessor rows remain hidden, and `hydratePrepared`/`coldSnapshot` retain strict format identity, because normalizers can change values such as `blank` or `lastPromptAt` even when storage is physically consistent.
7. **A predecessor title is a listing hint, not a fold shortcut**: Session-list startup remains metadata/cache-only and never opens cold log bodies. The log header is authoritative; a lifecycle-matching checkpoint is a durable-prefix witness that may lag but cannot lead the log. `cachedPredecessorTitle` therefore exposes only a predecessor `title` row that still passes the current title unit's `stateVersion` and schema. Both adjacent Session-format edges preserve title text. The hint carries the stored title row's own watermark as `asOfSeq`; because a cardinality-changing log migration can remap that coordinate, the Session list labels the block `kind: 'cached'` and the client never compares it with the connected Session's seqs ([listing identity and cached rows](2026-09-19-projection-cache-listing-identity-and-cached-rows.md)). Other predecessor rows remain hidden, and `hydratePrepared`/`coldSnapshot` retain strict format identity, because normalizers can change values such as `blank` or `lastPromptAt` even when storage is physically consistent.
### v3-v6 → v7 disposition
@@ -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) | 中文
@@ -39,7 +40,7 @@ v4→v5 的唯一实质差异是 identity 新增两个 lineage 字段;v6 只
5. **identity 匹配比结构准入更严格**:缺失 `formatVersion` 的记录绝不匹配当前 Session,因此前代行不能播种投影,而会从权威日志重新折叠。格式匹配后,`identityMatches` 才把缺失 lineage 归一化为 unseeded(`?? false` / `?? 0`):对 unseeded 会话精确,对 seeded 期望则匹配失败。v5 投毒 home 因而可以安全启动,但其未绑定行不会作为当前值暴露。
6. **schema 校验兜底:`invalidRecords: 'backup-and-skip'`(仅本域声明)**。读兼容之外仍然解析失败的存量记录不再让整个域拒开:domain 层调用后端的 `KvUnit.backupRecord`(json per-record 实现=把文档改名为 `<key>.json.bak.<YYYYMMDDHHmm>`,字节留档、不再被读取),用 `logger.error` 打印具体失败信息(域名、表、键、移动去向、zod 失败原因),随后当该记录不存在继续启动;下一次冷读会重建并重写该会话的缓存。**该策略是域级显式声明,缺省仍为 fail-loud**——其他业务域的存量数据校验失败照旧整域拒载;后端没有 `backupRecord` 能力(single 布局、行存储)时也回退 fail-loud。命名沿革:quarantine → backup-and-skip(用户裁决:词要同时含"备份"与"跳过"两义,且与 `.bak` 后缀同源;skip-backup 因 CLI `--skip-X` 惯例存在"不备份"反读而弃用)。对本域而言,该策略取代了 [2026-07-28 存储恢复提案](../../proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.zh.md)中 reset/destroy 的恢复途径;该提案对权威介质与整介质损坏仍然有效。
7. **predecessor title 是列表 hint,而不是 fold shortcut**:Session list 启动保持 metadata/cache-only,绝不打开冷 log body。log header 是权威来源;生命周期匹配的 checkpoint 是 durable prefix witness,可以落后但不能领先日志。因此 `cachedPredecessorTitle` 只公开仍通过当前 title unit `stateVersion` 与 schema 的 predecessor `title` row。两条相邻 Session format edge 都保留 title 文本。该 hint 使用 `asOfSeq: -1`,而不使用存储 row 的序号,因为改变日志事件数量的迁移会重新映射该坐标。其他 predecessor row 继续隐藏,`hydratePrepared`/`coldSnapshot` 仍要求严格格式 identity,因为即使物理存储一致,normalizer 仍可能改变 `blank` 或 `lastPromptAt` 等值。
7. **predecessor title 是列表 hint,而不是 fold shortcut**:Session list 启动保持 metadata/cache-only,绝不打开冷 log body。log header 是权威来源;生命周期匹配的 checkpoint 是 durable prefix witness,可以落后但不能领先日志。因此 `cachedPredecessorTitle` 只公开仍通过当前 title unit `stateVersion` 与 schema 的 predecessor `title` row。两条相邻 Session format edge 都保留 title 文本。该 hint 的 `asOfSeq` 是存储 title row 自己的水位;因为改变日志事件数量的迁移会重新映射该坐标,Session list 把该 block 标为 `kind: 'cached'`,客户端不会拿它与建连 Session 的 seq 比较([只读面按 lifecycle 身份匹配与 cached 行](2026-09-19-projection-cache-listing-identity-and-cached-rows.zh.md))。其他 predecessor row 继续隐藏,`hydratePrepared`/`coldSnapshot` 仍要求严格格式 identity,因为即使物理存储一致,normalizer 仍可能改变 `blank` 或 `lastPromptAt` 等值。
### v3-v6 → v7 处置
@@ -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)
@@ -36,7 +37,7 @@ interface SidebarRightTabDefinition {
`priority` is one of three literal bands, spelled as strings so that a type from another package needs no runtime import: `extension` is the band of a type from outside the product and the highest, so a type that declares nothing outranks every viewer shipped here; `builtin` is the ordinary band for shipped types; `fallback` is the plain-content position that anything more specific should beat, which VS Code's text editor holds implicitly and our text preview holds explicitly. `candidates(address)` returns every type whose globs match and whose `canOpen` does not veto, ranked by band, then by the length of the longest pattern that matched, then by registration order. `claim(address, kind?)` takes the best candidate, or the named kind's type in force when the caller overrides (its globs are not consulted; naming the type is the decision), and throws for an address nothing will open — a wiring mistake, not a user error. `get(kind)` returns the type in force; `entries()` and `guide()` list the types and their guide boxes in force; `subscribe` observes changes.
`title(address)`, `guide[].title()`, and optional `guide[].description()` are thunks read on every use, so a language change needs no re-registration. [Guide start page and stat pill refinements](../feature/2026-09-10-guide-start-page-and-stat-pill-refinements.md) owns the current description visibility and fallback-glyph rules. The registry itself is a plain object provided at `apply`'s top level **without** `Service.tracker`: a tracker would rebind `this.ctx` to the caller's context, and a cross-package `register()` would then add its effect to the caller's fiber while that fiber is the active scope, stalling the browser boot with no error.
`title(address)`, `guide[].title()`, and optional `guide[].description()` are thunks read on every use, so a language change needs no re-registration. The [Sidebar README](../../../../packages/client/ui-sidebar-right/README.md#the-guide) defines description visibility and fallback-glyph rules. The registry itself is a plain object provided at `apply`'s top level **without** `Service.tracker`: a tracker would rebind `this.ctx` to the caller's context, and a cross-package `register()` would then add its effect to the caller's fiber while that fiber is the active scope, stalling the browser boot with no error.
### Bodies and titles: keyed Slot seats under the definition's `id`
@@ -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) | 中文
@@ -36,7 +37,7 @@ interface SidebarRightTabDefinition {
`priority` 是三个字面量档位之一,写成字符串,好让别的包的类型不需要任何运行时引入:`extension` 是来自产品之外的类型的档位也是最高档,所以什么都不声明的类型压过这里随包交付的每个查看器;`builtin` 是随包类型的常规档;`fallback` 是任何更具体的东西都应压过的纯内容位置,VS Code 的文本编辑器隐含地占据它,我们的文本预览明确地占据它。`candidates(address)` 返回 glob 命中且 `canOpen` 未否决的每个类型,按档位、再按命中的最长 pattern 长度、再按注册顺序排序。`claim(address, kind?)` 取最佳候选,或在调用方指定时取该 kind 生效的类型(不查它的 glob;点名即决定),对无人愿开的地址抛错——这是接线错误,不是用户错误。`get(kind)` 返回生效类型;`entries()` 与 `guide()` 列出生效类型及其引导入口;`subscribe` 观察变化。
`title(address)`、`guide[].title()` 与可选的 `guide[].description()` 都是每次使用时重读的 thunk,语言切换无需重新注册。[引导起始页与统计 pill 的细化](../feature/2026-09-10-guide-start-page-and-stat-pill-refinements.zh.md)负责当前的描述显示与兜底图标规则。注册表本身是 `apply` 顶层提供的普通对象,**不带** `Service.tracker`:tracker 会把 `this.ctx` 重绑到调用方上下文,跨包 `register()` 就会在调用方 fiber 仍是活动作用域时往它上加 effect,浏览器启动会无声卡死。
`title(address)`、`guide[].title()` 与可选的 `guide[].description()` 都是每次使用时重读的 thunk,语言切换无需重新注册。[Sidebar README](../../../../packages/client/ui-sidebar-right/README.zh.md#the-guide)定义描述显示与兜底图标规则。注册表本身是 `apply` 顶层提供的普通对象,**不带** `Service.tracker`:tracker 会把 `this.ctx` 重绑到调用方上下文,跨包 `register()` 就会在调用方 fiber 仍是活动作用域时往它上加 effect,浏览器启动会无声卡死。
### 正文与标题:按定义 `id` keyed 的 Slot 坑位
@@ -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) | 中文
Loaded 100 of 11687 files, more files were not shown because too many files have changed in this diff. Show more