@oyasmi/pipiclaw 0.5.1 → 0.5.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.
Files changed (193) hide show
  1. package/README.md +308 -209
  2. package/dist/agent/channel-runner.d.ts +47 -0
  3. package/dist/agent/channel-runner.js +441 -0
  4. package/dist/agent/index.d.ts +3 -0
  5. package/dist/agent/index.js +2 -0
  6. package/dist/agent/progress-formatter.d.ts +4 -0
  7. package/dist/agent/progress-formatter.js +52 -0
  8. package/dist/agent/run-queue.d.ts +7 -0
  9. package/dist/agent/run-queue.js +26 -0
  10. package/dist/agent/runner-factory.d.ts +3 -0
  11. package/dist/agent/runner-factory.js +10 -0
  12. package/dist/agent/session-events.d.ts +14 -0
  13. package/dist/agent/session-events.js +215 -0
  14. package/dist/agent/session-resource-gate.d.ts +10 -0
  15. package/dist/agent/session-resource-gate.js +44 -0
  16. package/dist/agent/type-guards.d.ts +22 -0
  17. package/dist/agent/type-guards.js +106 -0
  18. package/dist/agent/types.d.ts +160 -0
  19. package/dist/agent/types.js +22 -0
  20. package/dist/agent.d.ts +2 -16
  21. package/dist/agent.js +1 -782
  22. package/dist/command-extension.d.ts +0 -1
  23. package/dist/command-extension.js +0 -1
  24. package/dist/commands.d.ts +0 -1
  25. package/dist/commands.js +0 -1
  26. package/dist/config-loader.d.ts +0 -1
  27. package/dist/config-loader.js +1 -2
  28. package/dist/context.d.ts +58 -15
  29. package/dist/context.js +50 -8
  30. package/dist/index.d.ts +12 -13
  31. package/dist/index.js +12 -13
  32. package/dist/log.d.ts +0 -1
  33. package/dist/log.js +0 -1
  34. package/dist/main.d.ts +0 -1
  35. package/dist/main.js +5 -405
  36. package/dist/memory/bootstrap.d.ts +6 -0
  37. package/dist/memory/bootstrap.js +46 -0
  38. package/dist/{memory-candidates.d.ts → memory/candidates.d.ts} +1 -1
  39. package/dist/{memory-candidates.js → memory/candidates.js} +33 -21
  40. package/dist/memory/chinese-words.d.ts +1 -0
  41. package/dist/memory/chinese-words.js +273 -0
  42. package/dist/{memory-consolidation.d.ts → memory/consolidation.d.ts} +0 -1
  43. package/dist/{memory-consolidation.js → memory/consolidation.js} +26 -35
  44. package/dist/{memory-files.d.ts → memory/files.d.ts} +0 -6
  45. package/dist/{memory-files.js → memory/files.js} +11 -36
  46. package/dist/{memory-lifecycle.d.ts → memory/lifecycle.d.ts} +23 -6
  47. package/dist/memory/lifecycle.js +246 -0
  48. package/dist/{memory-recall.d.ts → memory/recall.d.ts} +2 -2
  49. package/dist/memory/recall.js +501 -0
  50. package/dist/{session-memory.d.ts → memory/session.d.ts} +1 -1
  51. package/dist/{session-memory.js → memory/session.js} +31 -62
  52. package/dist/model-utils.d.ts +0 -1
  53. package/dist/model-utils.js +0 -1
  54. package/dist/paths.d.ts +0 -1
  55. package/dist/paths.js +0 -1
  56. package/dist/prompt-builder.d.ts +0 -1
  57. package/dist/prompt-builder.js +0 -1
  58. package/dist/runtime/bootstrap.d.ts +47 -0
  59. package/dist/runtime/bootstrap.js +450 -0
  60. package/dist/{delivery.d.ts → runtime/delivery.d.ts} +0 -1
  61. package/dist/{delivery.js → runtime/delivery.js} +1 -2
  62. package/dist/{dingtalk.d.ts → runtime/dingtalk.d.ts} +10 -1
  63. package/dist/{dingtalk.js → runtime/dingtalk.js} +87 -28
  64. package/dist/{events.d.ts → runtime/events.d.ts} +0 -1
  65. package/dist/{events.js → runtime/events.js} +1 -2
  66. package/dist/{store.d.ts → runtime/store.d.ts} +5 -1
  67. package/dist/{store.js → runtime/store.js} +60 -20
  68. package/dist/sandbox.d.ts +0 -1
  69. package/dist/sandbox.js +1 -2
  70. package/dist/{llm-json.d.ts → shared/llm-json.d.ts} +0 -1
  71. package/dist/{llm-json.js → shared/llm-json.js} +0 -1
  72. package/dist/shared/markdown-sections.d.ts +6 -0
  73. package/dist/{markdown-sections.js → shared/markdown-sections.js} +10 -4
  74. package/dist/{shell-escape.d.ts → shared/shell-escape.d.ts} +0 -1
  75. package/dist/{shell-escape.js → shared/shell-escape.js} +0 -1
  76. package/dist/shared/text-utils.d.ts +9 -0
  77. package/dist/shared/text-utils.js +36 -0
  78. package/dist/shared/type-guards.d.ts +5 -0
  79. package/dist/shared/type-guards.js +12 -0
  80. package/dist/shared/types.d.ts +14 -0
  81. package/dist/shared/types.js +1 -0
  82. package/dist/sidecar-worker.d.ts +0 -1
  83. package/dist/sidecar-worker.js +1 -8
  84. package/dist/{sub-agents.d.ts → subagents/discovery.d.ts} +0 -1
  85. package/dist/{sub-agents.js → subagents/discovery.js} +2 -3
  86. package/dist/{tools/subagent.d.ts → subagents/tool.d.ts} +2 -16
  87. package/dist/{tools/subagent.js → subagents/tool.js} +16 -38
  88. package/dist/tools/attach.d.ts +0 -1
  89. package/dist/tools/attach.js +0 -1
  90. package/dist/tools/bash.d.ts +0 -1
  91. package/dist/tools/bash.js +0 -1
  92. package/dist/tools/edit.d.ts +0 -1
  93. package/dist/tools/edit.js +1 -2
  94. package/dist/tools/index.d.ts +1 -2
  95. package/dist/tools/index.js +1 -2
  96. package/dist/tools/read.d.ts +0 -1
  97. package/dist/tools/read.js +1 -2
  98. package/dist/tools/truncate.d.ts +0 -1
  99. package/dist/tools/truncate.js +0 -1
  100. package/dist/tools/write-content.d.ts +0 -1
  101. package/dist/tools/write-content.js +1 -2
  102. package/dist/tools/write.d.ts +0 -1
  103. package/dist/tools/write.js +0 -1
  104. package/package.json +9 -3
  105. package/CHANGELOG.md +0 -47
  106. package/dist/agent.d.ts.map +0 -1
  107. package/dist/agent.js.map +0 -1
  108. package/dist/command-extension.d.ts.map +0 -1
  109. package/dist/command-extension.js.map +0 -1
  110. package/dist/commands.d.ts.map +0 -1
  111. package/dist/commands.js.map +0 -1
  112. package/dist/config-loader.d.ts.map +0 -1
  113. package/dist/config-loader.js.map +0 -1
  114. package/dist/context.d.ts.map +0 -1
  115. package/dist/context.js.map +0 -1
  116. package/dist/delivery.d.ts.map +0 -1
  117. package/dist/delivery.js.map +0 -1
  118. package/dist/dingtalk.d.ts.map +0 -1
  119. package/dist/dingtalk.js.map +0 -1
  120. package/dist/events.d.ts.map +0 -1
  121. package/dist/events.js.map +0 -1
  122. package/dist/index.d.ts.map +0 -1
  123. package/dist/index.js.map +0 -1
  124. package/dist/llm-json.d.ts.map +0 -1
  125. package/dist/llm-json.js.map +0 -1
  126. package/dist/log.d.ts.map +0 -1
  127. package/dist/log.js.map +0 -1
  128. package/dist/main.d.ts.map +0 -1
  129. package/dist/main.js.map +0 -1
  130. package/dist/markdown-sections.d.ts +0 -6
  131. package/dist/markdown-sections.d.ts.map +0 -1
  132. package/dist/markdown-sections.js.map +0 -1
  133. package/dist/memory-candidates.d.ts.map +0 -1
  134. package/dist/memory-candidates.js.map +0 -1
  135. package/dist/memory-consolidation.d.ts.map +0 -1
  136. package/dist/memory-consolidation.js.map +0 -1
  137. package/dist/memory-files.d.ts.map +0 -1
  138. package/dist/memory-files.js.map +0 -1
  139. package/dist/memory-lifecycle.d.ts.map +0 -1
  140. package/dist/memory-lifecycle.js +0 -150
  141. package/dist/memory-lifecycle.js.map +0 -1
  142. package/dist/memory-recall.d.ts.map +0 -1
  143. package/dist/memory-recall.js +0 -218
  144. package/dist/memory-recall.js.map +0 -1
  145. package/dist/model-utils.d.ts.map +0 -1
  146. package/dist/model-utils.js.map +0 -1
  147. package/dist/paths.d.ts.map +0 -1
  148. package/dist/paths.js.map +0 -1
  149. package/dist/prompt-builder.d.ts.map +0 -1
  150. package/dist/prompt-builder.js.map +0 -1
  151. package/dist/sandbox.d.ts.map +0 -1
  152. package/dist/sandbox.js.map +0 -1
  153. package/dist/session-memory-files.d.ts +0 -2
  154. package/dist/session-memory-files.d.ts.map +0 -1
  155. package/dist/session-memory-files.js +0 -2
  156. package/dist/session-memory-files.js.map +0 -1
  157. package/dist/session-memory.d.ts.map +0 -1
  158. package/dist/session-memory.js.map +0 -1
  159. package/dist/shell-escape.d.ts.map +0 -1
  160. package/dist/shell-escape.js.map +0 -1
  161. package/dist/sidecar-worker.d.ts.map +0 -1
  162. package/dist/sidecar-worker.js.map +0 -1
  163. package/dist/store.d.ts.map +0 -1
  164. package/dist/store.js.map +0 -1
  165. package/dist/sub-agents.d.ts.map +0 -1
  166. package/dist/sub-agents.js.map +0 -1
  167. package/dist/tools/attach.d.ts.map +0 -1
  168. package/dist/tools/attach.js.map +0 -1
  169. package/dist/tools/bash.d.ts.map +0 -1
  170. package/dist/tools/bash.js.map +0 -1
  171. package/dist/tools/edit.d.ts.map +0 -1
  172. package/dist/tools/edit.js.map +0 -1
  173. package/dist/tools/index.d.ts.map +0 -1
  174. package/dist/tools/index.js.map +0 -1
  175. package/dist/tools/read.d.ts.map +0 -1
  176. package/dist/tools/read.js.map +0 -1
  177. package/dist/tools/subagent.d.ts.map +0 -1
  178. package/dist/tools/subagent.js.map +0 -1
  179. package/dist/tools/truncate.d.ts.map +0 -1
  180. package/dist/tools/truncate.js.map +0 -1
  181. package/dist/tools/write-content.d.ts.map +0 -1
  182. package/dist/tools/write-content.js.map +0 -1
  183. package/dist/tools/write.d.ts.map +0 -1
  184. package/dist/tools/write.js.map +0 -1
  185. package/docs/improve-memory/design.md +0 -537
  186. package/docs/improve-memory/interfaces-and-tests.md +0 -473
  187. package/docs/improve-memory/spec.md +0 -357
  188. package/docs/memory-rfc.md +0 -297
  189. package/docs/proj-review.md +0 -188
  190. package/docs/subagent/pi-subagent-analyse.txt +0 -190
  191. package/docs/subagent/pi-subagent-design.txt +0 -266
  192. package/docs/subagent/pi-subagent-phase1-plan.txt +0 -529
  193. package/docs/test-supplementation-plan.md +0 -553
