@deepseek-ai/dsh-tool-bash 0.1.5-rc.2 → 0.1.6-alpha.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/shell/tool-bash/README.md
5
- README.md: 5b38c0a0bad9e03be783ad8431cd06c2d3ba34d3
6
- README.zh.md: 969ca02dfa9462d884f71cde7d8b34975c4a8cff
5
+ README.md: 43c70d7ebc8eb13f28c4e4576dfde8cb2402b775
6
+ README.zh.md: e38e7afa6b7a534fe29d1022fc2797f5a98651b0
package/README.md CHANGED
@@ -53,9 +53,10 @@ The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-a
53
53
 
54
54
  The tool executes `bash -c <command>` and returns the combined output. Commands run in a fresh shell every call, so state never persists — pass `workdir` instead of `cd`. A non-zero exit is reported as `[exit code: N]` for the agent to interpret, not surfaced as a tool error. A `description` in active voice (5–10 words) labels the call in the UI; `timeoutMs` overrides the executor's default and cap. Output beyond the executor's stream caps is truncated to its tail, with the full output saved to a spill file whose path is reported.
55
55
 
56
+ <a id="running-long-commands-in-the-background"></a>
56
57
  ### Running long commands in the background
57
58
 
58
- Passing `run_in_background: true` returns a job id immediately and no timeout applies; the command keeps running while the agent works on something else. The agent reads its output with `job_output` (non-blocking unless `wait: true`), lists jobs with `job_list`, and stops it with `job_kill`; a finished job notifies the owning agent in-session. Background support needs the generic job runtime (`dsh-jobs-local`) and its control tools (`dsh-tool-jobs`) mounted.
59
+ Passing `run_in_background: true` admits a job and returns its id immediately; confinement preparation may still be pending, and no background execution timeout applies. Output is empty until the process is available. Job cancellation aborts preparation and stops any process that arrives afterward; startup failure settles the admitted job as failed. The agent reads its output with `job_output` (non-blocking unless `wait: true`), lists jobs with `job_list`, and stops it with `job_kill`; a finished job notifies the owning agent in-session. Background support needs the generic job runtime (`dsh-jobs-local`) and its control tools (`dsh-tool-jobs`) mounted.
59
60
 
60
61
  ### Sandboxed execution and escalation
61
62
 
@@ -87,7 +88,7 @@ This section explains the design decisions behind the tool and points at the cod
87
88
  | File | Role |
88
89
  |---|---|
89
90
  | [`src/index.ts`](src/index.ts) | Plugin entry: tool registration, prompt section, arg validation, escalation, request assembly |
90
- | [`src/background.ts`](src/background.ts) | Map a settled background process onto generic job outcome vocabulary |
91
+ | [`src/background.ts`](src/background.ts) | Own asynchronous shell preparation and map process settlement onto job outcomes |
91
92
  | [`src/render.ts`](src/render.ts) | Model-facing result text: streams, markers, truncation notices |
92
93
  | — | No runtime invariant companion is published; the environment registry validates ownership and collected values at each mutation/read; it publishes no independent snapshot that a companion could cross-check. |
93
94
 
package/README.zh.md CHANGED
@@ -9,7 +9,7 @@ kind: "package-reference"
9
9
 
10
10
  ## 概述
11
11
 
12
- `dsh-tool-bash` 让 agent 运行一次性 `bash` 命令,并接收 stdout、stderr 与退出标记。每次调用都使用全新 shell,因此 cwd、变量和函数不会保留;`run_in_background` 可启动长时间运行的工作,agent 能用 `job_output` 检查、用 `job_kill` 停止。命令会收到受管 `DSH_*` 环境;沙箱拒绝可携带更宽的 `sandbox_permissions`、一句 `justification` 与用户批准重试一次。非零退出会作为结果报告,因此由 agent 决定如何响应;请使用 `dsh-bash-local` 或 `dsh-bash-sandbox` 等执行器,并加载 `dsh-shell-env`。
12
+ `dsh-tool-bash` 让 agent(智能体)运行一次性 `bash` 命令,并接收 stdout、stderr 与退出标记。每次调用都使用全新 shell,因此 cwd、变量和函数不会保留;`run_in_background` 可启动长时间运行的工作,agent 能用 `job_output` 检查、用 `job_kill` 停止。命令会收到受管 `DSH_*` 环境;沙箱拒绝后,可携带更宽的 `sandbox_permissions`、一句 `justification` 并经用户批准重试一次。非零退出会作为结果报告,因此由 agent 决定如何响应;请使用 `dsh-bash-local` 或 `dsh-bash-sandbox` 等执行器,并加载 `dsh-shell-env`。
13
13
 
