@luckydraw/cumulus 0.5.1

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 (142) hide show
  1. package/README.md +148 -0
  2. package/dist/cli/cumulus.d.ts +3 -0
  3. package/dist/cli/cumulus.d.ts.map +1 -0
  4. package/dist/cli/cumulus.js +233 -0
  5. package/dist/cli/cumulus.js.map +1 -0
  6. package/dist/index.d.ts +33 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +43 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/config.d.ts +86 -0
  11. package/dist/lib/config.d.ts.map +1 -0
  12. package/dist/lib/config.js +241 -0
  13. package/dist/lib/config.js.map +1 -0
  14. package/dist/lib/content-detector.d.ts +46 -0
  15. package/dist/lib/content-detector.d.ts.map +1 -0
  16. package/dist/lib/content-detector.js +359 -0
  17. package/dist/lib/content-detector.js.map +1 -0
  18. package/dist/lib/content-store.d.ts +255 -0
  19. package/dist/lib/content-store.d.ts.map +1 -0
  20. package/dist/lib/content-store.js +955 -0
  21. package/dist/lib/content-store.js.map +1 -0
  22. package/dist/lib/context-budget.d.ts +83 -0
  23. package/dist/lib/context-budget.d.ts.map +1 -0
  24. package/dist/lib/context-budget.js +101 -0
  25. package/dist/lib/context-budget.js.map +1 -0
  26. package/dist/lib/embeddings.d.ts +64 -0
  27. package/dist/lib/embeddings.d.ts.map +1 -0
  28. package/dist/lib/embeddings.js +176 -0
  29. package/dist/lib/embeddings.js.map +1 -0
  30. package/dist/lib/history.d.ts +120 -0
  31. package/dist/lib/history.d.ts.map +1 -0
  32. package/dist/lib/history.js +205 -0
  33. package/dist/lib/history.js.map +1 -0
  34. package/dist/lib/image-utils.d.ts +41 -0
  35. package/dist/lib/image-utils.d.ts.map +1 -0
  36. package/dist/lib/image-utils.js +288 -0
  37. package/dist/lib/image-utils.js.map +1 -0
  38. package/dist/lib/migrate.d.ts +35 -0
  39. package/dist/lib/migrate.d.ts.map +1 -0
  40. package/dist/lib/migrate.js +196 -0
  41. package/dist/lib/migrate.js.map +1 -0
  42. package/dist/lib/retriever.d.ts +56 -0
  43. package/dist/lib/retriever.d.ts.map +1 -0
  44. package/dist/lib/retriever.js +644 -0
  45. package/dist/lib/retriever.js.map +1 -0
  46. package/dist/lib/revert.d.ts +23 -0
  47. package/dist/lib/revert.d.ts.map +1 -0
  48. package/dist/lib/revert.js +75 -0
  49. package/dist/lib/revert.js.map +1 -0
  50. package/dist/lib/session.d.ts +65 -0
  51. package/dist/lib/session.d.ts.map +1 -0
  52. package/dist/lib/session.js +289 -0
  53. package/dist/lib/session.js.map +1 -0
  54. package/dist/lib/snapshots.d.ts +39 -0
  55. package/dist/lib/snapshots.d.ts.map +1 -0
  56. package/dist/lib/snapshots.js +99 -0
  57. package/dist/lib/snapshots.js.map +1 -0
  58. package/dist/lib/stream-processor.d.ts +149 -0
  59. package/dist/lib/stream-processor.d.ts.map +1 -0
  60. package/dist/lib/stream-processor.js +389 -0
  61. package/dist/lib/stream-processor.js.map +1 -0
  62. package/dist/lib/summarizer.d.ts +67 -0
  63. package/dist/lib/summarizer.d.ts.map +1 -0
  64. package/dist/lib/summarizer.js +213 -0
  65. package/dist/lib/summarizer.js.map +1 -0
  66. package/dist/mcp/index.d.ts +3 -0
  67. package/dist/mcp/index.d.ts.map +1 -0
  68. package/dist/mcp/index.js +16 -0
  69. package/dist/mcp/index.js.map +1 -0
  70. package/dist/mcp/proxy.d.ts +19 -0
  71. package/dist/mcp/proxy.d.ts.map +1 -0
  72. package/dist/mcp/proxy.js +120 -0
  73. package/dist/mcp/proxy.js.map +1 -0
  74. package/dist/mcp/server.d.ts +6 -0
  75. package/dist/mcp/server.d.ts.map +1 -0
  76. package/dist/mcp/server.js +29 -0
  77. package/dist/mcp/server.js.map +1 -0
  78. package/dist/mcp/shared-server.d.ts +21 -0
  79. package/dist/mcp/shared-server.d.ts.map +1 -0
  80. package/dist/mcp/shared-server.js +210 -0
  81. package/dist/mcp/shared-server.js.map +1 -0
  82. package/dist/mcp/tool-handler.d.ts +20 -0
  83. package/dist/mcp/tool-handler.d.ts.map +1 -0
  84. package/dist/mcp/tool-handler.js +1405 -0
  85. package/dist/mcp/tool-handler.js.map +1 -0
  86. package/dist/tui/components/App.d.ts +11 -0
  87. package/dist/tui/components/App.d.ts.map +1 -0
  88. package/dist/tui/components/App.js +607 -0
  89. package/dist/tui/components/App.js.map +1 -0
  90. package/dist/tui/components/DebugContextView.d.ts +13 -0
  91. package/dist/tui/components/DebugContextView.d.ts.map +1 -0
  92. package/dist/tui/components/DebugContextView.js +78 -0
  93. package/dist/tui/components/DebugContextView.js.map +1 -0
  94. package/dist/tui/components/IncludeMenu.d.ts +12 -0
  95. package/dist/tui/components/IncludeMenu.d.ts.map +1 -0
  96. package/dist/tui/components/IncludeMenu.js +127 -0
  97. package/dist/tui/components/IncludeMenu.js.map +1 -0
  98. package/dist/tui/components/InputArea.d.ts +27 -0
  99. package/dist/tui/components/InputArea.d.ts.map +1 -0
  100. package/dist/tui/components/InputArea.js +366 -0
  101. package/dist/tui/components/InputArea.js.map +1 -0
  102. package/dist/tui/components/MarkdownText.d.ts +38 -0
  103. package/dist/tui/components/MarkdownText.d.ts.map +1 -0
  104. package/dist/tui/components/MarkdownText.js +234 -0
  105. package/dist/tui/components/MarkdownText.js.map +1 -0
  106. package/dist/tui/components/MessageBubble.d.ts +11 -0
  107. package/dist/tui/components/MessageBubble.d.ts.map +1 -0
  108. package/dist/tui/components/MessageBubble.js +16 -0
  109. package/dist/tui/components/MessageBubble.js.map +1 -0
  110. package/dist/tui/components/MessageHistory.d.ts +11 -0
  111. package/dist/tui/components/MessageHistory.d.ts.map +1 -0
  112. package/dist/tui/components/MessageHistory.js +12 -0
  113. package/dist/tui/components/MessageHistory.js.map +1 -0
  114. package/dist/tui/components/RevertMenu.d.ts +17 -0
  115. package/dist/tui/components/RevertMenu.d.ts.map +1 -0
  116. package/dist/tui/components/RevertMenu.js +144 -0
  117. package/dist/tui/components/RevertMenu.js.map +1 -0
  118. package/dist/tui/components/StatusBar.d.ts +14 -0
  119. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  120. package/dist/tui/components/StatusBar.js +13 -0
  121. package/dist/tui/components/StatusBar.js.map +1 -0
  122. package/dist/tui/components/StreamingResponse.d.ts +15 -0
  123. package/dist/tui/components/StreamingResponse.d.ts.map +1 -0
  124. package/dist/tui/components/StreamingResponse.js +52 -0
  125. package/dist/tui/components/StreamingResponse.js.map +1 -0
  126. package/dist/tui/hooks/useAppState.d.ts +147 -0
  127. package/dist/tui/hooks/useAppState.d.ts.map +1 -0
  128. package/dist/tui/hooks/useAppState.js +110 -0
  129. package/dist/tui/hooks/useAppState.js.map +1 -0
  130. package/dist/tui/hooks/useClaudeProcess.d.ts +19 -0
  131. package/dist/tui/hooks/useClaudeProcess.d.ts.map +1 -0
  132. package/dist/tui/hooks/useClaudeProcess.js +185 -0
  133. package/dist/tui/hooks/useClaudeProcess.js.map +1 -0
  134. package/dist/tui/index.d.ts +10 -0
  135. package/dist/tui/index.d.ts.map +1 -0
  136. package/dist/tui/index.js +11 -0
  137. package/dist/tui/index.js.map +1 -0
  138. package/dist/tui/utils/streamParser.d.ts +31 -0
  139. package/dist/tui/utils/streamParser.d.ts.map +1 -0
  140. package/dist/tui/utils/streamParser.js +63 -0
  141. package/dist/tui/utils/streamParser.js.map +1 -0
  142. package/package.json +94 -0
