@deepseek-ai/dsh-tool-subagent 0.1.0-rc.7 → 0.1.1-rc.1

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
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/subagent/tool-subagent/README.md
5
- README.md: 9d7ed2e364f6a9dff26a1c9006535f898bdaabcc
6
- README.zh.md: 8650ee35588c2615e4d6c016cb672030ee2e8194
5
+ README.md: 28e6213b903ffffa7934e244b2a74ada519b32b2
6
+ README.zh.md: 74e8896a152c787abd0aebf055d6e13f6158bcd3
package/README.md CHANGED
@@ -8,9 +8,9 @@ The model-facing delegation tool over one configured `ctx.subagents` provider. C
8
8
 
9
9
  Each plugin instance binds one `provider` to one `toolName`; the model receives no provider selector. Load another distinctly named instance to expose another transport. The tool registers only while its provider exists, avoiding sibling load-order and provider-reload dependencies. Its description follows `provider.inheritsParentContext`: fresh children require standalone prompts, while forked children already see completed parent turns.
10
10
 
11
- A foreground call passes the execution signal through startup and execution, awaits `run.result`, and always awaits `run.dispose()` before returning. Only `completed` returns the canonical `{ kind: 'foreground', runId, output: JsonValue[] }`, rendered as the same final text; abort, refusal, token limit, and other failures become errored tool results whose message appends the child's preserved partial text (the `SubagentResult.output` selection) after the stop-reason headline, so a truncated answer is never reported as success yet never silently lost. If result collection and disposal both reject, the errored result preserves both diagnostics.
11
+ A foreground call passes the execution signal through startup and execution, awaits `run.result`, and always awaits `run.dispose()` before returning. Only `completed` returns the canonical `{ kind: 'foreground', runId, output: JsonValue[] }`, rendered as the same final text. Abort, refusal, token limit, and other failures become errored tool results whose message contains the stop-reason headline, an optional provider-authored `SubagentResult.diagnostic`, and then any preserved partial assistant text. The diagnostic remains separate from `SubagentResult.output`, so a truncated answer is never reported as success or confused with infrastructure detail. If result collection and disposal both reject, the errored result preserves both failures.
12
12
 
13
- `backgroundMode` selects both the background route and the omitted `run_in_background` default. `one-shot` waits in the foreground by default; an explicit `true` registers a plain parent-owned Task and returns canonical `{ kind: 'background', jobId }`, rendered as `started background subagent job <id>`, even when the provider supports continuable children. Generic task tools own its later status, collection, cancellation, and notices. `continuable` runs in the background when the argument is omitted or `true`; an explicit `false` waits for the result in the foreground. Its background route requires a provider with the `prepareContinuable` capability, calls `ctx.subagents.startContinuable()`, and returns `{ kind: 'continuable', subagentId }`, rendered as `started subagent <childId>`. The route resolves at inbox acceptance: the child owns its own turns from there, so this call neither waits for nor collects a result. The child's transcript by that id remains the source of its detailed output, and the optional global `send_message` tool sends it more work. The continuation service delivers one settlement notice whenever the child's Activation ends, containing its outcome and any final assistant message independently of `report`. Starting continuable work does not require `send_message` to be loaded. See the [background subagent Agent Note](../../../.agents/notes/implemented/feature/2026-07-08-background-subagent-tasks.md), the [continuable subagents Agent Note](../../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md), and the [background-first delegation Agent Note](../../../.agents/notes/implemented/feature/2026-08-11-background-first-continuable-delegation.md).
13
+ `backgroundMode` selects both the background route and the omitted `run_in_background` default. `one-shot` waits in the foreground by default; an explicit `true` registers a plain parent-owned Task and returns canonical `{ kind: 'background', jobId }`, rendered as `started background subagent job <id>`, even when the provider supports continuable children. Generic task tools own its later status, collection, cancellation, and notices; a failed Task keeps the stop reason and the same optional provider diagnostic in its detail. `continuable` runs in the background when the argument is omitted or `true`; an explicit `false` waits for the result in the foreground. Its background route requires a provider with the `prepareContinuable` capability, calls `ctx.subagents.startContinuable()`, and returns `{ kind: 'continuable', subagentId }`, rendered as `started subagent <childId>`. The route resolves at inbox acceptance: the child owns its own turns from there, so this call neither waits for nor collects a result. The child's transcript by that id remains the source of its detailed output, and the optional global `send_message` tool sends it more work. The continuation service delivers one settlement notice whenever the child's Activation ends, containing its outcome and any final assistant message independently of `report`. Starting continuable work does not require `send_message` to be loaded. See the [background subagent Agent Note](../../../.agents/notes/implemented/feature/2026-07-08-background-subagent-tasks.md), the [continuable subagents Agent Note](../../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md), and the [background-first delegation Agent Note](../../../.agents/notes/implemented/feature/2026-08-11-background-first-continuable-delegation.md).
14
14
 
