@deepwhale/core 1.0.12 → 1.0.13

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.
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Session JSONL — append-only 持久化 + crash recovery
3
+ *
4
+ * 协议(pi 借鉴):
5
+ * - 每条消息 = 1 行 JSON
6
+ * - 行分隔符 = '\n'(不带 \r)
7
+ * - 写入:append + fsync(保证不丢消息)
8
+ * - 读取:行扫描,**自动截断不完整行**(crash recovery 关键)
9
+ *
10
+ * Sprint 0.2 范围:
11
+ * - SessionWriter(append + fsync + flush)
12
+ * - SessionReader(line-by-line + partial line truncation)
13
+ * - SessionEvent 联合类型(4 种核心:user/assistant/tool/system)
14
+ * - v2.0 升级到 Session DAG(DAG 与 Planner 同链路,arch §3.5)
15
+ *
16
+ * Sprint 1c-revive-2-D-5 已落地(产线代码 packages/core/src/session/compaction.ts):
17
+ * - D-5-1 基础 compaction(shouldCompact + compact + 'compaction' event)
18
+ * 触发:promptTokens >= window * compactRatio (默认 0.8, Reasonix compact.go 拍板)
19
+ * - D-5-2 stuck latch(CompactionState + runCompactionWithLatch + 'compaction_paused' event)
20
+ * 连续 N 次失败 (默认 2) → latch 暂停, 防 death loop
21
+ * - D-5-3 tail token budget(resolveTail, tailMode='token_budget' 默认)
22
+ * 拍板 source: Reasonix compact.go:271-289 (tail 按 token budget 而非 message count)
23
+ *
24
+ * SessionEvent union 当前 7 kind:
25
+ * user / assistant / tool / system / compaction / compaction_paused / verification
26
+ * SessionReader 读 'compaction' / 'compaction_paused' / 'verification' 不重放进 LLM context
27
+ * (compaction.ts 拍板: 这三种是 runtime/metadata, 不进 context).
28
+ *
29
+ * 'verification' event (Sprint 1c-revive-2-D-11-3, 2026-06-04): `deepwhale --verify`
30
+ * 或 REPL `/verify` 跑完生成的 VerificationReport 摘要写到 session JSONL.
31
+ * - 跟 'compaction'/'compaction_paused' 同语义: metadata, 不重放进 LLM context.
32
+ * 用户 reload session 看不到 verification event 拼成 message (跟 paused event 一致).
33
+ * - 字段: report (VerificationReport 形态) + status (passed / failed) — 给 viewer
34
+ * / audit log 留口.
35
+ * - Sprint 1c-revive-2-D-11-3 拍板: 旧 session 文件 (没有 verification event)
36
+ * reload 不崩, 因为 SessionReader 走 kind discriminator union type,
37
+ * 旧 kind 解析流程不变. 新 kind 在旧 reader 读不到 (kind 不在 union),
38
+ * 但新 reader 读旧 JSONL 也不会试图 parse 缺失字段 — 严格 union 兜底.
39
+ * - 拍板 (D-11, 2026-06-04): 不**不**新增 session event 子表 / 不**不**新建 verification.jsonl,
40
+ * 跟 user/assistant/tool 同 append-only 1 JSONL 走, 简单且对旧 loader 透明.
41
+ *
42
+ * Sprint 1+ 仍待落地(待拍板):
43
+ * - 索引(按 messageId 加速查询)
44
+ * - 分片(>100MB 自动切文件)
45
+ * - 加密(at-rest AES-256-GCM)
46
+ * - 压缩(gzip content > N byte)
47
+ */
48
+ import { promises as fs } from 'node:fs';
49
+ import { dirname } from 'node:path';
50
+ /**
51
+ * JSONL Writer — append + fsync。
52
+ *
53
+ * 使用方式:
54
+ * const w = new SessionWriter('/path/to/session.jsonl');
55
+ * await w.open();
56
+ * await w.append({ kind: 'user', ts: Date.now(), content: 'hello' });
57
+ * await w.close();
58
+ *
59
+ * 关键:每次 append 都 fsync(v1.0 = 单人本地,可接受开销;v2.0 引入 batch fsync)
60
+ */
61
+ export class SessionWriter {
62
+ path;
63
+ handle = null;
64
+ writeQueue = Promise.resolve();
65
+ constructor(path) {
66
+ this.path = path;
67
+ }
68
+ async open() {
69
+ await fs.mkdir(dirname(this.path), { recursive: true });
70
+ this.handle = await fs.open(this.path, 'a');
71
+ }
72
+ /** 追加一条事件(fsync 后返回) */
73
+ async append(event) {
74
+ if (!this.handle) {
75
+ throw new Error('SessionWriter: must call open() before append()');
76
+ }
77
+ // 串行化写:避免并发 fsync 乱序
78
+ this.writeQueue = this.writeQueue.then(() => this.doAppend(event));
79
+ return this.writeQueue;
80
+ }
81
+ async doAppend(event) {
82
+ const handle = this.handle;
83
+ if (!handle)
84
+ throw new Error('SessionWriter: handle closed');
85
+ const line = JSON.stringify(event) + '\n';
86
+ await handle.write(line);
87
+ await handle.sync(); // fsync — 保证数据落盘
88
+ }
89
+ async close() {
90
+ // 关键:先 await writeQueue 排空,否则 doAppend 中的 handle.write/sync
91
+ // 会在 handle.close() 之后执行,触发 'EBADF' / 'file closed' 错误。
92
+ // 复现:append 后立刻 close(不 await)→ write 撞上 closed handle
93
+ await this.writeQueue;
94
+ if (this.handle) {
95
+ await this.handle.close();
96
+ this.handle = null;
97
+ }
98
+ }
99
+ }
100
+ /**
101
+ * JSONL Reader — line-by-line + 截断 partial line。
102
+ *
103
+ * Crash recovery 关键点:
104
+ * - 写入中途 crash → 最后一行可能是 partial JSON
105
+ * - read() 检测到不完整行 → 截断 + 警告 + 返回前面的完整行
106
+ * - 不抛错(让 agent 启动不卡死)
107
+ *
108
+ * 截断策略:把最后一行(无论完整与否)从文件删除
109
+ */
110
+ export class SessionReader {
111
+ path;
112
+ constructor(path) {
113
+ this.path = path;
114
+ }
115
+ /** 读取所有完整事件(自动 truncate partial last line) */
116
+ async readAll() {
117
+ let text;
118
+ try {
119
+ text = await fs.readFile(this.path, 'utf8');
120
+ }
121
+ catch (err) {
122
+ const e = err;
123
+ if (e.code === 'ENOENT')
124
+ return [];
125
+ throw e;
126
+ }
127
+ return this.parseLines(text);
128
+ }
129
+ parseLines(text) {
130
+ // Sprint 1c-revive-2-D-5+ (review P2, 2026-06-04): 入口清零 lastIncompleteLineIndex.
131
+ // 拍板: 同一个 SessionReader 实例先读过损坏文件 (有 partial line), truncate()
132
+ // 成功后, 再读修复后的文件, 旧 index 仍残留, 后续 truncate() 会按旧 index
133
+ // 截断, 可能删掉有效 events. 拍 parseLines 入口重置 = "本次读决定
134
+ // lastIncompleteLineIndex, 不会被前次污染".
135
+ this.lastIncompleteLineIndex = -1;
136
+ const events = [];
137
+ const lines = text.split('\n');
138
+ for (let i = 0; i < lines.length; i++) {
139
+ const line = lines[i];
140
+ if (line.length === 0)
141
+ continue;
142
+ try {
143
+ const parsed = JSON.parse(line);
144
+ events.push(parsed);
145
+ }
146
+ catch {
147
+ // 不完整行 / 损坏行:截断掉(crash recovery)
148
+ // 后面 truncate() 会把这一行从文件删除
149
+ this.lastIncompleteLineIndex = i;
150
+ break;
151
+ }
152
+ }
153
+ return events;
154
+ }
155
+ lastIncompleteLineIndex = -1;
156
+ /** 截断文件到最后一个完整事件(crash recovery) */
157
+ async truncate() {
158
+ if (this.lastIncompleteLineIndex < 0) {
159
+ return { truncated: 0 };
160
+ }
161
+ const text = await fs.readFile(this.path, 'utf8');
162
+ const lines = text.split('\n');
163
+ const keep = lines.slice(0, this.lastIncompleteLineIndex).join('\n') + '\n';
164
+ const truncatedBytes = Buffer.byteLength(text, 'utf8') - Buffer.byteLength(keep, 'utf8');
165
+ // Sprint 1c.6: temp file + atomic rename (修 1c.5 'w' flag 漏洞)
166
+ //
167
+ // 1c.5 用 fs.open(this.path, 'w') — 'w' = O_TRUNC 立即截 0 字节.
168
+ // fsync 救不了"open → write"窗口: 进程在这段被杀, session 变 0 字节,
169
+ // 比不 truncate 更坏. 1c.5 test 只验了"成功路径 stat().size",
170
+ // 没覆盖最坏窗口, 是 R-G1 "test passed ≠ production works" 反例.
171
+ //
172
+ // 修法: write to temp + atomic rename. 关键不变量:
173
+ // - 写 temp 阶段崩 → 原文件**完整保留** (没动), 可能有 .tmp 垃圾待清理
174
+ // - rename 阶段崩 → POSIX 原子 (要么旧要么新, 没有中间态),
175
+ // Windows MoveFileEx 覆盖原子
176
+ // - truncate 返回后, 文件系统状态 ∈ {原文件不变, 原文件 = keep}
177
+ // — 绝不会有 0 字节第三态
178
+ //
179
+ // temp path 唯一性: pid + timestamp + 随机, 避免并发 truncate 同文件
180
+ // (v1.0 单人本地不并发, 但保险). 同 dir 保证 rename atomic.
181
+ const tempPath = `${this.path}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
182
+ const handle = await fs.open(tempPath, 'w');
183
+ try {
184
+ await handle.writeFile(keep, 'utf8');
185
+ await handle.sync();
186
+ }
187
+ catch (err) {
188
+ // 写 temp 失败: 清理垃圾, 原文件**不动**, 抛错给 caller.
189
+ // 拍板 (review P2, 2026-06-04): 失败**保留** lastIncompleteLineIndex,
190
+ // caller 之后重试 truncate 仍能清掉这个 partial line. 抹掉的话会
191
+ // "成功一次后忘记清" 反复 leak, 更难诊断.
192
+ await handle.close().catch(() => { });
193
+ await fs.unlink(tempPath).catch(() => { });
194
+ throw err;
195
+ }
196
+ await handle.close();
197
+ // atomic rename: 旧文件要么没被替换 (进程在 rename 前被杀, 原文件 = 旧 keep+partial),
198
+ // 要么被替换 (rename 完成, 原文件 = new keep). 不会有 0 字节.
199
+ try {
200
+ await fs.rename(tempPath, this.path);
201
+ }
202
+ catch (err) {
203
+ // rename 失败: 清理 temp, 原文件**不动** (rename 没成功), 抛错给 caller.
204
+ // 拍板: 同样**保留** lastIncompleteLineIndex, 跟写 temp 失败同语义.
205
+ await fs.unlink(tempPath).catch(() => { });
206
+ throw err;
207
+ }
208
+ // 成功: 清零 lastIncompleteLineIndex (拍板 review P2, 2026-06-04).
209
+ // 下次 parseLines 入口本来就会重置 (review P2 fix), 这里额外清零
210
+ // 是给 truncate 后的二次调用兜底 (虽然实际不会发生, 但防御编程).
211
+ this.lastIncompleteLineIndex = -1;
212
+ return { truncated: truncatedBytes };
213
+ }
214
+ }
215
+ /**
216
+ * 便捷工厂 — 组合 open + read + truncate + close
217
+ */
218
+ export async function readSessionEvents(path) {
219
+ const reader = new SessionReader(path);
220
+ const events = await reader.readAll();
221
+ if (reader['lastIncompleteLineIndex'] >= 0) {
222
+ await reader.truncate();
223
+ }
224
+ return events;
225
+ }
226
+ //# sourceMappingURL=jsonl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../src/session/jsonl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 跨包共享的原子类型 — Sprint 0 占位。
3
+ * Sprint 1+ 把 Task / Message / Context / Observation / Memory 移到这里(来自 AGENT_RUNTIME.md)。
4
+ */
5
+ export type Brand<T, B extends string> = T & {
6
+ readonly __brand: B;
7
+ };
8
+ export type FilePath = Brand<string, 'FilePath'>;
9
+ export type SessionId = Brand<string, 'SessionId'>;
10
+ export type ToolName = Brand<string, 'ToolName'>;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACjD,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACnD,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 跨包共享的原子类型 — Sprint 0 占位。
3
+ * Sprint 1+ 把 Task / Message / Context / Observation / Memory 移到这里(来自 AGENT_RUNTIME.md)。
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepwhale/core",
3
- "version": "1.0.12",
3
+ "version": "1.0.13",
4
4
  "description": "Core primitives for DeepWhale: i18n, session JSONL, compaction, types",
5
5
  "license": "MIT",
6
6
  "type": "module",