@@ -0,0 +1,273 @@
1
+ export const COMMON_CHINESE_WORDS = new Set([
2
+ "当前状态",
3
+ "当前工作",
4
+ "工作状态",
5
+ "会话状态",
6
+ "任务状态",
7
+ "当前任务",
8
+ "工作进度",
9
+ "用户意图",
10
+ "活跃文件",
11
+ "错误修正",
12
+ "下一步",
13
+ "接下来",
14
+ "后续步骤",
15
+ "后续计划",
16
+ "待办事项",
17
+ "开放问题",
18
+ "开放循环",
19
+ "关键事实",
20
+ "设计决策",
21
+ "关键决策",
22
+ "约束条件",
23
+ "技术约束",
24
+ "兼容要求",
25
+ "接口稳定",
26
+ "协议变更",
27
+ "修复方案",
28
+ "实现方案",
29
+ "优化方案",
30
+ "根因分析",
31
+ "问题定位",
32
+ "错误信息",
33
+ "调试过程",
34
+ "排查过程",
35
+ "实现细节",
36
+ "调用链路",
37
+ "模块边界",
38
+ "领域边界",
39
+ "文件路径",
40
+ "运行时",
41
+ "子代理",
42
+ "工具调用",
43
+ "上下文",
44
+ "上下文恢复",
45
+ "上下文窗口",
46
+ "上下文注入",
47
+ "注入上下文",
48
+ "当前问题",
49
+ "历史问题",
50
+ "历史记录",
51
+ "历史恢复",
52
+ "历史叙事",
53
+ "历史块",
54
+ "摘要块",
55
+ "发布记录",
56
+ "部署记录",
57
+ "旧发布",
58
+ "旧记录",
59
+ "早期历史",
60
+ "过去工作",
61
+ "长期任务",
62
+ "短对话",
63
+ "短问答",
64
+ "自然结束",
65
+ "对话结束",
66
+ "会话切换",
67
+ "当前目录",
68
+ "代码实现",
69
+ "类型检查",
70
+ "单元测试",
71
+ "集成测试",
72
+ "回归测试",
73
+ "测试覆盖",
74
+ "回归风险",
75
+ "默认配置",
76
+ "配置项",
77
+ "参数选择",
78
+ "超时设置",
79
+ "内容截断",
80
+ "内存清理",
81
+ "背景维护",
82
+ "增量更新",
83
+ "历史折叠",
84
+ "持久化",
85
+ "一致性",
86
+ "可靠性",
87
+ "稳定性",
88
+ "兼容性",
89
+ "相关性",
90
+ "评分模型",
91
+ "检索候选",
92
+ "候选集合",
93
+ "召回候选",
94
+ "中文分词",
95
+ "词表分词",
96
+ "最大匹配",
97
+ "服务器",
98
+ "数据库",
99
+ "数据表",
100
+ "缓存",
101
+ "队列",
102
+ "网络",
103
+ "集群",
104
+ "容器",
105
+ "网关",
106
+ "代理服务",
107
+ "负载均衡",
108
+ "配置中心",
109
+ "注册中心",
110
+ "消息队列",
111
+ "对象存储",
112
+ "日志系统",
113
+ "监控系统",
114
+ "告警系统",
115
+ "文件系统",
116
+ "函数",
117
+ "变量",
118
+ "常量",
119
+ "接口",
120
+ "类型定义",
121
+ "类型系统",
122
+ "模块",
123
+ "组件",
124
+ "服务层",
125
+ "数据层",
126
+ "控制层",
127
+ "依赖注入",
128
+ "继承关系",
129
+ "抽象层",
130
+ "实现层",
131
+ "状态管理",
132
+ "异常处理",
133
+ "错误处理",
134
+ "管理",
135
+ "优化",
136
+ "系统",
137
+ "设计",
138
+ "开发",
139
+ "测试",
140
+ "部署",
141
+ "修改",
142
+ "创建",
143
+ "删除",
144
+ "更新",
145
+ "查询",
146
+ "提交",
147
+ "调用",
148
+ "启动",
149
+ "停止",
150
+ "迁移",
151
+ "同步",
152
+ "备份",
153
+ "分析",
154
+ "监控",
155
+ "审查",
156
+ "重构",
157
+ "封装",
158
+ "并发控制",
159
+ "并发请求",
160
+ "异步任务",
161
+ "同步调用",
162
+ "回调函数",
163
+ "中间件",
164
+ "过滤器",
165
+ "拦截器",
166
+ "路由配置",
167
+ "认证授权",
168
+ "用户认证",
169
+ "权限控制",
170
+ "会话管理",
171
+ "请求参数",
172
+ "响应结果",
173
+ "接口调用",
174
+ "请求头",
175
+ "响应头",
176
+ "重试机制",
177
+ "降级策略",
178
+ "熔断机制",
179
+ "事务处理",
180
+ "事务回滚",
181
+ "异常",
182
+ "错误",
183
+ "日志",
184
+ "线程",
185
+ "进程",
186
+ "端口",
187
+ "协议",
188
+ "路由",
189
+ "索引",
190
+ "事务",
191
+ "连接",
192
+ "超时",
193
+ "重连",
194
+ "校验",
195
+ "加密",
196
+ "解密",
197
+ "分支",
198
+ "合并",
199
+ "冲突",
200
+ "版本",
201
+ "发布",
202
+ "构建",
203
+ "编译",
204
+ "依赖",
205
+ "索引优化",
206
+ "数据迁移",
207
+ "数据同步",
208
+ "备份恢复",
209
+ "锁机制",
210
+ "乐观锁",
211
+ "悲观锁",
212
+ "死锁问题",
213
+ "查询语句",
214
+ "分页查询",
215
+ "条件过滤",
216
+ "批量操作",
217
+ "性能问题",
218
+ "性能优化",
219
+ "内存泄漏",
220
+ "资源释放",
221
+ "构建流程",
222
+ "编译过程",
223
+ "打包流程",
224
+ "发布流程",
225
+ "回滚方案",
226
+ "需求分析",
227
+ "方案设计",
228
+ "实现阶段",
229
+ "测试阶段",
230
+ "部署阶段",
231
+ "上线过程",
232
+ "故障排查",
233
+ "故障恢复",
234
+ "终端命令",
235
+ "调试器",
236
+ "编辑器",
237
+ "浏览器",
238
+ "编译器",
239
+ "构建工具",
240
+ "打包工具",
241
+ "认证回调",
242
+ "回调状态",
243
+ "回调验证",
244
+ "状态处理",
245
+ "状态流转",
246
+ "登录异常",
247
+ "登录失败",
248
+ "修复登录",
249
+ "生产环境",
250
+ "工作区",
251
+ "记忆",
252
+ "会话",
253
+ "频道",
254
+ "模型",
255
+ "提示",
256
+ "工具",
257
+ "代理",
258
+ "任务",
259
+ "调度",
260
+ "排队",
261
+ "响应",
262
+ "请求",
263
+ "回调",
264
+ "订阅",
265
+ "通知",
266
+ "触发",
267
+ "频道记忆",
268
+ "记忆系统",
269
+ "记忆子系统",
270
+ "持久记忆",
271
+ "工作记忆",
272
+ "会话记忆",
273
+ ]);
@@ -19,4 +19,3 @@ export interface BackgroundMaintenanceResult {
19
19
  }
