@falling-ts/dsh-force-compact 0.2.3 → 0.2.5

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.cn.md CHANGED
@@ -1,133 +1,163 @@
1
1
  # dsh-force-compact
2
2
 
3
- **面向本地推理的「本地优先 · 激进压缩」插件。**
3
+ **面向 DeepSeek Harness agent 的激进、本地优先上下文压缩。**
4
4
 
5
- `@falling-ts/dsh-force-compact` 是一个 DSH **Cordis 函数插件**,它让 agent 的工作上下文**始终
6
- 保持在紧凑、高信号的区间**,从而让你能用自托管 llama.cpp 服务上的 `Qwen3.8‑27B`(低上下文
7
- 配置)跑出**接近大窗口**的体验——更低延迟、数据不出本机、无 API 费用。
5
+ 一个 DSH **Cordis 功能插件**,让 agent 的工作上下文始终保持精悍:用自建 llama.cpp 以
6
+ 适中上下文承载 `Qwen3.8‑27B`,插件负责收缩会话本身——近乎大窗口的体验,无 API 费用、
7
+ 数据不出本机。
8
8
 
9
9
  [English](README.md)
10
10
 
11
11
  ---
12
12
 
13
- ## 为什么做这件事
13
+ ## 为什么要做
14
14
 
15
- 主流做法是把大模型塞进短上下文预算里硬扛。本插件反其道而行:**权重、端点、上下文预算都由你
16
- 自己掌控。**
17
-
18
- - **自托管推理。** 把 agent 指向本地 OpenAI 兼容的 llama.cpp 服务器,运行 `Qwen3.8‑27B`
19
- (GGUF / NVFP4 / MTP 变体均可走标准 DeepSeek 适配器路径,**无需单独的 llama.cpp 适配器**)
20
- - **低上下文、高信号。** 不与小硬上限较劲,而是**直接收缩会话本身**——agent 永远在紧凑、
21
- 高信号的小 prompt 上推理,却等效获得更大的工作记忆。
22
- - **默认关闭思考。** `disableThinking: true` 对**每一次出站调用**(业务请求 + 插件自己的摘要
23
- 调用)都关闭模型的内部推理努力,并在两个互补缝上双重保障(见下文「后端无关的思考控制」)。
24
- - **私有且免费。** 无按 token 计费、无数据外泄,模型与上下文的取舍完全由你调。
15
+ - **本地推理**——agent 走标准 DeepSeek 适配器对接一台本地 OpenAI 兼容的 llama.cpp
16
+ 服务端,无需另行编写适配器。
17
+ - **低上下文、高信号**——不与小上限较劲,而是直接收缩会话:agent 在短促的请求上
18
+ 思考,同时靠压缩后的开头段保有深层记忆。
19
+ - **只关压缩的思考,其余放行**——`disableThinking: true`(默认)只关掉
20
+ *本插件自己的压缩摘要调用* 的思考;其他一切模型请求沿用机器原有配置,原样放行。
21
+ - **私密免费**——不计 token 费用,无数据外流。
25
22
 
26
23
  ---
27
24
 
28
- ## 插件做了什么
25
+ ## 它能做什么
29
26
 
30
- 两条压缩引擎通过统一 facade(`resolveCompaction`)并存,对调用者透明:
27
+ 两条压缩引擎经由统一门面(`resolveCompaction`)共存,对调用者透明:
31
28
 
32
- | 引擎 | 何时使用 | 说明 |
29
+ | 引擎 | 启用条件 | 说明 |
33
30
  |------|----------|------|
34
- | **官方** | agent realm 内可解析到 `compaction` 服务时 | 首选,委托给 `compaction/basic`。 |
35
- | **内置** | 官方服务被 realm 隔离时自动接管(典型标准预设) | 自包含持久事务,仅依赖 `ctx.sessions` / `ctx.llm.stream` / `ctx.tokenMeter`;复用官方 `compaction/*` 事件词汇,跨 build 重放存活、无需 `ignorable` hack。 |
31
+ | **官方** | agent 领域内可解析出 `compaction` 服务 | 优先;委托 `compaction/basic`。 |
32
+ | **内置** | 自动回落(典型标准预设将服务隔离,解析不到) | 基于 `ctx.sessions` / `ctx.llm.stream` / `ctx.tokenMeter` 的自包含持久事务;复用官方 `compaction/*` 事件词汇,跨版本回放安全。 |
36
33
 