14
14
  ## 目录
15
15
 
@@ -53,13 +53,14 @@ kind: "package-reference"
53
53
 
54
54
  工具执行 `bash -c <command>` 并返回合并后的输出。命令每次调用都运行在全新 shell 中,因此状态从不保留——请传 `workdir` 而不是 `cd`。非零退出以 `[exit code: N]` 报告给 agent 解读,而不是作为工具错误抛出。主动语态的 `description`(5–10 个词)在 UI 中标注该调用;`timeoutMs` 覆盖执行器的默认值与上限。超出执行器流上限的输出会被截断为尾部,完整输出保存到 spill 文件并报告其路径。
55
55
 
56
+ <a id="running-long-commands-in-the-background"></a>
56
57
  ### 后台运行长时间命令
57
58
 
58
- 传入 `run_in_background: true` 会立即返回 job id,不应用超时;命令继续运行,agent 同时处理其他事情。agent 用 `job_output` 读取输出(除非 `wait: true`,否则非阻塞)、用 `job_list` 列出任务、用 `job_kill` 停止任务;完成的任务会在会话内通知拥有它的 agent。后台支持需要挂载通用任务运行时(`dsh-jobs-local`)及其控制工具(`dsh-tool-jobs`)。
59
+ 传入 `run_in_background: true` 会准入任务并立即返回 job id;限制准备可能仍在进行,且不设后台执行超时。进程可用前输出为空。任务取消会中止准备并停止随后返回的进程;启动失败使已准入任务以失败状态结算。agent 用 `job_output` 读取输出(除非 `wait: true`,否则非阻塞)、用 `job_list` 列出任务、用 `job_kill` 停止任务;完成的任务会在会话内通知拥有它的 agent。后台支持需要挂载通用任务运行时(`dsh-jobs-local`)及其控制工具(`dsh-tool-jobs`)。
59
60
 
60
61
  ### 沙箱执行与升权
61
62
 
62
- 当已挂载的执行器约束命令(例如 `dsh-bash-sandbox`)时,被阻止的文件操作会报告为 `[sandbox: file access denied under <mode> mode]`——这是策略拒绝,不是命令失败。模型随后可以在同一轮次中用 `sandbox_permissions`(满足需要的最窄更宽模式)与一句 `justification` 重试完全相同的命令一次;该重试引发的审批提示就是用户同意的方式。升权绝不能预先推测:没有真实拒绝依据的请求,或没有严格宽于当前模式的请求,会在不运行任何东西的情况下失败关闭,被拒绝的升权对该命令即为最终结果。
63
+ 当已挂载的执行器约束命令(例如 `dsh-bash-sandbox`)时,被阻止的文件操作会报告为 `[sandbox: file access denied under <mode> mode]`——这是策略拒绝,不是命令失败。模型随后可以在同一轮次中用 `sandbox_permissions`(满足需要的最窄更宽模式)与一句 `justification` 重试完全相同的命令一次;该重试引发的审批提示就是用户同意的方式。升权绝不能预先推测:没有真实拒绝依据的请求,或没有严格宽于当前模式的请求,都会直接失败且不执行任何操作;被拒绝的升权对该命令即为最终结果。
63
64
 
64
65
  ### 可能出什么问题
65
66
 
@@ -77,7 +78,7 @@ kind: "package-reference"
77
78
 
78
79
  ### 设计理念
79
80
 
