@deepseek-ai/dsh-headless 0.2.1-alpha.1 → 0.2.1-alpha.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.
package/README.i18n.yaml CHANGED
@@ -18,8 +18,11 @@
18
18
  en: 4447012f4c84100d
19
19
  zh: faf579ae9f04c096
20
20
  /deepseek-ai-dsh-headless/use-this-package/running-a-one-shot-task:
21
- en: 76a22e98d2b3cc2f
22
- zh: c9eb624609b8cc32
21
+ en: 89a48af61a38afc3
22
+ zh: fe202a1bb2c11781
23
+ /deepseek-ai-dsh-headless/use-this-package/credentials:
24
+ en: ca8217837ee9c698
25
+ zh: fa20daf27d4e09ef
23
26
  /deepseek-ai-dsh-headless/use-this-package/choosing-the-session-identity:
24
27
  en: dbaa2fac63910a4c
25
28
  zh: 4fd5c17815ca444b
@@ -36,14 +39,14 @@
36
39
  en: be1b73a6d0ee3902
37
40
  zh: bdba099685d68b27
38
41
  /deepseek-ai-dsh-headless/understand-the-implementation/run-flow:
39
- en: 2f2adf0c346c6c1b
40
- zh: f1e988c7e597a852
42
+ en: 3729fbdc598637da
43
+ zh: 254c6961b65b9e2b
41
44
  /deepseek-ai-dsh-headless/understand-the-implementation/patch-surface-over-base:
42
45
  en: a22752c052878579
43
46
  zh: 1e42c946d8673eeb
44
47
  /deepseek-ai-dsh-headless/understand-the-implementation/exit-mapping:
45
- en: cc6c485a42d40d28
46
- zh: c57775d9319d8dfd
48
+ en: c2466d3d8a26177a
49
+ zh: b75743bfa2e7723a
47
50
  /deepseek-ai-dsh-headless/understand-the-implementation/source-map:
48
51
  en: d82278600e0efdbd
49
52
  zh: 0f546bdba164ef25
@@ -57,8 +60,8 @@
57
60
  en: 0b0f74b412c7c6d8
58
61
  zh: 6e8f918d0c4bf342
59
62
  /deepseek-ai-dsh-headless/known-limitations-and-deferred-work:
60
- en: b2df65836d53ba03
61
- zh: 82a56dc1255a0c3b
63
+ en: 3a6dc9666d852219
64
+ zh: b764f203815e179e
62
65
  /deepseek-ai-dsh-headless/known-limitations-and-deferred-work/dev-note:
63
66
  en: e67f633dc6fe7773
64
67
  zh: 3bb0c20c93f16f98
package/README.md CHANGED
@@ -49,6 +49,26 @@ The task and run options are supplied through three settings:
49
49
 
50
50
  The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-headless) is the exhaustive source for every accepted field and its JSDoc.
51
51
 
52
+ <a id="credentials"></a>
53
+ ### Credentials
54
+
55
+ The shipped headless profile disables the managed credential store and its authorization and DeepSeek account consumers. API-key routes use the launch environment, then `<invocation cwd>/.env`, then `$DSH_HOME/.env`. Keys and sign-ins saved by the GUI are ignored without changing their file. Providers that require a saved sign-in fail unless stored authentication is restored; external provider credential chains, such as AWS profiles, remain available.
56
+
57
+ Unset an empty launch variable to allow its `.env` fallback; an exported empty value shadows that fallback.
58
+
59
+ To restore stored authentication, add these rows to `$DSH_HOME/profiles/headless/cordis.patch.yml` or a `--patch` overlay:
60
+
61
+ ```yaml
62
+ - id: credentials
63
+ disabled: false
64
+ - id: authorization
65
+ disabled: false
66
+ - id: deepseek-account
67
+ disabled: false
68
+ ```
69
+
70
+ The restored store uses [saved credentials before environment fallbacks](../../credentials/credentials-local/README.md). Web, SDK and ACP profiles keep that default ordering. Headless sessions, settings and tool behavior are unchanged; this profile choice is not a filesystem access boundary.
71
+
52
72
  ### Choosing the session identity
53
73
 
