dsh-output-styles 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,27 @@ All notable changes to this project are documented in this file. The format
4
4
  follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the
5
5
  project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.4.2] - 2026-08-21
8
+
9
+ ### Changed
10
+
11
+ - **rc8 compatibility**: every `@deepseek-ai/dsh-*` dependency moves to
12
+ `0.1.0-rc.8` (devDependencies and the runtime storage dependencies pinned,
13
+ peer ranges `>=0.1.0-rc.8 <0.2.0`); the five README compatibility rows,
14
+ the `dshWorkshop` compatibility claim, and the compat workflow's rc8 pins
15
+ follow. Verified on a real rc8 profile: bundle install, row mount, and a
16
+ keyless headless run through the deterministic mock LLM (`SMOKE-OK`).
17
+
18
+ ### Fixed
19
+
20
+ - **Web picker submits through the rc8 command Remote**: the generated
21
+ `commands.execute` client signature gained the image-attachment batch —
22
+ the `/style` picker passes an empty batch, keeping every switch on the
23
+ host's durable command lifecycle.
24
+ - **rc8 `commands.execute` arity in tests and the loader runner**: the
25
+ integration harness and `scripts/loader-runner.mjs` pass the image batch
26
+ and the abort signal explicitly, matching the rc8 registry signature.
27
+
7
28
  ## [0.4.1] - 2026-08-19
8
29
 
9
30
  ### Fixed
package/README.es.md CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  | Surface | Status |
26
26
  |---|---|
27
- | Harness | DeepSeek Harness `0.1.0-rc.6` |
27
+ | Harness | DeepSeek Harness `0.1.0-rc.8` |
28
28
  | Node | `^22.19.0 || >=24.0.0` |
29
29
  | Platforms | Todas (host + cliente web) |
30
30
  | Model | Cualquiera (inyección en el prompt del sistema) |
package/README.hi.md CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  | Surface | Status |
26
26
  |---|---|
27
- | Harness | DeepSeek Harness `0.1.0-rc.6` |
27
+ | Harness | DeepSeek Harness `0.1.0-rc.8` |
28
28
  | Node | `^22.19.0 || >=24.0.0` |
29
29
  | Platforms | सभी (host + वेब क्लाइंट) |
30
30
  | Model | कोई भी (सिस्टम-प्रॉम्प्ट इंजेक्शन) |
package/README.md CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  | Surface | Status |
26
26
  |---|---|
27
- | Harness | DeepSeek Harness `0.1.0-rc.6` |
27
+ | Harness | DeepSeek Harness `0.1.0-rc.8` |
28
28
  | Node | `^22.19.0 || >=24.0.0` |
29
29
  | Platforms | All (host + web client) |
30
30
  | Model | Any (system-prompt injection) |
package/README.pt.md CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  | Surface | Status |
26
26
  |---|---|
27
- | Harness | DeepSeek Harness `0.1.0-rc.6` |
27
+ | Harness | DeepSeek Harness `0.1.0-rc.8` |
28
28
  | Node | `^22.19.0 || >=24.0.0` |
29
29
  | Platforms | Todas (host + cliente web) |
30
30
  | Model | Qualquer (injeção no prompt do sistema) |
package/README.zh.md CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  | Surface | Status |
26
26
  |---|---|
27
- | Harness | DeepSeek Harness `0.1.0-rc.6` |
27
+ | Harness | DeepSeek Harness `0.1.0-rc.8` |
28
28
  | Node | `^22.19.0 || >=24.0.0` |
29
29
  | Platforms | 全部(host + Web 客户端) |
30
30
  | Model | 任意(系统提示注入) |