80
- - **shell seam 的模型侧消费方。** 本工具是 bash 能力的 Consumer 角色:它注册 `bash` schema、渲染结果并解析每次调用的策略,进程机制归执行器 seam 所有。
81
+ - **shell seam 的模型侧消费方。** 本工具是 bash 能力的消费方角色:它注册 `bash` schema、渲染结果并解析每次调用的策略,进程机制归执行器 seam 所有。
81
82
  - **请求只来自命名参数。** 工具从不暴露 `stdin`、`env` 或 `stdoutMaxBytes`;它只用命令/workdir/超时/信号字段加上注册表收集的 `dshEnv` 构建每个请求,因此模型提供的键无法替换受管值。
82
83
  - **非零退出只报告、不失败。** 只有基础设施故障(spawn 错误、中止)才会作为工具错误暴露;模型解读退出码与标记。
83
84
  - **后台工作归任务运行时。** 后台调用把进程句柄注册到 `ctx.jobs`;job id、所有权、完成通知与释放都是运行时的职责,本工具只把 bash 退出与沙箱事实映射为任务输出。
@@ -87,9 +88,9 @@ kind: "package-reference"
87
88
  | 文件 | 职责 |
88
89
  |---|---|
89
90
  | [`src/index.ts`](src/index.ts) | 插件入口:工具注册、提示词区段、参数校验、升权、请求组装 |
90
- | [`src/background.ts`](src/background.ts) | 把已结算的后台进程映射为通用任务结果词汇 |
91
+ | [`src/background.ts`](src/background.ts) | 管理异步 shell 准备,并将进程结算映射为任务结果 |
91
92
  | [`src/render.ts`](src/render.ts) | 模型侧结果文本:流、标记、截断通知 |
92
- | — | 不发布运行时不变式伴生入口;执行关系归能力 seam 所有。 |
93
+ | — | 不发布运行时不变式伴生入口;环境注册表在每次变更和读取时校验所有权及收集值,且不发布可供伴生入口交叉核对的独立快照;执行关系由能力 seam 负责。 |
93
94
 
94
95
  ### 请求解析
95
96
 
@@ -125,7 +126,7 @@ kind: "package-reference"
125
126
 
126
127
  #### 模型看到什么
127
128
 
128
- 该插件注册 scope 中的每次请求都在 first-party 顺序 1000 处包含以下 bash 指引。策略归属方通过其缓存安全的运行时上下文贡献当前沙箱状态,而不修改本区段。按 scope 限制工具可以隐藏 schema,却不会移除这个独立注册的区段。
129
+ 以下 bash 指引会以第一方顺序值 1000 出现在该插件注册作用域内的每次请求中。策略归属方通过其缓存安全的运行时上下文贡献当前沙箱状态,而不修改本区段。按作用域实施的工具限制可以隐藏 schema,却不会移除这个独立注册的区段。
129
130
 
130
131
  ##### Bash 指引
131
132
 
@@ -139,13 +140,13 @@ Check the [exit code: N] marker on every bash result; investigate failures befor
139
140
 
140
141
  #### KV Cache 影响
141
142
 
142
- 只要注册 scope 与提示词文本不变,前缀就保持稳定。插件激活或释放可能使从该提示词区段起的复用失效;沙箱模式切换不会。
143
+ 只要注册作用域与提示词文本不变,前缀就保持稳定。插件激活或释放可能使从该提示词区段起的复用失效;沙箱模式切换不会。
143
144
 
144
145
  ### 工具 schema
145
146
 
146
147
  #### 模型看到什么
147
148
 
148
- 模型会看到生成的 [`bash` schema](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-bash)。仅当本生产方启用 `run_in_background` 时,该字段才会出现;仅当已挂载执行器声明支持沙箱时,`sandbox_permissions` 和 `justification` 才会出现。按 agent(智能体)scope 限制工具可以移除该 agent 的定义。
149
+ 模型会看到生成的 [`bash` schema](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-bash)。仅当本生产方启用 `run_in_background` 时,该字段才会出现;仅当已挂载执行器声明支持沙箱时,`sandbox_permissions` 和 `justification` 才会出现。按 agent 作用域限制工具可以移除该 agent 的定义。
149
150
 
150
151
  #### Token 影响
151
152
 
