siclaw 0.1.2 → 0.1.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.
Files changed (215) hide show
  1. package/dist/agentbox/gateway-client.d.ts +4 -0
  2. package/dist/agentbox/gateway-client.js +9 -1
  3. package/dist/agentbox/gateway-client.js.map +1 -1
  4. package/dist/agentbox/http-server.js +25 -1
  5. package/dist/agentbox/http-server.js.map +1 -1
  6. package/dist/agentbox/session.d.ts +2 -0
  7. package/dist/agentbox/session.js +11 -7
  8. package/dist/agentbox/session.js.map +1 -1
  9. package/dist/agentbox-main.js +10 -0
  10. package/dist/agentbox-main.js.map +1 -1
  11. package/dist/cli-main.js +19 -3
  12. package/dist/cli-main.js.map +1 -1
  13. package/dist/core/agent-factory.d.ts +2 -0
  14. package/dist/core/agent-factory.js +87 -21
  15. package/dist/core/agent-factory.js.map +1 -1
  16. package/dist/core/compaction.d.ts +80 -0
  17. package/dist/core/compaction.js +442 -0
  18. package/dist/core/compaction.js.map +1 -0
  19. package/dist/core/config.d.ts +7 -0
  20. package/dist/core/config.js +27 -1
  21. package/dist/core/config.js.map +1 -1
  22. package/dist/core/extensions/compaction-safeguard.d.ts +2 -0
  23. package/dist/core/extensions/compaction-safeguard.js +681 -0
  24. package/dist/core/extensions/compaction-safeguard.js.map +1 -0
  25. package/dist/core/extensions/deep-investigation.js +47 -73
  26. package/dist/core/extensions/deep-investigation.js.map +1 -1
  27. package/dist/core/extensions/memory-flush.d.ts +2 -10
  28. package/dist/core/extensions/memory-flush.js +4 -86
  29. package/dist/core/extensions/memory-flush.js.map +1 -1
  30. package/dist/core/llm-proxy.js +25 -6
  31. package/dist/core/llm-proxy.js.map +1 -1
  32. package/dist/core/message-utils.d.ts +18 -0
  33. package/dist/core/message-utils.js +28 -0
  34. package/dist/core/message-utils.js.map +1 -0
  35. package/dist/core/prompt.js +4 -5
  36. package/dist/core/prompt.js.map +1 -1
  37. package/dist/core/session-tool-result-guard.d.ts +2 -0
  38. package/dist/core/session-tool-result-guard.js +159 -0
  39. package/dist/core/session-tool-result-guard.js.map +1 -0
  40. package/dist/core/stream-wrappers.d.ts +41 -0
  41. package/dist/core/stream-wrappers.js +369 -0
  42. package/dist/core/stream-wrappers.js.map +1 -0
  43. package/dist/core/thinking-blocks.d.ts +20 -0
  44. package/dist/core/thinking-blocks.js +45 -0
  45. package/dist/core/thinking-blocks.js.map +1 -0
  46. package/dist/core/tool-call-id.d.ts +22 -0
  47. package/dist/core/tool-call-id.js +226 -0
  48. package/dist/core/tool-call-id.js.map +1 -0
  49. package/dist/core/tool-call-repair.d.ts +18 -0
  50. package/dist/core/tool-call-repair.js +73 -0
  51. package/dist/core/tool-call-repair.js.map +1 -0
  52. package/dist/core/tool-result-context-guard.d.ts +36 -0
  53. package/dist/core/tool-result-context-guard.js +272 -0
  54. package/dist/core/tool-result-context-guard.js.map +1 -0
  55. package/dist/cron/cron-limits.d.ts +16 -0
  56. package/dist/cron/cron-limits.js +17 -0
  57. package/dist/cron/cron-limits.js.map +1 -0
  58. package/dist/cron/cron-matcher.d.ts +14 -0
  59. package/dist/cron/cron-matcher.js +29 -0
  60. package/dist/cron/cron-matcher.js.map +1 -1
  61. package/dist/gateway/agentbox/client.d.ts +0 -2
  62. package/dist/gateway/agentbox/client.js.map +1 -1
  63. package/dist/gateway/agentbox/k8s-spawner.d.ts +10 -10
  64. package/dist/gateway/agentbox/k8s-spawner.js +27 -55
  65. package/dist/gateway/agentbox/k8s-spawner.js.map +1 -1
  66. package/dist/gateway/agentbox/local-spawner.d.ts +5 -0
  67. package/dist/gateway/agentbox/local-spawner.js +10 -0
  68. package/dist/gateway/agentbox/local-spawner.js.map +1 -1
  69. package/dist/gateway/cron/cron-service.js +7 -0
  70. package/dist/gateway/cron/cron-service.js.map +1 -1
  71. package/dist/gateway/db/index.js +9 -1
  72. package/dist/gateway/db/index.js.map +1 -1
  73. package/dist/gateway/db/init-schema.js +65 -16
  74. package/dist/gateway/db/init-schema.js.map +1 -1
  75. package/dist/gateway/db/migrate-sqlite.js +73 -20
  76. package/dist/gateway/db/migrate-sqlite.js.map +1 -1
  77. package/dist/gateway/db/repositories/cluster-repo.d.ts +59 -0
  78. package/dist/gateway/db/repositories/cluster-repo.js +107 -0
  79. package/dist/gateway/db/repositories/cluster-repo.js.map +1 -0
  80. package/dist/gateway/db/repositories/config-repo.d.ts +4 -5
  81. package/dist/gateway/db/repositories/config-repo.js +17 -0
  82. package/dist/gateway/db/repositories/config-repo.js.map +1 -1
  83. package/dist/gateway/db/repositories/feedback-repo.d.ts +71 -0
  84. package/dist/gateway/db/repositories/feedback-repo.js +52 -0
  85. package/dist/gateway/db/repositories/feedback-repo.js.map +1 -0
  86. package/dist/gateway/db/repositories/knowledge-doc-repo.d.ts +37 -0
  87. package/dist/gateway/db/repositories/knowledge-doc-repo.js +48 -0
  88. package/dist/gateway/db/repositories/knowledge-doc-repo.js.map +1 -0
  89. package/dist/gateway/db/repositories/user-cluster-config-repo.d.ts +45 -0
  90. package/dist/gateway/db/repositories/user-cluster-config-repo.js +90 -0
  91. package/dist/gateway/db/repositories/user-cluster-config-repo.js.map +1 -0
  92. package/dist/gateway/db/repositories/workspace-repo.d.ts +2 -2
  93. package/dist/gateway/db/repositories/workspace-repo.js +12 -12
  94. package/dist/gateway/db/repositories/workspace-repo.js.map +1 -1
  95. package/dist/gateway/db/schema-mysql.d.ts +437 -44
  96. package/dist/gateway/db/schema-mysql.js +36 -9
  97. package/dist/gateway/db/schema-mysql.js.map +1 -1
  98. package/dist/gateway/db/schema-sqlite.d.ts +459 -46
  99. package/dist/gateway/db/schema-sqlite.js +36 -9
  100. package/dist/gateway/db/schema-sqlite.js.map +1 -1
  101. package/dist/gateway/db/schema.d.ts +435 -44
  102. package/dist/gateway/db/schema.js +1 -1
  103. package/dist/gateway/db/schema.js.map +1 -1
  104. package/dist/gateway/plugins/channel-bridge.js +1 -1
  105. package/dist/gateway/plugins/channel-bridge.js.map +1 -1
  106. package/dist/gateway/rpc-methods.d.ts +2 -1
  107. package/dist/gateway/rpc-methods.js +507 -172
  108. package/dist/gateway/rpc-methods.js.map +1 -1
  109. package/dist/gateway/server.js +191 -51
  110. package/dist/gateway/server.js.map +1 -1
  111. package/dist/gateway/web/dist/assets/index-DTD0P9j8.css +1 -0
  112. package/dist/gateway/web/dist/assets/index-DhqsS2E0.js +756 -0
  113. package/dist/gateway/web/dist/assets/index-DhqsS2E0.js.map +1 -0
  114. package/dist/gateway/web/dist/index.html +2 -2
  115. package/dist/gateway-main.js +1 -3
  116. package/dist/gateway-main.js.map +1 -1
  117. package/dist/memory/indexer.d.ts +13 -0
  118. package/dist/memory/indexer.js +91 -1
  119. package/dist/memory/indexer.js.map +1 -1
  120. package/dist/memory/knowledge-extractor.d.ts +47 -0
  121. package/dist/memory/knowledge-extractor.js +165 -0
  122. package/dist/memory/knowledge-extractor.js.map +1 -0
  123. package/dist/memory/overview-generator.d.ts +16 -0
  124. package/dist/memory/overview-generator.js +233 -0
  125. package/dist/memory/overview-generator.js.map +1 -0
  126. package/dist/memory/session-summarizer.d.ts +28 -0
  127. package/dist/memory/session-summarizer.js +20 -2
  128. package/dist/memory/session-summarizer.js.map +1 -1
  129. package/dist/memory/temporal-decay.js +2 -2
  130. package/dist/memory/temporal-decay.js.map +1 -1
  131. package/dist/memory/topic-consolidator.d.ts +52 -0
  132. package/dist/memory/topic-consolidator.js +197 -0
  133. package/dist/memory/topic-consolidator.js.map +1 -0
  134. package/dist/tools/cluster-info.d.ts +9 -0
  135. package/dist/tools/cluster-info.js +74 -0
  136. package/dist/tools/cluster-info.js.map +1 -0
  137. package/dist/tools/command-sets.js +15 -5
  138. package/dist/tools/command-sets.js.map +1 -1
  139. package/dist/tools/create-skill.js +1 -1
  140. package/dist/tools/create-skill.js.map +1 -1
  141. package/dist/tools/debug-pod.d.ts +217 -0
  142. package/dist/tools/debug-pod.js +603 -0
  143. package/dist/tools/debug-pod.js.map +1 -0
  144. package/dist/tools/deep-search/engine.d.ts +0 -5
  145. package/dist/tools/deep-search/engine.js +68 -28
  146. package/dist/tools/deep-search/engine.js.map +1 -1
  147. package/dist/tools/deep-search/format.d.ts +1 -1
  148. package/dist/tools/deep-search/format.js +1 -2
  149. package/dist/tools/deep-search/format.js.map +1 -1
  150. package/dist/tools/deep-search/prompts.d.ts +4 -1
  151. package/dist/tools/deep-search/prompts.js +47 -29
  152. package/dist/tools/deep-search/prompts.js.map +1 -1
  153. package/dist/tools/deep-search/quality-gate.d.ts +25 -0
  154. package/dist/tools/deep-search/quality-gate.js +81 -0
  155. package/dist/tools/deep-search/quality-gate.js.map +1 -0
  156. package/dist/tools/deep-search/schemas.d.ts +25 -0
  157. package/dist/tools/deep-search/schemas.js +26 -1
  158. package/dist/tools/deep-search/schemas.js.map +1 -1
  159. package/dist/tools/deep-search/sre-knowledge.d.ts +6 -10
  160. package/dist/tools/deep-search/sre-knowledge.js +21 -52
  161. package/dist/tools/deep-search/sre-knowledge.js.map +1 -1
  162. package/dist/tools/deep-search/sub-agent.js +24 -8
  163. package/dist/tools/deep-search/sub-agent.js.map +1 -1
  164. package/dist/tools/deep-search/tool.js +3 -6
  165. package/dist/tools/deep-search/tool.js.map +1 -1
  166. package/dist/tools/deep-search/types.d.ts +13 -0
  167. package/dist/tools/deep-search/types.js +4 -4
  168. package/dist/tools/deep-search/types.js.map +1 -1
  169. package/dist/tools/dp-tools.d.ts +9 -6
  170. package/dist/tools/dp-tools.js +26 -55
  171. package/dist/tools/dp-tools.js.map +1 -1
  172. package/dist/tools/exec-utils.d.ts +8 -21
  173. package/dist/tools/exec-utils.js +11 -95
  174. package/dist/tools/exec-utils.js.map +1 -1
  175. package/dist/tools/fork-skill.js +1 -1
  176. package/dist/tools/fork-skill.js.map +1 -1
  177. package/dist/tools/k8s-checks.d.ts +11 -5
  178. package/dist/tools/k8s-checks.js +28 -9
  179. package/dist/tools/k8s-checks.js.map +1 -1
  180. package/dist/tools/knowledge-search.d.ts +3 -0
  181. package/dist/tools/knowledge-search.js +115 -0
  182. package/dist/tools/knowledge-search.js.map +1 -0
  183. package/dist/tools/kubeconfig-resolver.d.ts +22 -0
  184. package/dist/tools/kubeconfig-resolver.js +98 -18
  185. package/dist/tools/kubeconfig-resolver.js.map +1 -1
  186. package/dist/tools/manage-schedule.js +23 -1
  187. package/dist/tools/manage-schedule.js.map +1 -1
  188. package/dist/tools/netns-script.d.ts +1 -1
  189. package/dist/tools/netns-script.js +19 -7
  190. package/dist/tools/netns-script.js.map +1 -1
  191. package/dist/tools/node-exec.d.ts +1 -1
  192. package/dist/tools/node-exec.js +19 -7
  193. package/dist/tools/node-exec.js.map +1 -1
  194. package/dist/tools/node-script.d.ts +1 -1
  195. package/dist/tools/node-script.js +19 -7
  196. package/dist/tools/node-script.js.map +1 -1
  197. package/dist/tools/pod-exec.js +12 -1
  198. package/dist/tools/pod-exec.js.map +1 -1
  199. package/dist/tools/pod-nsenter-exec.d.ts +1 -1
  200. package/dist/tools/pod-nsenter-exec.js +19 -7
  201. package/dist/tools/pod-nsenter-exec.js.map +1 -1
  202. package/dist/tools/pod-script.js +12 -1
  203. package/dist/tools/pod-script.js.map +1 -1
  204. package/dist/tools/restricted-bash.js +10 -3
  205. package/dist/tools/restricted-bash.js.map +1 -1
  206. package/dist/tools/run-skill.js +14 -2
  207. package/dist/tools/run-skill.js.map +1 -1
  208. package/dist/tools/save-feedback.d.ts +7 -0
  209. package/dist/tools/save-feedback.js +125 -0
  210. package/dist/tools/save-feedback.js.map +1 -0
  211. package/dist/tools/update-skill.js +1 -1
  212. package/dist/tools/update-skill.js.map +1 -1
  213. package/package.json +1 -1
  214. package/skills/core/deep-investigation/SKILL.md +11 -14
  215. package/skills/core/session-feedback/SKILL.md +146 -0