20
20
  export declare function runInlineConsolidation(options: ConsolidationRunOptions): Promise<InlineConsolidationResult>;
21
21
  export declare function runBackgroundMaintenance(options: ConsolidationRunOptions): Promise<BackgroundMaintenanceResult>;
22
- //# sourceMappingURL=memory-consolidation.d.ts.map
@@ -1,13 +1,16 @@
1
1
  import { getLatestCompactionEntry, serializeConversation, } from "@mariozechner/pi-coding-agent";
2
- import { parseJsonObject } from "./llm-json.js";
3
- import { appendChannelHistoryBlock, appendChannelMemoryUpdate, readChannelHistory, readChannelMemory, readChannelSession, rewriteChannelHistory, rewriteChannelMemory, splitMarkdownSections, } from "./memory-files.js";
4
- import { runSidecarTask } from "./sidecar-worker.js";
2
+ import { parseJsonObject } from "../shared/llm-json.js";
3
+ import { splitH2Sections } from "../shared/markdown-sections.js";
4
+ import { clipText } from "../shared/text-utils.js";
5
+ import { buildStandardMessages } from "../shared/type-guards.js";
6
+ import { runSidecarTask } from "../sidecar-worker.js";
7
+ import { appendChannelHistoryBlock, appendChannelMemoryUpdate, readChannelHistory, readChannelMemory, readChannelSession, rewriteChannelHistory, rewriteChannelMemory, } from "./files.js";
5
8
  const INLINE_TRANSCRIPT_MAX_CHARS = 28_000;