54
74
  Every invocation defaults to a fresh `session-<uuid>` identity, which `--json` reports in its opening `session` event. Pass `--session-id <id>` to continue that conversation: the runner adopts the persisted Session with that id, and an id with no stored Session fails before the task runs rather than quietly opening an empty history. Adoption requires the composed `sessionPersistence` and `sessionQuery` services, so a profile that omits either fails loudly instead of returning an id whose history dies with the process. An Agent already live under the requested id in this process is refused: another owner may still drive it, so the runner cannot claim an exclusive run interval over it. The identity is opaque, so the exact string is used, whitespace included. The working directory is resolved through the mounted filesystem provider (`fs.resolve('.')` and `fs.processPath()`), or the process cwd when no filesystem service is mounted; new Sessions record that directory. Adoption compares the recorded cwd with the same provider-resolved directory and refuses a Session that is a subagent or forked session, that recorded no working directory, that runs under an agent preset this profile does not compose, or whose preset record is malformed — the check reads the preset the Session log currently records, so a Session that switched preset while blank is rejected too. A supervisor therefore cannot silently drive someone else's conversation under a different composition; any mismatch fails before the task runs.
@@ -77,7 +97,7 @@ The runner is a direct driver over the core API carrier: it resolves the Agent i
77
97
 
78
98
  ### Run flow
79
99
 
80
- The runner awaits the complete application (`ctx.get('loader')?.await()`) so the composed tools and adapters are not half-mounted, reads the shared [`agentDefaultModel`](../../core/agent-default-model/README.md) selection, resolves the task from config or stdin, then resolves the Agent identity: a fresh `session-<uuid>` by default, or the persisted Session `--session-id` names, which it adopts through [`sessionQuery`](../../session-query/session-query/README.md) and refuses when no log exists. It submits the task as an ordinary user message. Without `--json` it streams that Agent's non-empty reasoning deltas to stderr; with `--json` it projects the run instead. It waits for quiescence, then flushes the Session and folds the owned interval (`firstSeq` onward) into the last non-empty `assistant/message` text and final `turn/end` reason. It writes the final text to stdout (or the `final` event) and requests exit.
100
+ The runner awaits the complete application (`ctx.get('loader')?.await()`) so the composed tools and adapters are not half-mounted, reads the shared [`agentDefaultModel`](../../core/agent-default-model/README.md) selection, resolves the task from config or stdin, then resolves the Agent identity: a fresh `session-<uuid>` by default, or the persisted Session `--session-id` names, which it adopts through [`sessionQuery`](../../session-query/session-query/README.md) and refuses when no log exists. It submits the task as an ordinary user message. Without `--json` it streams that Agent's non-empty reasoning deltas to stderr; with `--json` it projects the run instead. It waits for child work and rechecks that the parent remains idle with an unchanged Session sequence before finishing, so settlement notices can drive a final parent answer. Idle children with parked inbox messages do not delay completion; process shutdown discards their unclaimed messages. It then flushes the Session and folds the owned interval (`firstSeq` onward) into the last non-empty `assistant/message` text and final `turn/end` reason. It writes the final text to stdout (or the `final` event) and requests exit.
81
101
 
82
102
  ### Patch surface over base
83
103
 
@@ -85,7 +105,7 @@ The patch rides over `dsh-base`: it inherits the projection cache and shared PTC
85
105
 
86
106
  ### Exit mapping
87
107
 
88
- A completed final `turn/end` exits 0; any other outcome — aborted, error, or no turn in the owned interval — exits 1. An `error` reason also writes `dsh: <code>: <message>` to stderr. A direct driver failure (for example, Agent creation or an unusable `--session-id`) writes `dsh: <message>` to stderr and exits 1, and in `--json` mode also emits an `error` event.
108
+ A completed final `turn/end` exits 0; any other outcome — aborted, error, or no turn in the owned interval — exits 1. An `error` reason also writes `dsh: <code>: <message>` to stderr. A live Agent failure without a later committed `turn/end` is a direct driver failure, including a summary whose start or end cannot be persisted; an earlier completed turn cannot make that run succeed. A direct driver failure (for example, Agent creation or an unusable `--session-id`) writes `dsh: <message>` to stderr and exits 1, and in `--json` mode also emits an `error` event without a `final` event.
89
109
 
