funolio-agent 0.12.2 → 0.13.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 (70) hide show
  1. package/dist/backfill.d.ts +71 -0
  2. package/dist/backfill.d.ts.map +1 -0
  3. package/dist/backfill.js +637 -0
  4. package/dist/backfill.js.map +1 -0
  5. package/dist/clerk-model.d.ts +28 -2
  6. package/dist/clerk-model.d.ts.map +1 -1
  7. package/dist/clerk-model.js +90 -29
  8. package/dist/clerk-model.js.map +1 -1
  9. package/dist/cli.js +36 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config-cleanup.d.ts +35 -0
  12. package/dist/config-cleanup.d.ts.map +1 -0
  13. package/dist/config-cleanup.js +167 -0
  14. package/dist/config-cleanup.js.map +1 -0
  15. package/dist/context-window.d.ts +79 -0
  16. package/dist/context-window.d.ts.map +1 -0
  17. package/dist/context-window.js +192 -0
  18. package/dist/context-window.js.map +1 -0
  19. package/dist/local-data.d.ts +110 -0
  20. package/dist/local-data.d.ts.map +1 -1
  21. package/dist/local-data.js +219 -3
  22. package/dist/local-data.js.map +1 -1
  23. package/dist/local-db.d.ts.map +1 -1
  24. package/dist/local-db.js +116 -3
  25. package/dist/local-db.js.map +1 -1
  26. package/dist/local-server.d.ts.map +1 -1
  27. package/dist/local-server.js +567 -29
  28. package/dist/local-server.js.map +1 -1
  29. package/dist/mcp/claude-config-writer.d.ts +28 -0
  30. package/dist/mcp/claude-config-writer.d.ts.map +1 -0
  31. package/dist/mcp/claude-config-writer.js +125 -0
  32. package/dist/mcp/claude-config-writer.js.map +1 -0
  33. package/dist/mcp/local-memory-server.d.ts.map +1 -1
  34. package/dist/mcp/local-memory-server.js +27 -2
  35. package/dist/mcp/local-memory-server.js.map +1 -1
  36. package/dist/mcp/manager.d.ts +4 -0
  37. package/dist/mcp/manager.d.ts.map +1 -1
  38. package/dist/mcp/manager.js +19 -0
  39. package/dist/mcp/manager.js.map +1 -1
  40. package/dist/mcp/marketplace.d.ts +52 -0
  41. package/dist/mcp/marketplace.d.ts.map +1 -0
  42. package/dist/mcp/marketplace.js +144 -0
  43. package/dist/mcp/marketplace.js.map +1 -0
  44. package/dist/orchestration/safeguards.d.ts +29 -0
  45. package/dist/orchestration/safeguards.d.ts.map +1 -0
  46. package/dist/orchestration/safeguards.js +32 -0
  47. package/dist/orchestration/safeguards.js.map +1 -0
  48. package/dist/orchestration/status-parser.d.ts +10 -6
  49. package/dist/orchestration/status-parser.d.ts.map +1 -1
  50. package/dist/orchestration/status-parser.js +35 -19
  51. package/dist/orchestration/status-parser.js.map +1 -1
  52. package/dist/orchestration/topic-normalizer.d.ts +15 -0
  53. package/dist/orchestration/topic-normalizer.d.ts.map +1 -0
  54. package/dist/orchestration/topic-normalizer.js +65 -0
  55. package/dist/orchestration/topic-normalizer.js.map +1 -0
  56. package/dist/providers/claude-cli.d.ts.map +1 -1
  57. package/dist/providers/claude-cli.js +8 -1
  58. package/dist/providers/claude-cli.js.map +1 -1
  59. package/dist/summarization-pipeline.d.ts +39 -0
  60. package/dist/summarization-pipeline.d.ts.map +1 -0
  61. package/dist/summarization-pipeline.js +280 -0
  62. package/dist/summarization-pipeline.js.map +1 -0
  63. package/dist/tools/search-local-memory.d.ts.map +1 -1
  64. package/dist/tools/search-local-memory.js +34 -2
  65. package/dist/tools/search-local-memory.js.map +1 -1
  66. package/dist/workflow-engine.d.ts +6 -0
  67. package/dist/workflow-engine.d.ts.map +1 -1
  68. package/dist/workflow-engine.js +174 -11
  69. package/dist/workflow-engine.js.map +1 -1
  70. package/package.json +1 -1
