ReleaseSiliconFlowSiliconFlowpublished Sep 14, 2026seen 4w

siliconflow/dsh-llm-siliconflow v0.2.0-rc.3

siliconflow/dsh-llm-siliconflow

Open original ↗

Captured source

source ↗
published Sep 14, 2026seen 4wcaptured 4whttp 200method plain

0.2.0-rc.3 — single build, both dsh eras

Repository: siliconflow/dsh-llm-siliconflow

Tag: v0.2.0-rc.3

Published: 2026-09-14T05:33:22Z

Prerelease: yes

Release notes: One published build now runs unchanged inside BOTH dsh runtime closures — no per-era builds, no forked versions.

  • OLD era (dsh-llm 0.1.1-rc.2 / dsh CLI 0.1.1, credentials-local 0.1.0-rc.8 flat layout, settings 0.1.1): CallId brand, flat credentials, module-level installSettingsSection, discovery Request with signal.
  • NEW era (dsh-llm 0.1.5-rc.2, credentials version-1, settings 0.1.5): ToolCallId brand, version: 1 + refs: credentials, service method installSection, discovery Operation.

How it works (src/dsh-era.ts)

  • Namespace imports replace era-sensitive named imports — ESM link-time export validation applies only to named imports, which is where the reported SyntaxError: ... 'CallId' came from. Runtime probe: typeof ns.ToolCallId === 'function'.
  • toolCallIdOf() resolves the era-correct brand constructor at call time (ToolCallId ?? CallId), failing loud when neither exists.
  • Era-union discovery shape ModelDiscoveryShape (signal lived on the Request in the old era, on the Operation in the new — one callback serves both).
  • Settings install probes both surfaces, each verified present in exactly one era's real package: service.installSection method (new; method-call form keeps the service's registration state bound) and the module-level installSettingsSection function (old; it runs its own ctx.inject(['settings'])).
  • deepEqualJson inlined and key-order-insensitive — @deepseek-ai/dsh-util-values postdates the OLD era entirely; keeping it as a peer made npm resolution fail under old dsh homes.
  • Credentials write is layout-preserving: fresh/flat documents stay flat (OLD-era native read; NEW-era dsh migrates on next boot), existing version-1 documents stay version-1. Early-wizard top-level artifacts still fold back under refs.
  • @deepseek-ai/dsh-* peerDependencies relaxed to * with optional peerDependenciesMeta — fixes the ERESOLVE that blocked 0.2.0-rc.2 installs on old-era hosts (npm tried to auto-install the never-published dsh-util-values, 404).

During release review

A blocker was caught and fixed before tagging: the old-era settings path initially probed the settings *service object* for installSettingsSection — but the OLD dsh-settings (0.1.1) exports it as a *module-level function* and the service object carries no such member (verified against the 0.1.1-rc.2 tarball and at runtime). The corrected dual-surface probe routes into the genuine module function in a pure old-era closure.

Verification (real executions)

  • Dual-era link/import of the published bits: OK in 0.1.1-rc.2 and 0.1.5-rc.2 closures — the original SyntaxError: CallId reproducer is gone
  • Wizard run from the published package: flat layout written with comments kept; OLD credentials-local 0.1.0 parseCredentialsDocument reads both keys back; NEW renderFlatLayoutMigration converts the flat output correctly
  • Harness workspace: typecheck 0 errors, 220/220 tests, coverage gate passed (serialize.ts:78 branch is the pre-existing baseline gap, stash-verified)

Full change details: #3