@falling-ts/dsh-force-compact 0.2.2 → 0.2.4
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 +169 -110
- package/README.md +149 -85
- package/assets/live-conversation.png +0 -0
- package/assets/settings-panel.png +0 -0
- package/index.js +41 -34
- package/package.json +2 -1
- package/src/engine/builtin.js +6 -0
- package/src/engine/summarizer.js +51 -0
- package/src/hooks/guard.js +19 -8
- package/src/hooks/wire-rewrite.js +105 -97
package/README.cn.md
CHANGED
|
@@ -1,133 +1,163 @@
|
|
|
1
1
|
# dsh-force-compact
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**面向 DeepSeek Harness agent 的激进、本地优先上下文压缩。**
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
27
|
+
两条压缩引擎经由统一门面(`resolveCompaction`)共存,对调用者透明:
|
|
31
28
|
|
|
32
|
-
| 引擎 |
|
|
29
|
+
| 引擎 | 启用条件 | 说明 |
|
|
33
30
|
|------|----------|------|
|
|
34
|
-
| **官方** | agent
|
|
35
|
-
| **内置** |
|
|
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
|
-
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- **回合结束 /
|
|
45
|
-
|
|
46
|
-
- **手动 `/force-compact
|
|
47
|
-
|
|
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
|
+
阈值感知的缩容门禁会跳过注定拉不回阈值以下的摘要调用(消灭低阈值死循环)。
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
内置事务的影子价格账单取自与官方引擎相同的 `tokenMeter.measure` 逐节点单价,故米表
|
|
53
|
+
折叠协议结算正确——压缩后右下角计数器*下降*,而非漂移上升。
|
|
51
54
|
|
|
52
|
-
###
|
|
55
|
+
### 思考控制:只作用于压缩
|
|
53
56
|
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
自 2026‑08 语义修订,`disableThinking` 只管一件事:**本插件自己的摘要调用**
|
|
58
|
+
(`engine/builtin.js` → `engine/summarizer.js` → `ctx.llm.stream`)是否携带
|
|
59
|
+
`reasoningEffort:'off'`。其余一切不受影响:
|
|
56
60
|
|
|
57
|
-
|
|
61
|
+
| 调用位置 | `disableThinking: true` 时的行为 |
|
|
62
|
+
|---|---|
|
|
63
|
+
| 内置引擎的摘要调用 | 携带 `reasoningEffort:'off'` |
|
|
64
|
+
| 其他一切模型请求(业务、子代理、工具、其他插件) | 机器 `LlmCallConfig` 原样不动 |
|
|
65
|
+
| 官方 `compaction` 服务的调用 | 不经过本插件任何接缝——不受影响 |
|
|
58
66
|
|
|
59
|
-
|
|
60
|
-
|
|
67
|
+
目标是 **llama.cpp / OpenAI 兼容端点**时,适配器吐出的 `thinking: { type: 'disabled' }`
|
|
68
|
+
字段在那里被静默忽略——所以摘要器**另外**打上 llama.cpp 原生顶层字段
|
|
69
|
+
`reasoning_effort: "none"`,门控条件与前一字**完全一致**。同一 options 对象携带两字段:
|
|
61
70
|
|
|
62
|
-
|
|
71
|
+
| 端点家族 | 读取 | 结果 |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| 真·DeepSeek API | `reasoningEffort:'off'` → `thinking:{type:'disabled'}` | 关思考 ✅ |
|
|
74
|
+
| llama.cpp / OpenAI 兼容 | `reasoning_effort:"none"`(顶层) | `enable_thinking=false` ✅ |
|
|
63
75
|
|
|
64
|
-
`
|
|
76
|
+
每一类端点都宽容无视对方家族的键,故双发无害。字段打在 `src/engine/summarizer.js`
|
|
77
|
+
(紧挨 `llm.stream(options)` 调用之前),**不在** `llm/stream` 瀑布里——早期草稿曾在那
|
|
78
|
+
处尝试注入,实证证明结构性无效(中间层返回值被丢弃;就地改种子会使宿主崩溃);论证全文
|
|
79
|
+
见 `src/hooks/wire-rewrite.js` 模块头部。该钩子现在只承担 LiveUI 水印角色。
|
|
65
80
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
2. **wire 缝(`llm/stream`)** —— 插件在序列化后追加顶层 `reasoning_effort:"none"`,llama.cpp
|
|
69
|
-
的 OpenAI 兼容层原生解析(`server-common.cpp` 映射到 `enable_thinking=false`,与模板能力
|
|
70
|
-
无关)。真 DeepSeek 端点忽略未知键。
|
|
81
|
+
业务调用也要关思考?在请求头层面设定你 provider 的 `reasoningEffort`——插件有意退出
|
|
82
|
+
该决定。
|
|
71
83
|
|
|
72
|
-
|
|
84
|
+
#### 可观测性:每次摘要尝试的审计行
|
|
85
|
+
|
|
86
|
+
每次摘要尝试都会打两行日志(默认 `debug: true` 即见)——不抓包就能确认作用域裁定与其
|
|
87
|
+
wire 字段的持久证据:
|
|
88
|
+
|
|
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
|
+
```
|
|
93
|
+
|
|
94
|
+
- **第一行**(`engine/builtin.js`)记录 `disableThinking` 在哪里被读出、如何进入调用
|
|
95
|
+
选项;关闭时则记录*沿用机器默认*。
|
|
96
|
+
- **第二行**(`engine/summarizer.js`)记录离开 options 对象那一刻的两个 wire 字段(加上
|
|
97
|
+
解析出的 provider/模型);未盖章字段标注 `(absent…)`。
|
|
98
|
+
|
|
99
|
+
实证背书:对本机 llama.cpp 端点做过对照——基线请求返回非空 `reasoning_content`
|
|
100
|
+
(默认会想),带顶层 `reasoning_effort:"none"` 的同款请求完全没有——该类端点上该字段
|
|
101
|
+
确实在关思考,而未携字段业务调用维持正常思考。
|
|
73
102
|
|
|
74
103
|
### LiveUI 状态
|
|
75
104
|
|
|
76
|
-
|
|
105
|
+
极小的宿主→客户端信道(`liveUi` 设置字段被实时镜像到浏览器),在回合旁钉一枚徽标:
|
|
77
106
|
|
|
78
|
-
- **🟥
|
|
79
|
-
- **🟢
|
|
80
|
-
|
|
81
|
-
- **🔵
|
|
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
|
-
|
|
120
|
+
return await next() # 纯透传(思考关闭只作用于本插件
|
|
121
|
+
# 自己的摘要调用)
|
|
95
122
|
|
|
96
123
|
agent/pre-step(payload, next) # 每个模型步骤前
|
|
97
124
|
projectedTokens >= autoThresholdTokens?
|
|
98
|
-
否 -> next()
|
|
99
|
-
是 -> compactRegion(
|
|
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,
|
|
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
|
-
-
|
|
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`
|
|
117
|
-
|
|
118
|
-
- `src/engine/
|
|
119
|
-
|
|
120
|
-
|
|
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` —— 预览 + 缩容门禁 +
|
|
123
|
-
- `src/core/projected.js` —— provider 锚定的 `projectedTokens
|
|
124
|
-
- `src/core/ui-signal.js` ——
|
|
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
|
-
|
|
160
|
+
作为安装包(推荐):
|
|
131
161
|
|
|
132
162
|
```sh
|
|
133
163
|
# 从 npm(已发布):
|
|
@@ -138,82 +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
|
-
|
|
171
|
+
或不安装,直接从本地检出以 `--patch` 覆盖层挂载:
|
|
142
172
|
|
|
143
173
|
```sh
|
|
144
174
|
dsh web --patch dsh-force-compact/cordis.patch.yml
|
|
145
175
|
```
|
|
146
176
|
|
|
147
|
-
|
|
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` |
|
|
169
|
-
| `autoThresholdTokens` |
|
|
170
|
-
| `retainLatestTokens` | 正整数 ≥ 8000 | `8000` |
|
|
171
|
-
| `turnEndForceCompactionEnabled` |
|
|
172
|
-
| `debug` |
|
|
173
|
-
| `logFile` |
|
|
174
|
-
| `compactionMode` | `'realm' \| 'global'` | `'realm'` | 官方服务解析策略(
|
|
175
|
-
| `builtinEnabled` |
|
|
176
|
-
| `maxSummaryTokens` | 整数
|
|
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 #
|
|
229
|
+
autoThresholdTokens: 40000 # 早压 ⇒ 常驻请求更小
|
|
184
230
|
retainLatestTokens: 8000
|
|
185
231
|
turnEndForceCompactionEnabled: true
|
|
186
232
|
```
|
|
187
233
|
|
|
188
|
-
|
|
234
|
+
`settings` 服务缺席时,插件回落到同样的默认值并照常压缩——命名空间可选,永不成为硬
|
|
235
|
+
依赖。
|
|
189
236
|
|
|
190
|
-
###
|
|
237
|
+
### 低上下文 llama.cpp 调优建议
|
|
191
238
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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` 均经
|
|
204
|
-
读取并守卫;缺任一都优雅降级而非崩溃。
|
|
205
|
-
- **每请求读参数:**
|
|
206
|
-
- **信号:** `agent/*`
|
|
207
|
-
|
|
208
|
-
-
|
|
209
|
-
`user/message`
|
|
210
|
-
- **客户端半部:** `web/client.js`
|
|
211
|
-
(uSES
|
|
212
|
-
-
|
|
213
|
-
|
|
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` 强制标记。
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 截图
|
|
264
|
+
|
|
265
|
+

|
|
266
|
+
|
|
267
|
+
*设置页面——**强制压缩** 分区;上方九个字段全部支持不改重启地实时编辑。*
|
|
268
|
+
|
|
269
|
+

|
|
270
|
+
|
|
271
|
+
*会话页面——LiveUI 信令绘制三种状态(红:压缩中 / 绿:完成 / 蓝:工作中);绿色横幅约
|
|
272
|
+
3 秒后淡出,回到随机工作中短句。*
|
|
214
273
|
|
|
215
274
|
---
|
|
216
275
|
|
|
217
|
-
##
|
|
276
|
+
## 许可
|
|
218
277
|
|
|
219
278
|
MIT(见 LICENSE)。
|