@fanchao8609/agent_brain_sync 1.2.2 → 1.2.3
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/package.json +1 -1
- package/src/wrapup.js +21 -0
package/package.json
CHANGED
package/src/wrapup.js
CHANGED
|
@@ -18,6 +18,25 @@ export function wrapupLogPath() {
|
|
|
18
18
|
// 同项目两次快照的最小间隔(秒)。agent_end 会逐 turn 触发, 无变化时不刷屏。
|
|
19
19
|
export const WRAPUP_MIN_INTERVAL_MS = 5 * 60 * 1000;
|
|
20
20
|
|
|
21
|
+
// wrapup.log 轮转阈值。只留 .1 一层: 排查/Rebuild 只靠每个 proj 的最近一块,
|
|
22
|
+
// 旧块是死重量(parseWrapup 用 byProj.set 覆盖, 前面的块永远不会被读到)。
|
|
23
|
+
export const WRAPUP_MAX_BYTES = 1024 * 1024; // 1 MiB
|
|
24
|
+
|
|
25
|
+
/** 超阈值则轮转为 .1。放在 appendWrapup 里 → CLI/MCP/hook 三条路径都覆盖。 */
|
|
26
|
+
async function rotateIfNeeded(p) {
|
|
27
|
+
const max = Number(process.env.ABS_WRAPUP_MAX_BYTES || WRAPUP_MAX_BYTES);
|
|
28
|
+
let st;
|
|
29
|
+
try { st = await fs.stat(p); } catch { return; }
|
|
30
|
+
if (!Number.isFinite(max) || st.size <= max) return;
|
|
31
|
+
// 先把当前内容落成 .1(覆盖旧 .1), 再截断;失败则不动, 不让轮转本身丢数据
|
|
32
|
+
try {
|
|
33
|
+
await fs.rename(p, p + '.1');
|
|
34
|
+
} catch {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
await fs.writeFile(p, `[${localStamp()}] wrapup 轮转: 原文件 ${st.size} bytes > ${max}, 已移入 wrapup.log.1\n`, 'utf8').catch(() => {});
|
|
38
|
+
}
|
|
39
|
+
|
|
21
40
|
/** 从 todo 文本/快照块提取任务清单。兼容顶层(todo.md `- [ ]`)与缩进(快照 ` - [ ]`)两种行。
|
|
22
41
|
* body = 去掉 `- [ ]` 前缀、`(认领|完成 date)` 标注后的核心文本。bp 去掉 `↳ 断点|卡点: ` 前缀。
|
|
23
42
|
* Done 区(## Done 下)不采。返回 [{ body, bp }],bp 为附属断点数组(或空)。 */
|
|
@@ -102,6 +121,8 @@ export async function appendWrapup(root) {
|
|
|
102
121
|
await fs.mkdir(join(p, '..'), { recursive: true });
|
|
103
122
|
const todo = await readTodo(root); // readTodo 幂等迁移,拿到权威内容
|
|
104
123
|
const tasks = extractOpenTasks(todo);
|
|
124
|
+
// 轮转在写前做:否则文件无上限增长(只追加不清理,旧块永远读不到=死重量)
|
|
125
|
+
await rotateIfNeeded(p);
|
|
105
126
|
let prev = '';
|
|
106
127
|
try { prev = await fs.readFile(p, 'utf8'); } catch { /* 尚无文件 */ }
|
|
107
128
|
const snap = parseWrapup(prev);
|