@@ -0,0 +1,644 @@
1
+ /**
2
+ * Automatic RAG retriever for injecting relevant context before Claude invocation.
3
+ * Runs hybrid search (keyword + semantic) on history and content stores.
4
+ */
5
+ import { estimateTokens } from './context-budget.js';
6
+ import { cosineSimilarity, embeddingsAvailable, generateMissingEmbeddings, getEmbeddingProvider, loadEmbeddings, } from './embeddings.js';
7
+ import { SessionManager } from './session.js';
8
+ /** Default budget fraction for retrieved context (25% of effective limit) */
9
+ export const RETRIEVAL_BUDGET_FRACTION = 0.25;
10
+ /** Maximum candidates to consider before budget trimming */
11
+ const MAX_HISTORY_CANDIDATES = 20;
12
+ const MAX_CONTENT_CANDIDATES = 20;
13
+ /** Minimum similarity threshold for semantic matches */
14
+ const SEMANTIC_THRESHOLD = 0.3;
15
+ /** Maximum tokens per individual result snippet */
16
+ const MAX_SNIPPET_TOKENS_DEFAULT = 800;
17
+ const MAX_SNIPPET_TOKENS_CODE = 1800;
18
+ function getMaxSnippetTokens(contentType) {
19
+ return contentType === 'code' ? MAX_SNIPPET_TOKENS_CODE : MAX_SNIPPET_TOKENS_DEFAULT;
20
+ }
21
+ /** Common stop words to exclude from context extraction */
22
+ const STOP_WORDS = new Set([
23
+ 'the',
24
+ 'a',
25
+ 'an',
26
+ 'and',
27
+ 'or',
28
+ 'but',
29
+ 'in',
30
+ 'on',
31
+ 'at',
32
+ 'to',
33
+ 'for',
34
+ 'of',
35
+ 'with',
36
+ 'by',
37
+ 'from',
38
+ 'as',
39
+ 'is',
40
+ 'was',
41
+ 'are',
42
+ 'were',
43
+ 'been',
44
+ 'be',
45
+ 'have',
46
+ 'has',
47
+ 'had',
48
+ 'do',
49
+ 'does',
50
+ 'did',
51
+ 'will',
52
+ 'would',
53
+ 'could',
54
+ 'should',
55
+ 'may',
56
+ 'might',
57
+ 'must',
58
+ 'shall',
59
+ 'can',
60
+ 'need',
61
+ 'dare',
62
+ 'ought',
63
+ 'used',
64
+ 'it',
65
+ 'its',
66
+ 'this',
67
+ 'that',
68
+ 'these',
69
+ 'those',
70
+ 'i',
71
+ 'you',
72
+ 'he',
73
+ 'she',
74
+ 'we',
75
+ 'they',
76
+ 'what',
77
+ 'which',
78
+ 'who',
79
+ 'whom',
80
+ 'whose',
81
+ 'where',
82
+ 'when',
83
+ 'why',
84
+ 'how',
85
+ 'all',
86
+ 'each',
87
+ 'every',
88
+ 'both',
89
+ 'few',
90
+ 'more',
91
+ 'most',
92
+ 'other',
93
+ 'some',
94
+ 'such',
95
+ 'no',
96
+ 'nor',
97
+ 'not',
98
+ 'only',
99
+ 'own',
100
+ 'same',
101
+ 'so',
102
+ 'than',
103
+ 'too',
104
+ 'very',
105
+ 'just',
106
+ 'also',
107
+ 'now',
108
+ 'here',
109
+ 'there',
110
+ 'then',
111
+ 'once',
112
+ 'always',
113
+ 'never',
114
+ 'often',
115
+ 'still',
116
+ 'already',
117
+ 'before',
118
+ 'after',
119
+ 'again',
120
+ 'any',
121
+ 'about',
122
+ 'into',
123
+ 'through',
124
+ 'during',
125
+ 'above',
126
+ 'below',
127
+ 'between',
128
+ 'under',
129
+ 'over',
130
+ 'out',
131
+ 'up',
132
+ 'down',
133
+ 'off',
134
+ 'away',
135
+ 'back',
136
+ 'well',
137
+ 'even',
138
+ 'also',
139
+ 'much',
140
+ 'say',
141
+ 'said',
142
+ 'see',
143
+ 'seen',
144
+ 'know',
145
+ 'known',
146
+ 'think',
147
+ 'thought',
148
+ 'want',
149
+ 'like',
150
+ 'going',
151
+ 'come',
152
+ 'came',
153
+ 'being',
154
+ 'thing',
155
+ 'things',
156
+ 'way',
157
+ 'yes',
158
+ 'yeah',
159
+ 'okay',
160
+ 'ok',
161
+ 'sure',
162
+ 'right',
163
+ 'thanks',
164
+ 'thank',
165
+ 'please',
166
+ 'sorry',
167
+ 'actually',
168
+ 'basically',
169
+ 'really',
170
+ 'probably',
171
+ 'maybe',
172
+ 'perhaps',
173
+ 'seems',
174
+ 'seem',
175
+ ]);
176
+ /** Maximum context terms to extract from recent messages */
177
+ const MAX_CONTEXT_TERMS = 15;
178
+ /**
179
+ * Extract significant terms from recent conversation for query expansion.
180
+ * Uses heuristics to identify domain-specific and topical terms.
181
+ */
182
+ function extractSignificantTerms(messages) {
183
+ if (messages.length === 0)
184
+ return [];
185
+ const termFrequency = new Map();
186
+ for (const msg of messages) {
187
+ const terms = extractTermsFromText(msg.content);
188
+ const isUser = msg.role === 'user';
189
+ for (const term of terms) {
190
+ const existing = termFrequency.get(term);
191
+ if (existing) {
192
+ existing.count++;
193
+ if (isUser)
194
+ existing.inUser = true;
195
+ else
196
+ existing.inAssistant = true;
197
+ }
198
+ else {
199
+ termFrequency.set(term, {
200
+ count: 1,
201
+ inUser: isUser,
202
+ inAssistant: !isUser,
203
+ });
204
+ }
205
+ }
206
+ }
207
+ // Score terms by significance
208
+ const scored = [];
209
+ for (const [term, stats] of termFrequency) {
210
+ let score = 0;
211
+ // High signal: appears in both user and assistant messages (confirmed topic)
212
+ if (stats.inUser && stats.inAssistant) {
213
+ score += 3;
214
+ }
215
+ // Frequency bonus (diminishing returns)
216
+ score += Math.min(stats.count, 5) * 0.5;
217
+ // Technical term patterns get bonus
218
+ if (isTechnicalTerm(term)) {
219
+ score += 2;
220
+ }
221
+ // Longer terms are often more specific
222
+ if (term.length >= 8) {
223
+ score += 1;
224
+ }
225
+ if (score > 0) {
226
+ scored.push({ term, score });
227
+ }
228
+ }
229
+ // Sort by score, return top terms
230
+ scored.sort((a, b) => b.score - a.score);
231
+ const topTerms = scored.slice(0, MAX_CONTEXT_TERMS);
232
+ if (DEBUG_QUERY_EXPANSION && topTerms.length > 0) {
233
+ console.error('[RAG Context Term Scoring]');
234
+ for (const { term, score } of topTerms.slice(0, 8)) {
235
+ const stats = termFrequency.get(term);
236
+ const flags = [
237
+ stats.inUser && stats.inAssistant ? 'both' : stats.inUser ? 'user' : 'asst',
238
+ `×${stats.count}`,
239
+ isTechnicalTerm(term) ? 'tech' : '',
240
+ term.length >= 8 ? 'long' : '',
241
+ ]
242
+ .filter(Boolean)
243
+ .join(' ');
244
+ console.error(` ${score.toFixed(1)} ${term} (${flags})`);
245
+ }
246
+ }
247
+ return topTerms.map(s => s.term);
248
+ }
249
+ /**
250
+ * Extract candidate terms from text content.
251
+ */
252
+ function extractTermsFromText(text) {
253
+ const terms = [];
254
+ // Extract camelCase/PascalCase identifiers
255
+ const camelCaseMatches = text.match(/[a-z][a-zA-Z0-9]*[A-Z][a-zA-Z0-9]*/g) || [];
256
+ terms.push(...camelCaseMatches.map(t => t.toLowerCase()));
257
+ // Extract snake_case identifiers
258
+ const snakeCaseMatches = text.match(/[a-z]+_[a-z_]+/g) || [];
259
+ terms.push(...snakeCaseMatches.map(t => t.toLowerCase()));
260
+ // Extract regular words (lowercase, filter stop words and short terms)
261
+ const words = text.toLowerCase().match(/[a-z]{3,}/g) || [];
262
+ for (const word of words) {
263
+ if (!STOP_WORDS.has(word) && word.length >= 4) {
264
+ terms.push(word);
265
+ }
266
+ }
267
+ // Extract capitalized words (likely proper nouns, technologies)
268
+ // Filter against stop words to avoid sentence-starting common words like "The"
269
+ const properNouns = text.match(/\b[A-Z][a-z]{2,}\b/g) || [];
270
+ for (const noun of properNouns) {
271
+ const lower = noun.toLowerCase();
272
+ if (!STOP_WORDS.has(lower)) {
273
+ terms.push(lower);
274
+ }
275
+ }
276
+ return terms;
277
+ }
278
+ /**
279
+ * Check if a term looks like a technical/code identifier.
280
+ */
281
+ function isTechnicalTerm(term) {
282
+ // Contains underscore (snake_case)
283
+ if (term.includes('_'))
284
+ return true;
285
+ // Contains numbers mixed with letters
286
+ if (/[a-z].*\d|\d.*[a-z]/i.test(term))
287
+ return true;
288
+ // Common technical suffixes
289
+ const techSuffixes = [
290
+ 'store',
291
+ 'service',
292
+ 'handler',
293
+ 'manager',
294
+ 'provider',
295
+ 'factory',
296
+ 'controller',
297
+ 'model',
298
+ 'view',
299
+ 'component',
300
+ 'module',
301
+ 'config',
302
+ 'util',
303
+ 'helper',
304
+ 'client',
305
+ 'server',
306
+ 'api',
307
+ 'sdk',
308
+ 'cli',
309
+ 'orm',
310
+ 'db',
311
+ 'sql',
312
+ 'json',
313
+ 'xml',
314
+ 'html',
315
+ 'css',
316
+ 'tsx',
317
+ 'jsx',
318
+ 'async',
319
+ 'sync',
320
+ 'callback',
321
+ 'promise',
322
+ 'stream',
323
+ 'buffer',
324
+ ];
325
+ const termLower = term.toLowerCase();
326
+ if (techSuffixes.some(suffix => termLower.endsWith(suffix) || termLower.startsWith(suffix))) {
327
+ return true;
328
+ }
329
+ return false;
330
+ }
331
+ /** Enable debug logging for query expansion */
332
+ const DEBUG_QUERY_EXPANSION = process.env.DEBUG_RAG === '1';
333
+ /**
334
+ * Expand a query with terms extracted from recent conversation context.
335
+ */
336
+ function expandQueryWithContext(query, recentMessages) {
337
+ // Extract meaningful terms from the query (strip punctuation, filter stop words, deduplicate)
338
+ const queryTerms = extractTermsFromText(query);
339
+ const queryDeduped = [...new Set(queryTerms)];
340
+ // Extract context terms
341
+ const contextTerms = extractSignificantTerms(recentMessages);
342
+ // Combine: query terms first, then context terms (deduped)
343
+ const querySet = new Set(queryDeduped);
344
+ const combined = [...queryDeduped];
345
+ for (const term of contextTerms) {
346
+ if (!querySet.has(term)) {
347
+ combined.push(term);
348
+ }
349
+ }
350
+ if (DEBUG_QUERY_EXPANSION) {
351
+ console.error('[RAG Query Expansion]');
352
+ console.error(' Original query:', query);
353
+ console.error(' Query terms:', queryDeduped.join(', '));
354
+ console.error(' Context terms:', contextTerms.join(', '));
355
+ console.error(' Expanded terms:', combined.join(', '));
356
+ console.error(' Added from context:', combined.length - queryDeduped.length, 'terms');
357
+ }
358
+ return combined;
359
+ }
360
+ /**
361
+ * Truncate content to fit within token budget.
362
+ */
363
+ function truncateToTokens(content, maxTokens) {
364
+ const tokens = estimateTokens(content);
365
+ if (tokens <= maxTokens)
366
+ return content;
367
+ // Conservative: ~3 chars per token
368
+ const targetChars = maxTokens * 3;
369
+ return content.slice(0, targetChars) + '... [truncated]';
370
+ }
371
+ /**
372
+ * Run hybrid search on conversation history.
373
+ */
374
+ async function searchHistory(query, historyStore, limit, expandedTerms) {
375
+ const allMsgs = await historyStore.getAll();
376
+ // Exclude session docs from message search
377
+ const messages = allMsgs.filter(m => m.role !== 'session');
378
+ if (messages.length === 0)
379
+ return [];
380
+ const queryLower = query.toLowerCase();
381
+ // Use pre-expanded terms if provided, otherwise split query
382
+ const queryTerms = expandedTerms ?? queryLower.split(/\s+/).filter(t => t.length > 2);
383
+ // Keyword scores
384
+ const keywordScores = new Map();
385
+ for (let i = 0; i < messages.length; i++) {
386
+ const msg = messages[i];
387
+ if (!msg)
388
+ continue;
389
+ const contentLower = msg.content.toLowerCase();
390
+ let score = 0;
391
+ for (const term of queryTerms) {
392
+ if (contentLower.includes(term)) {
393
+ // Boost for exact phrase match
394
+ if (contentLower.includes(queryLower)) {
395
+ score += 2;
396
+ }
397
+ else {
398
+ score += 1;
399
+ }
400
+ }
401
+ }
402
+ if (score > 0) {
403
+ keywordScores.set(i, Math.min(score / Math.max(queryTerms.length, 1), 1));
404
+ }
405
+ }
406
+ // Semantic scores
407
+ const semanticScores = new Map();
408
+ const useSemanticSearch = await embeddingsAvailable();
409
+ if (useSemanticSearch) {
410
+ try {
411
+ // Generate missing embeddings
412
+ await generateMissingEmbeddings(historyStore.threadPath, messages.map(m => ({ id: m.id, content: m.content })));
413
+ const embeddings = await loadEmbeddings(historyStore.threadPath);
414
+ const provider = getEmbeddingProvider();
415
+ const [queryEmbedding] = await provider.embed([query]);
416
+ if (queryEmbedding) {
417
+ for (let i = 0; i < messages.length; i++) {
418
+ const msg = messages[i];
419
+ if (!msg)
420
+ continue;
421
+ const embedding = embeddings.get(msg.id);
422
+ if (!embedding)
423
+ continue;
424
+ const similarity = cosineSimilarity(queryEmbedding, embedding);
425
+ if (similarity > SEMANTIC_THRESHOLD) {
426
+ semanticScores.set(i, similarity);
427
+ }
428
+ }
429
+ }
430
+ }
431
+ catch {
432
+ // Fall back to keyword-only
433
+ }
434
+ }
435
+ // Combine scores (hybrid)
436
+ const combined = [];
437
+ const allIndices = new Set([...keywordScores.keys(), ...semanticScores.keys()]);
438
+ for (const index of allIndices) {
439
+ const msg = messages[index];
440
+ if (!msg)
441
+ continue;
442
+ const kwScore = keywordScores.get(index) ?? 0;
443
+ const semScore = semanticScores.get(index) ?? 0;
444
+ // Hybrid: combine with weights (semantic weighted higher)
445
+ let finalScore = kwScore * 0.3 + semScore * 0.7;
446
+ // Boost if both match
447
+ if (kwScore > 0 && semScore > 0) {
448
+ finalScore *= 1.2;
449
+ }
450
+ if (finalScore > 0) {
451
+ combined.push({
452
+ message: msg,
453
+ index,
454
+ score: finalScore,
455
+ keywordScore: kwScore,
456
+ semanticScore: semScore,
457
+ });
458
+ }
459
+ }
460
+ // Sort by score descending, then by index descending (most recent first for ties)
461
+ combined.sort((a, b) => {
462
+ if (Math.abs(b.score - a.score) > 0.01) {
463
+ return b.score - a.score;
464
+ }
465
+ return b.index - a.index;
466
+ });
467
+ return combined.slice(0, limit);
468
+ }
469
+ /**
470
+ * Search session documents for relevant context.
471
+ */
472
+ async function searchSessions(query, sessionsPath, currentSessionId) {
473
+ if (!(await embeddingsAvailable()))
474
+ return [];
475
+ try {
476
+ const provider = getEmbeddingProvider();
477
+ const [queryEmbedding] = await provider.embed([query]);
478
+ if (!queryEmbedding)
479
+ return [];
480
+ const results = await SessionManager.searchAllSessions(sessionsPath, queryEmbedding, currentSessionId, SEMANTIC_THRESHOLD);
481
+ return results.map(r => ({
482
+ sessionId: r.sessionId,
483
+ chunkIndex: r.chunkIndex,
484
+ content: r.content_snippet,
485
+ score: r.score,
486
+ }));
487
+ }
488
+ catch {
489
+ return [];
490
+ }
491
+ }
492
+ /**
493
+ * Format retrieved results into a context string that fits within budget.
494
+ */
495
+ function formatRetrievedContext(historyResults, contentResults, sessionResults, budgetTokens) {
496
+ if (budgetTokens <= 0) {
497
+ return { context: '', historyCount: 0, contentCount: 0, tokensUsed: 0 };
498
+ }
499
+ const sections = [];
500
+ let tokensUsed = 0;
501
+ let historyCount = 0;
502
+ let contentCount = 0;
503
+ const header = '\nRETRIEVED CONTEXT (automatically retrieved based on your query):\n';
504
+ const footer = '---\n';
505
+ const headerTokens = estimateTokens(header + footer);
506
+ let remaining = budgetTokens - headerTokens;
507
+ if (remaining <= 0) {
508
+ return { context: '', historyCount: 0, contentCount: 0, tokensUsed: 0 };
509
+ }
510
+ // Add session context first (highest priority for thread continuity)
511
+ if (sessionResults.length > 0) {
512
+ const sessionHeader = '\n[Session Context]\n';
513
+ const sessionHeaderTokens = estimateTokens(sessionHeader);
514
+ if (sessionHeaderTokens < remaining) {
515
+ remaining -= sessionHeaderTokens;
516
+ const sessionLines = [sessionHeader];
517
+ for (const result of sessionResults.slice(0, 3)) {
518
+ const line = `Session ${result.sessionId}: ${truncateToTokens(result.content, MAX_SNIPPET_TOKENS_DEFAULT)}\n`;
519
+ const lineTokens = estimateTokens(line);
520
+ if (lineTokens > remaining)
521
+ break;
522
+ sessionLines.push(line);
523
+ remaining -= lineTokens;
524
+ }
525
+ if (sessionLines.length > 1) {
526
+ sections.push(sessionLines.join(''));
527
+ }
528
+ }
529
+ }
530
+ // Add history results
531
+ if (historyResults.length > 0) {
532
+ const historyHeader = '\n[Relevant Past Messages]\n';
533
+ const historyHeaderTokens = estimateTokens(historyHeader);
534
+ if (historyHeaderTokens < remaining) {
535
+ remaining -= historyHeaderTokens;
536
+ const historyLines = [historyHeader];
537
+ for (const result of historyResults) {
538
+ const label = result.message.role === 'user' ? 'User' : 'Assistant';
539
+ const content = truncateToTokens(result.message.content, MAX_SNIPPET_TOKENS_DEFAULT);
540
+ const line = `[${label} #${result.index}]: ${content}\n`;
541
+ const lineTokens = estimateTokens(line);
542
+ if (lineTokens > remaining)
543
+ break;
544
+ historyLines.push(line);
545
+ remaining -= lineTokens;
546
+ historyCount++;
547
+ }
548
+ if (historyLines.length > 1) {
549
+ sections.push(historyLines.join(''));
550
+ }
551
+ }
552
+ }
553
+ // Add content results
554
+ if (contentResults.length > 0) {
555
+ const contentHeader = '\n[Relevant Stored Content]\n';
556
+ const contentHeaderTokens = estimateTokens(contentHeader);
557
+ if (contentHeaderTokens < remaining) {
558
+ remaining -= contentHeaderTokens;
559
+ const contentLines = [contentHeader];
560
+ for (const result of contentResults) {
561
+ const snippet = truncateToTokens(result.snippet, getMaxSnippetTokens(result.meta.contentType));
562
+ let line = `[${result.meta.id}] (${result.meta.sourceType}): ${snippet}\n`;
563
+ // For image analysis results, include cached image path and re-examination note
564
+ if (result.meta.sourceType === 'image_analysis' && result.meta.metadata?.cachedPath) {
565
+ line += ` [Cached image: ${result.meta.metadata.cachedPath} - use Read tool to re-examine]\n`;
566
+ }
567
+ const lineTokens = estimateTokens(line);
568
+ if (lineTokens > remaining)
569
+ break;
570
+ contentLines.push(line);
571
+ remaining -= lineTokens;
572
+ contentCount++;
573
+ }
574
+ if (contentLines.length > 1) {
575
+ sections.push(contentLines.join(''));
576
+ }
577
+ }
578
+ }
579
+ if (sections.length === 0) {
580
+ return { context: '', historyCount: 0, contentCount: 0, tokensUsed: 0 };
581
+ }
582
+ const context = header + sections.join('') + footer;
583
+ tokensUsed = budgetTokens - remaining;
584
+ return { context, historyCount, contentCount, tokensUsed };
585
+ }
586
+ /**
587
+ * Retrieve relevant context for a user query.
588
+ * Runs hybrid search on history, content, and session stores.
589
+ */
590
+ export async function retrieve(query, historyStore, contentStore, options) {
591
+ const { budgetTokens, currentSessionId, sessionsPath, recentMessages } = options;
592
+ // Expand query with context terms once, reuse for all searches
593
+ const expandedTerms = recentMessages ? expandQueryWithContext(query, recentMessages) : undefined;
594
+ // Run searches in parallel
595
+ const [historyResults, contentResults, sessionResults] = await Promise.all([
596
+ searchHistory(query, historyStore, MAX_HISTORY_CANDIDATES, expandedTerms),
597
+ contentStore
598
+ ? contentStore.search(query, { limit: MAX_CONTENT_CANDIDATES, mode: 'hybrid', expandedTerms })
599
+ : Promise.resolve([]),
600
+ sessionsPath && currentSessionId
601
+ ? searchSessions(query, sessionsPath, currentSessionId)
602
+ : Promise.resolve([]),
603
+ ]);
604
+ // Format into context string within budget
605
+ const { context, historyCount, contentCount, tokensUsed } = formatRetrievedContext(historyResults, contentResults, sessionResults, budgetTokens);
606
+ if (DEBUG_QUERY_EXPANSION) {
607
+ console.error('[RAG Retrieval Results]');
608
+ console.error(' History matches:', historyResults.length, '→ included:', historyCount);
609
+ console.error(' Content matches:', contentResults.length, '→ included:', contentCount);
610
+ console.error(' Session matches:', sessionResults.length);
611
+ console.error(' Tokens used:', tokensUsed, '/', budgetTokens);
612
+ if (historyResults.length > 0) {
613
+ console.error(' Top history hit:', historyResults[0]?.message.content.slice(0, 80) + '...');
614
+ }
615
+ if (contentResults.length > 0) {
616
+ console.error(' Top content hit:', contentResults[0]?.snippet.slice(0, 80) + '...');
617
+ }
618
+ }
619
+ return {
620
+ context,
621
+ historyCount,
622
+ contentCount,
623
+ tokensUsed,
624
+ debug: {
625
+ historyResults: historyResults.map(r => ({
626
+ index: r.index,
627
+ role: r.message.role,
628
+ score: Math.round(r.score * 100) / 100,
629
+ snippet: r.message.content.slice(0, 100) + '...',
630
+ })),
631
+ contentResults: contentResults.map(r => ({
632
+ id: r.meta.id,
633
+ score: Math.round(r.score * 100) / 100,
634
+ snippet: r.snippet.slice(0, 100) + '...',
635
+ })),
636
+ sessionResults: sessionResults.map(r => ({
637
+ sessionId: r.sessionId,
638
+ score: Math.round(r.score * 100) / 100,
639
+ snippet: r.content.slice(0, 100) + '...',
640
+ })),
641
+ },
642
+ };
643
+ }
644
+ //# sourceMappingURL=retriever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../src/lib/retriever.ts"],"names":[],"mappings":"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"}