package/lib/client.js CHANGED
@@ -1,4 +1,4 @@
1
- //#region src/client/locales.ts
1
+ //#region lib/types/client/locales.js
2
2
  /**
3
3
  * Simplified Chinese dictionary (the key-set source of truth).
4
4
  *
@@ -17,7 +17,17 @@ const en = {
17
17
  "option.offDetail": "Restore the project default output style"
18
18
  };
19
19
  //#endregion
20
- //#region src/client/index.ts
20
+ //#region lib/types/client/index.js
21
+ /**
22
+ * Browser half of `dsh-output-styles`: a popup picker decorating the HOST
23
+ * `/style` command. The picker reads the `style` session projection
24
+ * (`{ options, currentValue }`), which the host plugin keeps fresh, and
25
+ * submits the completed `/style <name>` / `/style off` line back through the
26
+ * command Remote — so every switch keeps the host's durable command
27
+ * lifecycle (`command/run`/`command/done`) and the projection stays the
28
+ * single displayed fact.
29
+ * @module dsh-output-styles/client
30
+ */
21
31
  /** Client plugin name; keep stable after publishing. */
22
32
  const name = "dsh-output-styles-client";
23
33
  /** Required client services: the command surface, the sessions face, the command Remote, and locale. */
@@ -78,7 +88,7 @@ function apply(ctx) {
78
88
  },
79
89
  onSelect: async (option, session) => {
80
90
  const line = option.id === OFF_ID ? "/style off" : `/style ${option.id}`;
81
- const result = await remote.commands.execute(session.sessionId, line);
91
+ const result = await remote.commands.execute(session.sessionId, line, []);
82
92
  if (!result.ok) throw new Error(`command.execute failed: ${result.error.code}: ${result.error.message}`);
83
93
  if (result.value === void 0) throw new Error(`unknown or malformed command: ${line}`);
84
94
  }
package/lib/index.js CHANGED
@@ -1,11 +1,11 @@
1
- import { _ as styleSelectionSchema, c as loadStyleLibrary, d as STYLE_COMMAND, f as applyStyleEvent, g as STYLE_SOURCE, h as OUTPUT_STYLE_DOMAIN, i as installInvariant, l as truncateStyle, m as OFF, o as STYLE_NAME_RE, p as parseStyleInput, s as isValidStyleName, t as PACKAGE_NAME, u as EMPTY_STYLE_STATE, v as styleSelectionViewSchema } from "./invariant-B9LpUViP.js";
1
+ import { _ as styleSelectionSchema, c as loadStyleLibrary, d as STYLE_COMMAND, f as applyStyleEvent, g as STYLE_SOURCE, h as OUTPUT_STYLE_DOMAIN, i as installInvariant, l as truncateStyle, m as OFF, o as STYLE_NAME_RE, p as parseStyleInput, s as isValidStyleName, t as PACKAGE_NAME, u as EMPTY_STYLE_STATE, v as styleSelectionViewSchema } from "./invariant-CEWlfnrw.js";
2
2
  import z from "@deepseek-ai/schemastery";
3
3
  import { resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { watch } from "node:fs";
6
6
  import { installSettingsSection, settingsNamespace } from "@deepseek-ai/dsh-settings";
7
7
  import { deriveEventMessage, foldSurface } from "@deepseek-ai/dsh-session/surface";
8
- //#region src/config.ts
8
+ //#region lib/types/config.js
9
9
  /**
10
10
  * Serializable configuration, schema, and direct-call defaults.
11
11
  *
@@ -79,7 +79,20 @@ function resolveConfig(config, defaultStylesDir) {
79
79
  };
80
80
  }
81
81
  //#endregion
82
- //#region src/renderers.ts
82
+ //#region lib/types/renderers.js
83
+ /**
84
+ * The `output.render.*` protocol: a presenter registry that turns raw
85
+ * model-visible text into display text. A renderer is a pure function —
86
+ * `presenter(text, meta)` maps args to presentation data and never touches
87
+ * the DOM — matched by tool name and content type, ordered by priority.
88
+ * Every rendered result carries its original text alongside, so any consumer
89
+ * (this plugin's `/export`, third-party panels) can log both and keep the
90
+ * "model-visible ⟺ reconstructable" invariant.
91
+ *
92
+ * This module is dependency-free (no DOM, no node: imports, no DSH imports)
93
+ * so the protocol vocabulary itself is portable and unit-testable anywhere.
94
+ * @module dsh-output-styles/renderers
95
+ */
83
96
  /**
84
97
  * Validates a renderer before registration: id grammar, name, description,
85
98
  * match shape, priority, presenter function. Throws on the first violation
@@ -232,7 +245,7 @@ const BUILTIN_RENDERERS = [{
232
245
  presenter: (text) => enumerate(text)
233
246
  }];
234
247
  //#endregion
235
- //#region src/export.ts
248
+ //#region lib/types/export.js
236
249
  /**
237
250
  * Session export: a pure projection of the current session's message surface
238
251
  * into Markdown or sanitized HTML, with renderer application on top. The
@@ -396,7 +409,7 @@ function renderExport(registry, lines, format, rules, now = /* @__PURE__ */ new
396
409
  };