37
- 你**无需手动切换**:官方可达就用官方,不可达才落到内置。
34
+ 无需切换——官方可达就走官方,不可达就内置接管。
38
35
 
39
36
  ### 触发点
40
37
 
41
- - **每请求门禁(`agent/pre-step`)** —— 读取会话的 *投影* 上下文 token(与 harness 右下角显示
42
- 的同一数值,provider 锚定)。达到 `autoThresholdTokens` 时,拒绝发起模型请求,改为压缩头段,
43
- 并逐字保留最新的 `retainLatestTokens`。
44
- - **回合结束 / idle(`agent/status` → `idle`)** —— agent 静止(含子代理全部结束)时,可选地
45
- `compactNow` 压缩(开关:`turnEndForceCompactionEnabled`)。
46
- - **手动 `/force-compact` 斜杠命令** —— 对忙/闲 agent 都能生效:空闲立即压缩;繁忙则排队一个
47
- process-local 强制标记,在下一个模型步骤消费。
48
- - **`session/flush` 检查点** —— 等待型的持久化检查点。
38
+ - **每次请求门禁(`agent/pre-step`)**——读取会话*预计*上下文 token(即界面右下角显示的
39
+ 数字)。达到 `autoThresholdTokens` 时,拒绝本次出站请求并改压缩头部,最近
40
+ `retainLatestTokens` 逐字保留;低于阈值则请求照常进行。
41
+ - **回合结束 / 静止(`agent/status` → `idle`)**——agent 静止时(含子代理全部结束),
42
+ 可选地经 `compactNow` 压缩(开关:`turnEndForceCompactionEnabled`)。
43
+ - **手动 `/force-compact`**——对忙/闲 agent 都能生效:空闲立即压缩;繁忙则排队一个
44
+ 进程内强制标记,在下一个模型步骤消费。**命令本身惰性加载**——见安装章「命令可用性」。
45
+ - **`session/flush`**——等待型的持久化检查点。
46
+
47
+ 每条路径最终都汇入唯一的「**压缩结果落入会话**」边界——也正是**发送 LiveUI 信令**的位置。
48
+
49
+ 判定键用 `projectedTokens`(provider 锚定,与界面角标同源),故插件永远不会偏离你所见;
50
+ 阈值感知的缩容门禁会跳过注定拉不回阈值以下的摘要调用(消灭低阈值死循环)。
51
+
52
+ 内置事务的影子价格账单取自与官方引擎相同的 `tokenMeter.measure` 逐节点单价,故米表
53
+ 折叠协议结算正确——压缩后右下角计数器*下降*,而非漂移上升。
54
+
55
+ ### 思考控制:只作用于压缩
56
+
57
+ 自 2026‑08 语义修订,`disableThinking` 只管一件事:**本插件自己的摘要调用**
58
+ (`engine/builtin.js` → `engine/summarizer.js` → `ctx.llm.stream`)是否携带
59
+ `reasoningEffort:'off'`。其余一切不受影响:
60
+
61
+ | 调用位置 | `disableThinking: true` 时的行为 |
62
+ |---|---|
63
+ | 内置引擎的摘要调用 | 携带 `reasoningEffort:'off'` |
64
+ | 其他一切模型请求(业务、子代理、工具、其他插件) | 机器 `LlmCallConfig` 原样不动 |
65
+ | 官方 `compaction` 服务的调用 | 不经过本插件任何接缝——不受影响 |
49
66
 
50
- 每条路径最终都汇入唯一的「**压缩结果落入会话**」边界——也正是**发送 liveUI 信令**的位置。
67
+ 目标是 **llama.cpp / OpenAI 兼容端点**时,适配器吐出的 `thinking: { type: 'disabled' }`
68
+ 字段在那里被静默忽略——所以摘要器**另外**打上 llama.cpp 原生顶层字段
69
+ `reasoning_effort: "none"`,门控条件与前一字**完全一致**。同一 options 对象携带两字段:
51
70
 
