Commit Graph
200 Commits
Author SHA1 Message Date
bowenliang123 bcb73fca8c chore: release v0.64.0 2026-10-05 15:24:08 +08:00
bowenliang123 501b2f8329 chore(release): v0.63.0 2026-10-04 11:24:35 +08:00
bowenliang123 be28102882 chore(release): v0.62.3 2026-10-03 10:50:04 +08:00
bowenliang123 42f8491561 chore(release): v0.62.2 2026-10-01 05:28:06 +08:00
bowenliang123 df2a239603 chore(release): v0.62.1
The v0.62.0 publish wedged in npm's staged pipeline (the registry accepted
it, signed provenance, then never completed processing — publicly invisible,
and a re-publish is refused with E409 'previously staged'). Same content,
new version to route around the stuck stage.
2026-09-30 21:49:58 +08:00
bowenliang123 78b7f7817b chore(release): v0.62.0 2026-09-30 19:27:40 +08:00
bowenliang123 084a2d7f54 chore(release): v0.61.0 2026-09-30 14:17:29 +08:00
bowenliang123 74117d8ae5 feat(compat): support dsh 0.2.0-rc.2 as a third baseline
Add dsh-v0.2.0-rc.2 to the supported set alongside the 0.1.5-rc.1 and
0.1.7-rc.2 lines: the manifest's dshReleases, the baseline matrix, the
release workflow's tag fetch, and the compatibility docs.

Every seam the plugin rides is spelled as at 0.1.7-rc.2 - the projection
registry contract, the platform module table, the right Sidebar seats and
guide-entry contract, the session-jump verb pair, the detail channel RPC
faces, the Plugins page card slot over the configForms transport, the
balance settings faces, the step-boundary guard, and the durable event
vocabulary (still the V4 log generation, no v4-to-v5 migration). Cordis
stays 4.0.4 and the dsh peers stay >=0.1.5-rc.1.

Verified on the new tag: all 25 compat-matrix probes pass against the real
harness sources and the vendored cordis, `pnpm run lint:fix && pnpm run
test && pnpm run build` is green (1837 tests, 100% per-file coverage), and
on a disposable DSH_HOME the 0.2.0-rc.2 CLI installs dsh-context@0.60.0
into exactly one composed config row and removes it back to zero.

Also refresh the docs' verification stamp (plugin 0.58.0 -> 0.60.0).
2026-09-29 19:38:55 +08:00
bowenliang123 6d412f622a chore(release): v0.60.0 2026-09-29 18:53:03 +08:00
bowenliang123 fc44fff954 chore: release v0.59.2 2026-09-28 22:20:09 +08:00
bowenliang123 49b7af50d7 chore: release v0.59.1 2026-09-28 18:39:22 +08:00
bowenliang123 addccdd4aa chore: release v0.59.0
Closes #92
2026-09-28 14:27:36 +08:00
bowenliang123 8103022a1d chore(deps): prune unused devDependencies and refresh the dev toolchain
Drop @deepseek-ai/dsh-invariants and @deepseek-ai/dsh-scope (unreferenced
since the two-baseline re-fit) and the duplicate zod entry from
devDependencies; the dependencies entry stays the runtime one. Declare
react-dom as an optional peer - the client bundle requires it and the
host's platform module table provides it, mirroring the react peer.

Refresh dev-only tooling in range: oxlint 1.85.0, oxlint-tsgolint,
simple-icons, @types/node, jsdom, eslint-plugin-sonarjs, playwright-core.
Everything coupled to the dsh baselines stays put on purpose: the
primitives resolution shim at the versions dsh-v0.1.5-rc.1 itself
resolves, dev cordis 4.0.2 against the vendored packages' exact peers,
lightningcss 1.32.0 deduped with @tailwindcss/node, and the zod floor at
^4.4.3 to match the harness's own. Drop the two orphaned
minimumReleaseAgeExclude rows along with the removed packages.
2026-09-28 10:23:19 +08:00
bowenliang123 fc29e6ba9f chore: release v0.58.0 2026-09-28 05:15:11 +08:00
bowenliang123 53f4cf6248 chore(deps): bump @opencode-ai/models to 0.0.87
Fresher vendored snapshot fallback for the models.dev client; the
providers() entrypoint used by the price-book fetch is unchanged.
2026-09-28 02:37:17 +08:00
bowenliang123 43274f9982 chore: release v0.57.0 2026-09-27 09:26:12 +08:00
bowenliang123 198ec93105 chore: release v0.56.2 2026-09-25 22:59:42 +08:00
bowenliang123 eab750c5d7 chore: release v0.56.1 2026-09-25 03:50:12 +08:00
bowenliang123 cbf02e1524 chore: release v0.56.0 2026-09-25 02:02:17 +08:00
bowenliang123 9acbf7eb45 feat: support dsh 0.1.5-rc.1+ and 0.1.7-rc.2+ as the supported lines
The supported range is now two baselines - dsh-v0.1.5-rc.1 (session
format V3) and dsh-v0.1.7-rc.2 (V4) - enforced by the runtime gate at
BASELINE_DSH_VERSION = 0.1.5-rc.1; below it the fallback units and the
upgrade modal take over (0.1.2/0.1.3 hosts were previously served by the
real folds).

