@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.
- package/README.md +148 -0
- package/dist/cli/cumulus.d.ts +3 -0
- package/dist/cli/cumulus.d.ts.map +1 -0
- package/dist/cli/cumulus.js +233 -0
- package/dist/cli/cumulus.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +86 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +241 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/content-detector.d.ts +46 -0
- package/dist/lib/content-detector.d.ts.map +1 -0
- package/dist/lib/content-detector.js +359 -0
- package/dist/lib/content-detector.js.map +1 -0
- package/dist/lib/content-store.d.ts +255 -0
- package/dist/lib/content-store.d.ts.map +1 -0
- package/dist/lib/content-store.js +955 -0
- package/dist/lib/content-store.js.map +1 -0
- package/dist/lib/context-budget.d.ts +83 -0
- package/dist/lib/context-budget.d.ts.map +1 -0
- package/dist/lib/context-budget.js +101 -0
- package/dist/lib/context-budget.js.map +1 -0
- package/dist/lib/embeddings.d.ts +64 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +176 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/history.d.ts +120 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +205 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/image-utils.d.ts +41 -0
- package/dist/lib/image-utils.d.ts.map +1 -0
- package/dist/lib/image-utils.js +288 -0
- package/dist/lib/image-utils.js.map +1 -0
- package/dist/lib/migrate.d.ts +35 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +196 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/retriever.d.ts +56 -0
- package/dist/lib/retriever.d.ts.map +1 -0
- package/dist/lib/retriever.js +644 -0
- package/dist/lib/retriever.js.map +1 -0
- package/dist/lib/revert.d.ts +23 -0
- package/dist/lib/revert.d.ts.map +1 -0
- package/dist/lib/revert.js +75 -0
- package/dist/lib/revert.js.map +1 -0
- package/dist/lib/session.d.ts +65 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +289 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/snapshots.d.ts +39 -0
- package/dist/lib/snapshots.d.ts.map +1 -0
- package/dist/lib/snapshots.js +99 -0
- package/dist/lib/snapshots.js.map +1 -0
- package/dist/lib/stream-processor.d.ts +149 -0
- package/dist/lib/stream-processor.d.ts.map +1 -0
- package/dist/lib/stream-processor.js +389 -0
- package/dist/lib/stream-processor.js.map +1 -0
- package/dist/lib/summarizer.d.ts +67 -0
- package/dist/lib/summarizer.d.ts.map +1 -0
- package/dist/lib/summarizer.js +213 -0
- package/dist/lib/summarizer.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +16 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/proxy.d.ts +19 -0
- package/dist/mcp/proxy.d.ts.map +1 -0
- package/dist/mcp/proxy.js +120 -0
- package/dist/mcp/proxy.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +29 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/shared-server.d.ts +21 -0
- package/dist/mcp/shared-server.d.ts.map +1 -0
- package/dist/mcp/shared-server.js +210 -0
- package/dist/mcp/shared-server.js.map +1 -0
- package/dist/mcp/tool-handler.d.ts +20 -0
- package/dist/mcp/tool-handler.d.ts.map +1 -0
- package/dist/mcp/tool-handler.js +1405 -0
- package/dist/mcp/tool-handler.js.map +1 -0
- package/dist/tui/components/App.d.ts +11 -0
- package/dist/tui/components/App.d.ts.map +1 -0
- package/dist/tui/components/App.js +607 -0
- package/dist/tui/components/App.js.map +1 -0
- package/dist/tui/components/DebugContextView.d.ts +13 -0
- package/dist/tui/components/DebugContextView.d.ts.map +1 -0
- package/dist/tui/components/DebugContextView.js +78 -0
- package/dist/tui/components/DebugContextView.js.map +1 -0
- package/dist/tui/components/IncludeMenu.d.ts +12 -0
- package/dist/tui/components/IncludeMenu.d.ts.map +1 -0
- package/dist/tui/components/IncludeMenu.js +127 -0
- package/dist/tui/components/IncludeMenu.js.map +1 -0
- package/dist/tui/components/InputArea.d.ts +27 -0
- package/dist/tui/components/InputArea.d.ts.map +1 -0
- package/dist/tui/components/InputArea.js +366 -0
- package/dist/tui/components/InputArea.js.map +1 -0
- package/dist/tui/components/MarkdownText.d.ts +38 -0
- package/dist/tui/components/MarkdownText.d.ts.map +1 -0
- package/dist/tui/components/MarkdownText.js +234 -0
- package/dist/tui/components/MarkdownText.js.map +1 -0
- package/dist/tui/components/MessageBubble.d.ts +11 -0
- package/dist/tui/components/MessageBubble.d.ts.map +1 -0
- package/dist/tui/components/MessageBubble.js +16 -0
- package/dist/tui/components/MessageBubble.js.map +1 -0
- package/dist/tui/components/MessageHistory.d.ts +11 -0
- package/dist/tui/components/MessageHistory.d.ts.map +1 -0
- package/dist/tui/components/MessageHistory.js +12 -0
- package/dist/tui/components/MessageHistory.js.map +1 -0
- package/dist/tui/components/RevertMenu.d.ts +17 -0
- package/dist/tui/components/RevertMenu.d.ts.map +1 -0
- package/dist/tui/components/RevertMenu.js +144 -0
- package/dist/tui/components/RevertMenu.js.map +1 -0
- package/dist/tui/components/StatusBar.d.ts +14 -0
- package/dist/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/tui/components/StatusBar.js +13 -0
- package/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/tui/components/StreamingResponse.d.ts +15 -0
- package/dist/tui/components/StreamingResponse.d.ts.map +1 -0
- package/dist/tui/components/StreamingResponse.js +52 -0
- package/dist/tui/components/StreamingResponse.js.map +1 -0
- package/dist/tui/hooks/useAppState.d.ts +147 -0
- package/dist/tui/hooks/useAppState.d.ts.map +1 -0
- package/dist/tui/hooks/useAppState.js +110 -0
- package/dist/tui/hooks/useAppState.js.map +1 -0
- package/dist/tui/hooks/useClaudeProcess.d.ts +19 -0
- package/dist/tui/hooks/useClaudeProcess.d.ts.map +1 -0
- package/dist/tui/hooks/useClaudeProcess.js +185 -0
- package/dist/tui/hooks/useClaudeProcess.js.map +1 -0
- package/dist/tui/index.d.ts +10 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +11 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/utils/streamParser.d.ts +31 -0
- package/dist/tui/utils/streamParser.d.ts.map +1 -0
- package/dist/tui/utils/streamParser.js +63 -0
- package/dist/tui/utils/streamParser.js.map +1 -0
- 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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"}
|