Compare commits

...
Author SHA1 Message Date
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 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
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
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
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 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
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 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
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
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
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
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
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
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
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
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
Tianyi Cui bbf599483e docs(notes): normalize legacy implemented status metadata 2026-09-30 22:33:31 +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
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
turtle1999 c09be4813d test(webworker-packer): avoid counting inventory service reads in comment 2026-09-30 20:28:12 +08:00
turtle1999 a1df190fd9 test(webworker-packer): accept the inventory agentPresets read
Refs #5560
2026-09-30 20:04:26 +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
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
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
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
Turtle 015349e4ad fix(client-modules): remove untagged styles of a failed factory 2026-09-30 15:14:59 +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
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
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
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
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
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
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
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
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
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
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
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
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
ZiyaZhang 4374c2040a fix(web): apply revised 0.2 preview notice copy 2026-09-28 02:45:16 -07:00
yixiangihsiangandimccyu 6dd319ad5a test(web): align completed turn spacing
Co-authored-by: imccyu <[email protected]>
2026-09-28 17:18:32 +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
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
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
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
Chinesezjc ab86d7a568 Merge remote-tracking branch 'origin/master' into feat/preset-scoped-schedule-tools 2026-09-28 16:34:27 +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
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
turtle1999 f2af03539b perf(settings): skip unused shared compositions 2026-09-28 16:12:42 +08:00
Chinesezjc 39260067b5 docs(notes): record that the layout gate restores the recorded duration decision 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
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
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
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
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
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
Tianyi Cui ef2c281e6e Merge branch 'master' into worktree/web-clock-flake-20260926 2026-09-27 15:37:37 +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
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
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
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
Yif d27663918d Merge master scheduling updates and preserve approved icon 2026-09-26 22:11:11 +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
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
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
Chinesezjc 5815da5a53 test(web): poll the spreadsheet selection after each sidebar resize 2026-09-26 11:33:16 +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 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
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
07akioni 9d36f9c1fc refactor(telemetry): share reporting through a Cordis OTel service 2026-09-25 19:08:44 +08:00
07akioni b97ef29e79 fix(telemetry): await SDK export slot cleanup between requests 2026-09-25 18:47:23 +08:00
07akioni 3dd52bfd9b fix(telemetry): own byte-bounded session request scheduling 2026-09-25 18:39:21 +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
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
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
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
zhc 0b275fc3f6 merge: sync master release and align analytics policy checks 2026-09-24 23:08:59 +08:00
zhc 9f7ef18c03 refactor(analytics): centralize live policy and message submission context 2026-09-24 22:58:55 +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
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
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
turtle1999 374b9cc1fb test(web): align shipped composition fixtures with disabled scheduling 2026-09-24 20:41:51 +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
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
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
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
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
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
yudshj 03bd8258c3 chore(deps): upgrade LibreOffice Kit to 0.1.1 2026-09-24 18:56:22 +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
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
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
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
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
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
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
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
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
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
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
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
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
imccyu 55fadaa601 Merge pull request #5030 from deepseek-harness/ihsiang/ui-visual-consistency
feat(web): 统一界面圆角与菜单材质,优化文件改动展示
2026-09-24 15:10:55 +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
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
lsdsjy c846fd48a3 fix(account): extend balance request timeout to 30 seconds 2026-09-24 14:11:23 +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 fa04034a9c fix(session): isolate source migration verifiers in processes 2026-09-24 13:31:16 +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
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
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
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
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
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
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
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
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
lsdsjy 3cf49f26ab fix(account): cover live notices and satisfy CI checks 2026-09-23 20:53:30 +08:00
lsdsjy 4e0283c89b Merge remote-tracking branch 'origin/master' into feat/account-provider-signout 2026-09-23 20:45:29 +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
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
mektpoy c5c09c9afa Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-23 19:49:34 +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
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
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
lsdsjy 57a98bff5f fix(account): use medium weight for bonus notice title 2026-09-23 19:17:00 +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
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
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
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
_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
lsdsjy 850d78b798 fix(account): refresh after top-up and accept exponent balances 2026-09-23 17:42:15 +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
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
lsdsjy 51be61db98 Merge origin/master into feat/account-bonus-notices 2026-09-23 17:15:22 +08:00
Xinyu Yang 1aebb43147 fix(web): wait for sidebar collapse in delivery test 2026-09-23 17:02:19 +08:00
Xinyu Yang afbd10991a chore: update temporary CI merge to latest master 2026-09-23 16:44:04 +08:00
Xinyu Yang 31688747ad chore: temporarily merge master for CI validation 2026-09-23 16:41:44 +08:00
Xinyu Yang d0861be2cd fix(shortcuts): restore PRD reference order 2026-09-23 16:04:22 +08:00
lsdsjy e9a438d9e9 chore: merge master into account provider branch 2026-09-23 15:52:07 +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
lsdsjy b8df537f07 fix(desktop): return to initial welcome page after sign-out 2026-09-23 15:28:12 +08:00
lsdsjy 150303ff22 fix(account): refine bonus notice lifecycle and diagnostics 2026-09-23 15:13:29 +08:00
lsdsjy 9e19ca3e45 fix(account): limit automatic model selection to account login 2026-09-23 15:06:00 +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
gengruilin 3a9d77a841 merge: 同步 master 并合并 WebKit 测试说明 2026-09-23 14:48:20 +08:00
lsdsjy 40da69ff75 refactor(account): isolate provider authentication and preserve model selections 2026-09-23 14:43:47 +08:00
Xinyu Yang f6006c5547 fix(shortcuts): finish modal toggles and automatic focus handling 2026-09-23 14:34:20 +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
Yichen Jiang 26b4980364 feat(voice-input): guide unready microphones to plugin setup 2026-09-23 14:15:26 +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
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
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
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
gengruilin d9b3db5d24 merge: 同步 master 并解决文档配对冲突 2026-09-23 10:44:36 +08:00
lsdsjy 081526aa3e feat(account): show bonus notices after visible display 2026-09-22 22:51:09 +08:00
lsdsjy 3970cc974f feat(account): send client metadata with Platform requests 2026-09-22 22:42:11 +08:00
lsdsjy 318c83fa84 chore: merge master and restore PR validation 2026-09-22 22:25:13 +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
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 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 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
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 9178ff75f2 merge: 同步最新 master 2026-09-22 19:58:22 +08:00
gengruilin 9e95d9a3f4 merge: 同步最新 master 2026-09-22 19:55:51 +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
gengruilin aaa52be272 merge: 同步最新 master 2026-09-22 18:25:04 +08:00
lsdsjy f0f4bb73fc fix(desktop): keep welcome back action on one line 2026-09-22 16:58:55 +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
gengruilin dd1d739a55 merge: 同步 master 并更新文档配对记录 2026-09-22 16:24:03 +08:00
lsdsjy 3e4119ebdb fix(account): expire account credentials on inference HTTP 401 2026-09-22 16:12:01 +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 37d3a31e29 fix(account): sign out on rejected inference tokens 2026-09-22 15:44:26 +08:00
lsdsjy 43f107d164 fix(account): expire grants rejected by Platform response code 2026-09-22 15:27:38 +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
lsdsjy 06a3daef9f Merge remote-tracking branch 'origin/master' into feat/account-provider-signout 2026-09-22 15:08:47 +08:00
lsdsjy 6ef32577a3 fix(account,models): reconcile provider lifecycle with master 2026-09-22 15:06:16 +08:00
lsdsjy f21098e9d3 fix(account): expire rejected credentials and hide signed-out provider 2026-09-22 14:41:33 +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
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
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
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
mektpoy 613157c5db Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-21 20:42:39 +08:00
mektpoy ba88134117 Merge remote-tracking branch 'origin/master' into feat/unify-code-highlight-languages 2026-09-21 20:37:43 +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
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
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
gengruilin a964bd34b5 fix(tools): 同步原生容器校验并归位回归测试 2026-09-21 18:14:56 +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
gengruilin 9373f74c9c test(web): 补充 WebKit 会话回放回归 2026-09-21 17:25:57 +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
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 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
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
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
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
mektpoy ae59505baf Merge remote-tracking branch 'origin/master' into tmp4500-sync 2026-09-20 18:24:54 +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
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
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
mektpoy 6f1de05d54 Merge remote-tracking branch 'origin/master' into fix/windows-directory-junction 2026-09-20 15:51:00 +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
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
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
6388 changed files with 224666 additions and 125071 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: 6872de0a1390fa5a1707b9f464c9e0edeb2da4be
README.zh.md: ced81f77fa904ad0b5cb5219383ef651d87392b8
/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
+3 -3
View File
@@ -16,7 +16,7 @@ Every Agent Note has two axes, both encoded in its **path** — `{lifecycle}/{cl
The date in the filename is when the topic was **first proposed** (per git history). Cross-references between Agent Notes use relative markdown links (`[topic](../../implemented/architecture/2026-…-….md)`) — never bare prose or numbers — so they are mechanically checkable and survive moves between folders.
The active lifecycle tree is the working inventory: browse its lifecycle/class folders or search the repository. Do not add a centralized `INDEX.md`; the [no-index Agent Note](implemented/process/2026-07-19-remove-generated-agent-note-index.md) owns the rationale. Implemented records with historical decision value but little future guidance move to the separate frozen [`archived/`](archived/AGENTS.md) tree described below.
The active lifecycle tree is the working inventory: browse its lifecycle/class folders or search the repository. Do not add a centralized `INDEX.md`: it duplicates path metadata and makes unrelated note changes contend on one generated file. Implemented records with historical decision value but little future guidance move to the separate frozen [`archived/`](archived/AGENTS.md) tree described below.
## Classification
@@ -39,7 +39,7 @@ Delete an implemented Agent Note that only describes small UI adjustments or pur
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
+3 -3
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>
@@ -41,7 +41,7 @@
归档路径编码为 `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
@@ -1,6 +1,7 @@
# Agent Note: Provider-neutral content-block vocabulary owned by dsh-llm
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-11-content-block-vocabulary.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 由 dsh-llm 拥有的提供方无关内容块词汇
Status: implemented
Archived: 2026-09-30
[English](2026-06-11-content-block-vocabulary.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-06-11-microkernel-event-taxonomy.md
2026-06-11-microkernel-event-taxonomy.md: 681ab6eed1dc4d8a361990e69f071b918ce297c2
2026-06-11-microkernel-event-taxonomy.zh.md: 3b7504a21be7d83969c9cee77a77c33803a41e74
@@ -1,6 +1,7 @@
# Agent Note: Microkernel — extension via Cordis event taxonomy, one concrete loop
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-11-microkernel-event-taxonomy.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 微内核——通过 Cordis 事件分类体系实现扩展,唯一具体循环
Status: implemented
Archived: 2026-09-30
[English](2026-06-11-microkernel-event-taxonomy.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-06-14-session-persistence.md
2026-06-14-session-persistence.md: 4d067d2905d764a5c0d70b0a3eae5de68cb717f4
2026-06-14-session-persistence.zh.md: 1f0f4af301a439c02fc23a1ffdc541d6bcbb24d2
@@ -1,6 +1,7 @@
# Agent Note: Session persistence as an abstract service over the existing `SessionEvent`
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-14-session-persistence.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 会话持久化作为基于现有 `SessionEvent` 的抽象服务
Status: implemented
Archived: 2026-09-30
[English](2026-06-14-session-persistence.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-06-20-generic-long-running-tool-runtime.md
2026-06-20-generic-long-running-tool-runtime.md: 7cdb72ece6ca5681ba83999dd5d95fc2c27bf318
2026-06-20-generic-long-running-tool-runtime.zh.md: bf0a5d61c0e45aa6b39c6bcd0ac71cfb9b61d43f
@@ -1,6 +1,7 @@
# Agent Note: The background job runtime (`ctx.jobs`) and generic task control tools
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-20-generic-long-running-tool-runtime.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 后台任务运行时(`ctx.jobs`)与通用任务控制工具
Status: implemented
Archived: 2026-09-30
[English](2026-06-20-generic-long-running-tool-runtime.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-06-21-mandatory-app-attribution-headers.md
2026-06-21-mandatory-app-attribution-headers.md: 680bd56301d80f87f13294bc7744a5de376425be
2026-06-21-mandatory-app-attribution-headers.zh.md: d9e19dbf8cf5a8f8594f25c0cd8565a7deb4b8a6
@@ -1,6 +1,7 @@
# Agent Note: Mandatory `User-Agent` attribution for provider requests
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-21-mandatory-app-attribution-headers.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 对提供方请求强制携带 `User-Agent` 归属标识
Status: implemented
Archived: 2026-09-30
[English](2026-06-21-mandatory-app-attribution-headers.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-06-26-file-context-as-event-gate.md
2026-06-26-file-context-as-event-gate.md: 96962f6a7260cc4da393a90349528aece3c23ce1
2026-06-26-file-context-as-event-gate.zh.md: 22fb85fc1246bb67bc0793f8cf7816b6134f11ae
@@ -1,6 +1,7 @@
# Agent Note: Make `dsh-fs-observation-policy` an event-gate plugin, not a method interface
Status: implemented
Archived: 2026-09-30
English | [中文](2026-06-26-file-context-as-event-gate.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 将 `dsh-fs-observation-policy` 改为事件门禁插件,而非方法接口
Status: implemented
Archived: 2026-09-30
[English](2026-06-26-file-context-as-event-gate.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-05-windows-jsonl-durable-publish.md
2026-07-05-windows-jsonl-durable-publish.md: f6be0b602d00daabdffc152508b0f8658fcb47a5
2026-07-05-windows-jsonl-durable-publish.zh.md: 136b4c92b44d53c6fbfcefc94b683c9cbbfc9597
@@ -1,6 +1,7 @@
# Agent Note: Windows-native durable JSONL publication
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-05-windows-jsonl-durable-publish.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Windows 原生持久 JSONL 发布
Status: implemented
Archived: 2026-09-30
[English](2026-07-05-windows-jsonl-durable-publish.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-08-agent-scope-contexts.md
2026-07-08-agent-scope-contexts.md: e6513e6dc5aab699ba12d028aa7985f8dc5e33af
2026-07-08-agent-scope-contexts.zh.md: bfb1dfdad882c51ea39fd701e5a6c549af9b2349
@@ -1,6 +1,7 @@
# Agent Note: The agent is a registration scope
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-08-agent-scope-contexts.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: agent 即注册作用域
Status: implemented
Archived: 2026-09-30
[English](2026-07-08-agent-scope-contexts.md) | 中文
@@ -1,6 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-10-after-call-compaction-pressure-and-overflow-recovery.md
2026-07-10-after-call-compaction-pressure-and-overflow-recovery.md: 89c8917484c11057ff2e6b55e2311e83f724f7ed
2026-07-10-after-call-compaction-pressure-and-overflow-recovery.zh.md: 48f954f2c4720894548ecab387965d3a3d1799b0
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-10-after-call-compaction-pressure-and-overflow-recovery.md
2026-07-10-after-call-compaction-pressure-and-overflow-recovery.md: f5b739b80022c85c9009a37de0e8b3f147f920b1
2026-07-10-after-call-compaction-pressure-and-overflow-recovery.zh.md: 303f266079e0738ed9b0c6d7a19fadce7dc77442
@@ -1,6 +1,7 @@
# Agent Note: After-call compaction pressure and context-overflow recovery
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-10-after-call-compaction-pressure-and-overflow-recovery.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 调用后压缩压力与上下文溢出恢复
Status: implemented
Archived: 2026-09-30
[English](2026-07-10-after-call-compaction-pressure-and-overflow-recovery.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-12-agent-scope-runtime-design.md
2026-07-12-agent-scope-runtime-design.md: dba700b99a622a2f38c964fcfe6a6fdcf877c45e
2026-07-12-agent-scope-runtime-design.zh.md: f5c12fce6b9829e4ada61eab44d49232fa5aa241
@@ -1,6 +1,7 @@
# Agent Note: Agent-scope runtime design and correctness
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-12-agent-scope-runtime-design.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Agent 作用域运行时设计与正确性
Status: implemented
Archived: 2026-09-30
[English](2026-07-12-agent-scope-runtime-design.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-16-explicit-turn-cancellation.md
2026-07-16-explicit-turn-cancellation.md: 23aaaae2d1f57a546ccbae7986c163e50f89fe24
2026-07-16-explicit-turn-cancellation.zh.md: 4ce379c84640a214be1fa9708426e15ecc25c1d4
@@ -1,6 +1,7 @@
# Agent Note: Explicit turn cancellation capability
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-16-explicit-turn-cancellation.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 显式轮次取消能力
Status: implemented
Archived: 2026-09-30
[English](2026-07-16-explicit-turn-cancellation.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-19-gui-web-client-architecture.md
2026-07-19-gui-web-client-architecture.md: f54f13869d748b68fd00bdfff23c2da49b8fdc81
2026-07-19-gui-web-client-architecture.zh.md: 4ab3639dac9d7e8916a0d3affb14bd965c11d783
@@ -1,6 +1,7 @@
# Agent Note: Web client architecture — the client cordis plugin tree, the slot system, and the React-free object layer
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-19-gui-web-client-architecture.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Web 客户端架构——client cordis 插件树、slot 体系与 React-free 对象层
Status: implemented
Archived: 2026-09-30
[English](2026-07-19-gui-web-client-architecture.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-19-package-invariant-runtime-contracts.md
2026-07-19-package-invariant-runtime-contracts.md: d0559b0379ce05aa9a5a0c30df4808e3088c840b
2026-07-19-package-invariant-runtime-contracts.zh.md: 0cfe61ee6344a4f6da73ffff22bb8a1b30f9f3a9
@@ -1,6 +1,7 @@
# Agent Note: Meaningful package invariant contracts
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-19-package-invariant-runtime-contracts.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 有意义的包不变量约定
Status: implemented
Archived: 2026-09-30
[English](2026-07-19-package-invariant-runtime-contracts.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-19-zstandard-jsonl-session-logs.md
2026-07-19-zstandard-jsonl-session-logs.md: 8ab55279bc94224b8b048c972bfda5c4a91a2fc8
2026-07-19-zstandard-jsonl-session-logs.zh.md: c8f1b1599c415aaec37af3f238a2a979461f855b
@@ -1,6 +1,7 @@
# Agent Note: Zstandard JSONL session logs
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-19-zstandard-jsonl-session-logs.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Zstandard JSONL 会话日志
Status: implemented
Archived: 2026-09-30
[English](2026-07-19-zstandard-jsonl-session-logs.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-20-canonical-tool-output-contract.md
2026-07-20-canonical-tool-output-contract.md: 1e2cdacdfa9100ca89840bb6ff0c98f07cecf8be
2026-07-20-canonical-tool-output-contract.zh.md: 6fa16a682a03a79d98278e2ffa543ec330550b9b
@@ -1,6 +1,7 @@
# Agent Note: Canonical tool output contract
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-20-canonical-tool-output-contract.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 规范工具输出约定
Status: implemented
Archived: 2026-09-30
[English](2026-07-20-canonical-tool-output-contract.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-20-unified-json-value-schema-dsl.md
2026-07-20-unified-json-value-schema-dsl.md: c1cc5c16f3d0e8ac65cff881a9f7b2ff51259e2a
2026-07-20-unified-json-value-schema-dsl.zh.md: 7cd7be62c47ba96914c802b208fd87640849b3eb
@@ -1,6 +1,7 @@
# Agent Note: Unified JSON-value schema DSL
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-20-unified-json-value-schema-dsl.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 统一 JSON 值 schema DSL
Status: implemented
Archived: 2026-09-30
[English](2026-07-20-unified-json-value-schema-dsl.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-24-project-session-directories.md
2026-07-24-project-session-directories.md: 92a8ea11b8150b7c60fe76ae1354c5fadddd13c9
2026-07-24-project-session-directories.zh.md: 1850f04366deb79709b2bc51db194098eab9a95e
@@ -1,6 +1,7 @@
# Agent Note: Project-grouped session directories
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-24-project-session-directories.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 按项目分组的会话目录
Status: implemented
Archived: 2026-09-30
[English](2026-07-24-project-session-directories.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-24-web-config-tree-boot-and-transport-layering.md
2026-07-24-web-config-tree-boot-and-transport-layering.md: 7f1a619796158be987e58fa718af119421e477fa
2026-07-24-web-config-tree-boot-and-transport-layering.zh.md: 6f0dc590944f3994752ef1de06de46a843fdbc94
@@ -1,6 +1,7 @@
# Agent Note: dsh web config-tree boot and the web transport layering
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-24-web-config-tree-boot-and-transport-layering.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: dsh web 的 config-tree boot 与 web 传输分层
Status: implemented
Archived: 2026-09-30
[English](2026-07-24-web-config-tree-boot-and-transport-layering.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-25-web-client-session-scope-and-provide-channel.md
2026-07-25-web-client-session-scope-and-provide-channel.md: 9afd2419c24f21b903c6e2c692cc6ee943244e07
2026-07-25-web-client-session-scope-and-provide-channel.zh.md: 2385cfc8edde2dd65291037ea6d0d18c90f720d4
@@ -1,6 +1,7 @@
# Agent Note: Web client Agent-scope parity model and the provisioning channel (agents/scope / blank reuse / provide)
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-25-web-client-session-scope-and-provide-channel.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Web client Agent-scope 对等模型与供数通道(agents/scope / blank 复用 / provide)
Status: implemented
Archived: 2026-09-30
[English](2026-07-25-web-client-session-scope-and-provide-channel.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-30-session-end-seed-log-boundary.md
2026-07-30-session-end-seed-log-boundary.md: d7025aac7a69ffafd4f64a2f73d202e7107452b2
2026-07-30-session-end-seed-log-boundary.zh.md: 5c6227c5866b8a12506709726a1a0f93a8a6dcdc
@@ -1,6 +1,7 @@
# Agent Note: the end-seed log boundary
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-30-session-end-seed-log-boundary.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 种子结束日志边界
Status: implemented
Archived: 2026-09-30
[English](2026-07-30-session-end-seed-log-boundary.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-07-31-claimed-pre-step-inbox-lifecycle.md
2026-07-31-claimed-pre-step-inbox-lifecycle.md: 1f5d06b7314e1433880e17cc370a842b153fe287
2026-07-31-claimed-pre-step-inbox-lifecycle.zh.md: f31790826ea3464ab519a5b21084834390075526
@@ -1,6 +1,7 @@
# Agent Note: Claim inbox input before one pre-step decision
Status: implemented
Archived: 2026-09-30
English | [中文](2026-07-31-claimed-pre-step-inbox-lifecycle.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 在单一 pre-step 决策前领取 inbox 输入
Status: implemented
Archived: 2026-09-30
[English](2026-07-31-claimed-pre-step-inbox-lifecycle.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-08-04-draft-provider-endpoint-interrogation.md
2026-08-04-draft-provider-endpoint-interrogation.md: d6de95d91b4c045d4eca793ca7190f6d148888d4
2026-08-04-draft-provider-endpoint-interrogation.zh.md: eb72884a7119db36549d64a613a5f9d927a1d30a
@@ -1,6 +1,7 @@
# Agent Note: Interrogating a draft provider endpoint
Status: implemented
Archived: 2026-09-30
English | [中文](2026-08-04-draft-provider-endpoint-interrogation.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 询问草稿中的提供方端点
Status: implemented
Archived: 2026-09-30
[English](2026-08-04-draft-provider-endpoint-interrogation.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-08-10-remote-event-delivery.md
2026-08-10-remote-event-delivery.md: c5c68db6e280dcd10344d019d7f961bd0530f965
2026-08-10-remote-event-delivery.zh.md: 86c1321fd153ea0e062193f95e31aafbf0dd6c46
@@ -1,6 +1,7 @@
# Agent Note: Remote event delivery (`ctx.remote.$on`)
Status: implemented
Archived: 2026-09-30
English | [中文](2026-08-10-remote-event-delivery.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Remote 事件投递(ctx.remote.$on)
Status: implemented
Archived: 2026-09-30
[English](2026-08-10-remote-event-delivery.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-08-18-experimental-agent-teams-packages.md
2026-08-18-experimental-agent-teams-packages.md: 358eec1f0d51286fe1bfb8b6b7ab71a858c26bef
2026-08-18-experimental-agent-teams-packages.zh.md: f511a2b5ae5560d8cae0f5925e67b7ea00da49c3
@@ -1,6 +1,7 @@
# Agent Note: Publish Agent Teams under experimental package names
Status: implemented
Archived: 2026-09-30
English | [中文](2026-08-18-experimental-agent-teams-packages.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 以实验性包名发布 Agent Teams
Status: implemented
Archived: 2026-09-30
[English](2026-08-18-experimental-agent-teams-packages.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-08-28-subprocess-native-containment.md
2026-08-28-subprocess-native-containment.md: ea47118fa7da79bc56bfdba9fe08eb91d04c6a51
2026-08-28-subprocess-native-containment.zh.md: 750315d4b406cd0a802b91314e4cd4a77a19a99e
@@ -1,6 +1,7 @@
# Agent Note: Native owners contain escaped subprocess descendants
Status: implemented
Archived: 2026-09-30
English | [中文](2026-08-28-subprocess-native-containment.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 原生 owner 收容逃逸的 subprocess 后代
Status: implemented
Archived: 2026-09-30
[English](2026-08-28-subprocess-native-containment.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-09-01-jobs-absorb-activity-record.md
2026-09-01-jobs-absorb-activity-record.md: e5543737155cc75f62485d8b125a7fa178e63ca0
2026-09-01-jobs-absorb-activity-record.zh.md: 1f6e283c7924e2a30cc6f617396e4e0c9852e7e0
@@ -1,6 +1,7 @@
# Agent Note: The job registry absorbs the observation record; the standalone activity seam is removed
Status: implemented
Archived: 2026-09-30
Superseded: the record declaration (`JobStart.record`, `RecordingJob`, `readRecord`, `pumpJobOutput`) and the split wire (`SessionJob.record` on the session control stream, `ctx.jobOutput`) described below were consolidated into one output ring and direct operations on `ctx.jobs` — see [the jobs seam consolidation](2026-09-03-jobs-seam-consolidation.md). The argument for absorbing the standalone activity seam into `ctx.jobs` still holds.
@@ -1,6 +1,7 @@
# Agent Note:job 注册表吸收观测 record;独立的 activity seam 被移除
Status: implemented
Archived: 2026-09-30
Superseded:下文描述的 record 声明(`JobStart.record`、`RecordingJob`、`readRecord`、`pumpJobOutput`)与拆分的线路(会话控制流上的 `SessionJob.record`、`ctx.jobOutput`)已收敛为一个输出环与 `ctx.jobs` 上的直接操作——见 [jobs seam 收敛](2026-09-03-jobs-seam-consolidation.zh.md)。把独立 activity seam 吸收进 `ctx.jobs` 的论证仍然成立。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-09-02-projcache-cross-version-read-compat.md
2026-09-02-projcache-cross-version-read-compat.md: 22722e7bb41c2d06ffbdf433aad10a9647abce3f
2026-09-02-projcache-cross-version-read-compat.zh.md: a928c40bfa6d294b2ed927a381528ccc260692ea
@@ -1,6 +1,7 @@
# Agent Note: Projection-cache predecessor recovery and Session-format binding (session_projcache v3-v6 → v7)
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-02-projcache-cross-version-read-compat.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 投影缓存前代恢复与 Session 格式绑定(session_projcache v3-v6 → v7)
Status: implemented
Archived: 2026-09-30
[English](2026-09-02-projcache-cross-version-read-compat.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-09-05-package-manifest-types.md
2026-09-05-package-manifest-types.md: 63c2dd833508d2246ba818b584eabe5c02846c07
2026-09-05-package-manifest-types.zh.md: 794983e05b914705eb431d204470cd67d512fab4
@@ -1,6 +1,7 @@
# Agent Note: Package manifest declaration ownership
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-05-package-manifest-types.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: Package manifest 声明归属
Status: implemented
Archived: 2026-09-30
[English](2026-09-05-package-manifest-types.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-09-05-sidebar-tab-types-and-navigation.md
2026-09-05-sidebar-tab-types-and-navigation.md: a2eaed465332d1dc9adc4a770554ecac69535920
2026-09-05-sidebar-tab-types-and-navigation.zh.md: 60d0fc9ae20e6e234939a2cf45233a5c6bd602e9
@@ -1,6 +1,7 @@
# Agent Note: Right Sidebar tab types and navigation
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-05-sidebar-tab-types-and-navigation.zh.md)
@@ -72,7 +73,7 @@ interface SidebarRightTabParamsMap {} // key: kind — a page type declar
`openResource` accepts the union of every declared resource shape and `openTab<K>` the shape declared for `K`; a body narrows `navigation.params` by the protocol or kind it knows it serves. Parameters belong to the resource type rather than to the viewer because a line number is a fact about a file location, not about the text preview, and any type that claims `file` addresses receives the same shape. Values must be JSON-serializable, and a record must be rebuildable from address and parameters alone, because undo, redo, reload, and HMR rebuild tabs after the opener is gone.
Beside the two opens, the face carries `close(tabId)`, `active()`, `isExpanded()`, `toggleExpanded()`, and four operational methods — `focus(tabId)`, `split(paneId?)` (returning the new pane, or `undefined` when the pane budget or the width rule forbids the split, recording nothing), `float(tabId, rect?)`, and `dock(paneId)` — each recording one history entry and a no-op on a missing target or one already in the requested state. There is no layout snapshot, no subscription, and no lookup by address: the face grants control over the layout, not a view of it. The seat publishes its binding — its session, its store's actions, and its surface — while mounted; a command on the public face acts on the mounted session and throws with no mounted session surface. A tab's own actions reach their session's own store instead: the slot runtime mints one store per session, the plugin adopts each as it is minted, and the controller routes by session id, so an action fired after the user switched sessions still lands, and does nothing for a session whose store was never minted.
Beside the two opens, the face carries `close(tabId)`, `active()`, `isExpanded()`, `toggleExpanded()`, and four operational methods — `focus(tabId)`, `split(paneId?)` (returning the new pane, or `undefined` when the pane budget or the width rule forbids the split, recording nothing), `float(tabId, rect?)`, and `dock(paneId)` — each recording one history entry and a no-op on a missing target or one already in the requested state. There is no layout snapshot, no subscription, and no lookup by address: the face grants control over the layout, not a view of it. The plugin names the Session on screen — the selected Session while the Conversation fills the main column — from the Session selection and the main panel, before React renders either change, and publishes it as `mounted`; a command on the public face acts on that Session through its adopted store and throws when no Session is on screen or its store has not been minted. The seat reports only what it renders with: the room its docking kit measured and whether its frame width presents the panel fullscreen automatically. A tab's own actions reach their session's own store instead: the slot runtime mints one store per session, the plugin adopts each as it is minted, and the controller routes by session id, so an action fired after the user switched sessions still lands, and does nothing for a session whose store was never minted.
### Addresses
@@ -100,6 +101,8 @@ The conversation's `openFile(path, { line? })` — tool-row path links, produced
**Slot priorities to express an extension taking over a builtin, then registry-minted slot keys.** The first attempt had the overriding type register its body at a lower slot priority through an exported constant — a value import across dynamic plugins, and a second rule system (slot priority) standing in for the registry's. The second attempt had the registry mint a key per registration and return it from `register()`, which made registration a two-step dance whose ordering mattered. Letting the implementation declare its own `id` — required, unique, the same string it registers its seats under — needs no constant, no minting, and no ordering, and gives the registry the identity it needs to reject duplicates.
**A binding the seat publishes from its own effects.** The first form had the mounted seat publish its session, actions, and surface after each commit and release them when it left. React runs a commit's passive effects in tree order, and the frame renders the Conversation column before the right column, so in a commit that switched Sessions or returned from a global panel a Conversation component opening content from its effect ran while no seat was bound — after the departing seat's release and before the arriving seat's bind — and the open threw. The Session selection and the main panel change before React renders, so deriving the on-screen Session from them removes that ordering dependency. The seat still measures pane room, because only its rendered kit can.
## Consequences
- A type is one static object plus one or two keyed seat registrations; its occurrence information is read through injected `useTabInfo()`. The framework grows no per-type API surface, and a type shipped from outside this repository imports only types from the Sidebar package.
@@ -116,5 +119,5 @@ The conversation's `openFile(path, { line? })` — tool-row path links, produced
## Deferred
- A navigation protocol beyond `sidebar://<kind>`: sub-routes within a page, naming an implementation, and the ecosystem-facing rules for other navigation schemes.
- Opening into a session other than the one on screen from the public face, which acts on the mounted session only; a tab's own actions already act on their tab's session.
- Opening into a session other than the one on screen from the public face, which acts on the on-screen Session only; a tab's own actions already act on their tab's session.
- A localized message when an open fails from the conversation; the failure is currently the thrown error's text.
@@ -1,6 +1,7 @@
# Agent Note: 右侧 Sidebar 的 tab 类型与导航
Status: implemented
Archived: 2026-09-30
[English](2026-09-05-sidebar-tab-types-and-navigation.md) | 中文
@@ -72,7 +73,7 @@ interface SidebarRightTabParamsMap {} // key: kind — a page type declar
`openResource` 接受所有已声明资源形状的联合,`openTab<K>` 接受为 `K` 声明的形状;正文按自己所服务的协议或 kind 收窄 `navigation.params`。参数属于资源类型而非查看器,因为行号是关于文件位置的事实,不是关于文本预览的,任何认领 `file` 地址的类型收到同一形状。值必须可 JSON 序列化,一条记录必须只凭地址与参数就能重建,因为撤销、重做、刷新与 HMR 都在开启方已不在时重建 tab。
除两种打开外,该面还有 `close(tabId)`、`active()`、`isExpanded()`、`toggleExpanded()`,以及四个操作型方法——`focus(tabId)`、`split(paneId?)`(返回新格,预算或宽度规则不允许分栏时返回 `undefined` 且不记账)、`float(tabId, rect?)` 与 `dock(paneId)`——每个记一条历史,目标不存在或已在目标态时为 no-op。没有布局快照、没有订阅、没有按地址查找:该面给的是对布局的控制权,不是布局的视图。座位挂载期间发布其绑定——自己的会话、其 store 的 action 与其面;公开面上的命令作用于已挂载会话,没有已挂载会话面时抛错。tab 自己的动作则到达其会话自己的 store:slot 运行时每个会话铸一个 store,插件在铸出时逐个收养,控制器按会话 id 路由,因此用户切换会话之后触发的动作照样落地,而 store 从未铸出的会话什么也不做。
除两种打开外,该面还有 `close(tabId)`、`active()`、`isExpanded()`、`toggleExpanded()`,以及四个操作型方法——`focus(tabId)`、`split(paneId?)`(返回新格,预算或宽度规则不允许分栏时返回 `undefined` 且不记账)、`float(tabId, rect?)` 与 `dock(paneId)`——每个记一条历史,目标不存在或已在目标态时为 no-op。没有布局快照、没有订阅、没有按地址查找:该面给的是对布局的控制权,不是布局的视图。插件依据会话选择与主面板确定屏上会话——Conversation 占据主栏时的选中会话——并在 React 渲染这两者的变化之前将其发布为 `mounted`;公开面上的命令经该会话被收养的 store 作用于它,没有会话在屏上或其 store 尚未铸出时抛错。座位只上报它渲染时依据的事实:停靠套件测得的空间,以及框架宽度是否让面板自动全屏。tab 自己的动作则到达其会话自己的 store:slot 运行时每个会话铸一个 store,插件在铸出时逐个收养,控制器按会话 id 路由,因此用户切换会话之后触发的动作照样落地,而 store 从未铸出的会话什么也不做。
### 地址
@@ -100,6 +101,8 @@ interface SidebarRightTabParamsMap {} // key: kind — a page type declar
**用 Slot 优先级表达 extension 接管 builtin,随后是注册表铸造的坑位键。** 第一次尝试让覆盖方经一个导出常量以更低的 Slot 优先级注册正文——这是动态插件间的值引用,也是拿第二套规则(Slot 优先级)替注册表的规则站台。第二次尝试让注册表为每次注册铸一个键并从 `register()` 返回,这把注册变成了两步且顺序敏感的舞步。让实现自己声明 `id`——必填、唯一、与它注册坑位所用的同一个串——既不需要常量,也不需要铸键与顺序,还给了注册表拒绝重复所需的身份。
**由座位在自己的 effect 里发布绑定。** 最初的形式由已挂载的座位在每次提交后发布自己的会话、action 与面,离开时释放。React 按树序运行一次提交的被动 effect,而框架先渲染 Conversation 列、后渲染右栏,于是在切换会话或从全局面板返回的那次提交里,从自己 effect 打开内容的 Conversation 组件运行时没有任何座位已绑定——在离开的座位释放之后、到来的座位绑定之前——打开随之抛错。会话选择与主面板都在 React 渲染之前变化,从它们推导屏上会话便消除了这一顺序依赖。分栏空间仍由座位测量,因为只有它渲染出的套件能测。
## Consequences
- 一个类型 = 一个静态对象 + 一到两个 keyed 坑位注册;其实例信息通过注入的 `useTabInfo()` 读取。框架不长任何按类型的 API 面,仓外类型从 Sidebar 包只引类型。
@@ -116,5 +119,5 @@ interface SidebarRightTabParamsMap {} // key: kind — a page type declar
## Deferred
- `sidebar://<kind>` 之外的导航协议:页内子路由、点名实现、以及面向生态的其它导航 scheme 规则。
- 从公开面往屏上会话之外的会话里打开;公开面只作用于已挂载的会话,而 tab 自己的动作已作用于其所在会话。
- 从公开面往屏上会话之外的会话里打开;公开面只作用于屏上会话,而 tab 自己的动作已作用于其所在会话。
- 从会话区打开失败时的本地化提示;目前是抛错文本本身。
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-09-06-embedded-stream-record-readers.md
2026-09-06-embedded-stream-record-readers.md: 88a15f50f8d122676b1b5d2c7df39aa7b7e7b331
2026-09-06-embedded-stream-record-readers.zh.md: a66dbc69c788a05569859de7de4bc43b985183ff
@@ -1,6 +1,7 @@
# Agent Note: Embedded Assistant stream consumers read compact records
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-06-embedded-stream-record-readers.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 内嵌 Assistant 流的消费方直接读取紧凑记录
Status: implemented
Archived: 2026-09-30
[English](2026-09-06-embedded-stream-record-readers.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-09-07-sidebar-responsive-tab-info.md
2026-09-07-sidebar-responsive-tab-info.md: e47ad9cd1a9b24b783d5acec780f0a2af6303727
2026-09-07-sidebar-responsive-tab-info.zh.md: d2e3c84b76ffad6f52f7db1d13158ed51e3d5624
@@ -1,6 +1,7 @@
# Agent Note: Responsive Sidebar and injected tab information
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-07-sidebar-responsive-tab-info.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 响应式 Sidebar 与注入的标签信息
Status: implemented
Archived: 2026-09-30
[English](2026-09-07-sidebar-responsive-tab-info.md) | 中文
@@ -0,0 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/archived/architecture/2026-09-07-workspace-files-dual-face-package.md
2026-09-07-workspace-files-dual-face-package.md: dbefb894291ac7c0b3e7847c75a7bd4d19c19d3e
2026-09-07-workspace-files-dual-face-package.zh.md: c10a46736982a2b326bcedae11723feef6871476
@@ -1,6 +1,7 @@
# Agent Note: Workspace files as one dual-face API package
Status: implemented
Archived: 2026-09-30
English | [中文](2026-09-07-workspace-files-dual-face-package.zh.md)
@@ -1,6 +1,7 @@
# Agent Note: 工作区文件统一为 API 双面包
Status: implemented
Archived: 2026-09-30
[English](2026-09-07-workspace-files-dual-face-package.md) | 中文
Loaded 100 of 6388 files, more files were not shown because too many files have changed in this diff. Show more