@deepseek-ai/dsh-sdk-jsonrpc-server 0.2.1-alpha.1 → 0.2.1-alpha.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/README.i18n.yaml CHANGED
@@ -15,8 +15,8 @@
15
15
  en: d152484eb41ac6b4
16
16
  zh: 09388d293f9be9cb
17
17
  /deepseek-ai-dsh-sdk-jsonrpc-server/use-this-package:
18
- en: 7abbf9c04a04b16c
19
- zh: dc18b716ed3807d5
18
+ en: ab5b719668e746f2
19
+ zh: 971c2fdaa9e7d351
20
20
  /deepseek-ai-dsh-sdk-jsonrpc-server/use-this-package/wiring:
21
21
  en: 47a33e9397e36e15
22
22
  zh: e6d173820f9ea6e5
@@ -27,8 +27,8 @@
27
27
  en: 784b68b5a498f2d5
28
28
  zh: 2c3c5a1490845179
29
29
  /deepseek-ai-dsh-sdk-jsonrpc-server/use-this-package/what-sdk-clients-can-do:
30
- en: 2b1b52a7467c557e
31
- zh: 31f58d32469f9d50
30
+ en: b4351b6b407fe65f
31
+ zh: 52d711d554d2ad33
32
32
  /deepseek-ai-dsh-sdk-jsonrpc-server/use-this-package/shutdown-and-exit:
33
33
  en: 08c3858f53090f39
34
34
  zh: dfae960e11515b06
@@ -45,8 +45,8 @@
45
45
  en: 2658804b2f90b135
46
46
  zh: 085aa00c8f0bbbcd
47
47
  /deepseek-ai-dsh-sdk-jsonrpc-server/understand-the-implementation/teardown:
48
- en: 81786b3bd70b389f
49
- zh: da80b4f50f16a098
48
+ en: 7e4403a7b1da7ff4
49
+ zh: ef75ee9411486b90
50
50
  /deepseek-ai-dsh-sdk-jsonrpc-server/further-exploration:
51
51
  en: cea854984c56c75a
52
52
  zh: 1ee5eaab8305e10d
package/README.md CHANGED
@@ -25,6 +25,8 @@ English | [中文](README.zh.md)
25
25
  <a id="use-this-package"></a>
26
26
  ## Use this package
27
27
 
28
+ `session/working-directory/get` accepts `{ sessionId }`; `session/working-directory/set` accepts `{ sessionId, path }`. Both return `{ cwd }` and create an unknown Session without starting a model turn. Reads recover missing directories through the working-directory service; changes preserve origin metadata and permissions, and reach the model through logged user context.
29
+
28
30
  Mount this plugin when a runtime must serve SDK clients: add it to a `cordis.yml` that composes the agent service, boot the runtime, and clients connect over stdio. The common path is explicit — the plugin needs the `agents` service; every other capability comes from the surrounding tree.
29
31
 
30
32
  ### Wiring
@@ -47,6 +49,8 @@ Stdout carries only JSON-RPC frames, so clients can parse every byte; diagnostic
47
49
 
48
50
  `initialize` is the runtime-readiness boundary: when the server is mounted by a Loader composition, it waits for the current plugin tree to settle before replying, so async sibling capabilities such as initial MCP tool discovery are visible to the first prompt. The handshake returns the wire-stable identity `deepseek-harness-sdk-runtime`. The server validates the provider/model route and optional non-empty `reasoningEffort` through the selected adapter before it stores them; omission stores no effort, so the model retains its own default. An optional positive `maxTokens` becomes the request output cap of each SDK-created agent and its in-process descendants, while omission applies the selected adapter or provider route default. JSON-RPC requests may dispatch concurrently, so `session/prompt` rejects until one `initialize` has completed successfully; clients must await the handshake before sending prompts. An accepted prompt queues one identified user message and immediately returns `{ messageId }`; the server then streams every durable fact as `session.event` and every whole-agent lifecycle transition as `session.status`. It does not assign an assistant message or `turn/end` to a prompt, and independent requests may enqueue more work on the same session. Persistence roots and persona come from the surrounding composition.
49
51
 
