Commit Graph
18801 Commits
Author SHA1 Message Date
Dudu-0223 1e437229da test(subagent): inspect children before activation completion 2026-09-21 10:43:43 +08:00
Dudu-0223 fb41430414 Merge remote-tracking branch 'origin/master' into refactor/subagent 2026-09-21 10:37:54 +08:00
Dudu-0223 ef88d6a277 refactor(subagent): deliver activation results after teardown 2026-09-21 10:37:26 +08:00
imccyu 37535cf44a Merge pull request #4753 from deepseek-harness/fix/pr-4749-review
fix(chat): address presentation review findings
2026-09-21 00:46:02 +08:00
imccyu 4533be9531 fix(chat): address presentation review findings 2026-09-21 00:32:43 +08:00
imccyu b173fe1c19 Merge pull request #4749 from deepseek-harness/feat/chat-presentation-channel
feat(ui-chat): restore independent work-detail presentation from #4565
2026-09-21 00:10:18 +08:00
Turtle 3f7016a422 feat(config): add volatile schemas and watcher-driven updates (#4579)
* feat(cordis): add volatile config references without remounting

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

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

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

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

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

* refactor(config): separate comparison from volatile reconciliation

* refactor(loader): extract pure entry option diff

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

* refactor(loader): make volatile comparison policy explicit

* refactor: name config reload and volatile HMR events

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

`openWorkspace` now shows the failure through the shared Workspace
notice as a `createFailed` toast quoting the Host's stable code and
message on the long hold, then rethrows as before. Startup restoration
does not go through `openWorkspace` and stays console-only.
2026-09-20 22:40:00 +08:00
winewill 6446944fa6 Merge pull request #4669 from deepseek-harness/build/test-release-path-id
build(desktop): isolate test downloads by release ID
2026-09-20 22:06:58 +08:00
winewill 338eea071e Merge remote-tracking branch 'origin/master' into build/test-release-path-id 2026-09-20 21:59:07 +08:00
07akioni 287f879d67 Merge pull request #4738 from deepseek-harness/fix/4728-macos-localizations
fix(desktop): 修复 macOS 中文系统首次启动默认英文
2026-09-20 21:50:03 +08:00
winewill b793dd2df6 Merge remote-tracking branch 'origin/master' into build/test-release-path-id
# Conflicts:
#	apps/desktop/scripts/desktop-package-environment.mjs
#	apps/desktop/tests/package-target-stages.spec.ts
2026-09-20 21:46:58 +08:00
07akioni 27fa7ed9ff Merge pull request #4681 from deepseek-harness/xtr/default-workspace-first-send
feat(workspace): prepare a default workspace on startup
2026-09-20 21:04:06 +08:00
Christina Lee ea05e57b60 Merge branch 'master' into fix/4728-macos-localizations 2026-09-20 20:56:39 +08:00
liyao 942e496ce7 fix(desktop): declare macOS bundle localizations 2026-09-20 20:45:29 +08:00
Turtle 31e6b3f150 fix(client): rotate every ongoing StateDot loader in phase (#4737)
CSS animations start when their element is inserted, so loaders mounted
at different moments rotated out of step in the sidebar session list.
The ongoing loader now pins its spin and dash animations to document
time zero on mount so every visible loader shares one phase.
2026-09-20 20:45:23 +08:00
_Kerman a4fdaebf52 Merge remote-tracking branch 'origin/master' into xtr/default-workspace-first-send 2026-09-20 20:44:25 +08:00
_Kerman 5ec3353af2 refactor(workspace): reuse toast for default initialization failures 2026-09-20 20:42:50 +08:00
imccyu 2411452433 Merge pull request #4707 from deepseek-harness/subagent-catalog
perf(session): avoid duplicate cold reads on conversation open
2026-09-20 19:27:13 +08:00
winewill 2c233c64f0 Merge pull request #4716 from deepseek-harness/feat/current-version-display
feat(client): 在通用设置展示当前版本号
2026-09-20 19:19:04 +08:00
imccyu 42f9a76b77 test(client): align remaining navigation refresh expectations 2026-09-20 18:58:22 +08:00
Yudong Han a25780c63b Merge pull request #4725 from deepseek-harness/fix/sidebar-excel-default-app 2026-09-20 18:45:17 +08:00
imccyu 045e2f9360 test(client): omit absent optional Session fixture fields 2026-09-20 18:41:30 +08:00
imccyu ad2dad1186 test(client): cover auxiliary reads with retained Session fixtures 2026-09-20 18:41:30 +08:00
imccyu d25490d8b4 test(subagent): replace legacy unknown cast with typed fixture 2026-09-20 18:41:30 +08:00
imccyu 280048d868 fix(client): align navigation callbacks and projection tests 2026-09-20 18:41:30 +08:00
imccyu d088572e11 fix(session): declare persistence identity for Typert analysis 2026-09-20 18:41:30 +08:00
imccyu be0d63661c perf(client): remove redundant projection reads from navigation 2026-09-20 18:41:29 +08:00
imccyu dfff5056f4 perf(client): defer auxiliary reads until history is ready 2026-09-20 18:41:29 +08:00
imccyu 6fef0f0af9 fix(session-query): stabilize persistence cache identity 2026-09-20 18:41:29 +08:00
Turtle 2099andTurtle e8f3d02da8 fix(web): batch session expansion and keep running sessions visible (#4715)
* fix(web): expand workspace sessions in bounded batches

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

---------

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

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

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

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

Also close the review nits: assert the settings.general.item rows dispose
on unload, give the localized-label cases distinct titles (%s printed the
dictionary object, so both read "[object Object]"), complete the
CurrentVersionRow @param, and note why current-version orders last.
2026-09-20 18:18:13 +08:00
ZiyaZhang d620c1e4b7 fix(web): soften segmented tab focus styling 2026-09-20 03:08:34 -07:00
ZiyaZhang 5aa0e3f806 test(web): align developer tools check with preset copy 2026-09-20 03:00:57 -07:00
Dudu-0223 703bf4d504 Merge master after validating subagent cleanup 2026-09-20 17:59:25 +08:00
Dudu-0223 c882069928 test(subagent): record creation-only external catalogs 2026-09-20 17:53:43 +08:00
imccyu ffea3c8818 fix(gateway): close the remaining uplink lifecycle gaps 2026-09-20 17:53:18 +08:00