90
110
  ### Source map
91
111
 
@@ -133,6 +153,7 @@ The runner adds nothing to the request prefix; it only drives one user message t
133
153
  These limits tell you when headless does not fit and what it needs from the `dsh` launcher. They are current package constraints, not a general CLI comparison or a task backlog.
134
154
 
135
155
  - **One task per run** — after the task is answered the process exits; there is no interactive follow-up, so split multi-step work into separate runs.
156
+ - **Final background-job settlement may be absent from persisted history** — process teardown can end Session routing or close its writer before an owned job settles, including normal completion and signal shutdown; the [job lifecycle contract](../../../docs/subsystems/jobs.md#session-lifecycle-records) defines how consumers retain incomplete intervals.
136
157
  - **Runs through the `dsh` launcher** — starting the headless profile another way fails at startup, because only the launcher can request the process exit.
137
158
  - **No pre-token heartbeat** — in default mode stderr stays silent until the provider emits a non-empty reasoning delta; a delayed first token exposes no earlier progress signal.
138
159
  - **Reasoning enters stderr logs** — in default mode, redirection and supervisors may retain substantially more and potentially sensitive model output; route stderr to a controlled sink when needed.
package/README.zh.md CHANGED
@@ -49,6 +49,26 @@ agent 会完成该任务,把提供方的每个非空推理(reasoning)增
49
49
 
50
50
  生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-headless)是所有受支持字段及其 JSDoc 的完整真源。
51
51
 
52
+ <a id="credentials"></a>
53
+ ### 凭据
54
+
55
+ 随附的 headless profile 禁用托管凭据存储,以及依赖它的 authorization 和 DeepSeek account 消费方。API 密钥路由依次使用启动环境、`<运行命令的目录>/.env` 和 `$DSH_HOME/.env`。GUI 保存的密钥和登录凭据不会被使用,存储文件保持原样。需要已保存登录凭据的提供方会失败,除非恢复存储认证;AWS profile 等提供方外部凭据链仍然可用。
56
+
57
+ 启动变量为空时,请取消导出该变量,让 `.env` 后备生效;已导出的空值会遮蔽后备值。
58
+
59
+ 要恢复存储认证,请把以下行加入 `$DSH_HOME/profiles/headless/cordis.patch.yml` 或 `--patch` 覆盖文件:
60
+
61
+ ```yaml
62
+ - id: credentials
63
+ disabled: false
64
+ - id: authorization
65
+ disabled: false
66
+ - id: deepseek-account
67
+ disabled: false
68
+ ```
69
+
70
+ 恢复后,存储仍按[已保存凭据优先于环境后备](../../credentials/credentials-local/README.zh.md)解析。Web、SDK 和 ACP profile 保留这一默认顺序。headless 的会话、settings 和工具行为不变;这种 profile 配置选择不构成文件系统访问边界。
71
+
52
72
  ### 选择 Session 标识
53
73
 
54
74
  每次调用默认使用全新的 `session-<uuid>` 标识,`--json` 会在开头的 `session` 事件里报告它。传入 `--session-id <id>` 延续这段对话:runner 沿用该 id 对应的持久化 Session,而该 id 没有持久化 Session 时会在任务运行前失败,而不是悄悄开出一段空历史。沿用要求已组合 `sessionPersistence` 与 `sessionQuery` 服务,因此缺少任一服务的 profile 会显式失败,而不会返回一个历史随进程消失的 id。本进程中已存在持有该 id 的存活 Agent 时会被拒绝:它的原 owner 可能仍在驱动它,runner 无法取得独占的运行区间。标识是不透明的,因此会原样使用调用方给出的字符串,包括空白字符。工作目录通过已挂载的文件系统提供方解析(`fs.resolve('.')` 与 `fs.processPath()`);未挂载文件系统服务时使用进程 cwd,新 Session 会记录该目录。沿用会将已记录 cwd 与同一提供方解析出的目录比较,并拒绝子 agent 或 fork 会话、未记录工作目录的会话、运行在本 profile 不组合的 agent preset 下的会话,以及 preset 记录畸形的会话——该检查读取 Session 日志当前记录的 preset,因此在空白期切换过 preset 的会话同样会被拒绝。因此监督进程无法在另一套组合下悄悄驱动他人的会话;任一不匹配都会在任务运行前失败。
