Commit Graph
20768 Commits
Author SHA1 Message Date
Tianyi Cui df41b7cd2d fix(credentials-local): contain watcher errors that arrive after close
chokidar's close() drops every listener while a scheduled write-settle poll
can still run. That straggler stats a document the home teardown is
deleting, which Windows reports as EPERM, and an 'error' emission with no
listener is rethrown as an uncaught exception: the whole coverage
partition fails while every test file passes.

Re-attach the provider's error listener across the close so the straggler
stays inside the provider, and make it a no-op after disposal.
2026-10-05 09:38:53 +08:00
Tianyi Cui 534acc5952 Merge pull request #3649 from deepseek-harness/fix/packed-install-private-npm-cache
fix(release): isolate packed-install npm cache
2026-10-05 09:23:14 +08:00
Tianyi Cui c1b0e84b95 Merge pull request #5079 from deepseek-harness/worktree/python-live-smoke-ack-20260923
test(python): accept standalone live smoke acknowledgements
2026-10-05 09:18:47 +08:00
Tianyi Cui d2d8c47b4a Merge pull request #5459 from deepseek-harness/worktree/installer-root-validation
fix(desktop): reject canonical drive roots in installer
2026-10-05 09:10:39 +08:00
Tianyi Cui 454c6bfa83 Merge pull request #5620 from deepseek-harness/test/dynamic-tool-cache-e2e-flake-2d600396
test(sdk): keep the dynamic tool cache e2e tolerant of extra model calls
2026-10-05 09:10:17 +08:00
Tianyi Cui d6b2430df1 Merge master checkpoint a2ac28a6 into packed-install cache fix 2026-10-05 09:09:23 +08:00
Tianyi Cui 3ca9334868 Merge observed master checkpoint to resolve Python smoke pairing conflict 2026-10-05 09:05:54 +08:00
Tianyi Cui ef9944a01f Merge pull request #5625 from deepseek-harness/worktree/native-handler-fixture-01a0f9ff
test(native-command): publish Windows handler marker atomically
2026-10-05 09:04:37 +08:00
Tianyi Cui 7f83658b4a fix(desktop): reject canonical drive roots in installer 2026-10-05 08:53:27 +08:00
Tianyi Cui 22e627169e Merge branch 'master' into test/dynamic-tool-cache-e2e-flake-2d600396 2026-10-05 08:50:31 +08:00
Tianyi Cui 0f51ba0737 Merge pull request #5629 from deepseek-harness/test/llm-retry-transport-recovery-timeout-c2c45a16
fix(timeout): end an idle demand the transport abandons
2026-10-05 08:45:18 +08:00
Tianyi Cui 6f88bed362 Merge pull request #5689 from deepseek-harness/worktree/pi-ai-1.0.2-20261004
build(llm-pi-ai): upgrade @earendil-works/pi-ai to 1.0.2
2026-10-05 08:07:26 +08:00
Tianyi Cui 21fe89affe build(llm-pi-ai): upgrade @earendil-works/pi-ai to 1.0.2
pi-ai 1.0.1 and 1.0.2 bring model catalog updates and adapter fixes:
Anthropic native tool changes define later tools inline, Bedrock binds
replayed thinking blocks, OpenAI-compatible requests can pick sampling
parameters by thinking level, and "model is at capacity" is retried.
The runtime dependencies change only in @anthropic-ai/sdk (0.124.0 to
0.129.0) and @earendil-works/pi-telemetry (^1.0.2).

1.0.2 still re-parses the whole accumulated tool-argument JSON on every
stream delta (earendil-works/pi#9265), so the patch is regenerated
against the 1.0.2 sources: it removes the same six per-delta parses as
the 1.0.0 patch, and only the bedrock-converse-stream.js hunk moves, by a
line.
2026-10-05 06:40:08 +08:00
Tianyi Cui 3d0e274859 Merge pull request #5659 from deepseek-harness/worktree/pi-compat-notes-20261003
docs(agent-notes): propose Pi extensions bridge and Pi plugin support levels
2026-10-04 22:35:30 +08:00
Tianyi Cui b3f8bec8e8 docs(agent-notes): address review of the Pi compatibility notes
State the Pi-to-DSH direction of the built-in tool translation, how setActiveTools treats Agent-scoped extension tools, that module-scope extension state is shared by concurrent Sessions, which format edges retain plugin records, and that SessionStartSource already declares clear and compact. Date the npm package count and narrow the plugin note's opening sentence.
2026-10-04 05:08:15 +08:00
Tianyi Cui 61cbe84624 docs(agent-notes): link the issue tracking each core gap
Add the GitHub issue number to each row of the Pi extensions bridge note's core-gap table, and state which rows follow from DSH rules.
2026-10-04 04:52:14 +08:00
Tianyi Cui 6500cacbb2 docs(agent-notes): propose Pi extensions bridge and Pi plugin support levels
Record two proposals from the Pi 1.0.0 compatibility investigation.

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

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

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

The release-age exemption moves to the exact 1.0.0 pi-ai and
pi-telemetry versions, and the generated third-party notices and README
links name the new patch file.
2026-10-04 02:09:17 +08:00
Tianyi Cui 2ac5313009 Merge pull request #5650 from deepseek-harness/worktree/session-v4-release-record
docs(session): record the published V4 format
2026-10-03 23:18:42 +08:00
Tianyi Cui e166240405 docs(session): keep release status in the published state 2026-10-03 11:55:48 +08:00
Tianyi Cui 5badb15009 Merge pull request #5648 from deepseek-harness/worktree/release-dsh-0.2.1-alpha.1
release(dsh): prepare 0.2.1-alpha.1
dsh-v0.2.1-alpha.1
2026-10-03 11:48:13 +08:00
Tianyi Cui 7c22428471 docs(session): record the published V4 format 2026-10-03 11:37:09 +08:00
Tianyi Cui ec48669f48 release(dsh): 0.2.1-alpha.1 2026-10-03 10:46:11 +08:00
Tianyi Cui edcbb89bc8 Merge pull request #5646 from deepseek-harness/worktree/release-vendor-0.2.1-alpha.1
release(vendor): prepare isolated prereleases for DSH 0.2.1-alpha.1
2026-10-03 10:32:53 +08:00
Tianyi Cui 9c45de099f Merge pull request #5643 from deepseek-harness/worktree/release-vendor-channel
feat(release): support isolated npm publication channels
2026-10-03 10:18:21 +08:00
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