@@ -0,0 +1,637 @@
1
+ "use strict";
2
+ /**
3
+ * Backfill processing for imported/historical conversations.
4
+ *
5
+ * Backfill can:
6
+ * - assign projects (path/keyword + optional clerk hint)
7
+ * - assign/reuse high-level topics
8
+ * - extract decisions/action items/facts
9
+ * - optionally store narrative summaries
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.backfillAll = backfillAll;
46
+ exports.backfillOne = backfillOne;
47
+ exports.backfillConversation = backfillConversation;
48
+ const clerk_model_1 = require("./clerk-model");
49
+ const data = __importStar(require("./local-data"));
50
+ const context_window_1 = require("./context-window");
51
+ const summarization_pipeline_1 = require("./summarization-pipeline");
52
+ const safeguards_1 = require("./orchestration/safeguards");
53
+ const topic_normalizer_1 = require("./orchestration/topic-normalizer");
54
+ function nowSql() {
55
+ return new Date().toISOString().replace('T', ' ').replace('Z', '');
56
+ }
57
+ function buildProjectPatterns(hint) {
58
+ const patterns = [];
59
+ if (hint.folder) {
60
+ const folder = hint.folder.toLowerCase();
61
+ patterns.push(folder);
62
+ patterns.push(folder.replace(/\//g, '\\'));
63
+ patterns.push(folder.replace(/\\/g, '/'));
64
+ }
65
+ if (hint.keywords) {
66
+ for (const raw of hint.keywords.split(',')) {
67
+ const kw = raw.trim().toLowerCase();
68
+ if (kw)
69
+ patterns.push(kw);
70
+ }
71
+ }
72
+ return patterns;
73
+ }
74
+ function getBackfillCandidates(opts) {
75
+ const includeSummaries = opts.includeSummaries === true;
76
+ const db = data.getDb();
77
+ const wheres = [
78
+ 'c.message_count > 0',
79
+ "COALESCE(c.processing_status, '') != 'backfilled'",
80
+ ];
81
+ const params = [];
82
+ if (opts.conversationId) {
83
+ wheres.push('c.id = ?');
84
+ params.push(opts.conversationId);
85
+ }
86
+ if (includeSummaries) {
87
+ wheres.push('c.id NOT IN (SELECT DISTINCT conversation_id FROM conversation_summary)');
88
+ }
89
+ let sql = `
90
+ SELECT c.id, c.agent_id, c.project_id, c.message_count
91
+ FROM conversation c
92
+ WHERE ${wheres.join(' AND ')}
93
+ ORDER BY c.created_at ASC
94
+ `;
95
+ if (typeof opts.maxConversations === 'number' && opts.maxConversations > 0) {
96
+ sql += ' LIMIT ?';
97
+ params.push(opts.maxConversations);
98
+ }
99
+ return db.prepare(sql).all(...params);
100
+ }
101
+ function assignConversationToProject(conversationId, matchers) {
102
+ const db = data.getDb();
103
+ const headMsgs = db.prepare('SELECT content FROM message WHERE conversation_id = ? ORDER BY seq ASC LIMIT 100').all(conversationId);
104
+ const tailMsgs = db.prepare('SELECT content FROM message WHERE conversation_id = ? ORDER BY seq DESC LIMIT 100').all(conversationId);
105
+ const allText = [...headMsgs, ...tailMsgs]
106
+ .map((m) => (m.content || '').toLowerCase())
107
+ .join(' ');
108
+ const scores = [];
109
+ for (const matcher of matchers) {
110
+ let bestLen = 0;
111
+ for (const pattern of matcher.patterns) {
112
+ if (allText.includes(pattern) && pattern.length > bestLen) {
113
+ bestLen = pattern.length;
114
+ }
115
+ }
116
+ if (bestLen > 0)
117
+ scores.push({ id: matcher.id, bestLen });
118
+ }
119
+ if (scores.length === 0)
120
+ return { projectId: null, conflict: false };
121
+ if (scores.length === 1)
122
+ return { projectId: scores[0].id, conflict: false };
123
+ scores.sort((a, b) => b.bestLen - a.bestLen);
124
+ const [best, second] = scores;
125
+ if (best.bestLen > second.bestLen * 1.2) {
126
+ return { projectId: best.id, conflict: false };
127
+ }
128
+ return { projectId: null, conflict: true };
129
+ }
130
+ function buildProjectTopicCatalog(hints = []) {
131
+ const hintMap = new Map();
132
+ for (const hint of hints)
133
+ hintMap.set(hint.id, hint);
134
+ const projects = data.listProjects();
135
+ return projects.map((project) => {
136
+ const hint = hintMap.get(project.id);
137
+ const topics = data.listTopics({ projectId: project.id, limit: 200 }).map((t) => t.title);
138
+ const keywords = hint?.keywords
139
+ ? hint.keywords.split(',').map((k) => k.trim()).filter(Boolean)
140
+ : [];
141
+ return {
142
+ id: project.id,
143
+ name: project.name,
144
+ folder: hint?.folder ?? project.folder ?? null,
145
+ keywords,
146
+ topics,
147
+ };
148
+ });
149
+ }
150
+ function formatProjectCatalogForPrompt(catalog) {
151
+ if (catalog.length === 0)
152
+ return '(none)';
153
+ return catalog.map((project) => {
154
+ const topicText = project.topics.length > 0
155
+ ? project.topics.slice(0, 25).join(', ')
156
+ : '(no topics yet)';
157
+ const keywordText = project.keywords.length > 0
158
+ ? project.keywords.join(', ')
159
+ : '(none)';
160
+ const folderText = project.folder || '(none)';
161
+ return `- id=${project.id}
162
+ name=${project.name}
163
+ folder=${folderText}
164
+ keywords=${keywordText}
165
+ topics=${topicText}`;
166
+ }).join('\n');
167
+ }
168
+ function resolveProjectFromResponse(parsed, catalog) {
169
+ const trimmedId = parsed.projectId?.trim();
170
+ if (trimmedId) {
171
+ const byId = catalog.find((p) => p.id === trimmedId);
172
+ if (byId)
173
+ return byId.id;
174
+ }
175
+ const trimmedName = parsed.projectName?.trim().toLowerCase();
176
+ if (trimmedName) {
177
+ const exact = catalog.find((p) => p.name.toLowerCase() === trimmedName);
178
+ if (exact)
179
+ return exact.id;
180
+ const partial = catalog.find((p) => p.name.toLowerCase().includes(trimmedName) || trimmedName.includes(p.name.toLowerCase()));
181
+ if (partial)
182
+ return partial.id;
183
+ }
184
+ return null;
185
+ }
186
+ function markConversationBackfilled(conversationId) {
187
+ data.updateConversation(conversationId, {
188
+ processingStatus: 'backfilled',
189
+ processedAt: nowSql(),
190
+ });
191
+ }
192
+ function getConversationTopicTitles(conversationId) {
193
+ const db = data.getDb();
194
+ const rows = db.prepare(`
195
+ SELECT t.title
196
+ FROM topic_segment ts
197
+ JOIN topic t ON ts.topic_id = t.id
198
+ WHERE ts.conversation_id = ?
199
+ ORDER BY t.updated_at DESC
200
+ `).all(conversationId);
201
+ const seen = new Set();
202
+ const titles = [];
203
+ for (const row of rows) {
204
+ const key = row.title.trim().toLowerCase();
205
+ if (!key || seen.has(key))
206
+ continue;
207
+ seen.add(key);
208
+ titles.push(row.title);
209
+ }
210
+ return titles;
211
+ }
212
+ async function backfillAll(onProgress, projectHints, options = {}) {
213
+ if (!(0, summarization_pipeline_1.isClerkConfigured)()) {
214
+ throw new Error('Configure a clerk model in Settings -> Orchestration before running backfill');
215
+ }
216
+ const clerk = (0, clerk_model_1.getClerk)();
217
+ if (!clerk)
218
+ throw new Error('Clerk model not available');
219
+ const includeProjectCatalog = options.includeProjectCatalog !== false;
220
+ const conversations = getBackfillCandidates(options);
221
+ const matchers = (projectHints || [])
222
+ .map((h) => ({ id: h.id, name: h.name, patterns: buildProjectPatterns(h) }))
223
+ .filter((m) => m.name.toLowerCase() !== data.UNASSIGNED_PROJECT_NAME);
224
+ const catalog = includeProjectCatalog ? buildProjectTopicCatalog(projectHints || []) : [];
225
+ const unassignedProjectId = data.getUnassignedProject()?.id;
226
+ const result = {
227
+ conversationsProcessed: 0,
228
+ summariesCreated: 0,
229
+ decisionsExtracted: 0,
230
+ actionItemsExtracted: 0,
231
+ factsExtracted: 0,
232
+ topicsCreated: 0,
233
+ conversationsAssigned: 0,
234
+ conflicts: 0,
235
+ errors: [],
236
+ };
237
+ const progress = {
238
+ totalConversations: conversations.length,
239
+ processedConversations: 0,
240
+ currentConversation: null,
241
+ currentChunk: 0,
242
+ totalChunks: 0,
243
+ conflicts: 0,
244
+ errors: [],
245
+ };
246
+ for (const conv of conversations) {
247
+ progress.currentConversation = conv.id;
248
+ progress.currentChunk = 0;
249
+ progress.totalChunks = 0;
250
+ onProgress?.(progress);
251
+ let projectId = conv.project_id;
252
+ let assignedThisConversation = false;
253
+ const inUnassignedBucket = !!(projectId && unassignedProjectId && projectId === unassignedProjectId);
254
+ if ((!projectId || inUnassignedBucket) && matchers.length > 0) {
255
+ const assignment = assignConversationToProject(conv.id, matchers);
256
+ if (assignment.projectId) {
257
+ projectId = assignment.projectId;
258
+ data.updateConversation(conv.id, { projectId });
259
+ result.conversationsAssigned++;
260
+ assignedThisConversation = true;
261
+ }
262
+ else if (assignment.conflict) {
263
+ result.conflicts++;
264
+ progress.conflicts++;
265
+ }
266
+ }
267
+ try {
268
+ const chunkResult = await backfillConversation(conv.id, conv.agent_id, projectId, (current, total) => {
269
+ progress.currentChunk = current;
270
+ progress.totalChunks = total;
271
+ onProgress?.(progress);
272
+ }, {
273
+ includeSummaries: options.includeSummaries,
274
+ projectCatalog: catalog,
275
+ allowProjectSelection: !projectId || inUnassignedBucket,
276
+ });
277
+ if (chunkResult.finalProjectId && chunkResult.finalProjectId !== projectId) {
278
+ data.updateConversation(conv.id, { projectId: chunkResult.finalProjectId });
279
+ if (!assignedThisConversation)
280
+ result.conversationsAssigned++;
281
+ }
282
+ markConversationBackfilled(conv.id);
283
+ result.summariesCreated += chunkResult.summaries;
284
+ result.decisionsExtracted += chunkResult.decisions;
285
+ result.actionItemsExtracted += chunkResult.actionItems;
286
+ result.factsExtracted += chunkResult.facts;
287
+ result.topicsCreated += chunkResult.topics;
288
+ result.conversationsProcessed++;
289
+ }
290
+ catch (err) {
291
+ const errMsg = `Conversation ${conv.id}: ${err.message}`;
292
+ result.errors.push(errMsg);
293
+ progress.errors.push(errMsg);
294
+ }
295
+ progress.processedConversations++;
296
+ onProgress?.(progress);
297
+ }
298
+ return result;
299
+ }
300
+ async function backfillOne(projectHints, conversationId, options = {}) {
301
+ const candidates = getBackfillCandidates({
302
+ ...options,
303
+ conversationId,
304
+ maxConversations: 1,
305
+ });
306
+ if (candidates.length === 0) {
307
+ throw new Error('No eligible conversation found for single-conversation test.');
308
+ }
309
+ const conv = candidates[0];
310
+ const matchers = (projectHints || [])
311
+ .map((h) => ({ id: h.id, name: h.name, patterns: buildProjectPatterns(h) }))
312
+ .filter((m) => m.name.toLowerCase() !== data.UNASSIGNED_PROJECT_NAME);
313
+ const catalog = options.includeProjectCatalog === false
314
+ ? []
315
+ : buildProjectTopicCatalog(projectHints || []);
316
+ const unassignedProjectId = data.getUnassignedProject()?.id;
317
+ let projectId = conv.project_id;
318
+ const inUnassignedBucket = !!(projectId && unassignedProjectId && projectId === unassignedProjectId);
319
+ if ((!projectId || inUnassignedBucket) && matchers.length > 0) {
320
+ const assignment = assignConversationToProject(conv.id, matchers);
321
+ if (assignment.projectId) {
322
+ projectId = assignment.projectId;
323
+ data.updateConversation(conv.id, { projectId });
324
+ }
325
+ }
326
+ const result = await backfillConversation(conv.id, conv.agent_id, projectId, undefined, {
327
+ includeSummaries: options.includeSummaries,
328
+ projectCatalog: catalog,
329
+ allowProjectSelection: !projectId || inUnassignedBucket,
330
+ });
331
+ if (result.finalProjectId && result.finalProjectId !== projectId) {
332
+ data.updateConversation(conv.id, { projectId: result.finalProjectId });
333
+ }
334
+ markConversationBackfilled(conv.id);
335
+ const finalProjectId = result.finalProjectId || projectId || null;
336
+ const projectName = finalProjectId ? data.getProject(finalProjectId)?.name || null : null;
337
+ return {
338
+ conversationId: conv.id,
339
+ summaries: result.summaries,
340
+ decisions: result.decisions,
341
+ actionItems: result.actionItems,
342
+ facts: result.facts,
343
+ topics: result.topics,
344
+ topicTitles: getConversationTopicTitles(conv.id),
345
+ projectId: finalProjectId,
346
+ projectName,
347
+ finalProjectId,
348
+ };
349
+ }
350
+ async function backfillConversation(conversationId, agentId, projectId, onChunkProgress, options) {
351
+ const clerk = (0, clerk_model_1.getClerk)();
352
+ if (!clerk)
353
+ throw new Error('No clerk available');
354
+ const clerkLlm = clerk.llm;
355
+ const includeSummaries = options?.includeSummaries === true;
356
+ const projectCatalog = options?.projectCatalog || [];
357
+ let resolvedProjectId = projectId;
358
+ const messages = data.getMessages(conversationId, { limit: 10000 });
359
+ if (messages.length === 0) {
360
+ if (includeSummaries) {
361
+ (0, context_window_1.storeSummary)(conversationId, '(empty conversation)', 0, 0, { decisions: [], actionItems: [], facts: [] });
362
+ }
363
+ return {
364
+ summaries: includeSummaries ? 1 : 0,
365
+ decisions: 0,
366
+ actionItems: 0,
367
+ facts: 0,
368
+ topics: 0,
369
+ finalProjectId: resolvedProjectId,
370
+ };
371
+ }
372
+ const allTurns = (0, context_window_1.parseTurns)(messages);
373
+ if (allTurns.length === 0) {
374
+ if (includeSummaries) {
375
+ (0, context_window_1.storeSummary)(conversationId, '(no user messages)', 0, 0, { decisions: [], actionItems: [], facts: [] });
376
+ }
377
+ return {
378
+ summaries: includeSummaries ? 1 : 0,
379
+ decisions: 0,
380
+ actionItems: 0,
381
+ facts: 0,
382
+ topics: 0,
383
+ finalProjectId: resolvedProjectId,
384
+ };
385
+ }
386
+ const chunkSize = safeguards_1.SAFEGUARDS.BACKFILL_CHUNK_SIZE;
387
+ const turnChunks = [];
388
+ for (let i = 0; i < allTurns.length; i += chunkSize) {
389
+ turnChunks.push(allTurns.slice(i, i + chunkSize));
390
+ }
391
+ let runningSum = '';
392
+ let turnsSoFar = 0;
393
+ let totalDecisions = 0;
394
+ let totalActionItems = 0;
395
+ let totalFacts = 0;
396
+ let totalTopics = 0;
397
+ let summaryCount = 0;
398
+ for (let chunkIdx = 0; chunkIdx < turnChunks.length; chunkIdx++) {
399
+ onChunkProgress?.(chunkIdx + 1, turnChunks.length);
400
+ const turns = turnChunks[chunkIdx];
401
+ const turnsText = (0, context_window_1.formatTurnsForPrompt)(turns);
402
+ const promptParts = [];
403
+ if (runningSum) {
404
+ promptParts.push(`PREVIOUS SUMMARY:\n${runningSum}`);
405
+ }
406
+ promptParts.push(`MESSAGES TO PROCESS (chunk ${chunkIdx + 1}/${turnChunks.length}):\n${turnsText}`);
407
+ const existingDecisions = data.listDecisions({ conversationId, limit: 100 });
408
+ const existingActionItems = data.listActionItems({ conversationId, limit: 100 });
409
+ const convFacts = data.listMemoryFacts({ agentId, limit: 200 })
410
+ .filter((f) => f.conversation_id === conversationId);
411
+ const agentFacts = data.listMemoryFacts({ agentId, limit: 200 })
412
+ .filter((f) => f.conversation_id !== conversationId);
413
+ const existingFacts = [...convFacts, ...agentFacts].slice(0, 200);
414
+ if (existingDecisions.length > 0 || existingActionItems.length > 0 || existingFacts.length > 0) {
415
+ const captured = [];
416
+ if (existingDecisions.length > 0) {
417
+ captured.push('Decisions: ' + existingDecisions.map((d) => d.title).join('; '));
418
+ }
419
+ if (existingActionItems.length > 0) {
420
+ captured.push('Action Items: ' + existingActionItems.map((a) => a.title).join('; '));
421
+ }
422
+ if (existingFacts.length > 0) {
423
+ captured.push('Facts: ' + existingFacts.map((f) => f.content).join('; '));
424
+ }
425
+ promptParts.push(`ALREADY CAPTURED (do NOT re-extract):\n${captured.join('\n')}`);
426
+ }
427
+ const existingTopics = resolvedProjectId
428
+ ? data.listTopics({ projectId: resolvedProjectId, limit: 200 })
429
+ : data.listTopics({ limit: 200 }).filter((t) => !t.project_id);
430
+ if (existingTopics.length > 0) {
431
+ promptParts.push(`EXISTING TOPICS (prefer assigning to one of these if the conversation fits):\n${existingTopics.map((t) => `- ${t.title}`).join('\n')}`);
432
+ }
433
+ if (projectCatalog.length > 0) {
434
+ promptParts.push(`PROJECT CANDIDATES (reuse these project ids/names when possible):\n${formatProjectCatalogForPrompt(projectCatalog)}`);
435
+ if (resolvedProjectId) {
436
+ const current = projectCatalog.find((p) => p.id === resolvedProjectId);
437
+ if (current) {
438
+ promptParts.push(`CURRENT PROJECT: id=${current.id}, name=${current.name}`);
439
+ }
440
+ }
441
+ }
442
+ promptParts.push('Produce a compound summary and extract ONLY NEW items. Also suggest a HIGH-LEVEL topic title (reuse existing topic titles when possible).');
443
+ try {
444
+ const response = await Promise.race([
445
+ clerkLlm.chat({
446
+ messages: [{ role: 'user', content: promptParts.join('\n\n') }],
447
+ system: BACKFILL_SYSTEM_PROMPT,
448
+ stream: false,
449
+ }),
450
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Backfill chunk timeout')), safeguards_1.SAFEGUARDS.HELPER_TIMEOUT_MS * 2)),
451
+ ]);
452
+ const parsed = parseBackfillResponse(response.content || '');
453
+ if (!parsed)
454
+ continue;
455
+ if (options?.allowProjectSelection && projectCatalog.length > 0) {
456
+ const selectedProjectId = resolveProjectFromResponse(parsed, projectCatalog);
457
+ if (selectedProjectId && selectedProjectId !== resolvedProjectId) {
458
+ resolvedProjectId = selectedProjectId;
459
+ data.updateConversation(conversationId, { projectId: selectedProjectId });
460
+ }
461
+ }
462
+ const rangeStart = turnsSoFar + 1;
463
+ turnsSoFar += turns.length;
464
+ const rangeEnd = turnsSoFar;
465
+ if (includeSummaries) {
466
+ (0, context_window_1.storeSummary)(conversationId, parsed.summary, rangeStart, rangeEnd, {
467
+ decisions: parsed.decisions,
468
+ actionItems: parsed.actionItems,
469
+ facts: parsed.facts,
470
+ });
471
+ summaryCount++;
472
+ }
473
+ runningSum = parsed.summary;
474
+ for (const d of parsed.decisions) {
475
+ data.createDecision({
476
+ conversationId,
477
+ title: d.title,
478
+ reasoning: d.reasoning,
479
+ category: d.category,
480
+ });
481
+ totalDecisions++;
482
+ }
483
+ for (const a of parsed.actionItems) {
484
+ data.createActionItem({
485
+ conversationId,
486
+ title: a.title,
487
+ priority: a.priority || 'medium',
488
+ type: a.type,
489
+ });
490
+ totalActionItems++;
491
+ }
492
+ for (const f of parsed.facts) {
493
+ data.upsertMemoryFact({
494
+ agentId,
495
+ conversationId,
496
+ factType: f.factType || 'general',
497
+ content: f.content,
498
+ entityName: f.entityName,
499
+ entityType: f.entityType,
500
+ });
501
+ totalFacts++;
502
+ }
503
+ if (parsed.topicTitle) {
504
+ // Normalize topic title for quality + dedupe
505
+ const normalized = (0, topic_normalizer_1.normalizeTopicTitle)(parsed.topicTitle) || parsed.topicTitle;
506
+ const topics = resolvedProjectId
507
+ ? data.listTopics({ projectId: resolvedProjectId, limit: 200 })
508
+ : data.listTopics({ limit: 200 }).filter((t) => !t.project_id);
509
+ const match = fuzzyMatchTopic(normalized, topics);
510
+ if (match) {
511
+ // Idempotent upsert — no duplicates
512
+ data.upsertConversationTopicSegment(conversationId, match.id);
513
+ }
514
+ else {
515
+ const topic = data.createTopic({
516
+ title: normalized,
517
+ projectId: resolvedProjectId || undefined,
518
+ isAuto: true,
519
+ });
520
+ // Populate normalized_title column
521
+ data.updateTopic(topic.id, { normalizedTitle: normalized.toLowerCase() });
522
+ data.upsertConversationTopicSegment(conversationId, topic.id);
523
+ totalTopics++;
524
+ }
525
+ }
526
+ }
527
+ catch (err) {
528
+ console.error(`[backfill] Chunk ${chunkIdx + 1} error for ${conversationId}: ${err.message}`);
529
+ }
530
+ }
531
+ data.updateConversation(conversationId, { turnCount: allTurns.length });
532
+ if (resolvedProjectId) {
533
+ data.updateConversation(conversationId, { projectId: resolvedProjectId });
534
+ }
535
+ return {
536
+ summaries: summaryCount,
537
+ decisions: totalDecisions,
538
+ actionItems: totalActionItems,
539
+ facts: totalFacts,
540
+ topics: totalTopics,
541
+ finalProjectId: resolvedProjectId,
542
+ };
543
+ }
544
+ function parseBackfillResponse(text) {
545
+ const base = (0, summarization_pipeline_1.parseSummarizationResponse)(text);
546
+ if (!base)
547
+ return null;
548
+ const raw = parseLooseJson(text) || {};
549
+ const projectId = typeof raw.projectId === 'string' ? raw.projectId.trim() : undefined;
550
+ const projectName = typeof raw.projectName === 'string' ? raw.projectName.trim() : undefined;
551
+ return {
552
+ summary: base.summary,
553
+ decisions: base.decisions,
554
+ actionItems: base.actionItems,
555
+ facts: base.facts,
556
+ topicTitle: base.topicTitle,
557
+ projectId: projectId || undefined,
558
+ projectName: projectName || undefined,
559
+ };
560
+ }
561
+ function parseLooseJson(text) {
562
+ try {
563
+ return JSON.parse(text);
564
+ }
565
+ catch { /* fallthrough */ }
566
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/);
567
+ if (fenced) {
568
+ try {
569
+ return JSON.parse(fenced[1].trim());
570
+ }
571
+ catch { /* fallthrough */ }
572
+ }
573
+ const braceMatch = text.match(/\{[\s\S]*\}/);
574
+ if (braceMatch) {
575
+ try {
576
+ return JSON.parse(braceMatch[0]);
577
+ }
578
+ catch { /* fallthrough */ }
579
+ }
580
+ return null;
581
+ }
582
+ function fuzzyMatchTopic(suggested, existing) {
583
+ if (existing.length === 0)
584
+ return null;
585
+ const stopWords = new Set(['the', 'a', 'an', 'and', 'or', 'for', 'of', 'in', 'to', 'with', 'on', 'at', 'by', 'is', 'it']);
586
+ const tokenize = (s) => s
587
+ .toLowerCase()
588
+ .replace(/[^a-z0-9\s]/g, '')
589
+ .split(/\s+/)
590
+ .filter((w) => w.length > 1 && !stopWords.has(w));
591
+ const suggestedWords = tokenize(suggested);
592
+ if (suggestedWords.length === 0)
593
+ return null;
594
+ const exact = existing.find((t) => t.title.toLowerCase() === suggested.toLowerCase());
595
+ if (exact)
596
+ return exact;
597
+ let bestMatch = null;
598
+ let bestScore = 0;
599
+ for (const topic of existing) {
600
+ const topicWords = tokenize(topic.title);
601
+ if (topicWords.length === 0)
602
+ continue;
603
+ const overlap = suggestedWords.filter((w) => topicWords.some((tw) => tw === w || tw.includes(w) || w.includes(tw))).length;
604
+ const score = overlap / Math.max(suggestedWords.length, topicWords.length);
605
+ if (score > bestScore) {
606
+ bestScore = score;
607
+ bestMatch = topic;
608
+ }
609
+ }
610
+ return bestScore >= 0.5 ? bestMatch : null;
611
+ }
612
+ const BACKFILL_SYSTEM_PROMPT = `You are a conversation backfill processor. Your job is to:
613
+ 1. Produce a compound summary that builds on any previous summary.
614
+ 2. Extract ONLY NEW decisions, action items, and facts.
615
+ 3. Assign a HIGH-LEVEL topic title for the conversation.
616
+ 4. If project candidates are provided, pick the best matching project.
617
+
618
+ Return ONLY a JSON object in this exact format:
619
+ {
620
+ "summary": "Comprehensive summary covering all conversation context so far...",
621
+ "decisions": [{"title": "...", "reasoning": "...", "category": "architecture|design|process|tooling"}],
622
+ "actionItems": [{"title": "...", "priority": "high|medium|low", "type": "task|bug|feature|research"}],
623
+ "facts": [{"factType": "preference|technical|project|biographical", "content": "...", "entityName": "...", "entityType": "person|project|tool|concept"}],
624
+ "topicTitle": "Short HIGH-LEVEL topic (2-5 words)",
625
+ "projectId": "project id from candidates, or null",
626
+ "projectName": "project name from candidates, or null"
627
+ }
628
+
629
+ Rules:
630
+ - Only extract NEW items not in the ALREADY CAPTURED list.
631
+ - Topic title must be HIGH-LEVEL and broad (example: "Desktop App UI", not "Fixed button bug").
632
+ - Prefer existing topics when they fit; if reusing, return exactly the same title text.
633
+ - projectId/projectName must come from provided PROJECT CANDIDATES when possible.
634
+ - Facts must be durable knowledge, not transient events.
635
+ - Keep extracted items concise (under 200 characters).
636
+ - Return valid JSON only.`;
637
+ //# sourceMappingURL=backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../src/backfill.ts"],"names":[],"mappings":"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"}