The pre-V3 log shapes are dead code on every supported harness: the
running harness migrates historical logs on every read path (or refuses
the session wholesale), and 0.1.5-rc.1 rejects a request/header carrying
header.system outright. The fold therefore drops the V0/V2-only paths -
the header.system envelope system prompt, assistant/chunk floods,
{start, end} replacement endpoints, tool/code-dispatch - and the state
fields only they wrote (systemsFromHeader, the stepStart decode
accumulators). stateVersion stays 20: no supported log folds
differently, and pre-V3-era cached rows are discarded by the projection
cache's identity gate (and the strict stepStart sub-schema) instead of
served. The headers unit folds metadata-only epochs (envelope
systemTokens write dropped; the v1 cached-row read-compat and its pinned
stateVersion 1 stay); replaceRangeOf speaks startSeq/endSeq only; the
browser's epoch fetch maps request/header to tools and system/message to
the prompt text.

tests/baselines.ts re-fits to the two entries (the right Sidebar seam is
required on both), the compat matrix drives both tags' REAL sources
(canonical logs re-shaped to V3, the hostile probe renumbered past them),
and the version fixtures pin the new floor. Manifest: dshReleases
{0.1.5-rc.1, 0.1.7-rc.2}, dsh peers >=0.1.5-rc.1 (satisfies the 0.1.7
admission check under includePrerelease), devDeps pinned to the
0.1.5-rc.1 surface plus the ui-primitives runtime closure the client
lane inlines (test-only), and the release workflow fetches the two tags.
docs/compatibility.md is rewritten around the two-line matrix; README,
AGENTS.md and the issue template follow.

Also riding this move, from the audit pass: the fold re-proves an inject
source's form before it books the event record (the harness validates
`kind` but not `form` - a hostile one previously failed the strict
wire/state schemas on every delivery, the #44 freeze class), the headers
unit guards a data-less envelope (it has no try/catch of its own), the
schemastery schema annotations drop the explicit z<T> wrappers the 3.18.4
Mode generics reject, and the version-history note records why
stateVersion is deliberately not bumped.
2026-09-25 01:08:38 +08:00
bowenliang123 d72b6f8d12 feat: support dsh 0.1.7-rc.1 as the supported V4 line
Every runtime seam the plugin rides is source-identical from
0.1.7-alpha.2, so no code changes; the supported V4 baseline moves
from 0.1.7-alpha.2 to 0.1.7-rc.1 (the alphas leave the matrix). rc.1
adds the harness-side plugin peer-compatibility admission gate
(evaluatePluginCompatibility); the plugin's >=0.1.2-rc.1 dsh peers
satisfy it under the gate's includePrerelease check, so the bundle
composes with no exemption. The release workflow fetches the rc.1 tag
for the compat matrix and points the plugin checker at the npm next
dist-tag (0.1.7-rc.1).
2026-09-24 11:05:05 +08:00
bowenliang123 091a8b3521 chore: release v0.55.0 2026-09-23 17:20:56 +08:00
bowenliang123 aa0c0a5f57 feat: localize the Plugins-page title and description
The Host's package-meta reader serves each plugin's localized
title/description from the dictionaries exported under locale/ - the
same surface the official plugins use, so the Plugins page and the
settings inventory present dsh-context in the active locale instead of
the raw manifest fields. en carries the canonical copy (matching the
manifest name/description it overlays), zh the translation; the
exports pattern and the files list ship both dictionaries. A spec pins
the dictionaries' shape, the exports/files alignment, and the en/manifest
agreement.
2026-09-23 16:52:20 +08:00
bowenliang123 bdb63a1aed feat(client): brand the Plugins page cards with the package icon.svg
The Plugins page's package cards draw each bundle's icon from the Host's
package metadata (manifest-relative SVG/PNG/JPEG/WebP, inlined as a data
URI), which we never declared - the cards fell back to the default
artwork. The Context emblem's single graphic source is now the
package-root icon.svg: the package.json "icon" field points the Host's
reader at it, and the client build inlines the same file through a
"*.svg?raw" channel (the bundled ContextIcon re-renders it at every
requested size), so the code carries no second copy of the paths. A spec
pins the file and the component in lockstep; the files list ships the
asset.
2026-09-23 16:44:08 +08:00
bowenliang123 bc2544adfa feat(host): serve the preferences through the entry Config schema
The Config-form generation (dsh 0.1.7+) derives the Plugins page's live
form from each loader entry's own Config schema, so the entry schema must
be the schemastery one: cordis keeps validating the config: block through
its Standard Schema face, and the same schema now carries the six display
preferences as .volatile() fields (live-editable there, namespace = the
entry id). The fold bounds stay ordinary fields — their edit remounts the
entry, a preference edit commits volatile-only.

