All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Client dependency-surface migration. The browser half no longer
type-imports the removed
@deepseek-ai/dsh-client-runtimepackage: it rides the cordisContextplus the published client packages, and the frozen tool-call block is read through a local structural contract (the published0.1.1-rc.2line keeps the block union in the removed runtime package, and the unreleased0.1.2-alpha.1host owns it in the unpublisheddsh-client-ui-chat). The tsdown external list and the tsconfig paths drop the runtime entries; peers, devDeps, and the client inject manifest dropdsh-client-runtime. - Envelope-less host calibration. The session-event gate docs now cover
0.1.2-alpha.1, which removed theignorableenvelope and fails closed on unknown event types at read: the probe reports no support there and everydraw/generatedcommit degrades to the in-memory fallback ledger (already the fail-safe behavior). - Tests derive the call-id brand from the
dsh-toolsexecution contract (tests/call-id.ts) instead of importingCallIdfromdsh-llm, which host master renamed toToolCallId.
- Declare the web-client inject packages (
@deepseek-ai/dsh-client-connection,@deepseek-ai/dsh-client-locale,@deepseek-ai/dsh-client-runtime,@deepseek-ai/dsh-client-ui-settings,@deepseek-ai/dsh-client-ui-slots,@deepseek-ai/dsh-client-ui-tool) as optional peerDependencies so the bundle composition is explicit and standalone installs stay clean.
- Pluggable engine provider seam (Replicate / fal.ai).
- Presenter pure-function suite (
tests/present.spec.ts, 11 tests):presentDrawResultandpresentDrawPanelare pinned directly on their arguments — settled/error/foreign/null-call-head blocks, meta fallbacks, regenerate-args parsing, engine-row projection, and the cooldown flag.
presentDrawPanelnow takes an optionalnowclock (defaultDate.now) so the cooldown flag is a pure function of its inputs and testable without fake timers; theimage_generatetool surface and the settings tab are unchanged.
- The five-language README "Development" section reported a stale
77 tests, 11 suites; it now matches the actual107 tests, 16 test files. src/version.tsreferenced a non-existenttests/version.spec.ts; the comment now names the real tripwire (tests/session-events.spec.ts).
- Upgraded every
@deepseek-ai/dsh-*devDependency to0.1.1-rc.2and thedshWorkshop.compatibility.dshVersionsdeclaration to0.1.1-rc.2(rc.2 compatibility release); peers stay>=0.1.0-rc.8 <0.2.0and@deepseek-ai/cordisstays^4.0.1. - Re-verified the rc.2 credential read/write surface (
resolve/describe/set/unset) and the attachmentsaveImage/ImageAttachmentRef/ImageAttachmentLimitsface; both remain source-compatible, so no plugin code changes were required. - The monthly compat workflow now installs and smokes against DeepSeek Harness
0.1.1-rc.2.
- Upgraded every
@deepseek-ai/dsh-*peer to>=0.1.0-rc.8 <0.2.0and every devDependency to0.1.0-rc.8(rc.8 compatibility release);@deepseek-ai/cordisstays at^4.0.1. tests/harness.tspins the rc.8ImageAttachmentLimitsface (addsmaxImageDimension).
- Sessions that used image generation no longer refuse to reopen on rc.6/rc.7 hosts (issue #2).
draw/generatedis declared only by this package, so it sits outside the host's staticKNOWN_SESSION_EVENT_TYPESwhitelist, and those hosts'Session.appendcannot stamp theignorableenvelope — every generated image left the log unloadable after restart withSessionFormatUnsupportedError. The append now goes through an adaptive gate (src/event-gate.ts): the event is logged only when the host knows the type or a mount-time probe on a detachedSessionStoreproves envelope support. On gated hosts the accounting payload rides a new in-memory fallback ledger (WeakMap-keyed by session), so quota stays exact for the live session and the log stays reloadable; durable, log-folded accounting resumes on hosts with a plugin event surface. - Regression coverage:
tests/event-gate.spec.tspins the gate decisions, the rc.6 probe reading, fallback-ledger quota accounting, and the append-failure degradation; the assembly regenerate test now asserts the rc.6-safe behavior (clean log, exact quota).
- Initial release: unified image_generate tool with config-driven engine routing, health-aware fallback, durable attachments, per-session quota accounting, and credential-reference key storage.
- Unified
image_generatetool: standard parameters (prompt/size/count/quality/style/engine) translated per engine; canonical value carries durable attachment references plus quota and routing facts; render embeds the images as attachment content blocks. - Config-driven engine chain with two shipped presets (OpenAI Images
gpt-image-1, Zhipu CogViewcogview-3-flash) and any OpenAI-compatible endpoint; per-engine size maps, quality/style support, response format, and media type. - Health-aware fallback router: chain order with engine-override promotion, consecutive-failure cooldown, disabled-engine skipping, and per-attempt audit views.
- Per-session quota accounting folded from the durable
draw/generatedsession event (generation calls + image bytes), enforced before engine spend and before attachment storage. drawTypert Remote service (draw/status,draw/probe,draw/setCredential,draw/unsetCredential,draw/regenerate) with a hand-written host./typertmanifest shared with the client Remote contribution.- Browser half: keyed
tool.call.toolviewresult card (engine/quota facts + regenerate action) and a Plugins settings tab (engine chain, credential references, probes, quota limits). - API keys stay credential references (environment-variable names) resolved per call through the official
ctx.credentialsseam — values are never logged or snapshotted.
HttpRequest.bodycarriesUint8Array<ArrayBuffer>; the fetch transport spreads optional headers/body soexactOptionalPropertyTypesholds.Session.appenduses the two-argument form (the pinned0.1.0-rc.6peers have no append-envelope option).
translateRequestdefaultssize/countfor engines reached with a normalized request missing them.