@deepseek-ai/dsh-compaction-basic 0.1.3-alpha.2 → 0.1.5-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 +4 -4
- package/README.zh.md +4 -4
- package/lib/index.js +32 -16
- package/lib/types/region.d.ts +4 -2
- package/lib/types/summarizer.d.ts +1 -3
- package/package.json +24 -24
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/compaction/compaction-basic/README.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: f4045f99f55ba77a1f3741717141baa52d94d742
|
|
6
|
+
README.zh.md: f8d7f62165ab63215f225550dbc5916bfe7942d6
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
|
|
|
9
9
|
|
|
10
10
|
## Summary
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
This package keeps long agent conversations working near the model's context limit. As token pressure builds, it condenses the oldest history into a summary while preserving recent messages; after a context-overflow error, it condenses and retries. You can also request condensation with `/compact` and optionally trim oversized tool outputs first. Condensation uses one extra model request and retains only its summary text. It cannot reduce the system prompt, tools, or session prefix, or split one indivisible unit such as a single huge tool call.
|
|
13
13
|
|
|
14
14
|
## Table of Contents
|
|
15
15
|
|
|
@@ -104,18 +104,18 @@ The backend is built on four commitments:
|
|
|
104
104
|
|
|
105
105
|
- **One measurement service prices every decision.** The singleton `ctx.tokenMeter` measures the latest canonical logged envelope and current surface at one consumed-log revision. When the routed adapter declares request-image pricing, the meter applies it to image history. Pressure, recent-tail retention, range selection, and shrink validation use the same route-priced node figures; logged replacement shadow prices stay on the route-independent heuristic so pure projection folds remain consistent.
|
|
106
106
|
- **The log-recorded bracket is the transaction.** All entry points share one bracket-first region transaction: validate the range and live lock, append `compaction/start` synchronously, prepare and await the summary, revalidate, append `compaction/summary` plus the replacement, and make exactly one closing attempt. Automatic and explicit-region calls require a numeric open-turn owner and whole-surface stability; `compactNow()` reserves idle admission, uses `turn: null`, accepts append-only context outside its selected span, flushes every closed attempt, and releases admission in `finally`.
|
|
107
|
-
- **Summarization reuses the provider's warm prefix.** Replaying the last routed request's
|
|
107
|
+
- **Summarization reuses the provider's warm prefix.** Replaying the system prompt held by the `system/message` at surface node 0, the last routed request's tools, and the shadowed-region messages byte-for-byte makes the auxiliary call a genuine prefix of the conversation, so only the trailing instruction and the summary output are uncached.
|
|
108
108
|
- **`summarize()` is the sole subclass hook.** A template- or remote-summarizer subclass can override it while pressure, retention, cited source events, shrink validation, and shadowed-token accounting stay on the token meter.
|
|
109
109
|
|
|
110
110
|
### Automatic triggers and overflow recovery
|
|
111
111
|
|
|
112
|
-
With `auto: true`, a serial `agent/pre-step` listener checks pressure before request derivation: it prices the latest durable routed request envelope through `ctx.tokenMeter`, and when pressure crosses the routed model's threshold it prunes, then summarizes the oldest balanced span while keeping a priced recent tail. The `agent/request-error` listener reacts to a provider-confirmed `CONTEXT_WINDOW_EXCEEDED`: it bypasses the normal threshold and retention policy, attempts one maximal balanced head reduction, and authorizes a retry only after the surface replacement generation advances. Cancellation stays authoritative throughout.
|
|
112
|
+
With `auto: true`, a serial `agent/pre-step` listener checks pressure before request derivation: it prices the latest durable routed request envelope through `ctx.tokenMeter`, and when pressure crosses the routed model's threshold it prunes, then summarizes the oldest balanced span while keeping a priced recent tail. Every selected range starts at the first surface node that is not a `system/message`, so a system prompt at surface node 0 is never shadowed; a later `system/message` appended by an in-history prompt update is ordinary history that the range may shadow, and the agent loop's projection then replaces node 0 with the current prompt when their text differs ([decision rule](../../core/agent-loop/README.md#understand-the-implementation)). The `agent/request-error` listener reacts to a provider-confirmed `CONTEXT_WINDOW_EXCEEDED`: it bypasses the normal threshold and retention policy, attempts one maximal balanced head reduction, and authorizes a retry only after the surface replacement generation advances. Cancellation stays authoritative throughout.
|
|
113
113
|
|
|
114
114
|
Pressure policy resolves capacity from the adapter that owns the durable route. An adapter that returns no capacity for a valid dynamic route makes the manual pressure path throw a target-specific configuration error; the automatic listener warns once for that exact target and continues with full history.
|
|
115
115
|
|
|
116
116
|
### Summarization mechanics
|
|
117
117
|
|
|
118
|
-
A direct `ctx.llm.stream()` call uses the configured provider/model pair and cap, falling back to the latest logged request target and then the `AgentOptions` pair, without running the loop-only `agent/request` extension point. The call replays the
|
|
118
|
+
A direct `ctx.llm.stream()` call uses the configured provider/model pair and cap, falling back to the latest logged request target and then the `AgentOptions` pair, without running the loop-only `agent/request` extension point. The call replays the derived `system/message` at surface node 0 as the leading entry of `messages`, followed by the shadowed-region messages (including a shadowed in-history `system/message` in its surface position), and carries the header's tools verbatim — including image references, which the selected adapter must resolve or explicitly reject — and appends the compaction instruction as the final user message, so it reuses the provider's warm prefix cache instead of invalidating it. An empty-content system head contributes no message but remains outside the compacted range. The call sets `GenerateOptions.purpose` to `compaction`; only returned text enters the checkpoint, excluding reasoning and tool calls. Image output fails with `UNSUPPORTED_CONTENT` rather than disappearing. The replacement user message frames the summary with `<compacted-summary>` tags; the raw summary remains on the `compaction/summary` event.
|
|
119
119
|
|
|
120
120
|
### The region transaction
|
|
121
121
|
|
package/README.zh.md
CHANGED
|
@@ -9,7 +9,7 @@ kind: "package-reference"
|
|
|
9
9
|
|
|
10
10
|
## 概述
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
本包让长时 agent 会话在接近模型上下文上限时仍能正常工作。token 压力上升时,它会把最旧的历史压缩为摘要并保留近期消息;上下文溢出错误发生后,它会压缩并重试。你也可以通过 `/compact` 按需压缩,并选择先修剪超大工具输出。压缩使用一次额外的模型请求,并且只保留该请求返回的摘要文本。它无法缩减系统提示词、工具或会话前缀,也无法拆分单个不可分单元(例如一次超大工具调用)。
|
|
13
13
|
|
|
14
14
|
## 目录
|
|
15
15
|
|
|
@@ -104,18 +104,18 @@ kind: "package-reference"
|
|
|
104
104
|
|
|
105
105
|
- **一个测量服务为每个决策定价。** 单例 `ctx.tokenMeter` 会在同一个已消费日志 revision 上测量最新规范已记录 envelope 与当前表层。路由适配器声明请求图片定价时,meter 会将其应用于图片历史。压力、近期尾部保留、范围选择与缩减验证使用同一套路由定价的节点数值;已记录的替换影子价仍使用与路由无关的启发式规则,使纯投影 fold 保持一致。
|
|
106
106
|
- **日志记录的标记对就是事务。** 所有入口点共享一个先记录标记的区域事务:验证范围与活动锁,同步追加 `compaction/start`,准备并等待摘要,重新验证,再追加 `compaction/summary` 与替换,最后恰好进行一次闭合尝试。自动调用与显式范围调用要求数字标识的开放轮次归属与整个表层稳定;`compactNow()` 会预留空闲接纳,使用 `turn: null`,允许所选 span 之外追加仅追加上下文,flush 每次已闭合尝试,并在 `finally` 中释放接纳预留。
|
|
107
|
-
- **摘要复用提供方的热前缀。**
|
|
107
|
+
- **摘要复用提供方的热前缀。** 逐字回放 surface 节点 0 处 `system/message` 所承载的系统提示词、上次已路由请求的工具与已遮蔽区域消息,使辅助调用成为会话的真正前缀,因此只有尾随指令与摘要输出未缓存。
|
|
108
108
|
- **`summarize()` 是唯一的子类钩子。** 基于模板或远程摘要器的子类可以覆盖它,同时压力、保留、被引用的源事件、缩减验证与已遮蔽 token 计量仍由 token meter 负责。
|
|
109
109
|
|
|
110
110
|
### 自动触发与溢出恢复
|
|
111
111
|
|
|
112
|
-
当 `auto: true` 时,串行 `agent/pre-step` listener 会在请求派生前检查压力:它通过 `ctx.tokenMeter` 为最新持久路由请求 envelope
|
|
112
|
+
当 `auto: true` 时,串行 `agent/pre-step` listener 会在请求派生前检查压力:它通过 `ctx.tokenMeter` 为最新持久路由请求 envelope 定价,当压力越过路由模型的阈值时,先剪枝,再在保留已定价近期尾部的同时摘要最旧的平衡范围。每个选定范围都从第一个不是 `system/message` 的 surface 节点开始,因此位于 surface 节点 0 的系统提示词永不会被遮蔽;由历史内提示词更新追加的后续 `system/message` 是普通历史,范围可以遮蔽它,agent loop 的投影随后会在二者文本不同时用当前提示词替换节点 0([决策规则](../../core/agent-loop/README.zh.md#understand-the-implementation))。`agent/request-error` listener 响应提供方确认的 `CONTEXT_WINDOW_EXCEEDED`:它绕过常规阈值与保留策略,尝试一次最大平衡头部缩减,并且只在表层替换 generation 前进后才授权重试。取消全程保持最终决定权。
|
|
113
113
|
|
|
114
114
|
压力策略从拥有持久路由的适配器解析容量。适配器无法为有效动态路由返回容量时,手动压力路径会抛出目标特定配置错误;自动 listener 会对该精确目标警告一次,并携带完整历史继续。
|
|
115
115
|
|
|
116
116
|
### 摘要机制
|
|
117
117
|
|
|
118
|
-
直接 `ctx.llm.stream()` 调用使用已配置的提供方/模型对与上限,回退到最新已记录请求目标,然后再回退到 `AgentOptions` 对,而不运行仅用于 agent loop 的 `agent/request`
|
|
118
|
+
直接 `ctx.llm.stream()` 调用使用已配置的提供方/模型对与上限,回退到最新已记录请求目标,然后再回退到 `AgentOptions` 对,而不运行仅用于 agent loop 的 `agent/request` 扩展点。该调用将 surface 节点 0 处派生的 `system/message` 作为 `messages` 的首项回放,后接已遮蔽区域消息(包括位于其 surface 位置的被遮蔽历史内 `system/message`),并逐字携带 header 的工具——包括所选适配器必须解析或明确拒绝的图片引用——并将压缩指令作为最后一条 user 消息追加,从而复用提供方的热前缀 cache,而非使它失效。空内容系统头节点不贡献消息,但仍处于压缩范围之外。调用将 `GenerateOptions.purpose` 设为 `compaction`;只有返回文本进入检查点,推理与工具调用都会被排除。图片输出会以 `UNSUPPORTED_CONTENT` 失败,而不是消失。替换 user 消息用 `<compacted-summary>` 标签框定摘要;原始摘要保留在 `compaction/summary` 事件上。
|
|
119
119
|
|
|
120
120
|
### 区域事务
|
|
121
121
|
|
package/lib/index.js
CHANGED
|
@@ -293,7 +293,6 @@ async function summarizeWithLlm(ctx, config, input, agent, signal) {
|
|
|
293
293
|
provider: target.provider,
|
|
294
294
|
model: target.model,
|
|
295
295
|
messages,
|
|
296
|
-
...input.system === void 0 ? {} : { system: input.system },
|
|
297
296
|
...input.tools === void 0 ? {} : { tools: [...input.tools] },
|
|
298
297
|
maxTokens: config.maxTokens,
|
|
299
298
|
sessionId: agent.session.id,
|
|
@@ -371,8 +370,21 @@ function summaryText(blocks) {
|
|
|
371
370
|
*/
|
|
372
371
|
var SurfaceChangedError = class extends Error {};
|
|
373
372
|
/**
|
|
374
|
-
*
|
|
375
|
-
*
|
|
373
|
+
* The `system/message` holding surface node 0, or `undefined` when another
|
|
374
|
+
* message-producing event starts the surface.
|
|
375
|
+
* @param session - session supplying the log behind the current surface.
|
|
376
|
+
* @param headSeq - seq at surface node 0 of a non-empty surface.
|
|
377
|
+
* @returns the system head event, or `undefined` without one.
|
|
378
|
+
*/
|
|
379
|
+
function systemHead(session, headSeq) {
|
|
380
|
+
const head = session.eventAt(headSeq);
|
|
381
|
+
return head.type === "system/message" ? head : void 0;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Resolve the next range starting at the first non-system surface node while
|
|
385
|
+
* retaining a priced recent tail and never splitting an assistant
|
|
386
|
+
* tool-call/result pair. A `system/message` at surface node 0 is never inside
|
|
387
|
+
* the range; without one the range starts at node 0.
|
|
376
388
|
* @param session - session supplying authoritative current surface positions.
|
|
377
389
|
* @param measurement - unified pressure and surface measurement from the conversation meter.
|
|
378
390
|
* @param retainTokens - minimum recent tail budget retained verbatim.
|
|
@@ -383,6 +395,7 @@ function selectCompactableRange(session, measurement, retainTokens) {
|
|
|
383
395
|
if (pricedNodes.length === 0) return null;
|
|
384
396
|
const surfaceNodes = session.surface.nodes;
|
|
385
397
|
if (surfaceNodes.length !== pricedNodes.length || surfaceNodes.some((seq, index) => seq !== pricedNodes[index]?.seq)) throw new Error("compaction: token-meter surface does not match the current session surface");
|
|
398
|
+
const firstIdx = systemHead(session, surfaceNodes[0]) === void 0 ? 0 : 1;
|
|
386
399
|
let accumulated = 0;
|
|
387
400
|
let keepFromIdx = pricedNodes.length;
|
|
388
401
|
for (let index = pricedNodes.length - 1; index >= 0; index -= 1) {
|
|
@@ -390,14 +403,14 @@ function selectCompactableRange(session, measurement, retainTokens) {
|
|
|
390
403
|
keepFromIdx = index;
|
|
391
404
|
if (accumulated >= retainTokens) break;
|
|
392
405
|
}
|
|
393
|
-
if (keepFromIdx
|
|
394
|
-
while (keepFromIdx >
|
|
406
|
+
if (keepFromIdx <= firstIdx) return null;
|
|
407
|
+
while (keepFromIdx > firstIdx) {
|
|
395
408
|
if (toolPairingBalancedBefore(session, surfaceNodes[keepFromIdx])) break;
|
|
396
409
|
keepFromIdx -= 1;
|
|
397
410
|
}
|
|
398
|
-
if (keepFromIdx
|
|
411
|
+
if (keepFromIdx <= firstIdx) return null;
|
|
399
412
|
return {
|
|
400
|
-
start: surfaceNodes[
|
|
413
|
+
start: surfaceNodes[firstIdx],
|
|
401
414
|
end: surfaceNodes[keepFromIdx - 1]
|
|
402
415
|
};
|
|
403
416
|
}
|
|
@@ -608,8 +621,8 @@ function commitCompactionBody(session, startEvent, summarized) {
|
|
|
608
621
|
session.append("user/message", checkpointMessage, {
|
|
609
622
|
surfaceOp: {
|
|
610
623
|
op: "replace",
|
|
611
|
-
start,
|
|
612
|
-
end
|
|
624
|
+
startSeq: start,
|
|
625
|
+
endSeq: end
|
|
613
626
|
},
|
|
614
627
|
sourceEventSeqs: [
|
|
615
628
|
startEvent.seq,
|
|
@@ -640,21 +653,24 @@ function completeCompaction(pending, endEvent) {
|
|
|
640
653
|
}
|
|
641
654
|
/**
|
|
642
655
|
* Reconstruct the last routed request's cacheable prefix for the shadowed
|
|
643
|
-
* region:
|
|
644
|
-
*
|
|
645
|
-
*
|
|
646
|
-
* and reuses the provider's
|
|
647
|
-
*
|
|
656
|
+
* region: the system prompt held by the `system/message` at surface node 0,
|
|
657
|
+
* the header's tool schemas, then the region's own derived messages in surface
|
|
658
|
+
* order. The summarizer appends only the compaction instruction after this, so
|
|
659
|
+
* the call is a genuine prefix of the conversation and reuses the provider's
|
|
660
|
+
* KV cache. A surface without a system head, or whose head projects to no
|
|
661
|
+
* message, contributes no leading system message.
|
|
662
|
+
* @param session - session supplying the surface head, request header, and per-node projection.
|
|
648
663
|
* @param shadowedSeqs - the surface-node seqs, in order, being compacted.
|
|
649
664
|
* @returns the replayed conversation prefix to condense.
|
|
650
665
|
*/
|
|
651
666
|
function buildSummarizationInput(session, shadowedSeqs) {
|
|
652
667
|
const header = session.requestHeader();
|
|
668
|
+
const head = systemHead(session, session.surface.nodes[0]);
|
|
669
|
+
const system = head === void 0 ? null : session.deriveEventMessage(head);
|
|
653
670
|
const regionMessages = shadowedSeqs.map((seq) => session.deriveEventMessage(session.eventAt(seq))).filter((message) => message !== null);
|
|
654
671
|
return {
|
|
655
|
-
...header?.system === void 0 ? {} : { system: header.system },
|
|
656
672
|
...header?.tools === void 0 ? {} : { tools: header.tools },
|
|
657
|
-
messages: regionMessages
|
|
673
|
+
messages: system === null ? regionMessages : [system, ...regionMessages]
|
|
658
674
|
};
|
|
659
675
|
}
|
|
660
676
|
/** Inspect open-turn, unmatched-compaction, and latest seed-boundary state independently. */
|
package/lib/types/region.d.ts
CHANGED
|
@@ -25,8 +25,10 @@ interface CompactionTransactionOptions {
|
|
|
25
25
|
readonly sourceCommandId?: CommandId;
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
* Resolve the next
|
|
29
|
-
* and never splitting an assistant
|
|
28
|
+
* Resolve the next range starting at the first non-system surface node while
|
|
29
|
+
* retaining a priced recent tail and never splitting an assistant
|
|
30
|
+
* tool-call/result pair. A `system/message` at surface node 0 is never inside
|
|
31
|
+
* the range; without one the range starts at node 0.
|
|
30
32
|
* @param session - session supplying authoritative current surface positions.
|
|
31
33
|
* @param measurement - unified pressure and surface measurement from the conversation meter.
|
|
32
34
|
* @param retainTokens - minimum recent tail budget retained verbatim.
|
|
@@ -18,11 +18,9 @@ interface SummaryConfig {
|
|
|
18
18
|
* compaction instruction is then the only novel input.
|
|
19
19
|
*/
|
|
20
20
|
export interface SummarizationInput {
|
|
21
|
-
/** The conversation's own system prompt, reused for prefix-cache alignment; absent for a system-less request. */
|
|
22
|
-
readonly system?: string;
|
|
23
21
|
/** The conversation's tool schemas, reused for prefix-cache alignment; absent when the request carried none. */
|
|
24
22
|
readonly tools?: readonly ToolSchema[];
|
|
25
|
-
/** The
|
|
23
|
+
/** The derived system head, when present, followed by the shadowed region in surface order. */
|
|
26
24
|
readonly messages: readonly Message[];
|
|
27
25
|
}
|
|
28
26
|
/** Safe summary content plus the exact auxiliary call envelope recorded with it. */
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-compaction-basic",
|
|
3
3
|
"description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.5-alpha.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -27,14 +27,14 @@
|
|
|
27
27
|
],
|
|
28
28
|
"license": "MIT",
|
|
29
29
|
"peerDependencies": {
|
|
30
|
-
"@deepseek-ai/
|
|
31
|
-
"@deepseek-ai/dsh-
|
|
32
|
-
"@deepseek-ai/dsh-compaction": "^0.1.
|
|
33
|
-
"@deepseek-ai/dsh-compaction-tool-result-pruner": "^0.1.
|
|
34
|
-
"@deepseek-ai/dsh-llm": "^0.1.
|
|
35
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
36
|
-
"@deepseek-ai/dsh-token-meter": "^0.1.
|
|
37
|
-
"@deepseek-ai/
|
|
30
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
31
|
+
"@deepseek-ai/dsh-agent": "^0.1.5-alpha.2",
|
|
32
|
+
"@deepseek-ai/dsh-compaction": "^0.1.5-alpha.2",
|
|
33
|
+
"@deepseek-ai/dsh-compaction-tool-result-pruner": "^0.1.5-alpha.2",
|
|
34
|
+
"@deepseek-ai/dsh-llm": "^0.1.5-alpha.2",
|
|
35
|
+
"@deepseek-ai/dsh-session": "^0.1.5-alpha.2",
|
|
36
|
+
"@deepseek-ai/dsh-token-meter": "^0.1.5-alpha.2",
|
|
37
|
+
"@deepseek-ai/dsh-commands": "^0.1.5-alpha.2"
|
|
38
38
|
},
|
|
39
39
|
"peerDependenciesMeta": {
|
|
40
40
|
"@deepseek-ai/dsh-compaction-tool-result-pruner": {
|
|
@@ -42,25 +42,25 @@
|
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@deepseek-ai/
|
|
46
|
-
"@deepseek-ai/
|
|
45
|
+
"@deepseek-ai/schemastery": "^3.18.2",
|
|
46
|
+
"@deepseek-ai/dsh-util-values": "^0.1.5-alpha.2"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@deepseek-ai/cordis": "^4.0.2",
|
|
50
50
|
"@deepseek-ai/cordis-plugin-include": "^1.0.7",
|
|
51
51
|
"@deepseek-ai/cordis-plugin-loader": "^1.0.3",
|
|
52
|
-
"@deepseek-ai/dsh-agent": "^0.1.
|
|
53
|
-
"@deepseek-ai/dsh-agent-loop": "^0.1.
|
|
54
|
-
"@deepseek-ai/dsh-
|
|
55
|
-
"@deepseek-ai/dsh-
|
|
56
|
-
"@deepseek-ai/dsh-
|
|
57
|
-
"@deepseek-ai/dsh-
|
|
58
|
-
"@deepseek-ai/dsh-
|
|
59
|
-
"@deepseek-ai/dsh-
|
|
60
|
-
"@deepseek-ai/dsh-
|
|
61
|
-
"@deepseek-ai/dsh-
|
|
62
|
-
"@deepseek-ai/dsh-
|
|
63
|
-
"@deepseek-ai/dsh-
|
|
64
|
-
"@deepseek-ai/dsh-
|
|
52
|
+
"@deepseek-ai/dsh-agent": "^0.1.5-alpha.2",
|
|
53
|
+
"@deepseek-ai/dsh-agent-loop-testkit": "^0.1.5-alpha.2",
|
|
54
|
+
"@deepseek-ai/dsh-commands": "^0.1.5-alpha.2",
|
|
55
|
+
"@deepseek-ai/dsh-compaction-tool-result-pruner": "^0.1.5-alpha.2",
|
|
56
|
+
"@deepseek-ai/dsh-invariants": "^0.1.5-alpha.2",
|
|
57
|
+
"@deepseek-ai/dsh-llm": "^0.1.5-alpha.2",
|
|
58
|
+
"@deepseek-ai/dsh-llm-retry": "^0.1.5-alpha.2",
|
|
59
|
+
"@deepseek-ai/dsh-session": "^0.1.5-alpha.2",
|
|
60
|
+
"@deepseek-ai/dsh-session-projection": "^0.1.5-alpha.2",
|
|
61
|
+
"@deepseek-ai/dsh-token-meter": "^0.1.5-alpha.2",
|
|
62
|
+
"@deepseek-ai/dsh-tools": "^0.1.5-alpha.2",
|
|
63
|
+
"@deepseek-ai/dsh-agent-loop": "^0.1.5-alpha.2",
|
|
64
|
+
"@deepseek-ai/dsh-compaction": "^0.1.5-alpha.2"
|
|
65
65
|
}
|
|
66
66
|
}
|