The .volatile() modifier ships only with the newer schemastery, so the
builder feature-detects it and the same bundle loads on the older lines
(3.18.2 predates the modifier). The devDependency bumps to 3.18.4 to
exercise the marked path in tests. Deliberate relaxations against the
replaced zod schema: unknown keys merge through, and integers are
expressed as min 1 + step 1.
2026-09-23 15:57:28 +08:00
bowenliang123 6064731c9f chore(compat): advance the V4 baseline to dsh 0.1.7-alpha.2
dsh 0.1.7-alpha.2 introduces no breaking change for the plugin: the
vendored cordis 4.0.3 -> 4.0.4 bump is version-metadata only, the
durable log stays at V4 with an unchanged event vocabulary, and every
seam the plugin rides (session-projection registry, right-Sidebar tab
and navigation faces, connection RPC, settings namespace, agent-loop
pre-step, ui-primitives icons and markdown labels, the plugins.bundle
config slot) is source-identical or additively extended. The remaining
deltas are internal to the harness: an optional turnWindow on history
page requests, client-module batch-failure recovery, and host-side
tool-result retention (the already-documented deferred image-offload
area).

Per the one-representative-per-generation convention, replace the
alpha.1 baseline with alpha.2 across the declared releases, the seam
matrix, the release workflow's tag fetch, and the compatibility page.
The compat matrix now boots the real alpha.2 sources on cordis 4.0.4.
2026-09-23 00:11:24 +08:00
bowenliang123 c53d40a45e chore: release v0.54.4 2026-09-22 16:41:30 +08:00
bowenliang123 390399ff24 feat(compat): support dsh 0.1.7-alpha.1
Add the V4 baseline (session format 4, cordis 4.0.3): the fold's switched
event families are unchanged, so its entry rides the V3 seam face with a
per-generation settings surface — the `register` face and the retired
`settings.plugin.item` slot are asserted BOTH ways (present through V3,
absent on V4+), and the modal dock probe now pins the sidebar-leading
grid track the measure actually reads instead of one generation's exact
template. New ICON_SEAMS probe: every icon the client renders must exist
in at least one spelling per tag, so a platform rename fails the matrix
instead of the browser. Declare the release in the manifest, fetch its
tag in the release workflow, and document the V4 generation with its
known deltas (deferred: the preferences card's Plugins-page migration,
image-offload accounting).
2026-09-22 16:28:46 +08:00
bowenliang123 df06e62d0b chore: release v0.54.3 2026-09-22 13:03:21 +08:00
bowenliang123 f3b4c88390 feat(client): lead the Plugin Info rows with site marks
The Plugin / GitHub / Settings labels open with siDeepseek, siGithub,
and the harness's IconSettingsOutline14 gear, riding currentColor at the
label's baseline. simple-icons is a dev-only dependency pinned to the
harness ui-primitives' own 16.31.0 and tree-shakes into lib/client.js as
exactly the two mark paths, so no runtime dependency is added and the
marks are identical to the harness's own SiteGlyph artwork.
2026-09-22 08:08:22 +08:00
bowenliang123 c8e1b16b75 chore: release v0.54.2 2026-09-21 10:37:08 +08:00
bowenliang123 cd53e1403c chore: release v0.54.1 2026-09-21 10:20:40 +08:00
bowenliang123 f90d398eb7 chore: release v0.54.0 2026-09-20 11:18:18 +08:00
bowenliang123 0b8175e721 chore: release v0.53.4 2026-09-19 21:53:54 +08:00
Bowen Liang 60598ae0e4 chore: release v0.53.3 2026-09-17 23:28:52 +08:00
bowenliang123 e5ed03b4aa chore: release v0.53.2 2026-09-17 17:04:26 +08:00
Bowen Liang 0d34b468fb chore: release v0.53.1 2026-09-17 00:38:26 +08:00
bowenliang123 67f956b920 chore: release v0.53.0 2026-09-16 18:22:32 +08:00
Bowen Liang 6b8541e64d chore: release v0.52.2 2026-09-15 10:16:59 +08:00
bowenliang123 6e306c31b9 chore: release v0.52.1 2026-09-14 17:40:56 +08:00
bowenliang123 e19aee7540 fix(package): build lib in prepare for git-hosted installs
pnpm >=10 blocks a git dependency's prepare until allowlisted, and the
prepare script ran husky only — so even an allowlisted
'dsh plugin add git+https://...dsh-context.git' packed the repo without
lib/ and the bundle had no main entry to load. Building in prepare makes
the packed git dependency complete; registry-tarball installs never run
prepare, so the npm path is unchanged.
2026-09-14 17:06:13 +08:00
Bowen Liang 445c80d0c8 chore: release v0.52.0 2026-09-14 02:08:19 +08:00
Bowen Liang 4f19c5ecde chore: release v0.51.1 2026-09-13 22:01:26 +08:00
Bowen Liang de2d971b8a chore: release v0.51.0 2026-09-13 17:17:33 +08:00
Bowen Liang 55aa1fecc3 feat(build): compile Tailwind layout utilities into the client CSS channel
The global-CSS channel now runs @tailwindcss/node's compiler over a new
entry sheet (src/client/styles/tailwind.css) and feeds the resolved
@source globs through the oxide scanner; scanned sources join the watch
graph so class-list edits rebuild the sheet. The entry carries no
preflight and no theme import — just the spacing scale anchored to 4px —
and emits utilities unlayered, so the injected <style> cascade matches
the hand-written sheets it precedes. lightningcss and the Tailwind
packages are pinned to one exact version each: the config process loads
the oxide and lightningcss native bindings together, and duplicate
copies break the napi calls.
2026-09-13 01:55:31 +08:00
Bowen Liang 7cf9284362 feat(stats): estimate session cost from models.dev prices
Replace the hardcoded DeepSeek rate table with a client-fetched price
book: @opencode-ai/models reads the models.dev registry once per page
load, every entry is re-proved at the boundary, and a failed fetch
degrades to a dash + note with backed-off automatic retries.