52
- ### 判定基准是 provider 锚定的
71
+ | 端点家族 | 读取 | 结果 |
72
+ |---|---|---|
73
+ | 真·DeepSeek API | `reasoningEffort:'off'` → `thinking:{type:'disabled'}` | 关思考 ✅ |
74
+ | llama.cpp / OpenAI 兼容 | `reasoning_effort:"none"`(顶层) | `enable_thinking=false` ✅ |
53
75
 
54
- 判定使用 `projectedTokens`(与 UI 角标同款数值),插件因此永不偏离你所见的数字。阈值感知的
55
- 缩容门禁会跳过「注定无法把会话降到阈值以下」的摘要 LLM 调用(消灭低阈值死循环)
76
+ 每一类端点都宽容无视对方家族的键,故双发无害。字段打在 `src/engine/summarizer.js`
77
+ (紧挨 `llm.stream(options)` 调用之前),**不在** `llm/stream` 瀑布里——早期草稿曾在那
78
+ 处尝试注入,实证证明结构性无效(中间层返回值被丢弃;就地改种子会使宿主崩溃);论证全文
79
+ 见 `src/hooks/wire-rewrite.js` 模块头部。该钩子现在只承担 LiveUI 水印角色。
56
80
 
57
- ### 影子价格记账与米表对齐
81
+ 业务调用也要关思考?在请求头层面设定你 provider 的 `reasoningEffort`——插件有意退出
82
+ 该决定。
58
83
 
59
- 内置事务的 `shadowedTokenCount` 取自**与官方相同的** `tokenMeter.measure` 逐节点单价,使米表
60
- 的折叠协议正确结算下降——压缩后右下角计数是**下降**而非漂移上涨。
84
+ #### 可观测性:每次摘要尝试的审计行
61
85
 
62
- ### 后端无关的思考控制
86
+ 每次摘要尝试都会打两行日志(默认 `debug: true` 即见)——不抓包就能确认作用域裁定与其
87
+ wire 字段的持久证据:
63
88
 
64
- `disableThinking` 在**两个互补的缝**上强制执行:
89
+ ```
90
+ [force-compact] <sessionId>: compaction thinking-policy — settings.disableThinking=true → extra.reasoningEffort='off' (this summarization call carries thinking-OFF)
91
+ [force-compact] <sessionId>: summarization wire-fields → <provider>/<model>: reasoningEffort='off' + reasoning_effort="none" (llama.cpp-native wire field)
92
+ ```
65
93
 
66
- 1. **请求缝** —— `reasoningEffort:'off'` → DeepSeek 适配器序列化为
67
- `thinking:{type:'disabled'}`(真 DeepSeek API 认这个字段)。
68
- 2. **wire 缝(`llm/stream`)** —— 插件在序列化后追加顶层 `reasoning_effort:"none"`,llama.cpp
69
- OpenAI 兼容层原生解析(`server-common.cpp` 映射到 `enable_thinking=false`,与模板能力
70
- 无关)。真 DeepSeek 端点忽略未知键。
94
+ - **第一行**(`engine/builtin.js`)记录 `disableThinking` 在哪里被读出、如何进入调用
95
+ 选项;关闭时则记录*沿用机器默认*。
96
+ - **第二行**(`engine/summarizer.js`)记录离开 options 对象那一刻的两个 wire 字段(加上
97
+ 解析出的 provider/模型);未盖章字段标注 `(absent…)`。
71
98
 
72
- 结果:在任何后端(包括本地 llama.cpp)上都**确实关闭了思考**,不依赖目标嗅探启发式而漏判路由。
99
+ 实证背书:对本机 llama.cpp 端点做过对照——基线请求返回非空 `reasoning_content`
100
+ (默认会想),带顶层 `reasoning_effort:"none"` 的同款请求完全没有——该类端点上该字段
101
+ 确实在关思考,而未携字段业务调用维持正常思考。
73
102
 
74
103
  ### LiveUI 状态
75
104
 
76
- 一个极小的 host→client 信令通道(`liveUi` 设置字段,实时镜像到浏览器),在 turn 旁绘制徽标:
105
+ 极小的宿主→客户端信道(`liveUi` 设置字段被实时镜像到浏览器),在回合旁钉一枚徽标:
77
106
 
