Commit Graph
14237 Commits
Author SHA1 Message Date
Tianyi Cui ec48669f48 release(dsh): 0.2.1-alpha.1 2026-10-03 10:46:11 +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 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 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 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 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
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
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 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 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 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 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