@dsh-electron/dsh-plugin-multi-root-workspace 0.1.1 → 0.1.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.en.md +14 -2
- package/CHANGELOG.md +14 -2
- package/README.en.md +8 -6
- package/README.md +8 -6
- package/lib/client.js +133 -14
- package/lib/client.js.map +1 -1
- package/lib/{compat-nFYqN5wt.js → compat-CRdv0vPw.js} +6 -1
- package/lib/compat.js +1 -1
- package/lib/index.js +2 -2
- package/lib/{instructions-BRGoC82G.js → instructions-Cn1Jj5Xi.js} +79 -11
- package/lib/instructions.js +1 -1
- package/lib/types/client/panel-client.d.ts +0 -2
- package/lib/types/compat/client-icons.d.ts +40 -0
- package/lib/types/compat/client-session.d.ts +32 -0
- package/lib/types/compat/dsh-version.d.ts +1 -1
- package/lib/types/compat/llm-message.d.ts +39 -1
- package/lib/types/compat/tool-result.d.ts +29 -0
- package/lib/types/instructions.d.ts +4 -3
- package/package.json +15 -15
|
@@ -31,7 +31,12 @@ 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 = [
|
|
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
|
+
];
|
|
35
40
|
/**
|
|
36
41
|
* Packages whose absence means this plugin cannot function at all: every one of
|
|
37
42
|
* 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-
|
|
1
|
+
import { a as inject, i as assertSupportedInstallation, n as MultiRootCompatService, r as apply, t as DshCompatUnsupportedError } from "./compat-CRdv0vPw.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-
|
|
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-
|
|
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-CRdv0vPw.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
|
-
*
|
|
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
|
-
|
|
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 `
|
|
174
|
-
*
|
|
175
|
-
*
|
|
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
|
|
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);
|
package/lib/instructions.js
CHANGED
|
@@ -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-
|
|
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 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
|
|
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"];
|
|
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
|
-
*
|
|
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 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` records 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 `
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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.
|
|
4
|
+
"version": "0.1.2",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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"
|
|
85
85
|
},
|
|
86
86
|
"peerDependenciesMeta": {
|
|
87
87
|
"@deepseek-ai/dsh-agent": {
|