15
15
  `toolFilter` changes the child's global tool layer but is not a parent-derived authority ceiling. See the [agent-scope security non-goal](../../../.agents/notes/implemented/architecture/2026-07-08-agent-scope-contexts.md#security-and-authority-are-non-goals).
16
16
 
@@ -51,7 +51,7 @@ Prefix-stable while provider instances, names, descriptions, and schemas are unc
51
51
 
52
52
  #### What the model sees
53
53
 
54
- The call retains the description and prompt. Success contains only the child's final text; other outcomes become `Error: <message>`. Intermediate child steps stay out of the parent.
54
+ The call retains the description and prompt. Success contains only the child's final text; other outcomes become `Error: <stop reason>`, followed by a safe provider diagnostic when present and then any partial assistant text. Intermediate child steps stay out of the parent.
55
55
 
56
56
  #### Token effect
57
57
 
@@ -65,7 +65,7 @@ Append-only; newly visible content follows the reusable request prefix and does
65
65
 
66
66
  #### What the model sees
67
67
 
68
- Start returns exactly `started subagent <childId>` in configured continuable mode, or `started background subagent job <id>` in configured one-shot mode. In one-shot mode the generic task surface provides later status, final output, cancellation responses, and notices. In continuable mode this tool returns no result of its own; the child's settlement reaches the parent as a [service-owned notice](../subagent/README.md#settlement-notice), an independently loaded `send_message` tool delivers follow-ups, and the child's transcript by its id is the source of its detailed output.
68
+ Start returns exactly `started subagent <childId>` in configured continuable mode, or `started background subagent job <id>` in configured one-shot mode. In one-shot mode the generic task surface provides later status, final output, cancellation responses, and notices; failed status detail includes the provider diagnostic when the result supplied one. In continuable mode this tool returns no result of its own; the child's settlement reaches the parent as a [service-owned notice](../subagent/README.md#settlement-notice), an independently loaded `send_message` tool delivers follow-ups, and the child's transcript by its id is the source of its detailed output.
69
69
 
70
70
  #### Token effect
71
71
 
package/README.zh.md CHANGED
@@ -8,11 +8,11 @@
8
8
 
9
9
  每个插件实例把一个 `provider` 绑定到一个 `toolName`;模型不会收到提供方选择器。如需公开另一种传输,请加载另一个名称不同的实例。工具只在其提供方存在时注册,从而避免对同级加载顺序和提供方重新加载的依赖。工具描述遵循 `provider.inheritsParentContext`:新建子 agent(智能体)需要独立提示词,而 fork 子 agent 已能看到父级已完成轮次。
10
10
 