52
+ `session/wait` observes an existing SDK-owned session through managed descendant completion and any resulting root turns. It rejects unknown or retired roots, never creates a session, and responds after the root stays idle across the descendant check. Idle children with parked inbox messages remain resident but do not delay this response; later waking input can resume them. Session notifications emitted before completion precede the response on the stdio transport. A live Agent failure remains associated with that exact session until a later committed `turn/end` accounts for the outcome; otherwise the wait rejects, including when the failure preceded the wait request. Errors already represented by a terminal remain in Session events, and later successful activity clears an earlier live failure.
53
+
50
54
  ### Shutdown and exit
51
55
 
52
56
  The plugin answers `shutdown`, flushes the response, disposes the root context so SDK-owned agents, subscriptions, and persistence reach quiescence, then exits 0. EOF and signal exits belong to the app bin, which also disposes the root context. Unloading only this plugin stops serving without exiting the process.
@@ -78,7 +82,7 @@ Each protocol method validates its inputs and resolves the owning state before a
78
82
 
79
83
  ### Teardown
80
84
 
81
- `server.shutdown()` disposes only what the server owns — the surrounding context stays running when just this plugin is unloaded. Protocol `shutdown` instead disposes the root fiber so persistence and the whole runtime reach quiescence before the process exits.
85
+ `server.shutdown()` closes descendant admission below its exact root Agents and drains their managed descendants child-first before releasing the root handles and adapter. It removes its subscriptions while unrelated parent trees and the surrounding context stay running when just this plugin is unloaded. A descendant drain failure is reported after the remaining root and adapter teardown completes. Protocol `shutdown` instead disposes the root fiber so persistence and the whole runtime reach quiescence before the process exits.
82
86
 
83
87
  </details>
84
88
 
package/README.zh.md CHANGED
@@ -25,6 +25,8 @@ kind: "package-reference"
25
25
  <a id="use-this-package"></a>
26
26
  ## 使用本包
27
27
 
28
+ `session/working-directory/get` 接收 `{ sessionId }`;`session/working-directory/set` 接收 `{ sessionId, path }`。两者均返回 `{ cwd }`,并可创建未知 Session,而不启动模型轮次。读取通过工作目录服务恢复缺失目录;修改保留起始目录元数据与权限,并通过已记录的用户上下文告知模型。
29
+
28
30
  当运行时必须服务 SDK 客户端时挂载本插件:把它加入组合了 agent 服务的 `cordis.yml`,启动运行时,客户端即可通过 stdio 连接。常用路径是显式的——插件需要 `agents` 服务;其余每个能力都来自外围插件树。
29
31
 
30
32
  ### 组装
@@ -47,6 +49,8 @@ Stdout 只承载 JSON-RPC 帧,客户端可以逐字节解析;诊断信息应
47
49
 
48
50
  `initialize` 是运行时就绪边界:服务器由 Loader 组合挂载时,会等待当前插件树完成所有加载任务后再响应,因此首次提示词能够看到 MCP 初始工具发现等异步同级能力。握手返回协议稳定标识 `deepseek-harness-sdk-runtime`。服务器会通过所选适配器校验提供方/模型路由与可选的非空 `reasoningEffort`,再保存这些值;省略时不会保存推理强度,因此模型保留自身默认值。可选的正整数 `maxTokens` 会成为每个 SDK 创建的 agent 及其进程内后代的请求输出上限,省略时则应用所选适配器或提供方路由的默认值。JSON-RPC 请求可能并发分派,因此在一次 `initialize` 成功完成之前,`session/prompt` 会拒绝;客户端必须等待握手完成后再发送提示词。已接受的提示词会把一条带标识的用户消息排入队列,并立即返回 `{ messageId }`;服务器随后把每个持久事实作为 `session.event`、把整个 agent 生命周期的每次状态转换作为 `session.status` 流式发出。它不会把某条助手消息或 `turn/end` 归属于某个提示词,同一会话上的独立请求可以继续排入更多工作。持久化根目录与 persona 来自外围组合。
49
51
 
52
+ `session/wait` 观察已有 SDK 会话,直到受管理后代及其触发的根 Agent 后续轮次完成。它拒绝未知或已释放的根 Agent,不会创建会话,并在后代检查期间根 Agent 持续空闲后响应。收件箱消息处于停放状态的空闲子级继续驻留,但不延迟此响应;后续唤醒输入可使其继续运行。完成前发出的会话通知在 stdio 传输上先于响应到达。Agent 的运行时错误会保留在对应的确切会话中,直到后续提交的 `turn/end` 记录结果;否则等待请求会失败,即使错误发生在等待请求之前。终止事件已经记录的错误仍通过会话事件表达,后续成功的活动会清除较早的运行时错误。
53
+
50
54
  ### 关闭与退出