@@ -163,7 +164,7 @@ renderer 输出依数据而定的 stdout 尾部,再输出可选的 `[stderr]`
163
164
 
164
165
  #### Token 影响
165
166
 
166
- 调用前的结果 token 为零。输出按流设界,而每行已发出的内容在压缩(compaction)前保留于历史。
167
+ 调用前的结果 token 为零。每条流的输出有界,每个已输出行则会保留在历史中,直至压缩(compaction)。
167
168
 
168
169
  #### KV Cache 影响
169
170
 
@@ -177,7 +178,7 @@ renderer 输出依数据而定的 stdout 尾部,再输出可选的 `[stderr]`
177
178
 
178
179
  #### Token 影响
179
180
 
180
- 启动确认很小且会被保留;收集到的输出依数据而定,受执行器流缓冲设界。消费性读取不会重复先前输出。
181
+ 启动确认很短且会保留;收集到的输出依数据而定,并受执行器流缓冲区限制。消费式读取不会重复先前输出。
181
182
 
182
183
  #### KV Cache 影响
183
184
 
package/lib/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import z from "@deepseek-ai/schemastery";
2
- import { isAbsolute, resolve } from "node:path";
2
+ import { isAbsolute, sep } from "node:path";
3
3
  import { TOOL_ABORTED, defineTool } from "@deepseek-ai/dsh-tools";
4
4
  import { HarnessError } from "@deepseek-ai/dsh-llm";
5
- import { ESCALATION_TARGETS, approveEscalation, canonicalPath, escalationHintMarker, sandboxDenialMarker, validateEscalationArgs } from "@deepseek-ai/dsh-sandbox";
5
+ import { ESCALATION_TARGETS, approveEscalation, escalationHintMarker, sandboxDenialMarker, validateEscalationArgs } from "@deepseek-ai/dsh-sandbox";
6
6
  import { DSH_ENV_PREFIX, parseExitStatus } from "@deepseek-ai/dsh-shell";
7
7
  //#region lib/types/background.js
8
8
  /**
@@ -28,6 +28,40 @@ function processOutcome(proc) {
28
28
  detail: `exit code: ${proc.exitCode ?? 0}`
29
29
  };
30
30
  }
31
+ /**
32
+ * Adapt asynchronous shell preparation after job admission without exposing a partial process.
33
+ * @param start - starts the process with job-owned cancellation.
34
+ * @param renderOutput - consumes output from a published process.
35
+ * @returns synchronous job hooks whose completion includes preparation and process settlement.
36
+ */
37
+ function processJob(start, renderOutput) {
38
+ const controller = new AbortController();
39
+ let process;
40
+ return {
41
+ cancel: (reason) => {
42
+ if (controller.signal.aborted) return;
43
+ controller.abort(reason);
44
+ process?.kill();
45
+ },
46
+ done: (async () => {
47
+ try {
48
+ process = await start(controller.signal);
49
+ try {
50
+ if (controller.signal.aborted) process.kill();
51
+ } finally {
52
+ await process.done;
53
+ }
54
+ return processOutcome(process);
55
+ } catch (error) {
56
+ return {
57
+ status: controller.signal.aborted && process === void 0 ? "killed" : "failed",
58
+ detail: error instanceof Error ? error.message : String(error)
59
+ };
60
+ }
61
+ })(),
62
+ readOutput: () => process === void 0 ? "" : renderOutput(process)
63
+ };
64
+ }
31
65
  //#endregion
32
66
  //#region lib/types/render.js
33
67
  /**
@@ -176,9 +210,9 @@ function presentBashResult(args, result) {
176
210
  */
177
211
  function resolveWorkdir(modelWorkdir, exec, policyWorkspaceRoot) {
178
212
  const headerCwd = exec.agent?.session.header.cwd;
179
- const sessionCwd = policyWorkspaceRoot ?? (headerCwd === void 0 ? void 0 : canonicalPath(headerCwd));
213
+ const sessionCwd = policyWorkspaceRoot ?? headerCwd;
180
214
  if (modelWorkdir === void 0) return sessionCwd;
181
- if (sessionCwd !== void 0 && !isAbsolute(modelWorkdir)) return resolve(sessionCwd, modelWorkdir);
215
+ if (sessionCwd !== void 0 && !isAbsolute(modelWorkdir)) return `${sessionCwd}${sep}${modelWorkdir}`;
182
216
  return modelWorkdir;
183
217
  }