6
- const MEMORY_CLEANUP_LENGTH_THRESHOLD = 8_000;
7
- const MEMORY_UPDATE_BLOCK_THRESHOLD = 6;
8
- const HISTORY_LENGTH_THRESHOLD = 16_000;
9
- const HISTORY_BLOCK_THRESHOLD = 8;
10
- const HISTORY_RECENT_BLOCKS_TO_KEEP = 4;
9
+ const MEMORY_CLEANUP_LENGTH_THRESHOLD = 5_000;
10
+ const MEMORY_UPDATE_BLOCK_THRESHOLD = 4;
11
+ const HISTORY_LENGTH_THRESHOLD = 8_000;
12
+ const HISTORY_BLOCK_THRESHOLD = 5;
13
+ const HISTORY_RECENT_BLOCKS_TO_KEEP = 3;
11
14
  const INLINE_CONSOLIDATION_TIMEOUT_MS = 20_000;
12
15
  const MEMORY_CLEANUP_TIMEOUT_MS = 30_000;
13
16
  const HISTORY_FOLDING_TIMEOUT_MS = 30_000;
@@ -28,8 +31,15 @@ Rules:
28
31
  - Do not include ephemeral chatter, obvious one-shot acknowledgements, or formatting instructions.
29
32
  - Prefer leaving highly volatile step-by-step execution state in SESSION.md rather than promoting it into durable memory.