11
- 前台调用会让执行信号贯穿启动和执行,等待 `run.result`,并且在返回前总会等待 `run.dispose()`。只有 `completed` 会返回规范值 `{ kind: 'foreground', runId, output: JsonValue[] }`,并渲染为相同的最终文本;中止、拒绝、token 上限和其他失败都会变成出错的工具结果,其消息在终止原因标题之后附带子 agent 保留下来的部分文本(即 `SubagentResult.output` 的选取结果)——被截断的回答不会被报告为成功,也绝不会被悄悄丢弃。如果结果收集与 dispose(资源释放)都 reject,出错的结果会保留两项诊断信息。
11
+ 前台调用会让执行信号贯穿启动和执行,等待 `run.result`,并且在返回前总会等待 `run.dispose()`。只有 `completed` 会返回规范值 `{ kind: 'foreground', runId, output: JsonValue[] }`,并渲染为相同的最终文本。中止、拒绝、token 上限和其他失败都会变成出错的工具结果,其消息依次包含终止原因标题、可选的提供方 `SubagentResult.diagnostic`,以及子 agent 保留下来的部分 assistant 文本。诊断与 `SubagentResult.output` 保持分离,因此被截断的回答不会被报告为成功,也不会与基础设施说明混淆。如果结果收集与 dispose(资源释放)都 reject,出错结果会保留两项失败。
12
12
 
13
- `backgroundMode` 同时选择后台路由与省略 `run_in_background` 时的默认行为。`one-shot` 默认在前台等待;显式传入 `true` 时,它会注册一个归父级所有的普通 Task,并返回规范值 `{ kind: 'background', jobId }`,渲染为 `started background subagent job <id>`,即使提供方支持可继续子 agent 也不例外。通用 Task 工具负责其后续状态、收集、取消和通知。`continuable` 在参数省略或为 `true` 时于后台运行;显式传入 `false` 时则在前台等待结果。其后台路由要求提供方具备 `prepareContinuable` 能力,调用 `ctx.subagents.startContinuable()`,并返回 `{ kind: 'continuable', subagentId }`,渲染为 `started subagent <childId>`。该路由在 inbox 接受时结算:子 agent 自此拥有自己的轮次,因此该调用既不等待也不收集结果。通过该 id 查看其 transcript(文本记录)仍是其详细输出的来源,可选的全局 `send_message` 工具则向其发送更多工作。每当子 agent 的 Activation 结束,继续执行服务都会投递一条结算通知,其中包含结束结果及可能存在的最终 assistant 消息,且这项投递不依赖 `report`。启动可继续工作不要求加载 `send_message`。见[后台 subagent Agent Note](../../../.agents/notes/implemented/feature/2026-07-08-background-subagent-tasks.md)、[可继续的 subagent Agent Note](../../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md)和[后台优先委派 Agent Note](../../../.agents/notes/implemented/feature/2026-08-11-background-first-continuable-delegation.md)。
13
+ `backgroundMode` 同时选择后台路由与省略 `run_in_background` 时的默认行为。`one-shot` 默认在前台等待;显式传入 `true` 时,它会注册一个归父级所有的普通 Task,并返回规范值 `{ kind: 'background', jobId }`,渲染为 `started background subagent job <id>`,即使提供方支持可继续子 agent 也不例外。通用 Task 工具负责其后续状态、收集、取消和通知;失败 Task 的 detail 会保留终止原因与同一份可选提供方诊断。`continuable` 在参数省略或为 `true` 时于后台运行;显式传入 `false` 时则在前台等待结果。其后台路由要求提供方具备 `prepareContinuable` 能力,调用 `ctx.subagents.startContinuable()`,并返回 `{ kind: 'continuable', subagentId }`,渲染为 `started subagent <childId>`。该路由在 inbox 接受时结算:子 agent 自此拥有自己的轮次,因此该调用既不等待也不收集结果。通过该 id 查看其 transcript(文本记录)仍是其详细输出的来源,可选的全局 `send_message` 工具则向其发送更多工作。每当子 agent 的 Activation 结束,继续执行服务都会投递一条结算通知,其中包含结束结果及可能存在的最终 assistant 消息,且这项投递不依赖 `report`。启动可继续工作不要求加载 `send_message`。见[后台 subagent Agent Note](../../../.agents/notes/implemented/feature/2026-07-08-background-subagent-tasks.zh.md)、[可继续的 subagent Agent Note](../../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.zh.md)和[后台优先委派 Agent Note](../../../.agents/notes/implemented/feature/2026-08-11-background-first-continuable-delegation.zh.md)。
14
14
 