- cost totals rekey per (provider, model); only DeepSeek splits a
  pricing period (peak windows at list price, all other hours half
  price) — every other provider bills everything at list price
- provider ids resolve through a shared rename table (deepseek-official,
  kimi-coding, minimax-cn, zai-coding-cn) with verbatim passthrough for
  unmapped ids; model ids match exactly, case-insensitively, or by
  suffix (k3 -> kimi-k3), ambiguous matches price nothing
- CNY display converts at the fixed 1 CNY = 0.15 USD; the tooltip lists
  per-1M rates for the models the session billed, with peak|off-peak
  pairs and the DeepSeek note shown on DeepSeek sessions only
- stateVersion 18: cached rows refold from the log, which rebuilds the
  new cost keys and periods
2026-09-13 00:35:03 +08:00
Bowen Liang addfca6c65 chore: release v0.50.0 2026-09-12 08:58:04 +08:00
Bowen Liang 4c276c87da chore(deps): update oxlint to 1.82.0
oxlint-tsgolint stays an explicit exact devDependency: oxlint declares
it only as an optional peer dependency, so no package manager installs
it for us and type-aware linting fails loudly without it.
2026-09-12 01:50:11 +08:00
Bowen Liang befa7a986c chore(deps): update tsdown to 0.23.0
No config changes needed: the config only uses deps.neverBundle /
deps.alwaysBundle and dts, all carried over. The rolldown-plugin-dts
0.28.5 bump emits direct export declarations instead of declare +
re-export in lib/index.d.ts; the exported surface is unchanged and the
built JS is byte-identical.
2026-09-12 01:45:29 +08:00
bowenliang123 97ae8ff2ee feat(client): preview File Activity files in the right Sidebar
Clicking a file name in the File Activity card now opens the file's preview
tab in the right Sidebar — the shipped document-preview viewer, reached the
same way the built-in Files sidebar reaches it — on harnesses that serve that
column (dsh 0.1.5-rc.1+). The address is built with the harness's own
browser-safe `fileAddressFor`, inlined by the client bundle exactly as the
Sidebar's file types inline it, so a path under the workspace collapses to the
session-relative spelling and every route to one file settles on one tab.

The capability is OPTIONAL by contract, like the tab registration itself: the
opener reads `ctx.sidebarRight.openResource` through the runtime boundary and
re-proves it per call, and reports whether the column took the address. An
absent column, a face that refuses the address, or an unencodable log path
falls through to the pre-existing system-open behavior, so an older line is
fully functional and nothing becomes an inert click. Pattern rows and
directory targets are never previewable.

Adds the `@deepseek-ai/dsh-util-workspace-path` dev dependency (itself
browser-safe), allows it in the client bundle purity gate, pins the
resource-navigation seam in the compat matrix, and covers the address builder,
the card's preview-then-fallback click, and the optional opener per baseline.
2026-09-11 18:45:28 +08:00