78
- - **🟥 compressing** —— 固定红色 `[强制压缩中>>>]`,在压缩提交前一刻发出;
79
- - **🟢 done** —— 固定绿色 `[压缩完成!]`,**在压缩结果落入会话的瞬间**发出,3 秒后回落为一组
80
- 全新的随机 working 文案;
81
- - **🔵 working** —— 否则是一条玩梗式的随机短句("正在缝合上下文…"、"正在憋大招…"),颜色为
82
- 20 色深色色板随机抽取。
107
+ - **🟥 红色「压缩中」**——压缩即将提交前,钉在行进中的回合旁(屏幕文字为中文);
108
+ - **🟢 绿色「完成」**——压缩结果落定的瞬间点亮;约 3 秒后,一条新鲜的随机工作中
109
+ 短句接替;
110
+ - **🔵 蓝色「工作中」**——平时是一条轮换的俏皮短句。
83
111
 
84
- 发布器绝对安全:信令故障永远不会干扰真实压缩事务。
112
+ 发送方绝对安全:信令故障绝不误伤真实的压缩事务。
85
113
 
86
114
  ---
87
115
 
88
116
  ## 工作原理
89
117
 
90
- 插件钩住官方的模型请求 Waterfall,使决策发生在**真正发起模型请求之前**,以及持久化检查点上:
91
-
92
118
  ```
93
119
  agent/request(payload, next) # 每次模型请求
94
- disableThinking? -> { ...config, reasoningEffort: "off" }
120
+ return await next() # 纯透传(思考关闭只作用于本插件
121
+ # 自己的摘要调用)
95
122
 
96
123
  agent/pre-step(payload, next) # 每个模型步骤前
97
124
  projectedTokens >= autoThresholdTokens?
98
- 否 -> next() # 放行模型请求
99
- 是 -> compactRegion(head-before-retainLatestTokens, signal)
100
- return { kind: "reject" } # 本步不请求模型
125
+ 否 -> next() # 放行
126
+ 是 -> compactRegion(保留段之前的头部区间, signal)
127
+ return { kind: "reject" } # 本步骤不请求模型
101
128
 
102
- agent/status({ agent, status }) # 生命周期过渡
129
+ agent/status({ agent, status }) # 生命体征过渡
103
130
  status === "idle" && turnEndForceCompactionEnabled?
104
- -> compactNow(agent, freshSignal) # 回合结束压缩
131
+ -> compactNow(agent, 新signal) # 回合结束压缩
105
132
 
106
- session/flush(session) # 持久化检查点
107
- 选区 -> 投影消息 -> 预览 + 缩容门禁
133
+ session/flush(session) # 持久化检查点
134
+ 选取区间 -> 投影消息 -> 预览 + 缩容门禁
108
135
  -> compaction.compactRegion(start, end, agent, signal)
109
136
  ```
110
137
 
111
138
  支撑模块:
112
139
 
113
- - `src/hooks/guard.js` —— 每请求门禁:关思考 + 阈值门 + 强制标记。
114
- - `src/hooks/command.js` —— `/force-compact` 命令。
140
+ - `src/hooks/guard.js` —— 每次请求的门禁:`agent/request` 纯透传(不再批量盖思考章)+
141
+ `pre-step` 阈值门 + 进程内强制标记(`thinkingDisabled` 仅作遗留谓词保留,热路径不再
142
+ 调用)。
143
+ - `src/hooks/command.js` —— `/force-compact` 命令(惰性注册)。
115
144
  - `src/hooks/idle.js` —— 回合结束强制压缩。
116
- - `src/hooks/wire-rewrite.js` —— `llm/stream` wire 补丁,追加 `reasoning_effort:"none"`。
117
- - `src/engine/region.js` —— 头/尾锚定的选区(含官方工具配对账本)。
118
- - `src/engine/summarizer.js` —— 一次性 LLM 摘要器(与官方 `compaction-basic` 全面对齐:
119
- 三级 target 解析、前缀缓存对齐、`purpose:'compaction'` 标签、fail-closed finish 分类、
120
- usage 采集)。
145
+ - `src/hooks/wire-rewrite.js` —— `llm/stream` LiveUI 水印钩子(不再做任何 wire
146
+ 操作;缘由见模块头部历史注记)。
147
+ - `src/engine/region.js` —— 选区(锚定头/尾,含官方工具配对台账)。
148
+ - `src/engine/summarizer.js` —— 一次性 LLM 摘要器,与官方 `compaction-basic` 完全
149
+ 对齐(三级 target 解析、前缀缓存对齐、`purpose:'compaction'` 标签、fail-closed
150
+ 终局分类、用量采集)。
121
151
  - `src/engine/builtin.js` —— 内置持久事务(官方 `compaction/*` 词汇)。
