bikky 0.1.0

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 (124) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +323 -0
  3. package/bin/bikky.js +6 -0
  4. package/dist/cli.d.ts +12 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +51 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config.d.ts +59 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +141 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/config.test.d.ts +8 -0
  13. package/dist/config.test.d.ts.map +1 -0
  14. package/dist/config.test.js +449 -0
  15. package/dist/config.test.js.map +1 -0
  16. package/dist/daemon/consolidation.d.ts +60 -0
  17. package/dist/daemon/consolidation.d.ts.map +1 -0
  18. package/dist/daemon/consolidation.js +448 -0
  19. package/dist/daemon/consolidation.js.map +1 -0
  20. package/dist/daemon/extraction.d.ts +17 -0
  21. package/dist/daemon/extraction.d.ts.map +1 -0
  22. package/dist/daemon/extraction.js +465 -0
  23. package/dist/daemon/extraction.js.map +1 -0
  24. package/dist/daemon/index.d.ts +3 -0
  25. package/dist/daemon/index.d.ts.map +1 -0
  26. package/dist/daemon/index.js +3 -0
  27. package/dist/daemon/index.js.map +1 -0
  28. package/dist/daemon/loop.d.ts +3 -0
  29. package/dist/daemon/loop.d.ts.map +1 -0
  30. package/dist/daemon/loop.js +93 -0
  31. package/dist/daemon/loop.js.map +1 -0
  32. package/dist/daemon/qdrant.d.ts +103 -0
  33. package/dist/daemon/qdrant.d.ts.map +1 -0
  34. package/dist/daemon/qdrant.js +273 -0
  35. package/dist/daemon/qdrant.js.map +1 -0
  36. package/dist/daemon/qdrant.test.d.ts +8 -0
  37. package/dist/daemon/qdrant.test.d.ts.map +1 -0
  38. package/dist/daemon/qdrant.test.js +209 -0
  39. package/dist/daemon/qdrant.test.js.map +1 -0
  40. package/dist/daemon/relations.d.ts +54 -0
  41. package/dist/daemon/relations.d.ts.map +1 -0
  42. package/dist/daemon/relations.js +290 -0
  43. package/dist/daemon/relations.js.map +1 -0
  44. package/dist/daemon/staleness.d.ts +24 -0
  45. package/dist/daemon/staleness.d.ts.map +1 -0
  46. package/dist/daemon/staleness.js +63 -0
  47. package/dist/daemon/staleness.js.map +1 -0
  48. package/dist/daemon/watcher.d.ts +11 -0
  49. package/dist/daemon/watcher.d.ts.map +1 -0
  50. package/dist/daemon/watcher.js +38 -0
  51. package/dist/daemon/watcher.js.map +1 -0
  52. package/dist/daemon/watcher.test.d.ts +8 -0
  53. package/dist/daemon/watcher.test.d.ts.map +1 -0
  54. package/dist/daemon/watcher.test.js +214 -0
  55. package/dist/daemon/watcher.test.js.map +1 -0
  56. package/dist/install.d.ts +5 -0
  57. package/dist/install.d.ts.map +1 -0
  58. package/dist/install.js +49 -0
  59. package/dist/install.js.map +1 -0
  60. package/dist/install.test.d.ts +9 -0
  61. package/dist/install.test.d.ts.map +1 -0
  62. package/dist/install.test.js +126 -0
  63. package/dist/install.test.js.map +1 -0
  64. package/dist/llm/embedding.d.ts +13 -0
  65. package/dist/llm/embedding.d.ts.map +1 -0
  66. package/dist/llm/embedding.js +127 -0
  67. package/dist/llm/embedding.js.map +1 -0
  68. package/dist/llm/embedding.test.d.ts +8 -0
  69. package/dist/llm/embedding.test.d.ts.map +1 -0
  70. package/dist/llm/embedding.test.js +117 -0
  71. package/dist/llm/embedding.test.js.map +1 -0
  72. package/dist/llm/index.d.ts +4 -0
  73. package/dist/llm/index.d.ts.map +1 -0
  74. package/dist/llm/index.js +3 -0
  75. package/dist/llm/index.js.map +1 -0
  76. package/dist/llm/inference.d.ts +12 -0
  77. package/dist/llm/inference.d.ts.map +1 -0
  78. package/dist/llm/inference.js +146 -0
  79. package/dist/llm/inference.js.map +1 -0
  80. package/dist/llm/inference.test.d.ts +8 -0
  81. package/dist/llm/inference.test.d.ts.map +1 -0
  82. package/dist/llm/inference.test.js +117 -0
  83. package/dist/llm/inference.test.js.map +1 -0
  84. package/dist/llm/types.d.ts +41 -0
  85. package/dist/llm/types.d.ts.map +1 -0
  86. package/dist/llm/types.js +5 -0
  87. package/dist/llm/types.js.map +1 -0
  88. package/dist/logger.d.ts +13 -0
  89. package/dist/logger.d.ts.map +1 -0
  90. package/dist/logger.js +41 -0
  91. package/dist/logger.js.map +1 -0
  92. package/dist/mcp/api.d.ts +30 -0
  93. package/dist/mcp/api.d.ts.map +1 -0
  94. package/dist/mcp/api.js +150 -0
  95. package/dist/mcp/api.js.map +1 -0
  96. package/dist/mcp/helpers.d.ts +35 -0
  97. package/dist/mcp/helpers.d.ts.map +1 -0
  98. package/dist/mcp/helpers.js +152 -0
  99. package/dist/mcp/helpers.js.map +1 -0
  100. package/dist/mcp/helpers.test.d.ts +5 -0
  101. package/dist/mcp/helpers.test.d.ts.map +1 -0
  102. package/dist/mcp/helpers.test.js +487 -0
  103. package/dist/mcp/helpers.test.js.map +1 -0
  104. package/dist/mcp/index.d.ts +9 -0
  105. package/dist/mcp/index.d.ts.map +1 -0
  106. package/dist/mcp/index.js +67 -0
  107. package/dist/mcp/index.js.map +1 -0
  108. package/dist/mcp/taxonomy.d.ts +38 -0
  109. package/dist/mcp/taxonomy.d.ts.map +1 -0
  110. package/dist/mcp/taxonomy.js +223 -0
  111. package/dist/mcp/taxonomy.js.map +1 -0
  112. package/dist/mcp/taxonomy.test.d.ts +5 -0
  113. package/dist/mcp/taxonomy.test.d.ts.map +1 -0
  114. package/dist/mcp/taxonomy.test.js +341 -0
  115. package/dist/mcp/taxonomy.test.js.map +1 -0
  116. package/dist/mcp/tools.d.ts +6 -0
  117. package/dist/mcp/tools.d.ts.map +1 -0
  118. package/dist/mcp/tools.js +958 -0
  119. package/dist/mcp/tools.js.map +1 -0
  120. package/dist/mcp/types.d.ts +118 -0
  121. package/dist/mcp/types.d.ts.map +1 -0
  122. package/dist/mcp/types.js +5 -0
  123. package/dist/mcp/types.js.map +1 -0
  124. package/package.json +56 -0