@@ -77,7 +97,7 @@ runner 是核心 API 载体之上的直接驱动器:它确定 Agent 标识—
77
97
 
78
98
  ### 运行流程
79
99
 
80
- runner 等待整个应用结算(`ctx.get('loader')?.await()`),确保已组合的工具与适配器不会半挂载,读取共享的 [`agentDefaultModel`](../../core/agent-default-model/README.zh.md) 选择,从配置或 stdin 解析任务,然后确定 Agent 标识:默认是全新的 `session-<uuid>`,或是 `--session-id` 指名的持久化 Session——通过 [`sessionQuery`](../../session-query/session-query/README.zh.md) 沿用,日志不存在时拒绝。它把任务作为普通用户消息提交。不带 `--json` 时,它把该 Agent 的非空推理增量流式写入 stderr;带 `--json` 时改为投影本次运行。它等待完全停稳,然后对会话执行 flush,并把所属区间(从 `firstSeq` 起)折叠为最后一条非空 `assistant/message` 文本与最终 `turn/end` 原因。最后,它把最终文本写入 stdout(或 `final` 事件)并请求退出。
100
+ runner 等待整个应用结算(`ctx.get('loader')?.await()`),确保已组合的工具与适配器不会半挂载,读取共享的 [`agentDefaultModel`](../../core/agent-default-model/README.zh.md) 选择,从配置或 stdin 解析任务,然后确定 Agent 标识:默认是全新的 `session-<uuid>`,或是 `--session-id` 指名的持久化 Session——通过 [`sessionQuery`](../../session-query/session-query/README.zh.md) 沿用,日志不存在时拒绝。它把任务作为普通用户消息提交。不带 `--json` 时,它把该 Agent 的非空推理增量流式写入 stderr;带 `--json` 时改为投影本次运行。它等待子级工作,并在结束前复核父级仍空闲且 Session 序号未变,让结算通知可以驱动父级生成最终答案。收件箱消息处于停放状态的空闲子级不会延迟完成;进程关闭时丢弃这些未领取消息。随后它对会话执行 flush,并把所属区间(从 `firstSeq` 起)折叠为最后一条非空 `assistant/message` 文本与最终 `turn/end` 原因。最后,它把最终文本写入 stdout(或 `final` 事件)并请求退出。
81
101
 
82
102
  ### 基于 base 的 patch 内容
83
103
 
@@ -85,7 +105,7 @@ patch 叠加在 `dsh-base` 之上:继承投影缓存与共享 PTC 运行时,
85
105
 
86
106
  ### 退出映射
87
107
 
88
- 最终 `turn/end` 完成时退出码为 0;任何其他结果——aborted、error,或所属区间内没有轮次——退出码为 1。结束原因为 `error` 时还会向 stderr 写入 `dsh: <code>: <message>`。直接驱动器失败(例如 Agent 创建失败或不可用的 `--session-id`)向 stderr 写入 `dsh: <message>` 并退出 1,且在 `--json` 模式下额外发出一个 `error` 事件。
108
+ 最终 `turn/end` 完成时退出码为 0;任何其他结果——aborted、error,或所属区间内没有轮次——退出码为 1。结束原因为 `error` 时还会向 stderr 写入 `dsh: <code>: <message>`。若实时 Agent 失败后没有提交更晚的 `turn/end`,则视为直接驱动器失败,包括汇总轮次的开始或结束无法持久化;更早的已完成轮次不能使该次运行成功。直接驱动器失败(例如 Agent 创建失败或不可用的 `--session-id`)向 stderr 写入 `dsh: <message>` 并退出 1,且在 `--json` 模式下额外发出一个 `error` 事件,不发出 `final` 事件。
89
109
 
90
110
  ### 源码地图
91
111
 
@@ -133,6 +153,7 @@ runner 不向请求前缀添加任何内容;它只是驱动组合出的配置
133
153
  这些限制告诉你 headless 何时不适用、它需要 `dsh` 启动器提供什么。它们是当前包约束,不是通用的 CLI(命令行界面)对比或任务积压。
134
154
 