122
- - `src/engine/checkpoint.js` —— 预览 + 缩容门禁 + 委托 compaction 服务。
123
- - `src/core/projected.js` —— provider 锚定的 `projectedTokens` 读取。
124
- - `src/core/ui-signal.js` —— liveUI 信令器。
152
+ - `src/engine/checkpoint.js` —— 预览 + 缩容门禁 + 委托压缩服务。
153
+ - `src/core/projected.js` —— provider 锚定的 `projectedTokens`。
154
+ - `src/core/ui-signal.js` —— LiveUI 信道。
125
155
 
126
156
  ---
127
157
 
128
- ## 安装与验证
158
+ ## 安装
129
159
 
130
- 作为可安装 bundle(推荐):
160
+ 作为安装包(推荐):
131
161
 
132
162
  ```sh
133
163
  # 从 npm(已发布):
@@ -138,94 +168,111 @@ dsh plugin --profile web add github:falling-ts/dsh-force-compact
138
168
  dsh plugin --profile web add ./dsh-force-compact
139
169
  ```
140
170
 
141
- 或从本地检出,以 `--patch` overlay 挂载(不安装):
171
+ 或不安装,直接从本地检出以 `--patch` 覆盖层挂载:
142
172
 
143
173
  ```sh
144
174
  dsh web --patch dsh-force-compact/cordis.patch.yml
145
175
  ```
146
176
 
147
- 插件已加载 ⟺ `~/.dsh/logs/dsh-force-compact.log` 出现:
177
+ 插件加载 ⟺ `~/.dsh/logs/dsh-force-compact.log` 新增一行:
148
178
 
149
179
  ```
150
- [force-compact] debug logging enabled — writing [force-compact] lines to <绝对路径>
180
+ [force-compact] debug logging enabled — writing [force-compact] lines to <absolute path>
151
181
  ```
152
182
 
183
+ ### 命令可用性——`/force-compact` 是惰性加载的
184
+
185
+ `commands` 服务随 agent 预设平面到达,**晚于**插件启动期的 `apply`——所以注册发生在
186
+ 第一次受守卫监听器激活时(`agent/request` / `agent/pre-step` / `agent/status` /
187
+ `session/flush` 任一),首次成功后永久闩闭。实际效果:**实例(重新)启动后,全新会话的
188
+ `/` 命令列表在该会话第一次模型请求之前不会出现 `/force-compact`**——先发任意一条消息,
189
+ 命令即进程级注册,此后所有会话可用。
190
+
191
+ - 成功:`[force-compact] /force-compact command registered (deferred)`
192
+ - `commands` 永久缺席:约 10 分钟后打一条 `… still UNREGISTERED 10 min …` 警告,解释
193
+ 空列表。注册完成前插件其余功能照常——属自愈式降级,不是安装失败。
194
+
153
195
  验证压缩确实发生:
154
196
 
155
197
  ```
156
198
  idle compaction (builtin) shadowed N nodes (~M tokens)
157
199
  builtin compaction OK — replaced span seq[A..B] (N nodes, ~K tokens) with a P-char checkpoint
200
+ compaction thinking-policy — settings.disableThinking=true → extra.reasoningEffort='off' (…)
201
+ summarization wire-fields → <provider>/<model>: reasoningEffort='off' + reasoning_effort="none" (…)
158
202
  ```
159
203
 
204
+ (最后两行即上文「可观测性」所述的那对审计行。)
205
+
160
206
  ---
161
207
 
162
- ## 配置
208
+ ## 设置
163
209
 
164
210
  `$DSH_HOME/settings.yaml`,命名空间 `falling-ts-force-compact`:
165
211
 
166
212
  | 键 | 类型 | 默认 | 含义 |