@@ -0,0 +1,233 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ /**
4
+ * Build a concise knowledge overview from workspace directories.
5
+ * Scans repos/, docs/, and investigations/ (topic files no longer injected).
6
+ * Pure sync filesystem scan — no DB dependency.
7
+ * Returns empty string if no knowledge files exist.
8
+ */
9
+ export function buildKnowledgeOverview(opts) {
10
+ const { memoryDir, reposDir, docsDir, investigationPatterns } = opts;
11
+ const TOTAL_BUDGET = 1200;
12
+ const investigationsDir = path.join(memoryDir, "investigations");
13
+ const repoEntries = reposDir ? scanRepos(reposDir) : [];
14
+ const docEntries = docsDir ? scanDocs(docsDir) : [];
15
+ const investigationEntries = scanInvestigations(investigationsDir);
16
+ const hasPatterns = investigationPatterns && investigationPatterns.length > 0;
17
+ if (repoEntries.length === 0 &&
18
+ docEntries.length === 0 &&
19
+ investigationEntries.length === 0 &&
20
+ !hasPatterns) {
21
+ return "";
22
+ }
23
+ const parts = ["## Knowledge Overview"];
24
+ let currentLen = parts[0].length;
25
+ // --- Code Repositories (~400 chars budget) ---
26
+ if (repoEntries.length > 0) {
27
+ const header = "\n\n### Code Repositories\n| Repo | Files | Top languages |\n|------|-------|--------------|";
28
+ const rows = [];
29
+ let sectionLen = header.length;
30
+ for (const entry of repoEntries) {
31
+ const langs = entry.topExtensions.length > 0 ? entry.topExtensions.join(", ") : "-";
32
+ const row = `\n| ${entry.name} | ${entry.fileCount} | ${langs} |`;
33
+ if (currentLen + sectionLen + row.length > TOTAL_BUDGET - 800)
34
+ break; // reserve for docs + investigations + footer
35
+ rows.push(row);
36
+ sectionLen += row.length;
37
+ }
38
+ if (rows.length > 0) {
39
+ parts.push(header + rows.join(""));
40
+ currentLen += sectionLen;
41
+ }
42
+ }
43
+ // --- Documentation (~300 chars budget) ---
44
+ if (docEntries.length > 0) {
45
+ const header = "\n\n### Documentation\n| Category | Files |\n|----------|-------|";
46
+ const rows = [];
47
+ let sectionLen = header.length;
48
+ for (const entry of docEntries) {
49
+ const row = `\n| ${entry.category} | ${entry.fileCount} |`;
50
+ if (currentLen + sectionLen + row.length > TOTAL_BUDGET - 400)
51
+ break; // reserve for investigations + footer
52
+ rows.push(row);
53
+ sectionLen += row.length;
54
+ }
55
+ if (rows.length > 0) {
56
+ parts.push(header + rows.join(""));
57
+ currentLen += sectionLen;
58
+ }
59
+ }
60
+ // --- Recent Investigations (~300 chars budget) ---
61
+ if (investigationEntries.length > 0 || (investigationPatterns && investigationPatterns.length > 0)) {
62
+ const maxInvestigations = currentLen > TOTAL_BUDGET - 600 ? 3 : 5;
63
+ const entries = investigationEntries.slice(0, maxInvestigations);
64
+ const header = "\n\n### Recent Investigations";
65
+ const lines = entries.map(e => `\n- ${e.date}: ${e.question}`);
66
+ // Append pattern summary if available
67
+ if (investigationPatterns && investigationPatterns.length > 0) {
68
+ const patternStr = investigationPatterns.map(p => `${p.category} (${p.count}x)`).join(", ");
69
+ lines.push(`\n- Patterns: ${patternStr}`);
70
+ }
71
+ const section = header + lines.join("");
72
+ if (currentLen + section.length <= TOTAL_BUDGET - 100) {
73
+ parts.push(section);
74
+ currentLen += section.length;
75
+ }
76
+ }
77
+ // --- Footer ---
78
+ const hasWorkspace = repoEntries.length > 0 || docEntries.length > 0;
79
+ const footer = hasWorkspace
80
+ ? '\n\nUse `read` to view files in repos/ or docs/, or `memory_search` to find specific facts.'
81
+ : '\n\nUse `memory_search` to find specific facts from past sessions or investigations.';
82
+ parts.push(footer);
83
+ return parts.join("");
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // Helpers
87
+ // ---------------------------------------------------------------------------
88
+ /** Check if a Dirent is a directory, following symlinks. */
89
+ function isDir(parentDir, entry) {
90
+ if (entry.isDirectory())
91
+ return true;
92
+ if (entry.isSymbolicLink()) {
93
+ try {
94
+ return fs.statSync(path.join(parentDir, entry.name)).isDirectory();
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ }
100
+ return false;
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Scanners
104
+ // ---------------------------------------------------------------------------
105
+ /**
106
+ * Scan repos/ — list top-level subdirectories with recursive file count and top 3 extensions.
107
+ */
108
+ function scanRepos(reposDir) {
109
+ if (!fs.existsSync(reposDir))
110
+ return [];
111
+ let entries;
112
+ try {
113
+ entries = fs.readdirSync(reposDir, { withFileTypes: true });
114
+ }
115
+ catch {
116
+ return [];
117
+ }
118
+ const repos = [];
119
+ for (const entry of entries) {
120
+ if (!isDir(reposDir, entry))
121
+ continue;
122
+ const repoPath = path.join(reposDir, entry.name);
123
+ const { fileCount, extensionCounts } = countFilesRecursive(repoPath);
124
+ const topExtensions = getTopExtensions(extensionCounts, 3);
125
+ repos.push({ name: entry.name, fileCount, topExtensions });
126
+ }
127
+ // Sort by file count descending
128
+ repos.sort((a, b) => b.fileCount - a.fileCount);
129
+ return repos;
130
+ }
131
+ /**
132
+ * Recursively count files and tally extensions in a directory.
133
+ * Skips hidden directories (starting with .) and node_modules.
134
+ */
135
+ function countFilesRecursive(dir) {
136
+ const extensionCounts = new Map();
137
+ let fileCount = 0;
138
+ const walk = (d) => {
139
+ let items;
140
+ try {
141
+ items = fs.readdirSync(d, { withFileTypes: true });
142
+ }
143
+ catch {
144
+ return;
145
+ }
146
+ for (const item of items) {
147
+ if (item.name.startsWith(".") || item.name === "node_modules")
148
+ continue;
149
+ if (item.isDirectory()) {
150
+ walk(path.join(d, item.name));
151
+ }
152
+ else if (item.isFile()) {
153
+ fileCount++;
154
+ const ext = path.extname(item.name);
155
+ if (ext) {
156
+ extensionCounts.set(ext, (extensionCounts.get(ext) ?? 0) + 1);
157
+ }
158
+ }
159
+ }
160
+ };
161
+ walk(dir);
162
+ return { fileCount, extensionCounts };
163
+ }
164
+ function getTopExtensions(counts, n) {
165
+ return [...counts.entries()]
166
+ .sort((a, b) => b[1] - a[1])
167
+ .slice(0, n)
168
+ .map(([ext]) => ext);
169
+ }
170
+ /**
171
+ * Scan docs/ — list subdirectories with file counts, plus top-level files as "(root)".
172
+ */
173
+ function scanDocs(docsDir) {
174
+ if (!fs.existsSync(docsDir))
175
+ return [];
176
+ let items;
177
+ try {
178
+ items = fs.readdirSync(docsDir, { withFileTypes: true });
179
+ }
180
+ catch {
181
+ return [];
182
+ }
183
+ const entries = [];
184
+ let rootFileCount = 0;
185
+ for (const item of items) {
186
+ if (isDir(docsDir, item)) {
187
+ const subPath = path.join(docsDir, item.name);
188
+ const { fileCount } = countFilesRecursive(subPath);
189
+ entries.push({ category: item.name, fileCount });
190
+ }
191
+ else if (item.isFile() || item.isSymbolicLink()) {
192
+ rootFileCount++;
193
+ }
194
+ }
195
+ if (rootFileCount > 0) {
196
+ entries.push({ category: "(root)", fileCount: rootFileCount });
197
+ }
198
+ // Sort by file count descending, (root) last if tied
199
+ entries.sort((a, b) => b.fileCount - a.fileCount || (a.category === "(root)" ? 1 : -1));
200
+ return entries;
201
+ }
202
+ function scanInvestigations(investigationsDir) {
203
+ if (!fs.existsSync(investigationsDir))
204
+ return [];
205
+ let files;
206
+ try {
207
+ files = fs.readdirSync(investigationsDir).filter(f => f.endsWith(".md"));
208
+ }
209
+ catch {
210
+ return [];
211
+ }
212
+ // Sort by filename descending (filenames are date-based: YYYY-MM-DD-HH-MM-SS.md)
213
+ files.sort((a, b) => b.localeCompare(a));
214
+ const entries = [];
215
+ for (const file of files.slice(0, 5)) {
216
+ try {
217
+ // Read only first 300 bytes to extract the title
218
+ const content = fs.readFileSync(path.join(investigationsDir, file), "utf-8");
219
+ const head = content.slice(0, 300);
220
+ const titleMatch = head.match(/^# Investigation:\s*(.+)/m);
221
+ const question = titleMatch ? titleMatch[1].trim() : file.replace(/\.md$/, "");
222
+ // Parse date from filename (YYYY-MM-DD-HH-MM-SS.md → YYYY-MM-DD)
223
+ const dateMatch = file.match(/^(\d{4}-\d{2}-\d{2})/);
224
+ const date = dateMatch ? dateMatch[1] : "unknown";
225
+ entries.push({ date, question });
226
+ }
227
+ catch {
228
+ // Skip unreadable files
229
+ }
230
+ }
231
+ return entries;
232
+ }
233
+ //# sourceMappingURL=overview-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview-generator.js","sourceRoot":"","sources":["../../src/memory/overview-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAa7B;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAkB;IACvD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC;IACrE,MAAM,YAAY,GAAG,IAAI,CAAC;IAE1B,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAEjE,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAEnE,MAAM,WAAW,GAAG,qBAAqB,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,IACE,WAAW,CAAC,MAAM,KAAK,CAAC;QACxB,UAAU,CAAC,MAAM,KAAK,CAAC;QACvB,oBAAoB,CAAC,MAAM,KAAK,CAAC;QACjC,CAAC,WAAW,EACZ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,uBAAuB,CAAC,CAAC;IAClD,IAAI,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAEjC,gDAAgD;IAChD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,8FAA8F,CAAC;QAE9G,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACpF,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,SAAS,MAAM,KAAK,IAAI,CAAC;YAClE,IAAI,UAAU,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,GAAG,YAAY,GAAG,GAAG;gBAAE,MAAM,CAAC,6CAA6C;YACnH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACnC,UAAU,IAAI,UAAU,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,mEAAmE,CAAC;QAEnF,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,QAAQ,MAAM,KAAK,CAAC,SAAS,IAAI,CAAC;YAC3D,IAAI,UAAU,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,GAAG,YAAY,GAAG,GAAG;gBAAE,MAAM,CAAC,sCAAsC;YAC5G,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACnC,UAAU,IAAI,UAAU,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACnG,MAAM,iBAAiB,GAAG,UAAU,GAAG,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAG,+BAA+B,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE/D,sCAAsC;QACtC,IAAI,qBAAqB,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5F,KAAK,CAAC,IAAI,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExC,IAAI,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,YAAY;QACzB,CAAC,CAAC,6FAA6F;QAC/F,CAAC,CAAC,sFAAsF,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAsBD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,4DAA4D;AAC5D,SAAS,KAAK,CAAC,SAAiB,EAAE,KAAgB;IAChD,IAAI,KAAK,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IACrG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E;;GAEG;AACH,SAAS,SAAS,CAAC,QAAgB;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC;YAAE,SAAS;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,aAAa,GAAG,gBAAgB,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;QACzB,IAAI,KAAkB,CAAC;QACvB,IAAI,CAAC;YACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc;gBAAE,SAAS;YACxE,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzB,SAAS,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,GAAG,EAAE,CAAC;oBACR,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA2B,EAAE,CAAS;IAC9D,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,OAAe;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,IAAI,KAAkB,CAAC;IACvB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAClD,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,qDAAqD;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,iBAAyB;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjD,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,iDAAiD;YACjD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAE/E,iEAAiE;YACjE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAElD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -2,6 +2,7 @@
2
2
  * Session Summarizer — extracts conversation from JSONL and saves as memory markdown.
3
3
  *
4
4
  * Called during session release to persist conversation context for future memory search.
5
+ * saveSessionKnowledge() delegates to saveSessionMemory() (LLM topic extraction disabled).
5
6
  */
6
7
  export interface SaveSessionMemoryOpts {
7
8
  /** Path to the session directory containing .jsonl files */
@@ -11,9 +12,36 @@ export interface SaveSessionMemoryOpts {
11
12
  /** Maximum number of user/assistant messages to include (default: 15) */
12
13
  maxMessages?: number;
13
14
  }
15
+ export interface SaveSessionKnowledgeOpts extends SaveSessionMemoryOpts {
16
+ }
17
+ interface ExtractedMessage {
18
+ role: "user" | "assistant";
19
+ text: string;
20
+ }
21
+ /**
22
+ * Find the most recent .jsonl file in the session directory.
23
+ */
24
+ export declare function findLatestJsonl(sessionDir: string): string | null;
25
+ /**
26
+ * Extract user and assistant messages from a JSONL session file.
27
+ */
28
+ export declare function extractMessages(jsonlPath: string): Promise<ExtractedMessage[]>;
14
29
  /**
15
30
  * Save a session's conversation to a memory markdown file.
16
31
  *
17
32
  * @returns The written file path, or null if nothing was saved.
18
33
  */
19
34
  export declare function saveSessionMemory(opts: SaveSessionMemoryOpts): Promise<string | null>;
35
+ /**
36
+ * Save session knowledge.
37
+ *
38
+ * LLM-driven topic extraction is disabled — topic files produced more noise than signal
39
+ * in SRE scenarios (stale state, duplicate facts, 20KB injection drowning skill instructions).
40
+ * Now delegates to saveSessionMemory() which writes a raw conversation dump that is still
41
+ * searchable via memory_search.
42
+ *
43
+ * @returns Array of saved file paths, or null if nothing was saved.
44
+ * Return type must remain `string[] | null` — callers depend on it.
45
+ */
46
+ export declare function saveSessionKnowledge(opts: SaveSessionKnowledgeOpts): Promise<string[] | null>;
47
+ export {};
@@ -2,16 +2,19 @@
2
2
  * Session Summarizer — extracts conversation from JSONL and saves as memory markdown.
3
3
  *
4
4
  * Called during session release to persist conversation context for future memory search.
5
+ * saveSessionKnowledge() delegates to saveSessionMemory() (LLM topic extraction disabled).
5
6
  */
6
7
  import fs from "node:fs";
7
8
  import path from "node:path";
8
9
  import readline from "node:readline";
10
+ // NOTE: knowledge-extractor and topic-consolidator imports removed.
11
+ // Topic extraction + consolidation disabled — see memory simplification design doc.
9
12
  const DEFAULT_MAX_MESSAGES = 15;
10
13
  const MIN_MESSAGES_TO_SAVE = 3;
11
14
  /**
12
15
  * Find the most recent .jsonl file in the session directory.
13
16
  */
14
- function findLatestJsonl(sessionDir) {
17
+ export function findLatestJsonl(sessionDir) {
15
18
  let files;
16
19
  try {
17
20
  files = fs.readdirSync(sessionDir).filter((f) => f.endsWith(".jsonl"));
@@ -47,7 +50,7 @@ function extractText(content) {
47
50
  /**
48
51
  * Extract user and assistant messages from a JSONL session file.
49
52
  */
50
- async function extractMessages(jsonlPath) {
53
+ export async function extractMessages(jsonlPath) {
51
54
  const messages = [];
52
55
  const stream = fs.createReadStream(jsonlPath, { encoding: "utf-8" });
53
56
  const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
@@ -136,4 +139,19 @@ export async function saveSessionMemory(opts) {
136
139
  console.log(`[session-summarizer] Saved session memory to ${finalPath} (${messages.length} messages)`);
137
140
  return finalPath;
138
141
  }
142
+ /**
143
+ * Save session knowledge.
144
+ *
145
+ * LLM-driven topic extraction is disabled — topic files produced more noise than signal
146
+ * in SRE scenarios (stale state, duplicate facts, 20KB injection drowning skill instructions).
147
+ * Now delegates to saveSessionMemory() which writes a raw conversation dump that is still
148
+ * searchable via memory_search.
149
+ *
150
+ * @returns Array of saved file paths, or null if nothing was saved.
151
+ * Return type must remain `string[] | null` — callers depend on it.
152
+ */
153
+ export async function saveSessionKnowledge(opts) {
154
+ const raw = await saveSessionMemory(opts);
155
+ return raw ? [raw] : null;
156
+ }
139
157
  //# sourceMappingURL=session-summarizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-summarizer.js","sourceRoot":"","sources":["../../src/memory/session-summarizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-summarizer.js","sourceRoot":"","sources":["../../src/memory/session-summarizer.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export const DEFAULT_TEMPORAL_DECAY = {
9
9
  halfLifeDays: 30,
10
10
  };
11
11
  const DAY_MS = 24 * 60 * 60 * 1000;
12
- const DATED_MEMORY_RE = /(?:^|\/)(\d{4})-(\d{2})-(\d{2})\.md$/;
12
+ const DATED_MEMORY_RE = /(?:^|\/)(\d{4})-(\d{2})-(\d{2})(?:-\d{4}(?:-\d+)?)?\.md$/;
13
13
  function toDecayLambda(halfLifeDays) {
14
14
  if (!Number.isFinite(halfLifeDays) || halfLifeDays <= 0)
15
15
  return 0;
@@ -33,7 +33,7 @@ function isEvergreen(filePath) {
33
33
  const normalized = filePath.replaceAll("\\", "/").replace(/^\.\//, "");
34
34
  if (normalized === "MEMORY.md" || normalized === "memory.md")
35
35
  return true;
36
- // Non-dated files under memory/ are topic files (evergreen)
36
+ // Non-dated files under memory/ (PROFILE.md, legacy topics, user-written) are evergreen
37
37
  if (normalized.startsWith("memory/") && !DATED_MEMORY_RE.test(normalized))
38
38
  return true;
39
39
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"temporal-decay.js","sourceRoot":"","sources":["../../src/memory/temporal-decay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"temporal-decay.js","sourceRoot":"","sources":["../../src/memory/temporal-decay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * DISABLED — no production callsites. Reactivate when a config flag for topic
3
+ * consolidation is implemented (paired with knowledge-extractor.ts reactivation).
4
+ *
5
+ * Topic Consolidator — LLM-driven deduplication and merging of topic files.
6
+ *
7
+ * When topic files accumulate many date sections and facts over time, this module
8
+ * consolidates them: deduplicates, resolves contradictions (newer wins), and
9
+ * rewrites to a clean merged format.
10
+ *
11
+ * Triggered after saveSessionKnowledge when thresholds are met.
12
+ */
13
+ /**
14
+ * Check if a topic file needs consolidation based on thresholds.
15
+ * Returns false if already consolidated today.
16
+ */
17
+ export declare function shouldConsolidate(filePath: string): boolean;
18
+ /**
19
+ * Analyze a topic file for consolidation eligibility.
20
+ * Returns { factCount } if consolidation is needed, null otherwise.
21
+ */
22
+ export declare function analyzeTopicFile(filePath: string): {
23
+ factCount: number;
24
+ } | null;
25
+ /**
26
+ * Consolidate a single topic file using LLM.
27
+ * Reads the file, calls LLM to deduplicate and resolve contradictions,
28
+ * then rewrites the file in clean format.
29
+ */
30
+ export declare function consolidateTopicFile(filePath: string, llmConfig: {
31
+ apiKey: string;
32
+ baseUrl: string;
33
+ model?: string;
34
+ }): Promise<void>;
35
+ /**
36
+ * Check modified topic files and consolidate any that exceed thresholds.
37
+ * Called fire-and-forget after mergeTopicFiles.
38
+ */
39
+ export declare function triggerConsolidationIfNeeded(memoryDir: string, modifiedFiles: string[], llmConfig: {
40
+ apiKey: string;
41
+ baseUrl: string;
42
+ model?: string;
43
+ }): Promise<void>;
44
+ /**
45
+ * Scan all topic files and consolidate any that need it.
46
+ * Used as a catch-up check on new session creation.
47
+ */
48
+ export declare function consolidateAllPending(memoryDir: string, llmConfig: {
49
+ apiKey: string;
50
+ baseUrl: string;
51
+ model?: string;
52
+ }, maxFilesPerRun?: number): Promise<void>;
@@ -0,0 +1,197 @@
1
+ /**
2
+ * DISABLED — no production callsites. Reactivate when a config flag for topic
3
+ * consolidation is implemented (paired with knowledge-extractor.ts reactivation).
4
+ *
5
+ * Topic Consolidator — LLM-driven deduplication and merging of topic files.
6
+ *
7
+ * When topic files accumulate many date sections and facts over time, this module
8
+ * consolidates them: deduplicates, resolves contradictions (newer wins), and
9
+ * rewrites to a clean merged format.
10
+ *
11
+ * Triggered after saveSessionKnowledge when thresholds are met.
12
+ */
13
+ import fs from "node:fs";
14
+ import path from "node:path";
15
+ import { llmCompleteWithTool } from "../tools/deep-search/sub-agent.js";
16
+ // ---------------------------------------------------------------------------
17
+ // Thresholds
18
+ // ---------------------------------------------------------------------------
19
+ const MIN_DATE_SECTIONS = 5;
20
+ const MIN_FACT_LINES = 20;
21
+ // Guard against concurrent consolidation of the same file in LocalSpawner mode
22
+ // (single process, shared filesystem). In K8s mode, topics are pod-scoped so
23
+ // cross-pod races don't occur; the mtime optimistic lock is the safety net there.
24
+ const consolidationInProgress = new Set();
25
+ // ---------------------------------------------------------------------------
26
+ // Public API
27
+ // ---------------------------------------------------------------------------
28
+ /**
29
+ * Check if a topic file needs consolidation based on thresholds.
30
+ * Returns false if already consolidated today.
31
+ */
32
+ export function shouldConsolidate(filePath) {
33
+ return analyzeTopicFile(filePath) !== null;
34
+ }
35
+ /**
36
+ * Analyze a topic file for consolidation eligibility.
37
+ * Returns { factCount } if consolidation is needed, null otherwise.
38
+ */
39
+ export function analyzeTopicFile(filePath) {
40
+ let content;
41
+ try {
42
+ content = fs.readFileSync(filePath, "utf-8");
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ // Skip if already consolidated today
48
+ const consolidatedMatch = content.match(/^Last consolidated:\s*(\d{4}-\d{2}-\d{2})/m);
49
+ if (consolidatedMatch) {
50
+ const today = new Date().toISOString().slice(0, 10);
51
+ if (consolidatedMatch[1] === today)
52
+ return null;
53
+ }
54
+ const lines = content.split("\n");
55
+ const factCount = lines.filter(l => l.startsWith("- ")).length;
56
+ // Count date sections (## YYYY-MM-DD)
57
+ const dateSections = lines.filter(l => /^## \d{4}-\d{2}-\d{2}/.test(l)).length;
58
+ if (dateSections >= MIN_DATE_SECTIONS)
59
+ return { factCount };
60
+ if (factCount >= MIN_FACT_LINES)
61
+ return { factCount };
62
+ return null;
63
+ }
64
+ const CONSOLIDATION_SCHEMA = {
65
+ type: "object",
66
+ properties: {
67
+ consolidated_facts: {
68
+ type: "array",
69
+ items: { type: "string" },
70
+ description: "Deduplicated, merged list of facts. Each is a concise, self-contained statement.",
71
+ },
72
+ changes_summary: {
73
+ type: "string",
74
+ description: "Brief summary of what was changed (e.g. 'merged 3 duplicate facts, resolved 1 contradiction')",
75
+ },
76
+ },
77
+ required: ["consolidated_facts", "changes_summary"],
78
+ };
79
+ /**
80
+ * Consolidate a single topic file using LLM.
81
+ * Reads the file, calls LLM to deduplicate and resolve contradictions,
82
+ * then rewrites the file in clean format.
83
+ */
84
+ export async function consolidateTopicFile(filePath, llmConfig) {
85
+ if (consolidationInProgress.has(filePath)) {
86
+ console.log(`[topic-consolidator] Skipping ${path.basename(filePath)}: consolidation already in progress`);
87
+ return;
88
+ }
89
+ consolidationInProgress.add(filePath);
90
+ try {
91
+ await doConsolidateTopicFile(filePath, llmConfig);
92
+ }
93
+ finally {
94
+ consolidationInProgress.delete(filePath);
95
+ }
96
+ }
97
+ async function doConsolidateTopicFile(filePath, llmConfig) {
98
+ const mtimeBefore = fs.statSync(filePath).mtimeMs;
99
+ const content = fs.readFileSync(filePath, "utf-8");
100
+ // Extract the topic title from the first heading
101
+ const titleMatch = content.match(/^# (.+)/m);
102
+ const topicTitle = titleMatch ? titleMatch[1].trim() : path.basename(filePath, ".md");
103
+ const prompt = `You are a knowledge consolidation system. Below is a topic file containing facts accumulated over multiple sessions. Your job is to produce a clean, deduplicated list of facts.
104
+
105
+ <topic_file>
106
+ ${content}
107
+ </topic_file>
108
+
109
+ Rules:
110
+ 1. **Semantic dedup**: Merge facts that say the same thing in different words into one concise statement
111
+ 2. **Contradiction resolution**: When two facts contradict each other, keep the NEWER one (facts from date sections appearing earlier in the file are newer, as new sections are prepended)
112
+ 3. **Delete superseded facts**: If a newer fact updates/replaces an older one, only keep the newer version
113
+ 4. **Preserve all unique information**: Do NOT discard facts that are unique and non-redundant
114
+ 5. **Do NOT invent new information**: Only reorganize and deduplicate what exists
115
+ 6. **Keep facts concise and self-contained**: Each fact should be understandable on its own
116
+
117
+ Call the consolidate_knowledge tool with the merged result.`;
118
+ const { toolArgs } = await llmCompleteWithTool(undefined, prompt, "consolidate_knowledge", "Submit consolidated knowledge facts", CONSOLIDATION_SCHEMA, { apiKey: llmConfig.apiKey, baseUrl: llmConfig.baseUrl, model: llmConfig.model });
119
+ if (!toolArgs || !Array.isArray(toolArgs.consolidated_facts) || toolArgs.consolidated_facts.length === 0) {
120
+ console.warn(`[topic-consolidator] LLM returned empty result for ${path.basename(filePath)}, skipping`);
121
+ return;
122
+ }
123
+ // Sanity check: reject overly aggressive consolidation (possible prompt injection or LLM error)
124
+ const originalFactCount = content.split("\n").filter(l => l.startsWith("- ")).length;
125
+ if (originalFactCount > 0 && toolArgs.consolidated_facts.length < originalFactCount * 0.3) {
126
+ console.warn(`[topic-consolidator] Consolidation too aggressive for ${path.basename(filePath)} (${originalFactCount} → ${toolArgs.consolidated_facts.length}), skipping`);
127
+ return;
128
+ }
129
+ // Optimistic lock: check mtime hasn't changed since we read the file
130
+ const mtimeAfter = fs.statSync(filePath).mtimeMs;
131
+ if (mtimeAfter !== mtimeBefore) {
132
+ console.warn(`[topic-consolidator] File ${path.basename(filePath)} was modified during consolidation, skipping write`);
133
+ return;
134
+ }
135
+ const today = new Date().toISOString().slice(0, 10);
136
+ const factsBlock = toolArgs.consolidated_facts.map(f => `- ${f}`).join("\n");
137
+ const newContent = `Last consolidated: ${today}\n# ${topicTitle}\n\n${factsBlock}\n`;
138
+ fs.writeFileSync(filePath, newContent, "utf-8");
139
+ console.log(`[topic-consolidator] Consolidated ${path.basename(filePath)}: ${toolArgs.changes_summary}`);
140
+ }
141
+ /**
142
+ * Check modified topic files and consolidate any that exceed thresholds.
143
+ * Called fire-and-forget after mergeTopicFiles.
144
+ */
145
+ export async function triggerConsolidationIfNeeded(memoryDir, modifiedFiles, llmConfig) {
146
+ for (const filePath of modifiedFiles) {
147
+ // Only process files in topics/
148
+ const topicsDir = path.join(memoryDir, "topics");
149
+ if (!filePath.startsWith(topicsDir + path.sep))
150
+ continue;
151
+ if (shouldConsolidate(filePath)) {
152
+ try {
153
+ await consolidateTopicFile(filePath, llmConfig);
154
+ }
155
+ catch (err) {
156
+ console.warn(`[topic-consolidator] Failed to consolidate ${path.basename(filePath)}:`, err);
157
+ }
158
+ }
159
+ }
160
+ }
161
+ /**
162
+ * Scan all topic files and consolidate any that need it.
163
+ * Used as a catch-up check on new session creation.
164
+ */
165
+ export async function consolidateAllPending(memoryDir, llmConfig, maxFilesPerRun = 5) {
166
+ const topicsDir = path.join(memoryDir, "topics");
167
+ if (!fs.existsSync(topicsDir))
168
+ return;
169
+ let files;
170
+ try {
171
+ files = fs.readdirSync(topicsDir).filter(f => f.endsWith(".md"));
172
+ }
173
+ catch {
174
+ return;
175
+ }
176
+ // Prioritize files with the most fact lines (highest consolidation value)
177
+ const candidates = files
178
+ .map(file => {
179
+ const filePath = path.join(topicsDir, file);
180
+ const analysis = analyzeTopicFile(filePath);
181
+ if (!analysis)
182
+ return null;
183
+ return { file, filePath, factCount: analysis.factCount };
184
+ })
185
+ .filter((c) => c !== null)
186
+ .sort((a, b) => b.factCount - a.factCount)
187
+ .slice(0, maxFilesPerRun);
188
+ for (const { file, filePath } of candidates) {
189
+ try {
190
+ await consolidateTopicFile(filePath, llmConfig);
191
+ }
192
+ catch (err) {
193
+ console.warn(`[topic-consolidator] Catch-up consolidation failed for ${file}:`, err);
194
+ }
195
+ }
196
+ }
197
+ //# sourceMappingURL=topic-consolidator.js.map