@deepseek-ai/dsh-session-title-llm 0.1.1-rc.2 → 0.1.2-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 +2 -2
- package/README.md +97 -15
- package/README.zh.md +99 -19
- package/lib/index.js +2 -1
- package/package.json +15 -14
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/session/session-title-llm/README.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: d17c4962a3cc1f4f369013990c27ff1e5eea5588
|
|
6
|
+
README.zh.md: 156600335eb8e72e39e7441039b6e69bc34528e4
|
package/README.md
CHANGED
|
@@ -1,30 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Shared model-backed title generation policy for users and maintainers configuring title providers or debugging auxiliary LLM requests."
|
|
3
|
+
kind: "package-library"
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# @deepseek-ai/dsh-session-title-llm
|
|
2
7
|
|
|
3
8
|
English | [中文](README.zh.md)
|
|
4
9
|
|
|
5
|
-
|
|
10
|
+
## Summary
|
|
11
|
+
|
|
12
|
+
`dsh-session-title-llm` runs model-backed title generation through one shared policy: it resolves the auxiliary route, frames the exact selected human messages as JSON, enforces input and output budgets, composes timeout and caller cancellation, and validates the model's output before a title is accepted. It is a library, not a Cordis plugin — the shipped provider plugins call `registerSessionTitleLlmProvider()` with their cadence and message selector, and the helper validates shared config and delegates every revision to one generation path, so registration, route, prompt, cancellation, and validation behavior cannot drift between them. Deployments configure it through the provider plugins, which require every limit. The route, failure, and configuration contracts come first; the request internals live in a collapsible developer section below.
|
|
13
|
+
|
|
14
|
+
## Table of Contents
|
|
15
|
+
|
|
16
|
+
- [Use this package](#use-this-package)
|
|
17
|
+
- [Understand the implementation](#understand-the-implementation)
|
|
18
|
+
- [Further Exploration](#further-exploration)
|
|
19
|
+
- [Model Experience](#model-experience)
|
|
20
|
+
- [Known Limitations and Deferred Work](#known-limitations-and-deferred-work)
|
|
21
|
+
- [Dev Note](#dev-note)
|
|
22
|
+
|
|
23
|
+
-----
|
|
24
|
+
|
|
25
|
+
<a id="use-this-package"></a>
|
|
26
|
+
## Use this package
|
|
27
|
+
|
|
28
|
+
As a deployment, configure this policy through the [first-prompt](../session-title-first-prompt-llm/README.md) or [all-prompts](../session-title-all-prompts-llm/README.md) provider plugin. As a provider author, register through the shared helper instead of hand-rolling generation.
|
|
29
|
+
|
|
30
|
+
### Registering a provider
|
|
6
31
|
|
|
7
|
-
|
|
32
|
+
A provider plugin calls `registerSessionTitleLlmProvider(ctx, config, id, automatic, selectMessages)`; the helper validates the shared config, registers the provider on `ctx.sessionTitle`, and runs every generation through the shared policy. The two shipped plugins register the `first-prompt` and `all-prompts` cadences with their message selectors, and a second registration on the service throws.
|
|
8
33
|
|
|
9
|
-
|
|
34
|
+
### Route and failure contract
|
|
10
35
|
|
|
11
|
-
`provider` and `model` overrides are optional but must be supplied together as non-empty strings. Without that pair, the helper uses the exact provider/model route captured from the current session's logged `request/header
|
|
36
|
+
`provider` and `model` overrides are optional but must be supplied together as non-empty strings. Without that pair, the helper uses the exact provider/model route captured from the current session's logged `request/header`, so an explicit refresh before any route exists needs overrides. The helper measures the final JSON-framed user prompt against `maxInputBytes` before logging or dispatch instead of truncating it, and rechecks timeout and caller cancellation while consuming the stream and after it completes, so a late successful result cannot be accepted even if an interceptor or adapter ignores abort. Malformed or empty output, tool calls, and non-stop finish reasons reject; the session-title service decides whether that rejection is an automatic warning or an explicit caller failure.
|
|
12
37
|
|
|
13
|
-
|
|
38
|
+
### Configuration
|
|
14
39
|
|
|
15
|
-
|
|
40
|
+
<a id="configuration"></a>
|
|
16
41
|
|
|
17
42
|
Every field is required except the paired route override; there are no library defaults.
|
|
18
43
|
|
|
19
|
-
| Key |
|
|
44
|
+
| Key | Default | Meaning |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| `targetWords` | required | Target word count for non-CJK titles |
|
|
47
|
+
| `targetCjkCharacters` | required | Target character count for Chinese, Japanese, or Korean titles |
|
|
48
|
+
| `maxInputBytes` | required | UTF-8 byte ceiling for the final JSON-framed user prompt |
|
|
49
|
+
| `maxOutputTokens` | required | Auxiliary generation token cap |
|
|
50
|
+
| `timeoutMs` | required | End-to-end deadline within the runtime timer limit |
|
|
51
|
+
| `provider`, `model` | optional | Explicit route; both or neither |
|
|
52
|
+
|
|
53
|
+
-----
|
|
54
|
+
|
|
55
|
+
<a id="understand-the-implementation"></a>
|
|
56
|
+
## Understand the implementation
|
|
57
|
+
|
|
58
|
+
<details>
|
|
59
|
+
<summary>Implementation internals — click to expand</summary>
|
|
60
|
+
|
|
61
|
+
This section explains the generation path; the observable behavior is fully covered in [Use this package](#use-this-package).
|
|
62
|
+
|
|
63
|
+
### Design concept
|
|
64
|
+
|
|
65
|
+
One shared policy so provider plugins cannot drift: config validation, route resolution, prompt framing, budget enforcement, cancellation, and output validation all live here, parameterized only by the provider's cadence and message selector.
|
|
66
|
+
|
|
67
|
+
### Source map
|
|
68
|
+
|
|
69
|
+
| File | Role |
|
|
20
70
|
|---|---|
|
|
21
|
-
| `
|
|
22
|
-
| `targetCjkCharacters` | Positive target character count for Chinese, Japanese, or Korean titles. |
|
|
23
|
-
| `maxInputBytes` | Positive UTF-8 byte ceiling for the final JSON-framed user prompt. |
|
|
24
|
-
| `maxOutputTokens` | Positive auxiliary generation token cap. |
|
|
25
|
-
| `timeoutMs` | Positive end-to-end deadline within the runtime timer limit. |
|
|
26
|
-
| `provider`, `model` | Optional explicit route; both or neither. |
|
|
71
|
+
| [`src/index.ts`](src/index.ts) | Config schema and validation, provider registration helper, request framing, dispatch, and output validation |
|
|
27
72
|
|
|
73
|
+
### Request flow
|
|
74
|
+
|
|
75
|
+
A generation validates the config once at registration; each revision frames the selected messages as JSON, measures the framed prompt's UTF-8 bytes against `maxInputBytes`, resolves the route (the explicit pair or the logged `request/header`), appends a log-only `session/title-llm-request` event carrying the exact dispatchable request, then streams through `ctx.llm` under a composed timeout and cancellation deadline. The dispatched envelope carries `purpose: 'session-title'` and deliberately lacks the agent loop's process-local request identity; the DeepSeek adapter maps that purpose to thinking-disabled so the small output budget is reserved for visible title text, and other adapters own their purpose-specific behavior. Output assembles into text blocks only; tool calls, malformed or empty output, and non-stop finish reasons reject, and a later model failure leaves the request record intact.
|
|
76
|
+
|
|
77
|
+
</details>
|
|
78
|
+
|
|
79
|
+
-----
|
|
80
|
+
|
|
81
|
+
<a id="further-exploration"></a>
|
|
82
|
+
## Further Exploration
|
|
83
|
+
|
|
84
|
+
Read these pages when the generation policy is not enough. They move from the service it plugs into to the provider plugins that consume it.
|
|
85
|
+
|
|
86
|
+
- [Session title service](../session-title/README.md) — the title service, fallback behavior, and provider registration contract.
|
|
87
|
+
- [Session title subsystem](../../../docs/subsystems/session-title.md) — durable title state and the auxiliary request record.
|
|
88
|
+
- [First-message title provider](../session-title-first-prompt-llm/README.md) — titles from the first eligible human message.
|
|
89
|
+
- [All-messages title provider](../session-title-all-prompts-llm/README.md) — titles from every eligible human message.
|
|
90
|
+
- [Session package map](../README.md) — adjacent persistence, projection, title, and telemetry packages.
|
|
91
|
+
|
|
92
|
+
-----
|
|
93
|
+
|
|
94
|
+
<a id="model-experience"></a>
|
|
28
95
|
## Model Experience
|
|
29
96
|
|
|
30
97
|
### Auxiliary title request
|
|
@@ -43,5 +110,20 @@ No main-request invalidation. Auxiliary cache reuse is provider-specific; the fi
|
|
|
43
110
|
|
|
44
111
|
## Known Limitations and Deferred Work
|
|
45
112
|
|
|
46
|
-
|
|
47
|
-
|
|
113
|
+
<a id="known-limitations-and-deferred-work"></a>
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
These limits define the accepted generation shapes. They are current package constraints.
|
|
117
|
+
|
|
118
|
+
- **Text output only** — the helper accepts text output and rejects tool calls; structured-output adapters and provider-specific prompt variants are not exposed.
|
|
119
|
+
- **Whole-prompt byte ceiling** — it enforces a byte ceiling for the whole framed user prompt rather than clipping individual messages or applying a retention policy.
|
|
120
|
+
|
|
121
|
+
<a id="dev-note"></a>
|
|
122
|
+
### Dev Note
|
|
123
|
+
|
|
124
|
+
<details>
|
|
125
|
+
<summary>Working context for maintainers — click to expand</summary>
|
|
126
|
+
|
|
127
|
+
None.
|
|
128
|
+
|
|
129
|
+
</details>
|
package/README.zh.md
CHANGED
|
@@ -1,49 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "面向用户与维护者的共享模型标题生成策略说明,用于配置标题提供方或排查辅助 LLM 请求。"
|
|
3
|
+
kind: "package-library"
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# @deepseek-ai/dsh-session-title-llm
|
|
2
7
|
|
|
3
8
|
[English](README.md) | 中文
|
|
4
9
|
|
|
5
|
-
|
|
10
|
+
## 概述
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
`dsh-session-title-llm` 让模型支持的标题生成都经过同一份共享策略:它解析辅助路由,把精确选中的用户消息封装为 JSON,强制执行输入与输出预算,组合超时与调用方取消,并在标题被接受前校验模型输出。它是普通库而非 Cordis 插件——随附提供方插件以各自的节奏与消息选择器调用 `registerSessionTitleLlmProvider()`,该辅助函数验证共享配置并把每次修订委托给同一条生成路径,因此注册、路由、提示词、取消与校验行为不会在它们之间漂移。部署方通过要求所有上限的提供方插件来配置它。路由、失败与配置约定在前;请求内部细节放在下方可折叠的开发者章节中。
|
|
8
13
|
|
|
9
|
-
##
|
|
14
|
+
## 目录
|
|
10
15
|
|
|
11
|
-
|
|
16
|
+
- [使用本包](#use-this-package)
|
|
17
|
+
- [理解实现](#understand-the-implementation)
|
|
18
|
+
- [进一步探索](#further-exploration)
|
|
19
|
+
- [模型体验](#model-experience)
|
|
20
|
+
- [已知限制与延期工作](#known-limitations-and-deferred-work)
|
|
21
|
+
- [开发备注](#dev-note)
|
|
12
22
|
|
|
13
|
-
|
|
23
|
+
-----
|
|
14
24
|
|
|
15
|
-
<a id="
|
|
25
|
+
<a id="use-this-package"></a>
|
|
26
|
+
## 使用本包
|
|
27
|
+
|
|
28
|
+
作为部署方,通过[首消息](../session-title-first-prompt-llm/README.zh.md)或[全消息](../session-title-all-prompts-llm/README.zh.md)提供方插件配置此策略。作为提供方作者,通过共享辅助函数注册,而不是手写生成逻辑。
|
|
29
|
+
|
|
30
|
+
### 注册提供方
|
|
31
|
+
|
|
32
|
+
提供方插件调用 `registerSessionTitleLlmProvider(ctx, config, id, automatic, selectMessages)`;辅助函数验证共享配置、在 `ctx.sessionTitle` 上注册提供方,并让每次生成都经过共享策略。两个随附插件以各自的 `first-prompt` 与 `all-prompts` 节奏和消息选择器注册;服务上的第二次注册会立即抛出。
|
|
33
|
+
|
|
34
|
+
### 路由与失败约定
|
|
35
|
+
|
|
36
|
+
`provider` 与 `model` 覆盖项都是可选的,但必须同时作为非空字符串提供。如果没有这一对取值,辅助函数使用当前会话已记录 `request/header` 中捕获的确切提供方/模型路由,因此在任何路由出现前显式刷新时必须提供覆盖项。辅助函数在记录或分发前,依据 `maxInputBytes` 检查最终 JSON 封装用户提示词的大小,而不是将其截断,并在消费流期间与完成后重新检查超时与调用方取消,因此即使拦截器或适配器忽略 abort,也不能接受迟到的成功结果。格式错误或空输出、工具调用与非 stop 结束原因都会拒绝;会话标题服务决定该拒绝属于自动警告还是显式调用方失败。
|
|
37
|
+
|
|
38
|
+
### 配置
|
|
16
39
|
|
|
17
|
-
|
|
40
|
+
<a id="configuration"></a>
|
|
18
41
|
|
|
19
42
|
除成对的路由覆盖项外,每个字段都必填;库不提供默认值。
|
|
20
43
|
|
|
21
|
-
| 键 |
|
|
44
|
+
| 键 | 默认值 | 含义 |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| `targetWords` | 必填 | 非 CJK 标题的目标词数 |
|
|
47
|
+
| `targetCjkCharacters` | 必填 | 中文、日文或韩文标题的目标字符数 |
|
|
48
|
+
| `maxInputBytes` | 必填 | 最终 JSON 封装用户提示词的 UTF-8 字节上限 |
|
|
49
|
+
| `maxOutputTokens` | 必填 | 辅助生成的 token 上限 |
|
|
50
|
+
| `timeoutMs` | 必填 | 运行时定时器限制内的端到端时限 |
|
|
51
|
+
| `provider`, `model` | 可选 | 显式路由;二者同时提供或同时省略 |
|
|
52
|
+
|
|
53
|
+
-----
|
|
54
|
+
|
|
55
|
+
<a id="understand-the-implementation"></a>
|
|
56
|
+
## 理解实现
|
|
57
|
+
|
|
58
|
+
<details>
|
|
59
|
+
<summary>实现细节——点击展开</summary>
|
|
60
|
+
|
|
61
|
+
本节解释生成路径;可观察行为已在[使用本包](#use-this-package)中完整说明。
|
|
62
|
+
|
|
63
|
+
### 设计理念
|
|
64
|
+
|
|
65
|
+
一份共享策略让提供方插件无法漂移:配置校验、路由解析、提示词封装、预算执行、取消与输出校验都在这里,只以提供方的节奏与消息选择器为参数。
|
|
66
|
+
|
|
67
|
+
### 源码地图
|
|
68
|
+
|
|
69
|
+
| 文件 | 职责 |
|
|
22
70
|
|---|---|
|
|
23
|
-
| `
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
71
|
+
| [`src/index.ts`](src/index.ts) | 配置 schema 与校验、提供方注册辅助、请求封装、分发与输出校验 |
|
|
72
|
+
|
|
73
|
+
### 请求流程
|
|
74
|
+
|
|
75
|
+
生成在注册时校验一次配置;每次修订把选中的消息封装为 JSON,依据 `maxInputBytes` 检查封装提示词的 UTF-8 字节数,解析路由(显式对或已记录 `request/header`),追加一条携带确切可分发请求的仅日志 `session/title-llm-request` 事件,然后在组合的超时与取消截止时间内通过 `ctx.llm` 流式生成。分发的封套携带 `purpose: 'session-title'`,且有意不包含 agent loop 的进程本地请求身份;DeepSeek 适配器根据该用途禁用思考,使少量输出预算全部用于可见标题文本,其他适配器负责自身用途专用行为。输出只组装为文本块;工具调用、格式错误或空输出与非 stop 结束原因都会拒绝,后续模型失败会保留请求记录。
|
|
76
|
+
|
|
77
|
+
</details>
|
|
78
|
+
|
|
79
|
+
-----
|
|
80
|
+
|
|
81
|
+
<a id="further-exploration"></a>
|
|
82
|
+
## 进一步探索
|
|
83
|
+
|
|
84
|
+
当生成策略不够用时阅读以下页面。它们从它所插入的服务逐步进入消费它的提供方插件。
|
|
85
|
+
|
|
86
|
+
- [会话标题服务](../session-title/README.zh.md)——标题服务、回退行为与提供方注册约定。
|
|
87
|
+
- [会话标题子系统](../../../docs/subsystems/session-title.zh.md)——持久标题状态与辅助请求记录。
|
|
88
|
+
- [首消息标题提供方](../session-title-first-prompt-llm/README.zh.md)——根据第一条符合条件的用户消息生成标题。
|
|
89
|
+
- [全消息标题提供方](../session-title-all-prompts-llm/README.zh.md)——根据所有符合条件的用户消息生成标题。
|
|
90
|
+
- [会话包映射](../README.zh.md)——相邻的持久化、投影、标题与遥测包。
|
|
29
91
|
|
|
92
|
+
-----
|
|
93
|
+
|
|
94
|
+
<a id="model-experience"></a>
|
|
30
95
|
## 模型体验
|
|
31
96
|
|
|
32
97
|
### 辅助标题请求
|
|
33
98
|
|
|
34
|
-
####
|
|
99
|
+
#### 模型看到什么
|
|
35
100
|
|
|
36
101
|
标题模型会收到固定系统指令,要求以输入语言返回一个简洁且无装饰的标题;该指令包含所配置的词数与 CJK 字符数目标。它唯一的用户消息包含一个 JSON 数组,其中是精确选中的用户消息及其 seq。
|
|
37
102
|
|
|
38
103
|
#### Token 影响
|
|
39
104
|
|
|
40
|
-
|
|
105
|
+
辅助请求根据所选输入大小与 `maxOutputTokens` 消耗 token。它与主 agent 请求相互独立,不会向 agent 历史增加标题文本或封装内容。DeepSeek 标题调用会关闭思考;主对话保留自身配置的思考模式。
|
|
41
106
|
|
|
42
107
|
#### KV Cache 影响
|
|
43
108
|
|
|
44
109
|
不会使主请求的 KV Cache 失效。辅助缓存复用由提供方决定;固定指令可复用,而 JSON 消息数组会随每次修订变化。
|
|
45
110
|
|
|
46
|
-
##
|
|
111
|
+
## 已知限制与延期工作
|
|
112
|
+
|
|
113
|
+
<a id="known-limitations-and-deferred-work"></a>
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
这些限制定义被接受的生成形态。它们是当前包约束。
|
|
117
|
+
|
|
118
|
+
- **仅文本输出**——辅助函数只接受文本输出并拒绝工具调用;不公开结构化输出适配器或提供方专用提示词变体。
|
|
119
|
+
- **整体提示词字节上限**——它对整个封装用户提示词强制执行字节上限,而不是剪裁单条消息或应用保留策略。
|
|
120
|
+
|
|
121
|
+
<a id="dev-note"></a>
|
|
122
|
+
### 开发备注
|
|
123
|
+
|
|
124
|
+
<details>
|
|
125
|
+
<summary>维护者的工作上下文——点击展开</summary>
|
|
126
|
+
|
|
127
|
+
无。
|
|
47
128
|
|
|
48
|
-
|
|
49
|
-
- 它对整个封装用户提示词强制执行字节上限,不会剪裁单条消息或应用保留策略。
|
|
129
|
+
</details>
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import z from "@deepseek-ai/schemastery";
|
|
2
|
-
import { BlockAssembler, createUserMessage
|
|
2
|
+
import { BlockAssembler, createUserMessage } from "@deepseek-ai/dsh-llm";
|
|
3
3
|
import { MAX_TIMER_DELAY_MS, deadline } from "@deepseek-ai/dsh-timeout";
|
|
4
|
+
import { deepFreeze } from "@deepseek-ai/dsh-util-values";
|
|
4
5
|
import { SessionTitleProviderId, normalizeSessionTitle } from "@deepseek-ai/dsh-session-title";
|
|
5
6
|
//#region lib/types/index.js
|
|
6
7
|
/**
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-session-title-llm",
|
|
3
3
|
"description": "Shared LLM generation policy for DeepSeek Harness session-title providers",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.2-alpha.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -32,22 +32,23 @@
|
|
|
32
32
|
],
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"@deepseek-ai/
|
|
36
|
-
"@deepseek-ai/dsh-
|
|
37
|
-
"@deepseek-ai/dsh-
|
|
38
|
-
"@deepseek-ai/dsh-session
|
|
39
|
-
"@deepseek-ai/dsh-
|
|
40
|
-
"@deepseek-ai/
|
|
35
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
36
|
+
"@deepseek-ai/dsh-invariants": "^0.1.2-alpha.2",
|
|
37
|
+
"@deepseek-ai/dsh-llm": "^0.1.2-alpha.2",
|
|
38
|
+
"@deepseek-ai/dsh-session": "^0.1.2-alpha.2",
|
|
39
|
+
"@deepseek-ai/dsh-session-title": "^0.1.2-alpha.2",
|
|
40
|
+
"@deepseek-ai/dsh-timeout": "^0.1.2-alpha.2"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@deepseek-ai/schemastery": "^3.18.
|
|
43
|
+
"@deepseek-ai/schemastery": "^3.18.2",
|
|
44
|
+
"@deepseek-ai/dsh-util-values": "^0.1.2-alpha.2"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
|
-
"@deepseek-ai/dsh-invariants": "^0.1.
|
|
47
|
-
"@deepseek-ai/dsh-llm": "^0.1.
|
|
48
|
-
"@deepseek-ai/dsh-session
|
|
49
|
-
"@deepseek-ai/
|
|
50
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
51
|
-
"@deepseek-ai/
|
|
47
|
+
"@deepseek-ai/dsh-invariants": "^0.1.2-alpha.2",
|
|
48
|
+
"@deepseek-ai/dsh-llm": "^0.1.2-alpha.2",
|
|
49
|
+
"@deepseek-ai/dsh-session": "^0.1.2-alpha.2",
|
|
50
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
51
|
+
"@deepseek-ai/dsh-session-title": "^0.1.2-alpha.2",
|
|
52
|
+
"@deepseek-ai/dsh-timeout": "^0.1.2-alpha.2"
|
|
52
53
|
}
|
|
53
54
|
}
|