167
- |----|------|------|------|
168
- | `disableThinking` | boolean | `true` | 每次出站调用关闭模型推理努力(上述两缝)。 |
169
- | `autoThresholdTokens` | number ≥ 32000 | `32000` | 每请求门禁的投影 token 阈值。越低越激进、上下文越瘦。**下限 32000**(存储值读取时抬升)。 |
170
- | `retainLatestTokens` | 正整数 ≥ 8000 | `8000` | 逐字保留最新 N tokens;更早内容一次性发给摘要器。**下限 8000**。同时驱动自动门禁与 `/force-compact`。 |
171
- | `turnEndForceCompactionEnabled` | boolean | `true` | agent `idle` 过渡时压缩。 |
172
- | `debug` | boolean | `true` | 输出 `[force-compact]` 诊断到插件日志。 |
173
- | `logFile` | string | `~/.dsh/logs/dsh-force-compact.log` | 诊断输出路径(`~` 展开为用户家目录)。 |
174
- | `compactionMode` | `'realm' \| 'global'` | `'realm'` | 官方服务解析策略(priority‑1 路径)。 |
175
- | `builtinEnabled` | boolean | `true` | 内置引擎后备闸门。 |
176
- | `maxSummaryTokens` | 整数 (1024–200000) | `1024` | 摘要 LLM 调用的 `maxTokens` 上限。 |
177
-
178
- 示例——激进的**本地**配置:
213
+ |-----|------|------|------|
214
+ | `disableThinking` | 布尔 | `true` | 只有关闭时,本插件摘要调用不携带 `reasoningEffort:'off'`;其余请求一律机器默认。 |
215
+ | `autoThresholdTokens` | 数字 ≥ 32000 | `32000` | 门禁的预计 token 触发值。越低越激进,常驻请求越小。读取时不低于 32000(低于则抬高)。 |
216
+ | `retainLatestTokens` | 正整数 ≥ 8000 | `8000` | 从会话最新条目起保留的最新 token 数,逐字保留;更早内容一次性发往摘要。读取时不低于 8000。同时驱动自动门禁与 `/force-compact`。 |
217
+ | `turnEndForceCompactionEnabled` | 布尔 | `true` | agent 转入 `idle` 时压缩。 |
218
+ | `debug` | 布尔 | `true` | `[force-compact]` 诊断打到插件日志。 |
219
+ | `logFile` | 字符串 | `~/.dsh/logs/dsh-force-compact.log` | 诊断输出路径(`~` 展开到家目录)。 |
220
+ | `compactionMode` | `'realm' \| 'global'` | `'realm'` | 官方服务解析策略(优先级一)。 |
221
+ | `builtinEnabled` | 布尔 | `true` | 内置引擎回落闸门。 |
222
+ | `maxSummaryTokens` | 整数(1024–200000) | `1024` | 摘要 LLM `maxTokens` 上限。 |
223
+
224
+ 示例——激进的**本地**档:
179
225
 
180
226
  ```yaml
181
227
  falling-ts-force-compact:
182
228
  disableThinking: true
183
- autoThresholdTokens: 40000 # 更早压缩常驻 prompt 更小
229
+ autoThresholdTokens: 40000 # 早压常驻请求更小
184
230
  retainLatestTokens: 8000
185
231
  turnEndForceCompactionEnabled: true
186
232
  ```
187
233
 
188
- `settings` 服务缺席时,插件回退到相同默认值并照常压缩——该命名空间是可选的,绝不成为硬依赖。
234
+ `settings` 服务缺席时,插件回落到同样的默认值并照常压缩——命名空间可选,永不成为硬
235
+ 依赖。
189
236
 
190
- ### 面向低上下文 llama.cpp 的调参建议
237
+ ### 低上下文 llama.cpp 调优建议
191
238
 
192
- 用舒适但适中的上下文服务 `Qwen3.8‑27B`,把有效窗口交给插件决定:将 `autoThresholdTokens` 设在
193
- **明显低于**你服务的上下文,使常驻 prompt 保持小、延迟平稳,而 agent 仍通过被压缩的头段保留
194
- 深层记忆。由于压力按 *投影* token(provider 锚定)度量,阈值会可预测地对应到你 UI 上看到的
195
- 数字。
239
+ `autoThresholdTokens` 保持在所供上下文的**明显之内**(例如以 80k–128k 舒适上下文供服,
240
+ 就把阈值设在 40k):常驻请求小而延迟稳,agent 依旧靠压缩头段保有深层记忆。压力以
241
+ *预计* token(provider 锚定)度量,阈值与你界面上看到的数字可预期对应。
196
242
 