15
- `toolFilter` 会改变子 agent 的全局工具层,但不是从父级派生的权限上限。见 [agent 作用域的安全非目标](../../../.agents/notes/implemented/architecture/2026-07-08-agent-scope-contexts.md#security-and-authority-are-non-goals)。
15
+ `toolFilter` 会改变子 agent 的全局工具层,但不是从父级派生的权限上限。见 [agent 作用域的安全非目标](../../../.agents/notes/implemented/architecture/2026-07-08-agent-scope-contexts.zh.md#security-and-authority-are-non-goals)。
16
16
 
17
17
  ## 配置
18
18
 
@@ -29,7 +29,7 @@
29
29
 
30
30
  ## 并发
31
31
 
32
- 前台调用和后台调用均并发安全:同一条 assistant 消息中的同级委派会在循环的滚动池(`maxParallelToolCalls`)下重叠执行,结果仍按模型顺序提交。子 agent 在各自的会话中工作,一次运行绝不变更父会话;一次性后台形态对父级拥有状态的唯一写入是注册一个 Task——这是一次同步、可交换、能容忍并发分发的插入,因此重叠的后台调用按分发竞态顺序获得各自的 job id。协调同级工作区效果由模型负责,正如模型已经对后台和可继续子 agent 所承担的那样。见 [并行 subagent Agent Note](../../../.agents/notes/implemented/feature/2026-08-09-parallel-subagent-delegations.md) 和 [并行工具调用 Agent Note](../../../.agents/notes/implemented/feature/2026-07-10-parallel-tool-call-execution.md)。
32
+ 前台调用和后台调用均并发安全:同一条 assistant 消息中的同级委派会在循环的滚动池(`maxParallelToolCalls`)下重叠执行,结果仍按模型顺序提交。子 agent 在各自的会话中工作,一次运行绝不变更父会话;一次性后台形态对父级拥有状态的唯一写入是注册一个 Task——这是一次同步、可交换、能容忍并发分发的插入,因此重叠的后台调用按分发竞态顺序获得各自的 job id。协调同级工作区效果由模型负责,正如模型已经对后台和可继续子 agent 所承担的那样。见 [并行 subagent Agent Note](../../../.agents/notes/implemented/feature/2026-08-09-parallel-subagent-delegations.zh.md) 和 [并行工具调用 Agent Note](../../../.agents/notes/implemented/feature/2026-07-10-parallel-tool-call-execution.zh.md)。
33
33
 
34
34
  ## 模型体验
35
35
 
@@ -37,7 +37,7 @@
37
37
 
38
38
  #### 模型看到的内容
39
39
 
40
- 当提供方存在时,以当前实例配置的名称公开已生成的默认 [`subagent` schema](../../../docs/tool-catalog.md#deepseek-aidsh-tool-subagent)。提供方是否继承上下文会改变工具描述和提示词描述。启用后台模式会添加 `run_in_background`:可继续模式会记录其默认值为 `true`、运行时结算通知与显式前台覆盖;一次性模式会记录其默认值为 `false`,以及用 `job_output` 收集或用 `job_kill` 停止的 job id。当工具在本次组装的作用域中可见时,一个 `tool:<toolName>` 系统提示词 section 会指示模型同时启动相互独立的可继续委派、在它们运行时继续工作,并且仅当下一步动作依赖结果时选择前台;工具限制会同时移除其 schema 和这段指引。
40
+ 当提供方存在时,以当前实例配置的名称公开已生成的默认 [`subagent` schema](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-subagent)。提供方是否继承上下文会改变工具描述和提示词描述。启用后台模式会添加 `run_in_background`:可继续模式会记录其默认值为 `true`、运行时结算通知与显式前台覆盖;一次性模式会记录其默认值为 `false`,以及用 `job_output` 收集或用 `job_kill` 停止的 job id。当工具在本次组装的作用域中可见时,一个 `tool:<toolName>` 系统提示词 section 会指示模型同时启动相互独立的可继续委派、在它们运行时继续工作,并且仅当下一步动作依赖结果时选择前台;工具限制会同时移除其 schema 和这段指引。
41
41
 
42
42
  #### Token 影响
43
43
 
@@ -51,7 +51,7 @@
51
51
 
52
52
  #### 模型看到的内容
53
53
 
54
- 调用会保留描述和提示词。成功时只包含子 agent 的最终文本;其他结果变为 `Error: <message>`。子 agent 中间步骤不会进入父级。
54
+ 调用会保留描述和提示词。成功时只包含子 agent 的最终文本;其他结果会变为 `Error: <终止原因>`,随后在存在时附上安全的提供方诊断,再附上任何部分 assistant 文本。子 agent 中间步骤不会进入父级。
55
55
 
56
56
  #### Token 影响
57
57
 
@@ -65,7 +65,7 @@
65
65
 
66
66
  #### 模型看到的内容
67
67
 
68
- 在配置的可继续模式下,启动时返回内容恰为 `started subagent <childId>`;在配置的一次性模式下,则返回 `started background subagent job <id>`。一次性模式下,通用 Task 接口提供后续状态、最终输出、取消响应和通知。可继续模式下,本工具不返回自己的结果;子 agent 的结算会以[服务负责的通知](../subagent/README.md#settlement-notice)到达父级,独立加载的 `send_message` 工具会投递后续消息,而通过其 id 查看子 agent 的 transcript 即是其详细输出来源。
68
+ 在配置的可继续模式下,启动时返回内容恰为 `started subagent <childId>`;在配置的一次性模式下,则返回 `started background subagent job <id>`。一次性模式下,通用 Task 接口提供后续状态、最终输出、取消响应和通知;若结果携带提供方诊断,失败状态的 detail 会包含它。可继续模式下,本工具不返回自己的结果;子 agent 的结算会以[服务负责的通知](../subagent/README.zh.md#settlement-notice)到达父级,独立加载的 `send_message` 工具会投递后续消息,而通过其 id 查看子 agent 的 transcript 即是其详细输出来源。
69
69
 
70
70
  #### Token 影响
71
71
 
package/lib/index.js CHANGED
@@ -63,15 +63,17 @@ function stopReasonError(result) {
63
63
  }
64
64
  }
65
65
  /**
66
- * Append the child's preserved partial answer to a stop-reason error so a
67
- * truncated or cancelled child's real text still reaches the parent model.
66
+ * Append provider-authored failure detail and the child's preserved partial
67
+ * answer to a stop-reason error, keeping diagnostic text separate from the
68
+ * child's assistant output.
68
69
  * @param error - the stop-reason headline.
69
- * @param output - the child's selected output (`SubagentResult.output`).
70
- * @returns the headline, extended with the partial text when any exists.
70
+ * @param result - the child's terminal result.
71
+ * @returns the headline, diagnostic, and partial text that are present.
71
72
  */
72
- function withPartialText(error, output) {
73
- const text = output.filter((block) => block.type === "text").map((block) => block.text).join("");
74
- return text.length === 0 ? error : `${error}\nPartial output before the run ended:\n${text}`;
73
+ function withDiagnosticAndPartialText(error, result) {
74
+ const diagnostic = result.diagnostic === void 0 ? "" : `\nDiagnostic: ${result.diagnostic}`;
75
+ const text = result.output.filter((block) => block.type === "text").map((block) => block.text).join("");
76
+ return `${error}${diagnostic}${text.length === 0 ? "" : `\nPartial output before the run ended:\n${text}`}`;
75
77
  }
76
78
  /**
77
79
  * Collect and release one foreground run without letting disposal replace an
@@ -80,7 +82,7 @@ function withPartialText(error, output) {
80
82
  async function settleForegroundRun(run) {
81
83
  const [execution] = await Promise.allSettled([run.result.then((result) => {
82
84
  const error = stopReasonError(result);
83
- if (error !== void 0) throw new Error(withPartialText(error, result.output));
85
+ if (error !== void 0) throw new Error(withDiagnosticAndPartialText(error, result));
84
86
  return {
85
87
  kind: "foreground",
86
88
  runId: run.id,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-tool-subagent",
3
3
  "description": "Model-facing subagent delegation tool over the ctx.subagents seam",
4
- "version": "0.1.0-rc.7",
4
+ "version": "0.1.1-rc.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -32,33 +32,33 @@
32
32
  ],
33
33
  "license": "MIT",
34
34
  "peerDependencies": {
35
- "@deepseek-ai/dsh-invariants": "^0.1.0-rc.7",
36
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.7",
37
- "@deepseek-ai/dsh-subagent": "^0.1.0-rc.7",
38
- "@deepseek-ai/dsh-agent": "^0.1.0-rc.7",
39
- "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.7",
40
- "@deepseek-ai/dsh-jobs": "^0.1.0-rc.7",
41
- "@deepseek-ai/cordis": "^4.0.1",
42
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.7"
35
+ "@deepseek-ai/dsh-agent": "^0.1.1-rc.1",
36
+ "@deepseek-ai/dsh-invariants": "^0.1.1-rc.1",
37
+ "@deepseek-ai/dsh-llm": "^0.1.1-rc.1",
38
+ "@deepseek-ai/dsh-subagent": "^0.1.1-rc.1",
39
+ "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.1",
40
+ "@deepseek-ai/dsh-jobs": "^0.1.1-rc.1",
41
+ "@deepseek-ai/dsh-tools": "^0.1.1-rc.1",
42
+ "@deepseek-ai/cordis": "^4.0.1"
43
43
  },
44
44
  "dependencies": {
45
45
  "@deepseek-ai/schemastery": "^3.18.1"
46
46
  },
47
47
  "devDependencies": {
48
+ "@deepseek-ai/dsh-agent": "^0.1.1-rc.1",
48
49
  "@deepseek-ai/cordis-plugin-loader": "^1.0.2",
49
- "@deepseek-ai/dsh-agent": "^0.1.0-rc.7",
50
- "@deepseek-ai/dsh-invariants": "^0.1.0-rc.7",
51
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.7",
52
- "@deepseek-ai/dsh-session": "^0.1.0-rc.7",
53
- "@deepseek-ai/dsh-session-persistence-jsonl": "^0.1.0-rc.7",
54
- "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.7",
55
- "@deepseek-ai/dsh-subagent": "^0.1.0-rc.7",
56
- "@deepseek-ai/dsh-subagent-spawn-in-process": "^0.1.0-rc.7",
57
- "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.7",
58
- "@deepseek-ai/dsh-jobs": "^0.1.0-rc.7",
59
- "@deepseek-ai/dsh-tool-jobs": "^0.1.0-rc.7",
60
- "@deepseek-ai/dsh-jobs-local": "^0.1.0-rc.7",
61
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.7",
62
- "@deepseek-ai/cordis": "^4.0.1"
50
+ "@deepseek-ai/dsh-llm": "^0.1.1-rc.1",
51
+ "@deepseek-ai/dsh-session-persistence": "^0.1.1-rc.1",
52
+ "@deepseek-ai/dsh-invariants": "^0.1.1-rc.1",
53
+ "@deepseek-ai/dsh-session-persistence-jsonl": "^0.1.1-rc.1",
54
+ "@deepseek-ai/dsh-session": "^0.1.1-rc.1",
55
+ "@deepseek-ai/dsh-subagent": "^0.1.1-rc.1",
56
+ "@deepseek-ai/dsh-subagent-spawn-in-process": "^0.1.1-rc.1",
57
+ "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.1",
58
+ "@deepseek-ai/dsh-jobs": "^0.1.1-rc.1",
59
+ "@deepseek-ai/dsh-jobs-local": "^0.1.1-rc.1",
60
+ "@deepseek-ai/dsh-tool-jobs": "^0.1.1-rc.1",
61
+ "@deepseek-ai/cordis": "^4.0.1",
62
+ "@deepseek-ai/dsh-tools": "^0.1.1-rc.1"
63
63
  }
64
64
  }