51
55
 
52
56
  插件应答 `shutdown`,刷新响应并 dispose 根上下文,使 SDK 持有的 agent、订阅与持久化达到完全停稳,然后以 0 退出。EOF 与信号退出归 app bin 负责,后者也会 dispose 根上下文。仅卸载此插件会停止服务,但不会退出进程。
@@ -78,7 +82,7 @@ Stdout 只承载 JSON-RPC 帧,客户端可以逐字节解析;诊断信息应
78
82
 
79
83
  ### 清理
80
84
 
81
- `server.shutdown()` 只 dispose 服务器自身持有的内容——仅卸载本插件时,外围上下文保持运行。协议 `shutdown` 则 dispose 根 fiber,使持久化与整个运行时在进程退出前达到完全停稳。
85
+ `server.shutdown()` 关闭其精确根 Agent 下的后代准入,按子级优先顺序排空托管后代,再释放根句柄与适配器。它移除自身订阅,而仅卸载本插件时,无关父级树与外围上下文保持运行。后代排空失败会在其余根句柄与适配器的清理完成后报告。协议 `shutdown` 则 dispose 根 fiber,使持久化与整个运行时在进程退出前达到完全停稳。
82
86
 
83
87
  </details>
84
88
 
package/lib/index.js CHANGED
@@ -66,12 +66,22 @@ var HarnessSdkJsonRpcServer = class {
66
66
  this.options = options;
67
67
  const serverOptions = this.options;
68
68
  this.disposers.push(ctx.on("session/event", (session, event) => {
69
+ const record = this.sessions.get(session.id);
70
+ if (event.type === "turn/end" && record?.handle.agent.session === session && record.failure !== void 0 && event.seq >= record.failure.atOffset) record.failure = void 0;
69
71
  const payload = {
70
72
  sessionId: String(session.id),
71
73
  event
72
74
  };
73
75
  this.transport.notify("session.event", payload);
74
76
  }));
77
+ this.disposers.push(ctx.on("agent/error", ({ agent, error }) => {
78
+ const record = this.sessions.get(agent.session.id);
79
+ if (record?.handle.agent !== agent) return;
80
+ record.failure = {
81
+ error,
82
+ atOffset: agent.session.seq
83
+ };
84
+ }));
75
85
  this.disposers.push(ctx.on("agent/status", ({ agent, status }) => {
76
86
  this.transport.notify("session.status", {
77
87
  sessionId: String(agent.session.id),
@@ -153,11 +163,61 @@ var HarnessSdkJsonRpcServer = class {
153
163
  rec.handle.agent.followup(message);
154
164
  return { messageId: message.id };
155
165
  }
166
+ /**
167
+ * Wait for an existing owned Agent and its managed descendants to finish.
168
+ * The response follows all Session notifications emitted during the wait.
169
+ * Rejects a live Agent failure that has no subsequent durable terminal.
170
+ * @param params - the SDK-owned session to observe without creating one.
171
+ * @returns an empty result after the root stays idle across the descendant check.
172
+ */
173
+ async wait(params) {
174
+ if (!this.initialized) throw new Error("SDK server is not initialized");
175
+ const rec = this.sessions.get(params.sessionId);
176
+ if (rec === void 0) throw new Error(`unknown SDK session: ${params.sessionId}`);
177
+ const agent = rec.handle.agent;
178
+ const subagents = this.ctx.get("subagents");
179
+ while (true) {
180
+ this.assertLiveAgent(rec, params.sessionId);
181
+ await agent.whenIdle();
182
+ const idleSeq = agent.session.seq;
183
+ const children = await subagents?.waitForChildren(agent);
184
+ this.assertLiveAgent(rec, params.sessionId);
185
+ if (!children && agent.status === "idle" && agent.session.seq === idleSeq) {
186
+ if (rec.failure !== void 0) throw rec.failure.error;
187
+ return {};
188
+ }
189
+ }
190
+ }
156
191
  assertLiveAgent(rec, sessionId) {
157
192
  if (this.ctx.agents.get(rec.handle.agent.id) !== rec.handle.agent) throw new Error(`session agent was disposed outside the server: ${sessionId}`);
158
193
  }
159
194
  /**
195
+ * Read a Session's effective directory, recovering a missing directory to its origin.
196
+ * @param params - target Session; an unknown id creates it.
197
+ * @returns the absolute effective directory.
198
+ */
199
+ async getWorkingDirectory(params) {
200
+ const agent = await this.workingDirectoryAgent(params.sessionId);
201
+ return { cwd: await this.ctx.workingDirectory.ensure(agent) };
202
+ }
203
+ /**
204
+ * Change a Session's directory and queue its model-visible transition.
205
+ * @param params - target Session and absolute or current-directory-relative path.
206
+ * @returns the validated absolute directory; origin and permissions are unchanged.
207
+ */
208
+ async setWorkingDirectory(params) {
209
+ const agent = await this.workingDirectoryAgent(params.sessionId);
210
+ return { cwd: await this.ctx.workingDirectory.set(agent, params.path) };
211
+ }
212
+ async workingDirectoryAgent(sessionId) {
213
+ if (!this.initialized) throw new Error("SDK server is not initialized");
214
+ const rec = await this.getOrCreateSession(sessionId);
215
+ this.assertLiveAgent(rec, sessionId);
216
+ return rec.handle.agent;
217
+ }
218
+ /**
160
219
  * Dispose server-owned agents, adapter, and subscriptions to quiescence.
220
+ * Managed descendants drain before the root Agent handles and adapter are released.
161
221
  * The surrounding context remains running.
162
222
  * @returns empty JSON-RPC result.
163
223
  */
@@ -178,6 +238,11 @@ var HarnessSdkJsonRpcServer = class {
178
238
  } catch (error) {
179
239
  failures.push(error);
180
240
  }
241
+ try {
242
+ await this.ctx.get("subagents")?.drainDescendants(records.map((rec) => rec.handle.agent));
243
+ } catch (error) {
244
+ failures.push(error);
245
+ }
181
246
  const teardownResults = await Promise.allSettled([...records.map((rec) => Promise.resolve().then(() => rec.handle.dispose())), ...this.llmFiber === void 0 ? [] : [Promise.resolve().then(() => this.llmFiber?.dispose())]]);
182
247
  this.llmFiber = void 0;
183
248
  failures.push(...teardownResults.filter((result) => result.status === "rejected").map((result) => result.reason));
@@ -196,6 +261,20 @@ var HarnessSdkJsonRpcServer = class {
196
261
  switch (method) {
197
262
  case "initialize": return this.initialize(params);
198
263
  case "session/prompt": return this.prompt(params);
264
+ case "session/wait": {
265
+ const sessionId = params?.sessionId;
266
+ if (typeof sessionId !== "string") throw new TypeError("session/wait requires a sessionId string");
267
+ return this.wait({ sessionId });
268
+ }
269
+ case "session/working-directory/get":
270
+ case "session/working-directory/set":
271
+ if (typeof params?.sessionId !== "string" || params.sessionId.length === 0) throw new TypeError("working-directory requests require a non-empty sessionId");
272
+ if (method === "session/working-directory/get") return this.getWorkingDirectory({ sessionId: params.sessionId });
273
+ if (typeof params.path !== "string") throw new TypeError("working-directory set requires a path string");
274
+ return this.setWorkingDirectory({
275
+ sessionId: params.sessionId,
276
+ path: params.path
277
+ });
199
278
  case "shutdown": return this.shutdown();
200
279
  default: throw new Error(`unknown DeepSeek Harness SDK runtime method: ${method}`);
201
280
  }
@@ -216,16 +295,19 @@ var HarnessSdkJsonRpcServer = class {
216
295
  return creation;
217
296
  }
218
297
  async createSession(sessionId) {
219
- const rec = { handle: await this.ctx.agents.create({
220
- sessionId: brandString(sessionId),
221
- meta: { cwd: this.cwd },
222
- agentOptions: {
223
- provider: this.provider,
224
- model: this.model,
225
- ...this.reasoningEffort === void 0 ? {} : { reasoningEffort: this.reasoningEffort },
226
- ...this.maxTokens === void 0 ? {} : { maxTokens: this.maxTokens }
227
- }
228
- }) };
298
+ const rec = {
299
+ handle: await this.ctx.agents.create({
300
+ sessionId: brandString(sessionId),
301
+ meta: { cwd: this.cwd },
302
+ agentOptions: {
303
+ provider: this.provider,
304
+ model: this.model,
305
+ ...this.reasoningEffort === void 0 ? {} : { reasoningEffort: this.reasoningEffort },
306
+ ...this.maxTokens === void 0 ? {} : { maxTokens: this.maxTokens }
307
+ }
308
+ }),
309
+ failure: void 0
310
+ };
229
311
  this.sessions.set(sessionId, rec);
230
312
  return rec;
231
313
  }
@@ -246,7 +328,7 @@ var HarnessSdkJsonRpcServer = class {
246
328
  * @module @deepseek-ai/dsh-sdk-jsonrpc-server
247
329
  */
248
330
  const name = "sdk-jsonrpc-server";
249
- const inject = ["agents"];
331
+ const inject = ["agents", "workingDirectory"];
250
332
  const Config = Schema.object({ maxTokensAsSuccess: Schema.boolean().default(false) });
251
333
  /**
252
334
  * Serve SDK requests over the configured streams. Effect disposal shuts down
@@ -5,7 +5,7 @@
5
5
  * @module @deepseek-ai/dsh-sdk-jsonrpc-server/server
6
6
  */
7
7
  import type { Context } from '@deepseek-ai/cordis';
8
- import type { InitializeParams, InitializeResult, JsonRpcTransportPeer, SessionPromptParams, SessionPromptResult } from '@deepseek-ai/dsh-sdk-protocol';
8
+ import type { InitializeParams, InitializeResult, JsonRpcTransportPeer, SessionPromptParams, SessionPromptResult, SessionWaitParams, SessionWorkingDirectoryParams, SessionWorkingDirectorySetParams, SessionWorkingDirectoryResult } from '@deepseek-ai/dsh-sdk-protocol';
9
9
  /** Deployment-specific status mapping for SDK turn and subagent outcomes. */
10
10
  export interface HarnessSdkJsonRpcServerOptions {
11
11
  /** Report max-token termination as an accepted result instead of an infrastructure error. */
@@ -45,9 +45,31 @@ export declare class HarnessSdkJsonRpcServer {
45
45
  * @returns the durable message identity.
46
46
  */
47
47
  prompt(params: SessionPromptParams): Promise<SessionPromptResult>;
48
+ /**
49
+ * Wait for an existing owned Agent and its managed descendants to finish.
50
+ * The response follows all Session notifications emitted during the wait.
51
+ * Rejects a live Agent failure that has no subsequent durable terminal.
52
+ * @param params - the SDK-owned session to observe without creating one.
53
+ * @returns an empty result after the root stays idle across the descendant check.
54
+ */
55
+ wait(params: SessionWaitParams): Promise<Record<string, never>>;
48
56
  private assertLiveAgent;
57
+ /**
58
+ * Read a Session's effective directory, recovering a missing directory to its origin.
59
+ * @param params - target Session; an unknown id creates it.
60
+ * @returns the absolute effective directory.
61
+ */
62
+ getWorkingDirectory(params: SessionWorkingDirectoryParams): Promise<SessionWorkingDirectoryResult>;
63
+ /**
64
+ * Change a Session's directory and queue its model-visible transition.
65
+ * @param params - target Session and absolute or current-directory-relative path.
66
+ * @returns the validated absolute directory; origin and permissions are unchanged.
67
+ */
68
+ setWorkingDirectory(params: SessionWorkingDirectorySetParams): Promise<SessionWorkingDirectoryResult>;
69
+ private workingDirectoryAgent;
49
70
  /**
50
71
  * Dispose server-owned agents, adapter, and subscriptions to quiescence.
72
+ * Managed descendants drain before the root Agent handles and adapter are released.
51
73
  * The surrounding context remains running.
52
74
  * @returns empty JSON-RPC result.
53
75
  */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-sdk-jsonrpc-server",
3
3
  "description": "Stdio JSON-RPC server plugin for out-of-process DeepSeek Harness SDK clients",
4
- "version": "0.2.1-alpha.1",
4
+ "version": "0.2.1-alpha.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -27,34 +27,36 @@
27
27
  ],
28
28
  "license": "MIT",
29
29
  "dependencies": {
30
- "@deepseek-ai/dsh-brand": "0.2.1-alpha.1",
30
+ "@deepseek-ai/dsh-brand": "0.2.1-alpha.2",
31
31
  "@deepseek-ai/schemastery": "~3.18.5-alpha.1"
32
32
  },
33
33
  "peerDependencies": {
34
- "@deepseek-ai/dsh-agent": "0.2.1-alpha.1",
35
- "@deepseek-ai/dsh-attachment": "0.2.1-alpha.1",
36
- "@deepseek-ai/dsh-llm": "0.2.1-alpha.1",
37
- "@deepseek-ai/dsh-llm-deepseek-api-key": "0.2.1-alpha.1",
38
- "@deepseek-ai/dsh-scope": "0.2.1-alpha.1",
39
- "@deepseek-ai/dsh-sdk-protocol": "0.2.1-alpha.1",
40
- "@deepseek-ai/dsh-session": "0.2.1-alpha.1",
41
- "@deepseek-ai/dsh-subagent": "0.2.1-alpha.1",
42
- "@deepseek-ai/cordis": "~4.0.5-alpha.1"
34
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1",
35
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.2",
36
+ "@deepseek-ai/dsh-attachment": "0.2.1-alpha.2",
37
+ "@deepseek-ai/dsh-llm": "0.2.1-alpha.2",
38
+ "@deepseek-ai/dsh-llm-deepseek-api-key": "0.2.1-alpha.2",
39
+ "@deepseek-ai/dsh-scope": "0.2.1-alpha.2",
40
+ "@deepseek-ai/dsh-sdk-protocol": "0.2.1-alpha.2",
41
+ "@deepseek-ai/dsh-session": "0.2.1-alpha.2",
42
+ "@deepseek-ai/dsh-subagent": "0.2.1-alpha.2",
43
+ "@deepseek-ai/dsh-working-directory": "0.2.1-alpha.2"
43
44
  },
44
45
  "devDependencies": {
45
46
  "@deepseek-ai/cordis": "~4.0.5-alpha.1",
46
47
  "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.1",
47
- "@deepseek-ai/dsh-agent": "0.2.1-alpha.1",
48
- "@deepseek-ai/dsh-agent-loop": "0.2.1-alpha.1",
49
- "@deepseek-ai/dsh-agent-loop-testkit": "0.2.1-alpha.1",
50
- "@deepseek-ai/dsh-attachment": "0.2.1-alpha.1",
51
- "@deepseek-ai/dsh-llm": "0.2.1-alpha.1",
52
- "@deepseek-ai/dsh-llm-deepseek-api-key": "0.2.1-alpha.1",
53
- "@deepseek-ai/dsh-session-persistence-jsonl": "0.2.1-alpha.1",
54
- "@deepseek-ai/dsh-session": "0.2.1-alpha.1",
55
- "@deepseek-ai/dsh-session-projection": "0.2.1-alpha.1",
56
- "@deepseek-ai/dsh-subagent": "0.2.1-alpha.1",
57
- "@deepseek-ai/dsh-scope": "0.2.1-alpha.1",
58
- "@deepseek-ai/dsh-sdk-protocol": "0.2.1-alpha.1"
48
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.2",
49
+ "@deepseek-ai/dsh-agent-loop": "0.2.1-alpha.2",
50
+ "@deepseek-ai/dsh-agent-loop-testkit": "0.2.1-alpha.2",
51
+ "@deepseek-ai/dsh-attachment": "0.2.1-alpha.2",
52
+ "@deepseek-ai/dsh-llm": "0.2.1-alpha.2",
53
+ "@deepseek-ai/dsh-llm-deepseek-api-key": "0.2.1-alpha.2",
54
+ "@deepseek-ai/dsh-scope": "0.2.1-alpha.2",
55
+ "@deepseek-ai/dsh-sdk-protocol": "0.2.1-alpha.2",
56
+ "@deepseek-ai/dsh-session": "0.2.1-alpha.2",
57
+ "@deepseek-ai/dsh-session-persistence-jsonl": "0.2.1-alpha.2",
58
+ "@deepseek-ai/dsh-session-projection": "0.2.1-alpha.2",
59
+ "@deepseek-ai/dsh-subagent": "0.2.1-alpha.2",
60
+ "@deepseek-ai/dsh-working-directory": "0.2.1-alpha.2"
59
61
  }
60
62
  }