Install / Update
Install the dsh-context plugin on DeepSeek Harness with released NPM package:
dsh plugin --profile web add dsh-context@latestUpdate the dsh-context plugin:
dsh plugin --profile web update dsh-context@latestWhat's New
Engineering note: this compatibility rework landed as a single long-horizon agent task — ~110 minutes, ~710M tokens end to end — from reverse-engineering every 0.1.2-alpha.1 breaking change in the harness source to a shipped release, verified entirely through browser automation + visual QA against a live DeepSeek Harness booted from both 0.1.1-rc.2 and 0.1.2-alpha.1 (zero console errors, zero page errors across every surface).
- Full 0.1.2-alpha.1 compatibility — with 0.1.1-rc.2 retained — 0.1.2 rewrote the client composition (the
dsh-client-runtimemonolith is gone) and the entire history transport, and every plugin faced a rewrite. This release stops assuming and starts probing: each seam resolves by feature detection at runtime, older faces first, and every miss degrades one feature instead of ever erroring a page.- History reads:
remote.session.page(the 0.1.2 gateway transport, the inclusive cutthroughSeqpinned to the target seq) over the 0.1.1sessions.historyverb. Both served envelopes unwrap ({ok, value}and{result: {ok, value}}), packed chunk-row records skip (final events always ride verbatim), and a malformed payload rejects into the retryable "load failed · retry" state — never a silent "not in the log" claim. - Conversation-window join: prefers 0.1.2's
useChat(ChatSnapshot.legacy.nodes) and falls back to the 0.1.1 session snapshot, both seats invoked in a stable hook order — this fixes the empty File Activity card on 0.1.2 (#26). - Image cards: accept
uiConversation.imageUrl(0.1.2) orconversation.resolveImage(0.1.1); absent faces degrade to metadata-only cards. /contextcommand: waits for theinputTriggersservice (ctx.inject) instead of racing module arrival order, which 0.1.2's finer module graph broke; the modal resolvessessionsat close time for the same reason. Open → Escape → token consumption verified end to end on both versions.
- History reads:
- No more undefined on the wire (#29, #30) — the served
contextTimelineview now joinsmodel/provider/contextWindowby conditional spread, so a fresh blank session can no longer emit a non-lossless-JSON projection value that fails every push frame for the session. This is the exact root cause reported in #29/#30 (anundefined-valued view field), now fixed in the shipped package and guarded by plain-JSON view assertions on both the unknown and known model shapes. - One definition object, every registry generation — the projection units are typed against the full dual contract: pre-0.1.1
schema/view, 0.1.1+stateSchema/wire, and 0.1.2's widenedinit(header). The same unit installs unchanged from 0.1.0-rc.7 through 0.1.2-alpha.1,dsh.clientdeclarations and the client bundle's module-purity table track the 0.1.2 module graph, and the dsh peer ranges widen to>=0.1.0-rc.7.
Commits
- fix(host): keep undefined-valued scalars off the wire view (#29, #30) (d25d44a)
- refactor(host): mirror both projection unit contracts across registry generations (6e46d65)
- feat(browser): dual-face compatibility across the dsh 0.1.1/0.1.2 seams (#26) (7b61d5d)
- build: track the 0.1.2 client module graph (1dab8dc)
- release: v0.37.0 (6d17588)
v0.36.0...v0.37.0 · 5 commits