@dsh-electron/dsh-plugin-multi-root-workspace 0.1.1 → 0.1.3

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.
@@ -31,7 +31,14 @@ import { Service } from "@deepseek-ai/cordis";
31
31
  * the upgrade smoke passed on that exact version — a green CI run on an
32
32
  * unlisted release is evidence, not authorization (ADR-0009).
33
33
  */
34
- const SUPPORTED_DSH_RELEASES = ["0.1.5-rc.2", "0.1.6-alpha.1"];
34
+ const SUPPORTED_DSH_RELEASES = [
35
+ "0.1.5-rc.2",
36
+ "0.1.6-alpha.1",
37
+ "0.1.6-alpha.2",
38
+ "0.1.7-alpha.1",
39
+ "0.1.7-alpha.2",
40
+ "0.1.7-rc.1"
41
+ ];
35
42
  /**
36
43
  * Packages whose absence means this plugin cannot function at all: every one of
37
44
  * them is either subclassed, imported for a value, or the owner of a service
package/lib/compat.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as inject, i as assertSupportedInstallation, n as MultiRootCompatService, r as apply, t as DshCompatUnsupportedError } from "./compat-nFYqN5wt.js";
1
+ import { a as inject, i as assertSupportedInstallation, n as MultiRootCompatService, r as apply, t as DshCompatUnsupportedError } from "./compat-DKjbLSi-.js";
2
2
  export { DshCompatUnsupportedError, MultiRootCompatService, apply, assertSupportedInstallation, inject };
package/lib/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { c as REQUIRED_CORE_PACKAGES, d as compatEnforcement, f as readInstalledVersion, i as assertSupportedInstallation, l as SUPPORTED_DSH_RELEASES, n as MultiRootCompatService, o as CORE_PACKAGES, s as OPTIONAL_CORE_PACKAGES, t as DshCompatUnsupportedError, u as classifyInstallation } from "./compat-nFYqN5wt.js";
2
- import { a as composeInstructionMessage, c as createInstructionMessage, l as instructionsApi, r as PLUGIN_SOURCE, t as DEFAULT_MAX_BYTES, u as renderInstructions } from "./instructions-BRGoC82G.js";
1
+ import { c as REQUIRED_CORE_PACKAGES, d as compatEnforcement, f as readInstalledVersion, i as assertSupportedInstallation, l as SUPPORTED_DSH_RELEASES, n as MultiRootCompatService, o as CORE_PACKAGES, s as OPTIONAL_CORE_PACKAGES, t as DshCompatUnsupportedError, u as classifyInstallation } from "./compat-DKjbLSi-.js";
2
+ import { a as composeInstructionMessage, c as createInstructionMessage, l as instructionsApi, r as PLUGIN_SOURCE, t as DEFAULT_MAX_BYTES, u as renderInstructions } from "./instructions-Cn1Jj5Xi.js";
3
3
  import { n as widenConfined, t as MultiRootSandboxProvider } from "./sandbox-D8Fw95FM.js";
4
4
  import { a as classifyStoredRoots, c as indexedStatuses, f as resolveRootRef, i as canonicalRoot, l as isCanonicallyUnder, n as additionalRootId, p as validateRootCandidate, r as availableRoots, s as expandRootInput, t as RootValidationError, u as removeStatusAt } from "./roots-DasWEBJk.js";
5
5
  import { t as MultiRootFileSystem } from "./fs-D_Sw3o5z.js";
@@ -127,7 +127,50 @@ async function renderInstructions(files, options) {
127
127
  //#endregion
128
128
  //#region src/compat/llm-message.ts
129
129
  /**
130
- * Build one `{ kind: 'plugin', form: 'instructions' }` user-role message.
130
+ * This plugin's own producer kind.
131
+ *
132
+ * Session format 4 rejects the shared `kind: 'plugin'` (`format v4 message
133
+ * requires a producer-owned source kind`). The kind is ours, not
134
+ * `agent-instructions`: upstream treats that kind's `changes` array as its
135
+ * own reconciliation authority.
136
+ */
137
+ const PRODUCER_SOURCE_KIND = "multi-root-workspace";
138
+ /**
139
+ * The first session format whose encoder refuses `kind: 'plugin'`.
140
+ * Earlier formats declare that kind on `MessageSourceMap` and require it.
141
+ */
142
+ const PRODUCER_OWNED_FORMAT = 4;
143
+ /**
144
+ * Which source kind the installed session format will persist.
145
+ * @param formatVersion - `SESSION_FORMAT_VERSION`, when the session package is installed.
146
+ * @returns `plugin` through format 3, and this plugin's own kind from format 4 on.
147
+ */
148
+ function instructionSourceKind(formatVersion) {
149
+ return formatVersion !== void 0 && formatVersion >= PRODUCER_OWNED_FORMAT ? PRODUCER_SOURCE_KIND : "plugin";
150
+ }
151
+ /**
152
+ * The installed session format, when that package is present.
153
+ *
154
+ * A composition that never persists a session can omit the package; format 3
155
+ * is then the spelling that still declares `kind: 'plugin'`. Any other failure
156
+ * is a broken install and must surface.
157
+ * @returns the format version, or `undefined` when the package is not installed.
158
+ */
159
+ async function installedFormatVersion() {
160
+ try {
161
+ const session = await import("@deepseek-ai/dsh-session");
162
+ return typeof session.SESSION_FORMAT_VERSION === "number" ? session.SESSION_FORMAT_VERSION : void 0;
163
+ } catch (error) {
164
+ const code = error.code;
165
+ if (code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND") return void 0;
166
+ throw error;
167
+ }
168
+ }
169
+ /**
170
+ * Build one user-role instruction message.
171
+ *
172
+ * Format 3 and earlier: `{ kind: 'plugin', plugin, form: 'instructions' }`.
173
+ * Format 4 and later: `{ kind: 'multi-root-workspace', plugin, form: 'instructions' }`.
131
174
  * @param input - the body and the plugin attribution.
132
175
  * @returns the frozen message upstream's helper produced.
133
176
  * @throws {Error} when the optional peer is absent: a step that has instruction
@@ -141,18 +184,42 @@ async function createInstructionMessage(input) {
141
184
  } catch (error) {
142
185
  throw new Error(`multi-root workspace: @deepseek-ai/dsh-llm is not installed, so additional roots' instruction files cannot be delivered as messages (${error instanceof Error ? error.message : String(error)}).`);
143
186
  }
144
- return module.createUserMessage({
187
+ const create = module.createUserMessage;
188
+ return create({
145
189
  content: [{
146
190
  type: "text",
147
191
  text: input.text
148
192
  }],
149
- source: {
150
- kind: "plugin",
151
- plugin: input.plugin,
152
- form: "instructions"
153
- }
193
+ source: instructionSource(input.plugin, await installedFormatVersion())
154
194
  });
155
195
  }
196
+ /** The source object the installed format will persist. */
197
+ function instructionSource(plugin, formatVersion) {
198
+ const kind = instructionSourceKind(formatVersion);
199
+ if (kind === "plugin") return {
200
+ kind,
201
+ plugin,
202
+ form: "instructions"
203
+ };
204
+ return {
205
+ kind,
206
+ plugin,
207
+ form: "instructions"
208
+ };
209
+ }
210
+ //#endregion
211
+ //#region src/compat/tool-result.ts
212
+ /**
213
+ * Whether a tool-result message reports failure, on every supported release.
214
+ * @param message - the `tool/result` message from the session log.
215
+ * @returns `true` when either spelling says the call failed.
216
+ */
217
+ function toolResultFailed(message) {
218
+ if (message.isError === true) return true;
219
+ const block = message.content?.[0];
220
+ if (typeof block !== "object" || block === null || !("isError" in block)) return false;
221
+ return block.isError === true;
222
+ }
156
223
  //#endregion
157
224
  //#region src/instructions.ts
158
225
  /**
@@ -170,9 +237,10 @@ async function createInstructionMessage(input) {
170
237
  *
171
238
  * 1. **Not a system-prompt contribution.** Instruction text is
172
239
  * producer-supplied context, not system authority, so it enters as a
173
- * user-role message tagged `{ kind: 'plugin', form: 'instructions' }` — the
174
- * position DSH's own message model reserves for it. It is also the only
175
- * channel that is logged, and model-visible content must be logged.
240
+ * user-role message tagged `form: 'instructions'`. Through session format 3
241
+ * the source kind is `plugin`; format 4 retired that shared kind, so the
242
+ * adapter persists this plugin's own (`multi-root-workspace`). It is also
243
+ * the only channel that is logged, and model-visible content must be logged.
176
244
  * 2. **Injected from `agent/pre-step`, not a session lifecycle event.**
177
245
  * `pre-step` is an awaited waterfall, so discovery, reading and rendering all
178
246
  * complete BEFORE the step it feeds — deterministically, on the first step.
@@ -368,7 +436,7 @@ function apply(ctx, config = {}) {
368
436
  const call = pendingCalls.get(callId);
369
437
  pendingCalls.delete(callId);
370
438
  if (call === void 0) return;
371
- if (event.data.error !== void 0 || event.data.message.content[0]?.isError === true) return;
439
+ if (event.data.error !== void 0 || toolResultFailed(event.data.message)) return;
372
440
  const path = touchedPathOfToolCall(call.name, call.arguments);
373
441
  if (path === void 0) return;
374
442
  const state = stateOf(session);
@@ -1,2 +1,2 @@
1
- import { a as composeInstructionMessage, i as apply, n as DEFAULT_MAX_SOURCE_BYTES, o as inject, r as PLUGIN_SOURCE, s as touchedPathOfToolCall, t as DEFAULT_MAX_BYTES } from "./instructions-BRGoC82G.js";
1
+ import { a as composeInstructionMessage, i as apply, n as DEFAULT_MAX_SOURCE_BYTES, o as inject, r as PLUGIN_SOURCE, s as touchedPathOfToolCall, t as DEFAULT_MAX_BYTES } from "./instructions-Cn1Jj5Xi.js";
2
2
  export { DEFAULT_MAX_BYTES, DEFAULT_MAX_SOURCE_BYTES, PLUGIN_SOURCE, apply, composeInstructionMessage, inject, touchedPathOfToolCall };
@@ -55,5 +55,3 @@ export interface PanelClient {
55
55
  * @returns the client, with every transport failure normalized to a `PanelError`.
56
56
  */
57
57
  export declare function createPanelClient(connection: ConnectionHandle): PanelClient;
58
- /** The current session id, when the composed client can name one. */
59
- export declare function currentSessionIdOf(sessions: unknown): string | undefined;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Compatibility adapter for the product icons the panel renders.
3
+ *
4
+ * ```text
5
+ * 0.1.5-rc.2 / 0.1.6 IconFolderClose16, IconChevronDownOutline14, … (pixel size in the name)
6
+ * 0.1.7-alpha.1 through 0.1.7-rc.1 IconFolderCloseRegular, IconChevronDownOutlineRegular, … (weight in the name)
7
+ * ```
8
+ *
9
+ * `0.1.7-alpha.1` kept `size` as a prop and split each glyph into a Regular
10
+ * (1px) and a Medium (1.3px) weight. Upstream's own client surfaces use
11
+ * Regular for these glyphs, so that is the name this probe prefers after the
12
+ * pixel-sized one. The lookup is by export name, not by release string.
13
+ *
14
+ * @module @dsh-electron/dsh-plugin-multi-root-workspace/compat/client-icons
15
+ */
16
+ import type { ReactNode } from 'react';
17
+ import type { IconProps } from '@deepseek-ai/dsh-client-ui-primitives';
18
+ /** One icon component, spelled the way both releases spell `IconProps`. */
19
+ export type PanelIcon = (props: IconProps) => ReactNode;
20
+ /** Exports addressed by name. A release carries one name from each pair. */
21
+ type IconModule = Readonly<Record<string, PanelIcon | undefined>>;
22
+ /**
23
+ * Pick the first export name this release actually provides.
24
+ * @param module - the icon module to read.
25
+ * @param names - candidate export names, preferred first.
26
+ * @returns the component.
27
+ * @throws {Error} when none of the names is exported. That is a compatibility
28
+ * break to adapt here, not a missing optional peer.
29
+ */
30
+ export declare function selectIcon(module: IconModule, names: readonly string[]): PanelIcon;
31
+ export declare const IconChevronDown: PanelIcon;
32
+ export declare const IconChevronUp: PanelIcon;
33
+ export declare const IconCopy: PanelIcon;
34
+ export declare const IconEdit: PanelIcon;
35
+ export declare const IconEllipsis: PanelIcon;
36
+ export declare const IconFolderClose: PanelIcon;
37
+ export declare const IconFolderOpen: PanelIcon;
38
+ export declare const IconPlus: PanelIcon;
39
+ export declare const IconTrash: PanelIcon;
40
+ export {};
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Compatibility adapter for "which session is the client looking at".
3
+ *
4
+ * The browser panel has to name that session before it may call the host
5
+ * (ADR-0008). Upstream moved the fact between two releases this plugin
6
+ * supports, without renaming the `sessions` service:
7
+ *
8
+ * ```text
9
+ * 0.1.5-rc.2, 0.1.6-alpha.1
10
+ * sessions.list.getSnapshot().current SessionId | undefined
11
+ * 0.1.6-alpha.2, 0.1.7-alpha.1, 0.1.7-alpha.2, 0.1.7-rc.1
12
+ * the catalog has no `current`. The main view retains its session with
13
+ * source `mainView`, and that count is projected onto the list row:
14
+ * sessions.list.getSnapshot().byId[id].retainedBy.mainView > 0
15
+ * ```
16
+ *
17
+ * Reading only `current` makes 0.1.6-alpha.2 report "no active session"
18
+ * while a conversation is on screen. Reading the first catalog id would
19
+ * name a session the operator is not looking at. This probe prefers the
20
+ * explicit selection when that field is a non-empty string, and otherwise
21
+ * the first row the main view actually retains — the same predicate
22
+ * `ui-session` uses to publish the main binding.
23
+ *
24
+ * @module @dsh-electron/dsh-plugin-multi-root-workspace/compat/client-session
25
+ */
26
+ /**
27
+ * The session the composed client is showing, when it can name one.
28
+ * @param sessions - the client `sessions` service, or whatever this
29
+ * composition provided under that name. Absence is a supported state.
30
+ * @returns the session id, or `undefined` when no main view holds one.
31
+ */
32
+ export declare function currentSessionIdOf(sessions: unknown): string | undefined;
@@ -28,7 +28,7 @@
28
28
  * the upgrade smoke passed on that exact version — a green CI run on an
29
29
  * unlisted release is evidence, not authorization (ADR-0009).
30
30
  */
31
- export declare const SUPPORTED_DSH_RELEASES: readonly ["0.1.5-rc.2", "0.1.6-alpha.1"];
31
+ export declare const SUPPORTED_DSH_RELEASES: readonly ["0.1.5-rc.2", "0.1.6-alpha.1", "0.1.6-alpha.2", "0.1.7-alpha.1", "0.1.7-alpha.2", "0.1.7-rc.1"];
32
32
  /** One release this plugin claims to support. */
33
33
  export type SupportedDshRelease = typeof SUPPORTED_DSH_RELEASES[number];
34
34
  /**
@@ -24,7 +24,44 @@ export interface InstructionMessageInput {
24
24
  readonly plugin: string;
25
25
  }
26
26
  /**
27
- * Build one `{ kind: 'plugin', form: 'instructions' }` user-role message.
27
+ * This plugin's own producer kind.
28
+ *
29
+ * Session format 4 rejects the shared `kind: 'plugin'` (`format v4 message
30
+ * requires a producer-owned source kind`). The kind is ours, not
31
+ * `agent-instructions`: upstream treats that kind's `changes` array as its
32
+ * own reconciliation authority.
33
+ */
34
+ export declare const PRODUCER_SOURCE_KIND = "multi-root-workspace";
35
+ declare module '@deepseek-ai/dsh-llm' {
36
+ interface MessageSourceMap {
37
+ 'multi-root-workspace': {
38
+ kind: 'multi-root-workspace';
39
+ plugin: string;
40
+ form: 'instructions';
41
+ };
42
+ }
43
+ }
44
+ /** Either spelling of an instruction message's source. */
45
+ type InstructionSource = {
46
+ readonly kind: 'plugin';
47
+ readonly plugin: string;
48
+ readonly form: 'instructions';
49
+ } | {
50
+ readonly kind: 'multi-root-workspace';
51
+ readonly plugin: string;
52
+ readonly form: 'instructions';
53
+ };
54
+ /**
55
+ * Which source kind the installed session format will persist.
56
+ * @param formatVersion - `SESSION_FORMAT_VERSION`, when the session package is installed.
57
+ * @returns `plugin` through format 3, and this plugin's own kind from format 4 on.
58
+ */
59
+ export declare function instructionSourceKind(formatVersion: number | undefined): InstructionSource['kind'];
60
+ /**
61
+ * Build one user-role instruction message.
62
+ *
63
+ * Format 3 and earlier: `{ kind: 'plugin', plugin, form: 'instructions' }`.
64
+ * Format 4 and later: `{ kind: 'multi-root-workspace', plugin, form: 'instructions' }`.
28
65
  * @param input - the body and the plugin attribution.
29
66
  * @returns the frozen message upstream's helper produced.
30
67
  * @throws {Error} when the optional peer is absent: a step that has instruction
@@ -32,3 +69,4 @@ export interface InstructionMessageInput {
32
69
  * user-visible context instead of reporting a misconfigured composition.
33
70
  */
34
71
  export declare function createInstructionMessage(input: InstructionMessageInput): Promise<UserMessage>;
72
+ export {};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Compatibility adapter for where a tool result records failure.
3
+ *
4
+ * ```text
5
+ * 0.1.5-rc.2 / 0.1.6 content[0].isError on the tool-result block
6
+ * 0.1.7-alpha.1 through 0.1.7-rc.1 message.isError on the tool-role message
7
+ * ```
8
+ *
9
+ * A failed `read` / `write` / `edit` must not make a directory worth examining
10
+ * (ADR-0010). The two releases store that bit in different places, and a
11
+ * session log can carry either spelling, so both are read. Neither access is
12
+ * written against the installed `ContentBlock` or `ToolResultMessage` type:
13
+ * one of the two properties is absent from each release's declaration.
14
+ *
15
+ * @module @dsh-electron/dsh-plugin-multi-root-workspace/compat/tool-result
16
+ */
17
+ /** The fields either release uses to say a tool invocation failed. */
18
+ export interface ToolResultFailureShape {
19
+ /** `0.1.7-alpha.1` through `0.1.7-rc.1` record the outcome on the message. */
20
+ readonly isError?: boolean;
21
+ /** `0.1.5-rc.2` and `0.1.6` record it on the first content block. */
22
+ readonly content?: readonly object[];
23
+ }
24
+ /**
25
+ * Whether a tool-result message reports failure, on every supported release.
26
+ * @param message - the `tool/result` message from the session log.
27
+ * @returns `true` when either spelling says the call failed.
28
+ */
29
+ export declare function toolResultFailed(message: ToolResultFailureShape): boolean;
@@ -13,9 +13,10 @@
13
13
  *
14
14
  * 1. **Not a system-prompt contribution.** Instruction text is
15
15
  * producer-supplied context, not system authority, so it enters as a
16
- * user-role message tagged `{ kind: 'plugin', form: 'instructions' }` — the
17
- * position DSH's own message model reserves for it. It is also the only
18
- * channel that is logged, and model-visible content must be logged.
16
+ * user-role message tagged `form: 'instructions'`. Through session format 3
17
+ * the source kind is `plugin`; format 4 retired that shared kind, so the
18
+ * adapter persists this plugin's own (`multi-root-workspace`). It is also
19
+ * the only channel that is logged, and model-visible content must be logged.
19
20
  * 2. **Injected from `agent/pre-step`, not a session lifecycle event.**
20
21
  * `pre-step` is an awaited waterfall, so discovery, reading and rendering all
21
22
  * complete BEFORE the step it feeds — deterministically, on the first step.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dsh-electron/dsh-plugin-multi-root-workspace",
3
3
  "description": "Multi-root Workspace for DeepSeek Harness: adds N additional roots to the workspace sandbox scope as an out-of-tree bundle",
4
- "version": "0.1.1",
4
+ "version": "0.1.3",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/types/index.d.ts",
@@ -68,20 +68,20 @@
68
68
  "license": "MIT",
69
69
  "peerDependencies": {
70
70
  "@deepseek-ai/cordis": ">=4.0.1 <5.0.0",
71
- "@deepseek-ai/dsh-agent": "0.1.5-rc.2 || 0.1.6-alpha.1",
72
- "@deepseek-ai/dsh-agent-instructions": "0.1.5-rc.2 || 0.1.6-alpha.1",
73
- "@deepseek-ai/dsh-client-connection": "0.1.5-rc.2 || 0.1.6-alpha.1",
74
- "@deepseek-ai/dsh-commands": "0.1.5-rc.2 || 0.1.6-alpha.1",
75
- "@deepseek-ai/dsh-fs": "0.1.5-rc.2 || 0.1.6-alpha.1",
76
- "@deepseek-ai/dsh-fs-local": "0.1.5-rc.2 || 0.1.6-alpha.1",
77
- "@deepseek-ai/dsh-llm": "0.1.5-rc.2 || 0.1.6-alpha.1",
78
- "@deepseek-ai/dsh-sandbox": "0.1.5-rc.2 || 0.1.6-alpha.1",
79
- "@deepseek-ai/dsh-sandbox-local": "0.1.5-rc.2 || 0.1.6-alpha.1",
80
- "@deepseek-ai/dsh-sandbox-policy": "0.1.5-rc.2 || 0.1.6-alpha.1",
81
- "@deepseek-ai/dsh-session": "0.1.5-rc.2 || 0.1.6-alpha.1",
82
- "@deepseek-ai/dsh-storage-domain": "0.1.5-rc.2 || 0.1.6-alpha.1",
83
- "@deepseek-ai/dsh-subprocess": "0.1.5-rc.2 || 0.1.6-alpha.1",
84
- "@deepseek-ai/dsh-system-prompt": "0.1.5-rc.2 || 0.1.6-alpha.1"
71
+ "@deepseek-ai/dsh-agent": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
72
+ "@deepseek-ai/dsh-agent-instructions": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
73
+ "@deepseek-ai/dsh-client-connection": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
74
+ "@deepseek-ai/dsh-commands": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
75
+ "@deepseek-ai/dsh-fs": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
76
+ "@deepseek-ai/dsh-fs-local": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
77
+ "@deepseek-ai/dsh-llm": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
78
+ "@deepseek-ai/dsh-sandbox": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
79
+ "@deepseek-ai/dsh-sandbox-local": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
80
+ "@deepseek-ai/dsh-sandbox-policy": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
81
+ "@deepseek-ai/dsh-session": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
82
+ "@deepseek-ai/dsh-storage-domain": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
83
+ "@deepseek-ai/dsh-subprocess": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
84
+ "@deepseek-ai/dsh-system-prompt": "0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1"
85
85
  },
86
86
  "peerDependenciesMeta": {
87
87
  "@deepseek-ai/dsh-agent": {