30
33
  - historyBlock: concise Markdown summarizing the conversation chunk for later recovery.
34
+ - For any conversation that contains at least one meaningful user request and one meaningful assistant reply, return a non-empty historyBlock with at least one bullet.
31
35
  - Prefer short bullets and short paragraphs.
32
- - If there is nothing worth storing, return empty values.`;
36
+ - If there is nothing worth storing, return empty values.
37
+
38
+ Example output for a short useful exchange:
39
+ {
40
+ "memoryEntries": ["User prefers dark mode in the dashboard"],
41
+ "historyBlock": "- User asked how to toggle dashboard theme; confirmed dark mode preference."
42
+ }`;
33
43
  const MEMORY_CLEANUP_SYSTEM_PROMPT = `You are rewriting a Pipiclaw channel MEMORY.md file.
34
44
 
35
45
  Return Markdown only. Do not use code fences.
@@ -62,15 +72,6 @@ Goals:
62
72
  function normalizeText(text) {
63
73
  return text.replace(/\r/g, "").trim();
64
74
  }
65
- function clipTranscript(text, maxChars) {
66
- const normalized = normalizeText(text);
67
- if (normalized.length <= maxChars) {
68
- return normalized;
69
- }
70
- const headChars = Math.floor(maxChars * 0.35);
71
- const tailChars = maxChars - headChars;
72
- return `${normalized.slice(0, headChars)}\n\n[... omitted middle section ...]\n\n${normalized.slice(-tailChars)}`;
73
- }
74
75
  function parseConsolidationResponse(text) {
75
76
  const parsed = parseJsonObject(text);
76
77
  return {
@@ -93,15 +94,6 @@ function getLatestCompactionBoundary(entries) {
93
94
  function isMessage(entry) {
94
95
  return entry.type === "message";
95
96
  }
96
- function isStandardAgentMessage(message) {
97
- return (typeof message === "object" &&
98
- message !== null &&
99
- "role" in message &&
100
- (message.role === "user" || message.role === "assistant" || message.role === "toolResult"));
101
- }
102
- function buildMessagesForConsolidation(messages) {
103
- return messages.filter(isStandardAgentMessage);
104
- }
105
97
  function extractMessagesFromSessionEntries(entries) {
106
98
  return entries.filter(isMessage).map((entry) => entry.message);
107
99
  }
@@ -130,7 +122,7 @@ function hasMeaningfulMessages(messages) {
130
122
  return false;
131
123
  }
132
124
  function countMatchingSectionHeadings(content, prefix) {
133
- return splitMarkdownSections(content).filter((section) => section.heading.startsWith(prefix)).length;
125
+ return splitH2Sections(content).filter((section) => section.heading.startsWith(prefix)).length;
134
126
  }
135
127
  async function runWorkerPrompt(name, model, resolveApiKey, systemPrompt, prompt, timeoutMs) {
136
128
  const result = await runSidecarTask({
@@ -145,10 +137,10 @@ async function runWorkerPrompt(name, model, resolveApiKey, systemPrompt, prompt,
145
137
  return result.output;
146
138
  }
147
139
  async function buildInlineConsolidationResponse(options, messages) {
148
- const transcript = clipTranscript(serializeConversation(messages), INLINE_TRANSCRIPT_MAX_CHARS);
149
- const currentMemory = clipTranscript(await readChannelMemory(options.channelDir), 8_000);
150
- const currentSession = clipTranscript(await readChannelSession(options.channelDir), 8_000);
151
- const currentHistory = clipTranscript(await readChannelHistory(options.channelDir), 8_000);
140
+ const transcript = clipText(serializeConversation(messages), INLINE_TRANSCRIPT_MAX_CHARS, { headRatio: 0.35 });
141
+ const currentMemory = clipText(await readChannelMemory(options.channelDir), 8_000, { headRatio: 0.35 });
142
+ const currentSession = clipText(await readChannelSession(options.channelDir), 8_000, { headRatio: 0.35 });
143
+ const currentHistory = clipText(await readChannelHistory(options.channelDir), 8_000, { headRatio: 0.35 });
152
144
  const prompt = `Current SESSION.md:
153
145
  ${currentSession || "(empty)"}
154
146
 
@@ -166,7 +158,7 @@ ${transcript || "(empty)"}`;
166
158
  export async function runInlineConsolidation(options) {
167
159
  const sourceEntries = options.sessionEntries ?? [];
168
160
  const relevantEntries = sourceEntries.length > 0 ? sourceEntries.slice(getLatestCompactionBoundary(sourceEntries)) : sourceEntries;
169
- const relevantMessages = buildMessagesForConsolidation(relevantEntries.length > 0 ? extractMessagesFromSessionEntries(relevantEntries) : options.messages);
161
+ const relevantMessages = buildStandardMessages(relevantEntries.length > 0 ? extractMessagesFromSessionEntries(relevantEntries) : options.messages);
170
162
  if (!hasMeaningfulMessages(relevantMessages)) {
171
163
  return { skipped: true, appendedMemoryEntries: 0, appendedHistoryBlock: false };
172
164
  }
@@ -202,7 +194,7 @@ ${currentMemory}`;
202
194
  return true;
203
195
  }
204
196
  async function foldChannelHistory(options, currentHistory) {
205
- const sections = splitMarkdownSections(currentHistory);
197
+ const sections = splitH2Sections(currentHistory);
206
198
  if (currentHistory.length < HISTORY_LENGTH_THRESHOLD && sections.length < HISTORY_BLOCK_THRESHOLD) {
207
199
  return false;
208
200
  }
@@ -234,4 +226,3 @@ export async function runBackgroundMaintenance(options) {
234
226
  const foldedHistory = await foldChannelHistory(options, currentHistory);
235
227
  return { cleanedMemory, foldedHistory };
236
228
  }
237
- //# sourceMappingURL=memory-consolidation.js.map
@@ -19,9 +19,3 @@ export declare function rewriteChannelHistory(channelDir: string, content: strin
19
19
  export declare function rewriteChannelSession(channelDir: string, content: string): Promise<void>;
20
20
  export declare function appendChannelMemoryUpdate(channelDir: string, block: MemoryUpdateBlock): Promise<void>;
21
21
  export declare function appendChannelHistoryBlock(channelDir: string, block: HistoryBlock): Promise<void>;
22
- export interface MarkdownSection {
23
- heading: string;
24
- content: string;
25
- }
26
- export declare function splitMarkdownSections(content: string): MarkdownSection[];
27
- //# sourceMappingURL=memory-files.d.ts.map
@@ -97,10 +97,18 @@ export function ensureChannelMemoryFilesSync(channelDir) {
97
97
  }
98
98
  }
99
99
  async function readTextFile(path) {
100
- if (!existsSync(path)) {
101
- return "";
100
+ try {
101
+ return await readFile(path, "utf-8");
102
102
  }
103
- return readFile(path, "utf-8");
103
+ catch (error) {
104
+ if (isNodeError(error) && error.code === "ENOENT") {
105
+ return "";
106
+ }
107
+ throw error;
108
+ }
109
+ }
110
+ function isNodeError(error) {
111
+ return error instanceof Error && "code" in error;
104
112
  }
105
113
  export async function readChannelMemory(channelDir) {
106
114
  return readTextFile(getChannelMemoryPath(channelDir));
@@ -147,36 +155,3 @@ export async function appendChannelHistoryBlock(channelDir, block) {
147
155
  const renderedBlock = [`## ${block.timestamp}`, trimmedContent].join("\n\n");
148
156
  await writeAtomically(path, `${ensureTrailingNewlines(existing)}${renderedBlock}\n`);
149
157
  }
150
- export function splitMarkdownSections(content) {
151
- const normalized = content.replace(/\r/g, "").trim();
152
- if (!normalized) {
153
- return [];
154
- }
155
- const lines = normalized.split("\n");
156
- const sections = [];
157
- let currentHeading = "";
158
- let currentLines = [];
159
- const flush = () => {
160
- if (!currentHeading) {
161
- return;
162
- }
163
- sections.push({
164
- heading: currentHeading,
165
- content: currentLines.join("\n").trim(),
166
- });
167
- };
168
- for (const line of lines) {
169
- if (line.startsWith("## ")) {
170
- flush();
171
- currentHeading = line.slice(3).trim();
172
- currentLines = [];
173
- continue;
174
- }
175
- if (currentHeading) {
176
- currentLines.push(line);
177
- }
178
- }
179
- flush();
180
- return sections;
181
- }
182
- //# sourceMappingURL=memory-files.js.map
@@ -1,8 +1,8 @@
1
1
  import type { AgentMessage } from "@mariozechner/pi-agent-core";
2
2
  import type { Api, Model } from "@mariozechner/pi-ai";
3
3
  import type { ExtensionFactory, SessionEntry } from "@mariozechner/pi-coding-agent";
4
- import type { PipiclawSessionMemorySettings } from "./context.js";
5
- export type ConsolidationReason = "compaction" | "new-session";
4
+ import type { PipiclawSessionMemorySettings } from "../context.js";
5
+ export type ConsolidationReason = "compaction" | "new-session" | "idle";
6
6
  export interface MemoryLifecycleOptions {
7
7
  channelId: string;
8
8
  channelDir: string;
@@ -15,17 +15,35 @@ export interface MemoryLifecycleOptions {
15
15
  export declare class MemoryLifecycle {
16
16
  private options;
17
17
  private backgroundQueue;
18
+ private sessionRefreshQueue;
18
19
  private turnsSinceSessionUpdate;
19
20
  private toolCallsSinceSessionUpdate;
20
- private sessionUpdatePending;
21
+ private thresholdFailureBackoffTurnsRemaining;
22
+ private thresholdRefreshQueued;
23
+ private sessionRefreshRunning;
24
+ private durableDirty;
25
+ private durableRevision;
26
+ private lastAssistantTurnRevision;
27
+ private lastDurableConsolidationRevision;
28
+ private idleConsolidationTimer;
29
+ private idleConsolidationQueued;
21
30
  constructor(options: MemoryLifecycleOptions);
22
31
  private buildRunOptions;
23
32
  createExtensionFactory(): ExtensionFactory;
33
+ noteUserTurnStarted(): void;
24
34
  noteToolCall(): void;
25
35
  noteCompletedAssistantTurn(): void;
36
+ private clearIdleConsolidationTimer;
37
+ private shouldForceRefreshFor;
26
38
  private refreshSessionMemory;
27
- private enqueueSessionMemoryUpdate;
28
- private consolidateBeforeContextDrop;
39
+ private runSessionRefreshSerial;
40
+ private requestThresholdSessionRefresh;
41
+ private enqueueBackgroundJob;
42
+ private hasPendingAssistantSnapshot;
43
+ private markDurableConsolidationCheckpoint;
44
+ private logConsolidationResult;
45
+ private scheduleIdleConsolidation;
46
+ private runPreflightConsolidation;
29
47
  private handleSessionBeforeCompact;
30
48
  private handleSessionCompact;
31
49
  private handleSessionBeforeSwitch;
@@ -33,4 +51,3 @@ export declare class MemoryLifecycle {
33
51
  private enqueueBackgroundMaintenance;
34
52
  private logBackgroundResult;
35
53
  }
36
- //# sourceMappingURL=memory-lifecycle.d.ts.map