397
410
  }
398
411
  //#endregion
399
- //#region src/runtime.ts
412
+ //#region lib/types/runtime.js
400
413
  /**
401
414
  * Runtime boundary and Cordis activation: style resolution over the durable
402
415
  * selection domain, the model-visible system-prompt section, the `/style`
@@ -824,7 +837,7 @@ function parseExportInput(rawInput) {
824
837
  };
825
838
  }
826
839
  //#endregion
827
- //#region src/index.ts
840
+ //#region lib/types/index.js
828
841
  /**
829
842
  * `dsh-output-styles`: Claude Code `outputStyles`-equivalent runtime output
830
843
  * styles for DeepSeek Harness. The plugin registers a model-visible system
@@ -3,7 +3,16 @@ import { readFileSync, readdirSync } from "node:fs";
3
3
  import { z } from "zod";
4
4
  import { defineDomain, domainTable } from "@deepseek-ai/dsh-storage-domain";
5
5
  import { parse } from "yaml";
6
- //#region src/types.ts
6
+ //#region lib/types/types.js
7
+ /**
8
+ * Durable domain vocabulary and type-table merges owned by this package.
9
+ *
10
+ * The selection domain is the single source of the per-session style choice;
11
+ * its record schema doubles as the durable validation boundary. The `style`
12
+ * projection key is declared here (its one home) and re-exported from the
13
+ * package root so consumers receive the `SessionProjectionMap` merge.
14
+ * @module dsh-output-styles/types
15
+ */
7
16
  /** The reserved switch target that removes a session's selection. */
8
17
  const OFF = "off";
9
18
  /**
@@ -45,7 +54,16 @@ const styleSelectionViewSchema = z.object({
45
54
  currentValue: z.string().min(1).nullable()
46
55
  });
47
56
  //#endregion
48
- //#region src/style-command.ts
57
+ //#region lib/types/style-command.js
58
+ /**
59
+ * Strict parsing of the `/style` command input and the pure projection fold
60
+ * over its logged lifecycle events.
61
+ *
62
+ * The handler and the session-projection unit share {@link parseStyleInput}:
63
+ * the projection folds exactly the inputs the handler accepts, so the
64
+ * displayed selection can never diverge from what the command did.
65
+ * @module dsh-output-styles/style-command
66
+ */
49
67
  /** Command name registered on `ctx.commands`; also the log's `command/run` name. */
50
68
  const STYLE_COMMAND = "style";