135
155
  - **每次运行一个任务**——任务得到回答后进程即退出;没有交互式后续,因此多步工作请拆成多次运行。
156
+ - **持久化历史可能缺少后台 job 的最后一条结算**——进程销毁可能在有主 job 结算前停止 Session 路由或关闭写句柄,正常结束和信号关停也可能如此;[job 生命周期约定](../../../docs/subsystems/jobs.zh.md#session-lifecycle-records)说明消费方如何保留不完整区间。
136
157
  - **通过 `dsh` 启动器运行**——以其他方式启动 headless profile 会在启动时失败,因为只有启动器能请求进程退出。
137
158
  - **首个 token 前没有心跳**——默认模式下,提供方发出第一个非空推理增量前,stderr 保持静默;延迟首个 token 的提供方不会更早给出进度信号。
138
159
  - **推理进入 stderr 日志**——默认模式下,重定向与监督进程可能保留显著更多且可能敏感的模型输出;需要时应把 stderr 路由到受控位置。
package/cordis.patch.yml CHANGED
@@ -8,7 +8,6 @@
8
8
 
9
9
  - id: system-prompt
10
10
  config:
11
- personaSuffix: Your working directory is {{cwd}}.
12
11
  personaPrefix: >-
13
12
  You are a coding agent powered by the {{model}} model.
14
13
 
@@ -32,3 +31,13 @@
32
31
 
33
32
  - id: hmr
34
33
  disabled: true
34
+
35
+ # One-shot jobs use launch-time credentials instead of the interactive store.
36
+ - id: credentials
37
+ disabled: true
38
+
39
+ - id: authorization
40
+ disabled: true
41
+
42
+ - id: deepseek-account
43
+ disabled: true
package/lib/index.js CHANGED
@@ -286,6 +286,7 @@ function fail(io, error, json) {
286
286
  }
287
287
  /**
288
288
  * Run one task through one Agent and request process exit.
289
+ * Live Agent failures require a later durable terminal before a recovered run can succeed.
289
290
  * @param ctx - plugin context carrying the Agent, default model, Session, and launcher IO services.
290
291
  * @param config - task, optional exact Session identity, and output mode.
291
292
  * @param io - process-facing effects.
@@ -324,6 +325,16 @@ async function run(ctx, config, io) {
324
325
  const firstSeq = agent.session.seq;
325
326
  const projection = config.json === true ? projectJsonRun(ctx, agent, io.stdout, { cwd }) : void 0;
326
327
  const stopReasoning = projection === void 0 ? streamReasoning(ctx, agent, io.stderr) : void 0;
328
+ let failure;
329
+ const stopErrors = ctx.on("agent/error", ({ agent: subject, error }) => {
330
+ if (subject === agent) failure = {
331
+ error,
332
+ atOffset: agent.session.seq
333
+ };
334
+ });
335
+ const stopTerminals = ctx.on("session/event", (session, event) => {
336
+ if (session === agent.session && event.type === "turn/end" && failure !== void 0 && event.seq >= failure.atOffset) failure = void 0;
337
+ });
327
338
  try {
328
339
  try {
329
340
  agent.followup(createUserMessage({
@@ -333,17 +344,25 @@ async function run(ctx, config, io) {
333
344
  }],
334
345
  source: { kind: "user" }
335
346
  }));
336
- await agent.whenIdle();
347
+ const subagents = ctx.get("subagents");
348
+ while (true) {
349
+ await agent.whenIdle();
350
+ const idleSeq = agent.session.seq;
351
+ if (!await subagents?.waitForChildren(agent) && agent.status === "idle" && agent.session.seq === idleSeq) break;
352
+ }
337
353
  } finally {
338
354
  stopReasoning?.();
339
355
  }
340
356
  await sessions.flush(agent.session);
357
+ if (failure !== void 0) throw failure.error;
341
358
  const outcome = summarize(agent.session, firstSeq);
342
359
  if (projection === void 0) io.stdout.write(outcome.text + "\n");
343
360
  else projection.finish(outcome.text);
344
361
  if (outcome.reason?.kind === "error") io.stderr.write(`dsh: ${outcome.reason.error.code}: ${outcome.reason.error.message}\n`);
345
362
  io.exit(outcome.reason?.kind === "completed" ? 0 : 1);
346
363
  } finally {
364
+ stopErrors();
365
+ stopTerminals();
347
366
  projection?.dispose();
348
367
  }
349
368
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-headless",
3
3
  "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer",
4
- "version": "0.2.1-alpha.1",
4
+ "version": "0.2.1-alpha.3",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -40,32 +40,39 @@
40
40
  }
41
41
  },
42
42
  "dependencies": {
43
- "commander": "^15.0.0",
44
- "@deepseek-ai/dsh-cmdline": "0.2.1-alpha.1",
45
- "@deepseek-ai/dsh-brand": "0.2.1-alpha.1",
46
- "@deepseek-ai/dsh-util-values": "0.2.1-alpha.1",
47
- "@deepseek-ai/schemastery": "~3.18.5-alpha.1"
43
+ "@deepseek-ai/dsh-brand": "0.2.1-alpha.3",
44
+ "@deepseek-ai/dsh-cmdline": "0.2.1-alpha.3",
45
+ "@deepseek-ai/dsh-util-values": "0.2.1-alpha.3",
46
+ "@deepseek-ai/schemastery": "~3.18.5-alpha.2",
47
+ "commander": "^15.0.0"
48
48
  },
49
49
  "peerDependencies": {
50
- "@deepseek-ai/cordis": "~4.0.5-alpha.1",
51
- "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.1",
52
- "@deepseek-ai/dsh-agent": "0.2.1-alpha.1",
53
- "@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.1",
54
- "@deepseek-ai/dsh-llm": "0.2.1-alpha.1",
55
- "@deepseek-ai/dsh-session": "0.2.1-alpha.1",
56
- "@deepseek-ai/dsh-session-query": "0.2.1-alpha.1",
57
- "@deepseek-ai/dsh-fs": "0.2.1-alpha.1"
50
+ "@deepseek-ai/cordis": "~4.0.5-alpha.2",
51
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.2",
52
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.3",
53
+ "@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.3",
54
+ "@deepseek-ai/dsh-llm": "0.2.1-alpha.3",
55
+ "@deepseek-ai/dsh-session": "0.2.1-alpha.3",
56
+ "@deepseek-ai/dsh-session-query": "0.2.1-alpha.3",
57
+ "@deepseek-ai/dsh-fs": "0.2.1-alpha.3",
58
+ "@deepseek-ai/dsh-subagent": "0.2.1-alpha.3"
58
59
  },
59
60
  "devDependencies": {
60
- "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.1",
61
- "@deepseek-ai/cordis": "~4.0.5-alpha.1",
62
- "@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.1",
63
- "@deepseek-ai/dsh-agent-loop": "0.2.1-alpha.1",
64
- "@deepseek-ai/dsh-agent": "0.2.1-alpha.1",
65
- "@deepseek-ai/dsh-agent-loop-testkit": "0.2.1-alpha.1",
66
- "@deepseek-ai/dsh-llm": "0.2.1-alpha.1",
67
- "@deepseek-ai/dsh-session-query": "0.2.1-alpha.1",
68
- "@deepseek-ai/dsh-fs": "0.2.1-alpha.1",
69
- "@deepseek-ai/dsh-session": "0.2.1-alpha.1"
61
+ "@deepseek-ai/cordis": "~4.0.5-alpha.2",
62
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.2",
63
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.3",
64
+ "@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.3",
65
+ "@deepseek-ai/dsh-agent-loop": "0.2.1-alpha.3",
66
+ "@deepseek-ai/dsh-agent-loop-testkit": "0.2.1-alpha.3",
67
+ "@deepseek-ai/dsh-llm": "0.2.1-alpha.3",
68
+ "@deepseek-ai/dsh-session": "0.2.1-alpha.3",
69
+ "@deepseek-ai/dsh-session-query": "0.2.1-alpha.3",
70
+ "@deepseek-ai/dsh-fs": "0.2.1-alpha.3",
71
+ "@deepseek-ai/dsh-subagent": "0.2.1-alpha.3"
72
+ },
73
+ "peerDependenciesMeta": {
74
+ "@deepseek-ai/dsh-subagent": {
75
+ "optional": true
76
+ }
70
77
  }
71
78
  }