184
218
  /** Detach the executor DTO from readonly Service Definition types into plain JSON data. */
@@ -415,14 +449,10 @@ function apply(ctx, config = {}) {
415
449
  kind: "bash",
416
450
  label: args.command,
417
451
  ...exec.agent ? { owner: exec.agent } : {},
418
- run: () => {
419
- const proc = ctx.shell.start(ctx.shell.resolve(request));
420
- return {
421
- cancel: () => void proc.kill(),
422
- done: proc.done.then(() => processOutcome(proc)),
423
- readOutput: () => renderProcessRead(proc.readOutput(), proc.sandbox, escalationModes)
424
- };
425
- }
452
+ run: () => processJob((signal) => ctx.shell.start(ctx.shell.resolve({
453
+ ...request,
454
+ signal
455
+ })), (proc) => renderProcessRead(proc.readOutput(), proc.sandbox, escalationModes))
426
456
  })
427
457
  };
428
458
  }
@@ -4,6 +4,7 @@
4
4
  * @module @deepseek-ai/dsh-tool-bash/background
5
5
  */
6
6
  import type { ShellProcess } from '@deepseek-ai/dsh-shell';
7
+ import type { JobHooks } from '@deepseek-ai/dsh-jobs';
7
8
  /**
8
9
  * Map a settled background process onto the generic task-outcome vocabulary:
9
10
  * `killed` stays `killed` (detail: the signal when one is known), everything
@@ -16,4 +17,11 @@ export declare function processOutcome(proc: ShellProcess): {
16
17
  status: 'completed' | 'killed';
17
18
  detail: string;
18
19
  };
20
+ /**
21
+ * Adapt asynchronous shell preparation after job admission without exposing a partial process.
22
+ * @param start - starts the process with job-owned cancellation.
23
+ * @param renderOutput - consumes output from a published process.
24
+ * @returns synchronous job hooks whose completion includes preparation and process settlement.
25
+ */
26
+ export declare function processJob(start: (signal: AbortSignal) => Promise<ShellProcess>, renderOutput: (process: ShellProcess) => string): JobHooks;
19
27
  //# sourceMappingURL=background.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-tool-bash",
3
3
  "description": "Model-facing bash tool with optional generic background-job and sandbox-escalation support",
4
- "version": "0.1.5-rc.2",
4
+ "version": "0.1.6-alpha.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -27,41 +27,41 @@
27
27
  ],
28
28
  "license": "MIT",
29
29
  "peerDependencies": {
30
- "@deepseek-ai/dsh-shell": "^0.1.5-rc.2",
31
- "@deepseek-ai/dsh-shell-env": "^0.1.5-rc.2",
32
- "@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
33
- "@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
34
- "@deepseek-ai/dsh-sandbox": "^0.1.5-rc.2",
35
- "@deepseek-ai/dsh-sandbox-policy": "^0.1.5-rc.2",
36
- "@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.2",
37
- "@deepseek-ai/dsh-jobs": "^0.1.5-rc.2",
38
- "@deepseek-ai/dsh-tools": "^0.1.5-rc.2",
39
- "@deepseek-ai/dsh-user-approval": "^0.1.5-rc.2",
40
- "@deepseek-ai/cordis": "^4.0.2"
30
+ "@deepseek-ai/dsh-agent": "^0.1.6-alpha.1",
31
+ "@deepseek-ai/dsh-shell": "^0.1.6-alpha.1",
32
+ "@deepseek-ai/dsh-shell-env": "^0.1.6-alpha.1",
33
+ "@deepseek-ai/dsh-llm": "^0.1.6-alpha.1",
34
+ "@deepseek-ai/dsh-sandbox": "^0.1.6-alpha.1",
35
+ "@deepseek-ai/dsh-sandbox-policy": "^0.1.6-alpha.1",
36
+ "@deepseek-ai/dsh-system-prompt": "^0.1.6-alpha.1",
37
+ "@deepseek-ai/dsh-jobs": "^0.1.6-alpha.1",
38
+ "@deepseek-ai/dsh-tools": "^0.1.6-alpha.1",
39
+ "@deepseek-ai/cordis": "^4.0.2",
40
+ "@deepseek-ai/dsh-user-approval": "^0.1.6-alpha.1"
41
41
  },