51
69
  /**
@@ -112,7 +130,7 @@ function applyStyleEvent(state, event) {
112
130
  };
113
131
  }
114
132
  //#endregion
115
- //#region src/style-library.ts
133
+ //#region lib/types/style-library.js
116
134
  /**
117
135
  * Style-library loading: one style per `*.md` file (frontmatter + body),
118
136
  * with optional Claude Code `outputStyles` JSON compatibility (single entry
@@ -386,7 +404,27 @@ function truncateStyle(body, maxChars, marker) {
386
404
  return chars.slice(0, maxChars).join("") + marker;
387
405
  }
388
406
  //#endregion
389
- //#region src/invariant.ts
407
+ //#region lib/types/invariant.js
408
+ /**
409
+ * Package-owned invariant companion for `dsh-output-styles`.
410
+ *
411
+ * Two post-commit diagnostic checks over the events this plugin's write path
412
+ * produces (both target events are committed before dispatch, so a violation
413
+ * is reported — via the host registry's `fail` — rather than vetoed):
414
+ *
415
+ * 1. Every `output_style`/`selection` durable write carries this plugin's own
416
+ * source marker and a legal style name; when the library is known,
417
+ * the name must be a library member.
418
+ * 2. A successful `/style <name>` command has a matching selection record on
419
+ * its session by the time its `command/done` settles, and `/style off`
420
+ * leaves no record. The standalone companion (no library/domain handle)
421
+ * skips this check.
422
+ *
423
+ * The main plugin registers a facts-bearing installer from its own context;
424
+ * the `./invariant` export is the standalone companion usable through a
425
+ * separate profile row.
426
+ * @module dsh-output-styles/invariant
427
+ */
390
428
  /** Full npm package name owning the reported failures. */
391
429
  const PACKAGE_NAME = "dsh-output-styles";
392
430
  /** Cordis companion plugin name. */
package/lib/invariant.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as name, i as installInvariant, n as apply, r as inject, t as PACKAGE_NAME } from "./invariant-B9LpUViP.js";
1
+ import { a as name, i as installInvariant, n as apply, r as inject, t as PACKAGE_NAME } from "./invariant-CEWlfnrw.js";
2
2
  export { PACKAGE_NAME, apply, inject, installInvariant, name };
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "dsh-output-styles",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "Claude Code outputStyles-equivalent runtime output-style switching for DeepSeek Harness",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
- "packageManager": "pnpm@11.7.0",
8
7
  "license": "Apache-2.0",
9
8
  "author": "PerryLink",
10
9
  "repository": {
@@ -21,19 +20,6 @@
21
20
  "engines": {
22
21
  "node": "^22.19.0 || >=24.0.0"
23
22
  },
24
- "scripts": {
25
- "build": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\" && tsc -p tsconfig.json --noEmitOnError --pretty false && tsdown && tsdown -c tsdown.client.config.ts && node scripts/fix-dts.mjs",
26
- "test": "vitest run",
27
- "test:coverage": "vitest run --coverage",
28
- "lint": "oxlint",
29
- "check:readmes": "node scripts/check-readme-sync.mjs",
30
- "typecheck": "tsc -p tsconfig.json --noEmitOnError --pretty false && tsc -p tsconfig.vitest.json --pretty false",
31
- "verify": "pnpm run typecheck && pnpm test && pnpm run verify:self-contained",
32
- "verify:self-contained": "node scripts/verify-self-contained.mjs",
33
- "verify:artifacts": "node scripts/verify-artifacts.mjs",
34
- "prepublishOnly": "pnpm run verify",
35
- "prepare": "node scripts/prepare.mjs"
36
- },
37
23
  "main": "lib/index.js",
38
24
  "types": "lib/types/index.d.ts",
39
25
  "exports": {
@@ -120,7 +106,7 @@
120
106
  ],
121
107
  "compatibility": {
122
108
  "dshVersions": [
123
- "0.1.0-rc.6"
109
+ "0.1.0-rc.8"
124
110
  ]
125
111
  },
126
112
  "capability": {
@@ -137,18 +123,18 @@
137
123
  }
138
124
  },