@@ -0,0 +1,448 @@
1
+ /**
2
+ * Daemon-Driven Memory Consolidation
3
+ *
4
+ * Periodic maintenance tasks that keep memory lean and accurate:
5
+ * - Auto-distillation: consolidate session summaries into patterns
6
+ * - Contradiction detection: find and resolve conflicting facts
7
+ * - Category rebalancing: consolidate oversized categories
8
+ * - Decay scoring: downrank stale, unreferenced facts
9
+ * - Health report: generate a memory health report
10
+ * - Memory brief: generate a compact orientation doc from top facts
11
+ */
12
+ import { mkdirSync, writeFileSync } from "node:fs";
13
+ import { join, dirname } from "node:path";
14
+ import { createHash } from "node:crypto";
15
+ import * as qdrant from "./qdrant.js";
16
+ import { chatCompletion } from "../llm/index.js";
17
+ import { categoryValues } from "../mcp/taxonomy.js";
18
+ import { STATE_DIR } from "../config.js";
19
+ // ---------------------------------------------------------------------------
20
+ // State
21
+ // ---------------------------------------------------------------------------
22
+ const CATEGORIES = categoryValues();
23
+ let logFn = () => { };
24
+ const setLogger = (fn) => { logFn = fn; };
25
+ const MEMORY_BRIEF_PATH = join(STATE_DIR, "brief.md");
26
+ // ─── P3.1 Auto-Distillation ──────────────────────────────────────────────
27
+ /**
28
+ * Check for undistilled session summaries and consolidate them.
29
+ * Triggered periodically from daemon tick.
30
+ */
31
+ const autoDistill = async (_config, { minSummaries = 5 } = {}) => {
32
+ if (!qdrant.isReady())
33
+ return { distilled: false };
34
+ try {
35
+ // Find undistilled session summaries (support both legacy and new taxonomy)
36
+ const legacyFilter = {
37
+ must: [
38
+ { key: "category", match: { value: "session_summary" } },
39
+ { is_null: { key: "superseded_by" } },
40
+ ],
41
+ };
42
+ const newFilter = {
43
+ must: [
44
+ { key: "kind", match: { value: "summary" } },
45
+ { is_null: { key: "superseded_by" } },
46
+ ],
47
+ };
48
+ const [legacyRes, newRes] = await Promise.all([
49
+ qdrant.qdrantRequest("POST", `/collections/${qdrant.collection}/points/scroll`, {
50
+ filter: legacyFilter, limit: 50, with_payload: true,
51
+ }),
52
+ qdrant.qdrantRequest("POST", `/collections/${qdrant.collection}/points/scroll`, {
53
+ filter: newFilter, limit: 50, with_payload: true,
54
+ }),
55
+ ]);
56
+ // Deduplicate by ID
57
+ const seen = new Set();
58
+ const points = [];
59
+ for (const pt of [...(legacyRes.result?.points || []), ...(newRes.result?.points || [])]) {
60
+ if (!seen.has(pt.id)) {
61
+ seen.add(pt.id);
62
+ points.push(pt);
63
+ }
64
+ }
65
+ if (points.length < minSummaries) {
66
+ return { distilled: false, count: points.length };
67
+ }
68
+ // Sort by date (oldest first)
69
+ points.sort((a, b) => (a.payload?.created_at || "").localeCompare(b.payload?.created_at || ""));
70
+ // Take the oldest batch (up to 20)
71
+ const batch = points.slice(0, 20);
72
+ const summaryTexts = batch.map(pt => `[${pt.payload?.created_at?.slice(0, 10)}] ${pt.payload?.content}`).join("\n");
73
+ const raw = await chatCompletion({
74
+ messages: [
75
+ { role: "system", content: "You consolidate session summaries into high-level patterns. Output only valid JSON." },
76
+ { role: "user", content: `Consolidate these ${batch.length} session summaries into 3-5 distilled patterns.
77
+
78
+ ## Session Summaries:
79
+ ${summaryTexts}
80
+
81
+ ## Output (JSON array):
82
+ Each object: { "content": "pattern description (1-2 sentences)", "entities": ["entity1", "entity2"], "importance": 0.0-1.0 }
83
+
84
+ Return ONLY the JSON array.` },
85
+ ],
86
+ temperature: 0.2,
87
+ max_tokens: 1000,
88
+ });
89
+ if (!raw) {
90
+ logFn("WARN", "Auto-distill LLM returned empty");
91
+ return { distilled: false };
92
+ }
93
+ const jsonStr = raw.replace(/^```json?\n?/, "").replace(/\n?```$/, "").trim();
94
+ const patterns = JSON.parse(jsonStr);
95
+ if (!Array.isArray(patterns) || patterns.length === 0)
96
+ return { distilled: false };
97
+ // Store distilled patterns
98
+ for (const pattern of patterns) {
99
+ if (!pattern.content)
100
+ continue;
101
+ const hash = createHash("sha256").update(`distilled:${pattern.content}`).digest("hex");
102
+ await qdrant.storeFact({
103
+ content: pattern.content,
104
+ category: "observation",
105
+ domain: "work",
106
+ kind: "distilled",
107
+ entities: Array.isArray(pattern.entities) ? pattern.entities.map(e => String(e).toLowerCase()) : [],
108
+ source: "system",
109
+ confidence: 0.85,
110
+ importance: pattern.importance || 0.7,
111
+ content_hash: hash,
112
+ metadata: { distilled_from: batch.length.toString(), distilled_at: new Date().toISOString() },
113
+ });
114
+ }
115
+ // Supersede the source summaries
116
+ for (const pt of batch) {
117
+ await qdrant.supersedeFact(pt.id, `distilled:${new Date().toISOString()}`);
118
+ }
119
+ logFn("INFO", `Auto-distill: consolidated ${batch.length} summaries into ${patterns.length} patterns`);
120
+ return { distilled: true, count: patterns.length };
121
+ }
122
+ catch (e) {
123
+ logFn("ERROR", `Auto-distill failed: ${e.message}`);
124
+ return { distilled: false };
125
+ }
126
+ };
127
+ // ─── P3.2 Contradiction Detection ────────────────────────────────────────
128
+ /**
129
+ * Check a newly extracted fact for contradictions with existing facts.
130
+ * Called during extraction for high-importance facts.
131
+ */
132
+ const detectContradiction = async (fact, _config) => {
133
+ if (!qdrant.isReady())
134
+ return { contradiction: false };
135
+ if ((fact.importance || 0) < 0.5)
136
+ return { contradiction: false };
137
+ try {
138
+ const vector = await qdrant.embed(fact.content);
139
+ const results = await qdrant.qdrantRequest("POST", `/collections/${qdrant.collection}/points/search`, {
140
+ vector,
141
+ filter: {
142
+ must: [
143
+ { key: "category", match: { value: fact.category } },
144
+ { is_null: { key: "superseded_by" } },
145
+ ],
146
+ },
147
+ limit: 3,
148
+ with_payload: true,
149
+ });
150
+ const candidates = (results.result || [])
151
+ .filter(r => r.score >= 0.75 && r.score < 0.92);
152
+ if (candidates.length === 0)
153
+ return { contradiction: false };
154
+ // Use LLM to check if any candidate contradicts the new fact
155
+ const candidateTexts = candidates.map(c => `ID: ${c.id}\nFact: ${c.payload?.content}\nSimilarity: ${c.score.toFixed(3)}`).join("\n\n");
156
+ const raw = await chatCompletion({
157
+ messages: [
158
+ { role: "system", content: "You detect contradictions between facts. Output only valid JSON." },
159
+ { role: "user", content: `Does the NEW fact contradict any of the EXISTING facts?
160
+
161
+ NEW FACT: ${fact.content}
162
+
163
+ EXISTING FACTS:
164
+ ${candidateTexts}
165
+
166
+ If a contradiction exists, return: {"contradiction": true, "existing_id": "the contradicted fact ID", "reason": "brief explanation"}
167
+ If no contradiction: {"contradiction": false}
168
+
169
+ Return ONLY the JSON object.` },
170
+ ],
171
+ temperature: 0.1,
172
+ max_tokens: 200,
173
+ });
174
+ if (!raw)
175
+ return { contradiction: false };
176
+ const result = JSON.parse(raw.replace(/^```json?\n?/, "").replace(/\n?```$/, "").trim());
177
+ if (result.contradiction && result.existing_id) {
178
+ logFn("INFO", `Contradiction detected: "${fact.content}" vs existing ${result.existing_id}: ${result.reason}`);
179
+ return {
180
+ contradiction: true,
181
+ existingId: result.existing_id,
182
+ existingContent: candidates.find(c => c.id === result.existing_id)?.payload?.content,
183
+ reason: result.reason,
184
+ };
185
+ }
186
+ return { contradiction: false };
187
+ }
188
+ catch (e) {
189
+ logFn("WARN", `Contradiction detection failed: ${e.message}`);
190
+ return { contradiction: false };
191
+ }
192
+ };
193
+ // ─── P3.3 Category Rebalancing ───────────────────────────────────────────
194
+ /**
195
+ * Check for oversized categories and consolidate them.
196
+ */
197
+ const rebalanceCategories = async (_config, threshold = 100, postFn) => {
198
+ if (!qdrant.isReady())
199
+ return { rebalanced: false };
200
+ const categories = CATEGORIES;
201
+ const oversized = [];
202
+ try {
203
+ for (const category of categories) {
204
+ const count = await qdrant.qdrantRequest("POST", `/collections/${qdrant.collection}/points/count`, {
205
+ filter: {
206
+ must: [
207
+ { key: "category", match: { value: category } },
208
+ { is_null: { key: "superseded_by" } },
209
+ ],
210
+ },
211
+ exact: true,
212
+ });
213
+ const factCount = count.result?.count || 0;
214
+ if (factCount > threshold) {
215
+ oversized.push({ category, count: factCount });
216
+ }
217
+ }
218
+ if (oversized.length === 0)
219
+ return { rebalanced: false };
220
+ const lines = oversized.map(o => ` • ${o.category}: ${o.count} facts (threshold: ${threshold})`);
221
+ const message = `⚠️ Memory Rebalance Alert\n\nOversized categories:\n${lines.join("\n")}\n\nConsider consolidating or archiving older facts.`;
222
+ logFn("INFO", `Rebalance: ${oversized.length} oversized categories detected`);
223
+ if (postFn) {
224
+ postFn(message).catch(() => { });
225
+ }
226
+ return { rebalanced: false, category: oversized[0].category, factCount: oversized[0].count, threshold, needsAttention: true };
227
+ }
228
+ catch (e) {
229
+ logFn("WARN", `Category rebalancing check failed: ${e.message}`);
230
+ return { rebalanced: false };
231
+ }
232
+ };
233
+ // ─── P3.5 Memory Health Report ───────────────────────────────────────────
234
+ /**
235
+ * Generate a memory health report.
236
+ */
237
+ const generateHealthReport = async () => {
238
+ if (!qdrant.isReady())
239
+ return null;
240
+ try {
241
+ const categories = [...CATEGORIES];
242
+ const stats = {};
243
+ let total = 0;
244
+ for (const cat of categories) {
245
+ const count = await qdrant.qdrantRequest("POST", `/collections/${qdrant.collection}/points/count`, {
246
+ filter: {
247
+ must: [
248
+ { key: "category", match: { value: cat } },
249
+ { is_null: { key: "superseded_by" } },
250
+ ],
251
+ },
252
+ exact: true,
253
+ });
254
+ stats[cat] = count.result?.count || 0;
255
+ total += stats[cat];
256
+ }
257
+ // Count by kind
258
+ for (const kind of ["summary", "distilled", "relation"]) {
259
+ const count = await qdrant.qdrantRequest("POST", `/collections/${qdrant.collection}/points/count`, {
260
+ filter: {
261
+ must: [
262
+ { key: "kind", match: { value: kind } },
263
+ { is_null: { key: "superseded_by" } },
264
+ ],
265
+ },
266
+ exact: true,
267
+ });
268
+ stats[kind] = count.result?.count || 0;
269
+ }
270
+ // Count daemon-extracted
271
+ const daemonCount = await qdrant.qdrantRequest("POST", `/collections/${qdrant.collection}/points/count`, {
272
+ filter: {
273
+ must: [
274
+ { key: "source", match: { value: "daemon" } },
275
+ { is_null: { key: "superseded_by" } },
276
+ ],
277
+ },
278
+ exact: true,
279
+ });
280
+ // Count facts added in last 7 days
281
+ const weekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
282
+ const recentCount = await qdrant.qdrantRequest("POST", `/collections/${qdrant.collection}/points/count`, {
283
+ filter: {
284
+ must: [
285
+ { key: "created_at", range: { gte: weekAgo } },
286
+ { is_null: { key: "superseded_by" } },
287
+ ],
288
+ },
289
+ exact: true,
290
+ });
291
+ return {
292
+ total,
293
+ byCategory: stats,
294
+ daemonExtracted: daemonCount.result?.count || 0,
295
+ addedThisWeek: recentCount.result?.count || 0,
296
+ generatedAt: new Date().toISOString(),
297
+ };
298
+ }
299
+ catch (e) {
300
+ logFn("ERROR", `Health report generation failed: ${e.message}`);
301
+ return null;
302
+ }
303
+ };
304
+ /**
305
+ * Format health report as a readable string.
306
+ */
307
+ const formatHealthReport = (report) => {
308
+ if (!report)
309
+ return "Memory health report unavailable";
310
+ const lines = [
311
+ `Memory Health Report — ${new Date(report.generatedAt).toLocaleDateString()}`,
312
+ "",
313
+ `Total facts: ${report.total}`,
314
+ `Added this week: ${report.addedThisWeek}`,
315
+ `Daemon-extracted: ${report.daemonExtracted}`,
316
+ "",
317
+ "By category:",
318
+ ];
319
+ for (const [cat, count] of Object.entries(report.byCategory)) {
320
+ const bar = "█".repeat(Math.min(20, Math.ceil(count / 5)));
321
+ lines.push(` ${cat}: ${count} ${bar}`);
322
+ }
323
+ return lines.join("\n");
324
+ };
325
+ // ─── P3.6 Compact Memory Brief ──────────────────────────────────────────
326
+ /**
327
+ * Generate a compact memory brief from top facts.
328
+ * Written to ~/.bikky/state/brief.md for agent orientation.
329
+ */
330
+ const generateMemoryBrief = async (_config) => {
331
+ if (!qdrant.isReady())
332
+ return false;
333
+ try {
334
+ // Fetch top facts from each category (importance-weighted)
335
+ const sections = {};
336
+ const categories = CATEGORIES;
337
+ for (const cat of categories) {
338
+ const result = await qdrant.qdrantRequest("POST", `/collections/${qdrant.collection}/points/scroll`, {
339
+ filter: {
340
+ must: [
341
+ { key: "category", match: { value: cat } },
342
+ { is_null: { key: "superseded_by" } },
343
+ ],
344
+ },
345
+ limit: 30,
346
+ with_payload: true,
347
+ });
348
+ const points = (result.result?.points || [])
349
+ .sort((a, b) => (b.payload?.importance || 0) - (a.payload?.importance || 0))
350
+ .slice(0, 10);
351
+ if (points.length > 0) {
352
+ sections[cat] = points.map(pt => pt.payload?.content).filter(Boolean);
353
+ }
354
+ }
355
+ if (Object.keys(sections).length === 0)
356
+ return false;
357
+ // Use LLM to synthesize into a structured brief
358
+ const factsText = Object.entries(sections)
359
+ .map(([cat, facts]) => `### ${cat}\n${facts.map(f => `- ${f}`).join("\n")}`)
360
+ .join("\n\n");
361
+ const brief = await chatCompletion({
362
+ messages: [
363
+ { role: "system", content: "You generate concise orientation documents for AI agents. Write in a structured, scannable format." },
364
+ { role: "user", content: `Generate a compact memory brief from these facts. This brief will be loaded by AI agents at session start for orientation.
365
+
366
+ ## Facts by Category:
367
+ ${factsText}
368
+
369
+ ## Output Format (markdown):
370
+ # Memory Brief
371
+ Generated: [date]
372
+
373
+ ## Key People & Team
374
+ [who matters and their roles]
375
+
376
+ ## Active Projects
377
+ [what's in progress, blocked, recently completed]
378
+
379
+ ## Infrastructure Overview
380
+ [key services, databases, deployment details]
381
+
382
+ ## Recent Decisions
383
+ [important architectural/technical decisions]
384
+
385
+ ## Known Gotchas
386
+ [errors, workarounds, caveats to watch for]
387
+
388
+ ## Preferences & Conventions
389
+ [user/team preferences, coding style, etc.]
390
+
391
+ Keep each section to 3-5 bullet points. Omit empty sections. Be factual, not chatty.` },
392
+ ],
393
+ temperature: 0.2,
394
+ max_tokens: 1500,
395
+ });
396
+ if (!brief)
397
+ return false;
398
+ // Write to disk
399
+ mkdirSync(dirname(MEMORY_BRIEF_PATH), { recursive: true });
400
+ writeFileSync(MEMORY_BRIEF_PATH, brief + "\n", "utf8");
401
+ logFn("INFO", `Memory brief generated: ${MEMORY_BRIEF_PATH} (${brief.length} chars)`);
402
+ return true;
403
+ }
404
+ catch (e) {
405
+ logFn("ERROR", `Memory brief generation failed: ${e.message}`);
406
+ return false;
407
+ }
408
+ };
409
+ // ─── Consolidation Tick ──────────────────────────────────────────────────
410
+ // Counters for periodic tasks
411
+ let consolidationTickCount = 0;
412
+ /**
413
+ * Main consolidation tick — called from daemon tick loop.
414
+ * Spreads out expensive operations across different tick intervals.
415
+ */
416
+ const tick = async (config, opts = {}) => {
417
+ if (!qdrant.isReady())
418
+ return;
419
+ if (config.daemon.consolidation_enabled === false)
420
+ return;
421
+ consolidationTickCount++;
422
+ // Auto-distillation: every ~100 ticks (500s = ~8 min)
423
+ if (consolidationTickCount % 100 === 0) {
424
+ await autoDistill(config).catch(e => logFn("ERROR", `Auto-distill tick failed: ${e.message}`));
425
+ }
426
+ // Category rebalancing check: every ~500 ticks (2500s = ~40 min)
427
+ if (consolidationTickCount % 500 === 0) {
428
+ await rebalanceCategories(config, 100, opts.postHealthFn).catch(e => logFn("ERROR", `Category rebalance tick failed: ${e.message}`));
429
+ }
430
+ // Memory brief regeneration: every ~2000 ticks (10000s = ~2.7 hours)
431
+ if (consolidationTickCount % 2000 === 0) {
432
+ await generateMemoryBrief(config).catch(e => logFn("ERROR", `Memory brief tick failed: ${e.message}`));
433
+ }
434
+ // Health report: every ~5000 ticks (25000s = ~7 hours)
435
+ if (consolidationTickCount % 5000 === 0 && opts.postHealthFn) {
436
+ const report = await generateHealthReport().catch(() => null);
437
+ if (report) {
438
+ const text = formatHealthReport(report);
439
+ opts.postHealthFn(text).catch(() => { });
440
+ }
441
+ }
442
+ };
443
+ /** Reset state (for testing). */
444
+ const _reset = () => {
445
+ consolidationTickCount = 0;
446
+ };
447
+ export { detectContradiction, tick, setLogger, _reset, };
448
+ //# sourceMappingURL=consolidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidation.js","sourceRoot":"","sources":["../../src/daemon/consolidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwCzC,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,UAAU,GAAa,cAAc,EAAE,CAAC;AAE9C,IAAI,KAAK,GAAU,GAAG,EAAE,GAAE,CAAC,CAAC;AAC5B,MAAM,SAAS,GAAG,CAAC,EAAS,EAAQ,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAEvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAEtD,4EAA4E;AAE5E;;;GAGG;AACH,MAAM,WAAW,GAAG,KAAK,EACvB,OAAoB,EACpB,EAAE,YAAY,GAAG,CAAC,KAAgC,EAAE,EAC5B,EAAE;IAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAEnD,IAAI,CAAC;QACH,4EAA4E;QAC5E,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE;gBACJ,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE;gBACxD,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE;aACtC;SACF,CAAC;QACF,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE;gBACJ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;gBAC5C,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE;aACtC;SACF,CAAC;QAIF,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5C,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,MAAM,CAAC,UAAU,gBAAgB,EAAE;gBAC9E,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;aACpD,CAA4B;YAC7B,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,MAAM,CAAC,UAAU,gBAAgB,EAAE;gBAC9E,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;aACjD,CAA4B;SAC9B,CAAC,CAAC;QAEH,oBAAoB;QACpB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAAmD,EAAE,CAAC;QAClE,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACzF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YACjC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACpD,CAAC;QAED,8BAA8B;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;QAEhG,mCAAmC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAClC,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CACnE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC;YAC/B,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qFAAqF,EAAE;gBAClH,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,KAAK,CAAC,MAAM;;;EAGhE,YAAY;;;;;4BAKc,EAAE;aACvB;YACD,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,KAAK,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;YACjD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAIjC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAEnF,2BAA2B;QAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,SAAS;YAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvF,MAAM,MAAM,CAAC,SAAS,CAAC;gBACrB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,aAAa;gBACvB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnG,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,GAAG;gBACrC,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;aAC9F,CAAC,CAAC;QACL,CAAC;QAED,iCAAiC;QACjC,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,KAAK,CAAC,MAAM,EAAE,8BAA8B,KAAK,CAAC,MAAM,mBAAmB,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;QACvG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,OAAO,EAAE,wBAAyB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC,CAAC;AAEF,4EAA4E;AAE5E;;;GAGG;AACH,MAAM,mBAAmB,GAAG,KAAK,EAC/B,IAAoF,EACpF,OAAoB,EACU,EAAE;IAChC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACvD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,GAAG;QAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,MAAM,CAAC,UAAU,gBAAgB,EAAE;YACpG,MAAM;YACN,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE;oBACpD,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE;iBACtC;aACF;YACD,KAAK,EAAE,CAAC;YACR,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAmE;aACzG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QAE7D,6DAA6D;QAC7D,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACxC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,OAAO,EAAE,OAAO,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAC9E,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEf,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC;YAC/B,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,kEAAkE,EAAE;gBAC/F,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;;YAErB,IAAI,CAAC,OAAO;;;EAGtB,cAAc;;;;;6BAKa,EAAE;aACxB;YACD,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAItF,CAAC;QACF,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC/C,KAAK,CAAC,MAAM,EAAE,4BAA4B,IAAI,CAAC,OAAO,iBAAiB,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/G,OAAO;gBACL,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,MAAM,CAAC,WAAW;gBAC9B,eAAe,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO;gBACpF,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,MAAM,EAAE,mCAAoC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;AACH,CAAC,CAAC;AAEF,4EAA4E;AAE5E;;GAEG;AACH,MAAM,mBAAmB,GAAG,KAAK,EAC/B,OAAoB,EACpB,SAAS,GAAG,GAAG,EACf,MAAiD,EACvB,EAAE;IAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAEpD,MAAM,UAAU,GAAG,UAAU,CAAC;IAC9B,MAAM,SAAS,GAA+C,EAAE,CAAC;IACjE,IAAI,CAAC;QACH,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,MAAM,CAAC,UAAU,eAAe,EAAE;gBACjG,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;wBAC/C,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE;qBACtC;iBACF;gBACD,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,MAAM,SAAS,GAAI,KAAK,CAAC,MAA6B,EAAE,KAAK,IAAI,CAAC,CAAC;YACnE,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;gBAC1B,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QAEzD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,sBAAsB,SAAS,GAAG,CAAC,CAAC;QAClG,MAAM,OAAO,GAAG,uDAAuD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sDAAsD,CAAC;QAC9I,KAAK,CAAC,MAAM,EAAE,cAAc,SAAS,CAAC,MAAM,gCAAgC,CAAC,CAAC;QAE9E,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAc,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAClI,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,MAAM,EAAE,sCAAuC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAEF,4EAA4E;AAE5E;;GAEG;AACH,MAAM,oBAAoB,GAAG,KAAK,IAAkC,EAAE;IACpE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;QACnC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,MAAM,CAAC,UAAU,eAAe,EAAE;gBACjG,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;wBAC1C,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE;qBACtC;iBACF;gBACD,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,KAAK,CAAC,GAAG,CAAC,GAAI,KAAK,CAAC,MAA6B,EAAE,KAAK,IAAI,CAAC,CAAC;YAC9D,KAAK,IAAI,KAAK,CAAC,GAAG,CAAE,CAAC;QACvB,CAAC;QAED,gBAAgB;QAChB,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,MAAM,CAAC,UAAU,eAAe,EAAE;gBACjG,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;wBACvC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE;qBACtC;iBACF;gBACD,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,MAA6B,EAAE,KAAK,IAAI,CAAC,CAAC;QACjE,CAAC;QAED,yBAAyB;QACzB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,MAAM,CAAC,UAAU,eAAe,EAAE;YACvG,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;oBAC7C,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE;iBACtC;aACF;YACD,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7E,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,MAAM,CAAC,UAAU,eAAe,EAAE;YACvG,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;oBAC9C,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE;iBACtC;aACF;YACD,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,UAAU,EAAE,KAAK;YACjB,eAAe,EAAG,WAAW,CAAC,MAA6B,EAAE,KAAK,IAAI,CAAC;YACvE,aAAa,EAAG,WAAW,CAAC,MAA6B,EAAE,KAAK,IAAI,CAAC;YACrE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,OAAO,EAAE,oCAAqC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAG,CAAC,MAA2B,EAAU,EAAE;IACjE,IAAI,CAAC,MAAM;QAAE,OAAO,kCAAkC,CAAC;IAEvD,MAAM,KAAK,GAAG;QACZ,0BAA0B,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,EAAE;QAC7E,EAAE;QACF,gBAAgB,MAAM,CAAC,KAAK,EAAE;QAC9B,oBAAoB,MAAM,CAAC,aAAa,EAAE;QAC1C,qBAAqB,MAAM,CAAC,eAAe,EAAE;QAC7C,EAAE;QACF,cAAc;KACf,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,2EAA2E;AAE3E;;;GAGG;AACH,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAoB,EAAoB,EAAE;IAC3E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAAE,OAAO,KAAK,CAAC;IAEpC,IAAI,CAAC;QACH,2DAA2D;QAC3D,MAAM,QAAQ,GAA6B,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,UAAU,CAAC;QAE9B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,MAAM,CAAC,UAAU,gBAAgB,EAAE;gBACnG,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;wBAC1C,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE;qBACtC;iBACF;gBACD,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,IAAI;aACnB,CAAiE,CAAC;YAEnE,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;iBACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC;iBAC3E,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEhB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;YACpF,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAErD,gDAAgD;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;aACvC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aAC3E,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC;YACjC,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oGAAoG,EAAE;gBACjI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;;;EAG/B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;qFAwB0E,EAAE;aAChF;YACD,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,gBAAgB;QAChB,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,aAAa,CAAC,iBAAiB,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACvD,KAAK,CAAC,MAAM,EAAE,2BAA2B,iBAAiB,KAAK,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,OAAO,EAAE,mCAAoC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,4EAA4E;AAE5E,8BAA8B;AAC9B,IAAI,sBAAsB,GAAG,CAAC,CAAC;AAE/B;;;GAGG;AACH,MAAM,IAAI,GAAG,KAAK,EAAE,MAAmB,EAAE,OAAiC,EAAE,EAAiB,EAAE;IAC7F,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAAE,OAAO;IAC9B,IAAI,MAAM,CAAC,MAAM,CAAC,qBAAqB,KAAK,KAAK;QAAE,OAAO;IAC1D,sBAAsB,EAAE,CAAC;IAEzB,sDAAsD;IACtD,IAAI,sBAAsB,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAClC,KAAK,CAAC,OAAO,EAAE,6BAA8B,CAAW,CAAC,OAAO,EAAE,CAAC,CACpE,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,IAAI,sBAAsB,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAClE,KAAK,CAAC,OAAO,EAAE,mCAAoC,CAAW,CAAC,OAAO,EAAE,CAAC,CAC1E,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,IAAI,sBAAsB,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAC1C,KAAK,CAAC,OAAO,EAAE,6BAA8B,CAAW,CAAC,OAAO,EAAE,CAAC,CACpE,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,IAAI,sBAAsB,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAc,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,iCAAiC;AACjC,MAAM,MAAM,GAAG,GAAS,EAAE;IACxB,sBAAsB,GAAG,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,OAAO,EACL,mBAAmB,EACnB,IAAI,EACJ,SAAS,EACT,MAAM,GACP,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Events-based memory extraction — reads Copilot CLI events.jsonl transcripts,
3
+ * extracts facts via LLM, and stores them in Qdrant with source: "daemon".
4
+ *
5
+ * Uses a JSON file for extraction state (high-water byte offsets) instead of SQLite.
6
+ * Active session detection scans ~/.copilot/session-state/ for lock files.
7
+ */
8
+ import type { BikkyConfig } from "../config.js";
9
+ import type { LogFn } from "./qdrant.js";
10
+ export declare const setLogger: (fn: LogFn) => void;
11
+ /**
12
+ * Periodic extraction tick — called from the daemon tick loop.
13
+ * For each active Copilot session with events.jsonl, reads new events
14
+ * since the last high-water mark, extracts facts via LLM, and stores in Qdrant.
15
+ */
16
+ export declare const tick: (config: BikkyConfig) => Promise<void>;
17
+ //# sourceMappingURL=extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction.d.ts","sourceRoot":"","sources":["../../src/daemon/extraction.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,OAAO,KAAK,EAAE,KAAK,EAAa,MAAM,aAAa,CAAC;AAOpD,eAAO,MAAM,SAAS,GAAI,IAAI,KAAK,KAAG,IAErC,CAAC;AAuZF;;;;GAIG;AACH,eAAO,MAAM,IAAI,GAAU,QAAQ,WAAW,KAAG,OAAO,CAAC,IAAI,CA8B5D,CAAC"}