42
42
  "dependencies": {
43
43
  "@deepseek-ai/schemastery": "^3.18.2"
44
44
  },
45
45
  "devDependencies": {
46
- "@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
47
- "@deepseek-ai/dsh-agent-loop": "^0.1.5-rc.2",
48
- "@deepseek-ai/dsh-agent-loop-testkit": "^0.1.5-rc.2",
49
- "@deepseek-ai/dsh-shell-env": "^0.1.5-rc.2",
50
- "@deepseek-ai/dsh-shell": "^0.1.5-rc.2",
51
- "@deepseek-ai/dsh-subprocess-local": "^0.1.5-rc.2",
52
- "@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
53
- "@deepseek-ai/dsh-sandbox": "^0.1.5-rc.2",
54
- "@deepseek-ai/dsh-sandbox-policy": "^0.1.5-rc.2",
55
- "@deepseek-ai/dsh-session": "^0.1.5-rc.2",
56
- "@deepseek-ai/dsh-session-persistence-jsonl": "^0.1.5-rc.2",
57
- "@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.2",
58
- "@deepseek-ai/dsh-jobs": "^0.1.5-rc.2",
59
- "@deepseek-ai/dsh-jobs-local": "^0.1.5-rc.2",
60
- "@deepseek-ai/dsh-tool-jobs": "^0.1.5-rc.2",
61
- "@deepseek-ai/dsh-tools": "^0.1.5-rc.2",
46
+ "@deepseek-ai/dsh-agent": "^0.1.6-alpha.1",
47
+ "@deepseek-ai/dsh-agent-loop": "^0.1.6-alpha.1",
48
+ "@deepseek-ai/dsh-agent-loop-testkit": "^0.1.6-alpha.1",
49
+ "@deepseek-ai/dsh-shell": "^0.1.6-alpha.1",
50
+ "@deepseek-ai/dsh-shell-env": "^0.1.6-alpha.1",
51
+ "@deepseek-ai/dsh-bash-local": "^0.1.6-alpha.1",
52
+ "@deepseek-ai/dsh-llm": "^0.1.6-alpha.1",
53
+ "@deepseek-ai/dsh-sandbox": "^0.1.6-alpha.1",
54
+ "@deepseek-ai/dsh-subprocess-local": "^0.1.6-alpha.1",
55
+ "@deepseek-ai/dsh-sandbox-policy": "^0.1.6-alpha.1",
56
+ "@deepseek-ai/dsh-session-persistence-jsonl": "^0.1.6-alpha.1",
57
+ "@deepseek-ai/dsh-system-prompt": "^0.1.6-alpha.1",
58
+ "@deepseek-ai/dsh-jobs-local": "^0.1.6-alpha.1",
59
+ "@deepseek-ai/dsh-tool-jobs": "^0.1.6-alpha.1",
60
+ "@deepseek-ai/dsh-tools": "^0.1.6-alpha.1",
61
+ "@deepseek-ai/dsh-user-approval": "^0.1.6-alpha.1",
62
62
  "@deepseek-ai/cordis": "^4.0.2",
63
- "@deepseek-ai/dsh-session-projection": "^0.1.5-rc.2",
64
- "@deepseek-ai/dsh-user-approval": "^0.1.5-rc.2",
65
- "@deepseek-ai/dsh-bash-local": "^0.1.5-rc.2"
63
+ "@deepseek-ai/dsh-session": "^0.1.6-alpha.1",
64
+ "@deepseek-ai/dsh-session-projection": "^0.1.6-alpha.1",
65
+ "@deepseek-ai/dsh-jobs": "^0.1.6-alpha.1"
66
66
  }
67
67
  }