139
125
  "dependencies": {
140
- "@deepseek-ai/dsh-storage": "0.1.0-rc.6",
141
- "@deepseek-ai/dsh-storage-domain": "0.1.0-rc.6",
142
- "@deepseek-ai/dsh-storage-json": "0.1.0-rc.6",
126
+ "@deepseek-ai/dsh-storage": "0.1.0-rc.8",
127
+ "@deepseek-ai/dsh-storage-domain": "0.1.0-rc.8",
128
+ "@deepseek-ai/dsh-storage-json": "0.1.0-rc.8",
143
129
  "yaml": "^2.8.0",
144
130
  "zod": "^4.4.3"
145
131
  },
146
132
  "peerDependencies": {
147
133
  "@deepseek-ai/cordis": "^4.0.1",
148
- "@deepseek-ai/dsh-session": ">=0.1.0-rc.6 <0.2.0",
149
- "@deepseek-ai/dsh-session-projection": ">=0.1.0-rc.6 <0.2.0",
150
- "@deepseek-ai/dsh-settings": ">=0.1.0-rc.6 <0.2.0",
151
- "@deepseek-ai/dsh-storage-domain": ">=0.1.0-rc.6 <0.2.0",
134
+ "@deepseek-ai/dsh-session": ">=0.1.0-rc.8 <0.2.0",
135
+ "@deepseek-ai/dsh-session-projection": ">=0.1.0-rc.8 <0.2.0",
136
+ "@deepseek-ai/dsh-settings": ">=0.1.0-rc.8 <0.2.0",
137
+ "@deepseek-ai/dsh-storage-domain": ">=0.1.0-rc.8 <0.2.0",
152
138
  "@deepseek-ai/schemastery": "^3.18.1"
153
139
  },