197
243
  ---
198
244
 
199
245
  ## 行为说明
200
246
 
201
- - **运行时依赖:** `compaction` 服务(preset 平面 `agent-presets:compaction-basic`)。经
202
- `ctx.get('compaction')` 实时读取;不可用时强制压缩路径放行、让请求继续。
203
- - **可选依赖:** `settings` / `tokenMeter` / `commands` / `llm` / `agents` 均经 `ctx.get(...)`
204
- 读取并守卫;缺任一都优雅降级而非崩溃。
205
- - **每请求读参数:** 参数每次模型请求读取,故改动下次请求即生效、无需重启。
206
- - **信号:** `agent/*` Waterfall 转发当前 turn 的 signal;`session/flush` 检查点与
207
- `agent/status` idle 监听器各自新建 `AbortController`。
208
- - **持久性:** 持久产物为 `compaction/*` 括号事件 + `surfaceOp:replace` 的
209
- `user/message` 检查点,跨 build 重放安全。
210
- - **客户端半部:** `web/client.js` 新增设置分区 "强制压缩 / Force Compact",支持实时改值
211
- (uSES 安全的镜像,无 timer/状态)
212
- - **除一处外无 timer:** 唯一有意保留的是 3 s `publishDone` 回落(纯表现层,已在文档声明)
213
- 其余均为纯监听器 + 一个 process-local `Map` 强制标记。
247
+ - **运行时依赖:** `compaction` 服务(preset 平面 `agent-presets:compaction-basic`),
248
+ `ctx.get('compaction')` 实时读取;不可用时回落内置引擎(或放行请求)。
249
+ - **可选依赖:** `settings` / `tokenMeter` / `commands` / `llm` / `agents` 均经
250
+ `ctx.get(...)` 读取并守卫;缺任一都优雅降级而非崩溃。
251
+ - **每请求读参数:** 参数每次模型请求读取,改动下次请求即生效,无需重启。
252
+ - **信号:** `agent/*` 瀑布转发当前回合的信号;`session/flush` 检查点与 `agent/status`
253
+ 静止监听器各自新建 `AbortController`。
254
+ - **持久化:** 持久物为 `compaction/*` 括号事件 + 一条 `surfaceOp:replace` 的
255
+ `user/message` 检查点,跨版本回放安全。
256
+ - **客户端半部:** `web/client.js` 新增「强制压缩」设置分区(本地化标签),支持实时改
257
+ (uSES 安全镜像),除一处有意保留的 3 秒定时器(纯表现层,见下)外无任何定时/状态。
258
+ - **唯一的有意定时器:** `publishDone` 3 秒回落(表现层,见插件 AGENTS.md 例外节);
259
+ 其余全部纯监听器 + 进程内 `Map` 强制标记。
214
260
 
215
261
  ---
216
262
 
217
263
  ## 截图
218
264
 
219
- ![设置面板 —「强制压缩」分区,五个旋钮全部支持在线编辑](assets/settings-panel.png)
265
+ ![设置面板——「强制压缩」分区,五个旋钮均可在线编辑](assets/settings-panel.png)
220
266
 
221
- *设置面板 — `设置 > 强制压缩`。上面九个字段都可以实时编辑,无需重启。*
267
+ *设置页面——**强制压缩** 分区;上方九个字段全部支持不改重启地实时编辑。*
222
268
 
223
- ![会话页 — 红色 `[强制压缩中>>>]` 徽章挂在正在进行的回合旁边](assets/live-conversation.png)
269
+ ![会话页面——进行中的回合旁钉着一枚红色「压缩中」徽标](assets/live-conversation.png)
224
270
 
225
- *会话页 — live-UI 信令有三种状态(🟥 压缩中 / 🟢 已完成 / 🔵 工作中),绿色横幅约 3 s 后淡出回到随机「工作中」文案。*
271
+ *会话页面——LiveUI 信令绘制三种状态(红:压缩中 / 绿:完成 / 蓝:工作中);绿色横幅约
272
+ 3 秒后淡出,回到随机工作中短句。*
226
273
 
227
274
  ---
228
275
 
229
- ## License
276
+ ## 许可
230
277
 
231
278
  MIT(见 LICENSE)。