154
140
  "peerDependenciesMeta": {
@@ -175,29 +161,29 @@
175
161
  "@deepseek-ai/cordis": "4.0.1",
176
162
  "@deepseek-ai/cordis-plugin-include": "1.0.6",
177
163
  "@deepseek-ai/cordis-plugin-loader": "1.0.2",
178
- "@deepseek-ai/dsh-agent": "0.1.0-rc.6",
179
- "@deepseek-ai/dsh-api-remotes": "0.1.0-rc.6",
180
- "@deepseek-ai/dsh-attachment": "0.1.0-rc.6",
181
- "@deepseek-ai/dsh-brand": "0.1.0-rc.6",
182
- "@deepseek-ai/dsh-client-locale": "0.1.0-rc.6",
183
- "@deepseek-ai/dsh-client-runtime": "0.1.0-rc.6",
184
- "@deepseek-ai/dsh-client-ui-commands": "0.1.0-rc.6",
185
- "@deepseek-ai/dsh-client-ui-input-trigger": "0.1.0-rc.6",
186
- "@deepseek-ai/dsh-client-ui-slots": "0.1.0-rc.6",
187
- "@deepseek-ai/dsh-commands": "0.1.0-rc.6",
188
- "@deepseek-ai/dsh-llm": "0.1.0-rc.6",
189
- "@deepseek-ai/dsh-scope": "0.1.0-rc.6",
190
- "@deepseek-ai/dsh-session": "0.1.0-rc.6",
191
- "@deepseek-ai/dsh-session-persistence": "0.1.0-rc.6",
192
- "@deepseek-ai/dsh-session-persistence-jsonl": "0.1.0-rc.6",
193
- "@deepseek-ai/dsh-session-projection": "0.1.0-rc.6",
194
- "@deepseek-ai/dsh-settings": "0.1.0-rc.6",
195
- "@deepseek-ai/dsh-storage": "0.1.0-rc.6",
196
- "@deepseek-ai/dsh-storage-domain": "0.1.0-rc.6",
197
- "@deepseek-ai/dsh-storage-json": "0.1.0-rc.6",
198
- "@deepseek-ai/dsh-system-prompt": "0.1.0-rc.6",
199
- "@deepseek-ai/dsh-timeout": "0.1.0-rc.6",
200
- "@deepseek-ai/dsh-typert-protocol": "0.1.0-rc.6",
164
+ "@deepseek-ai/dsh-agent": "0.1.0-rc.8",
165
+ "@deepseek-ai/dsh-api-remotes": "0.1.0-rc.8",
166
+ "@deepseek-ai/dsh-attachment": "0.1.0-rc.8",
167
+ "@deepseek-ai/dsh-brand": "0.1.0-rc.8",
168
+ "@deepseek-ai/dsh-client-locale": "0.1.0-rc.8",
169
+ "@deepseek-ai/dsh-client-runtime": "0.1.0-rc.8",
170
+ "@deepseek-ai/dsh-client-ui-commands": "0.1.0-rc.8",
171
+ "@deepseek-ai/dsh-client-ui-input-trigger": "0.1.0-rc.8",
172
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.0-rc.8",
173
+ "@deepseek-ai/dsh-commands": "0.1.0-rc.8",
174
+ "@deepseek-ai/dsh-llm": "0.1.0-rc.8",
175
+ "@deepseek-ai/dsh-scope": "0.1.0-rc.8",
176
+ "@deepseek-ai/dsh-session": "0.1.0-rc.8",
177
+ "@deepseek-ai/dsh-session-persistence": "0.1.0-rc.8",
178
+ "@deepseek-ai/dsh-session-persistence-jsonl": "0.1.0-rc.8",
179
+ "@deepseek-ai/dsh-session-projection": "0.1.0-rc.8",
180
+ "@deepseek-ai/dsh-settings": "0.1.0-rc.8",
181
+ "@deepseek-ai/dsh-storage": "0.1.0-rc.8",
182
+ "@deepseek-ai/dsh-storage-domain": "0.1.0-rc.8",
183
+ "@deepseek-ai/dsh-storage-json": "0.1.0-rc.8",
184
+ "@deepseek-ai/dsh-system-prompt": "0.1.0-rc.8",
185
+ "@deepseek-ai/dsh-timeout": "0.1.0-rc.8",
186
+ "@deepseek-ai/dsh-typert-protocol": "0.1.0-rc.8",
201
187
  "@deepseek-ai/schemastery": "3.18.1",
202
188
  "@types/node": "^22.20.0",
203
189
  "@vitest/coverage-v8": "4.1.10",
@@ -205,5 +191,16 @@
205
191
  "tsdown": "^0.22.2",
206
192
  "typescript": "^6.0.3",
207
193
  "vitest": "^4.1.8"
194
+ },
195
+ "scripts": {
196
+ "build": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\" && tsc -p tsconfig.json --noEmitOnError --pretty false && tsdown && tsdown -c tsdown.client.config.ts && node scripts/fix-dts.mjs",
197
+ "test": "vitest run",
198
+ "test:coverage": "vitest run --coverage",
199
+ "lint": "oxlint",
200
+ "check:readmes": "node scripts/check-readme-sync.mjs",
201
+ "typecheck": "tsc -p tsconfig.json --noEmitOnError --pretty false && tsc -p tsconfig.vitest.json --pretty false",
202
+ "verify": "pnpm run typecheck && pnpm test && pnpm run verify:self-contained",
203
+ "verify:self-contained": "node scripts/verify-self-contained.mjs",
204
+ "verify:artifacts": "node scripts/verify-artifacts.mjs"
208
205
  }
209
- }
206
+ }
@@ -88,7 +88,7 @@ export function apply(ctx: ClientContext): void {
88
88
  },
89
89
  onSelect: async (option, session) => {
90
90
  const line = option.id === OFF_ID ? '/style off' : `/style ${option.id}`
91
- const result = await remote.commands.execute(session.sessionId, line)
91
+ const result = await remote.commands.execute(session.sessionId, line, [])
92
92
  if (!result.ok) {
93
93
  throw new Error(`command.execute failed: ${result.error.code}: ${result.error.message}`)
94
94
  }