@nxuss/lemma 0.4.13 → 0.5.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 (42) hide show
  1. package/README.md +16 -10
  2. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  3. package/dist/cjs/cli/lemma-proxy.js +94 -14
  4. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  5. package/dist/cjs/mcp/index.js +198 -1
  6. package/dist/cjs/mcp/index.js.map +1 -1
  7. package/dist/cjs/observability/IdeContextSync.d.ts.map +1 -1
  8. package/dist/cjs/observability/IdeContextSync.js +22 -10
  9. package/dist/cjs/observability/IdeContextSync.js.map +1 -1
  10. package/dist/cjs/proxy/KeyManager.d.ts +3 -0
  11. package/dist/cjs/proxy/KeyManager.d.ts.map +1 -1
  12. package/dist/cjs/proxy/KeyManager.js +44 -1
  13. package/dist/cjs/proxy/KeyManager.js.map +1 -1
  14. package/dist/cjs/utils/ClipboardWatcher.d.ts +19 -0
  15. package/dist/cjs/utils/ClipboardWatcher.d.ts.map +1 -0
  16. package/dist/cjs/utils/ClipboardWatcher.js +99 -0
  17. package/dist/cjs/utils/ClipboardWatcher.js.map +1 -0
  18. package/dist/cjs/utils/ContextSqueezer.d.ts +27 -1
  19. package/dist/cjs/utils/ContextSqueezer.d.ts.map +1 -1
  20. package/dist/cjs/utils/ContextSqueezer.js +279 -6
  21. package/dist/cjs/utils/ContextSqueezer.js.map +1 -1
  22. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  23. package/dist/esm/cli/lemma-proxy.js +94 -14
  24. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  25. package/dist/esm/mcp/index.js +198 -1
  26. package/dist/esm/mcp/index.js.map +1 -1
  27. package/dist/esm/observability/IdeContextSync.d.ts.map +1 -1
  28. package/dist/esm/observability/IdeContextSync.js +22 -10
  29. package/dist/esm/observability/IdeContextSync.js.map +1 -1
  30. package/dist/esm/proxy/KeyManager.d.ts +3 -0
  31. package/dist/esm/proxy/KeyManager.d.ts.map +1 -1
  32. package/dist/esm/proxy/KeyManager.js +44 -1
  33. package/dist/esm/proxy/KeyManager.js.map +1 -1
  34. package/dist/esm/utils/ClipboardWatcher.d.ts +19 -0
  35. package/dist/esm/utils/ClipboardWatcher.d.ts.map +1 -0
  36. package/dist/esm/utils/ClipboardWatcher.js +93 -0
  37. package/dist/esm/utils/ClipboardWatcher.js.map +1 -0
  38. package/dist/esm/utils/ContextSqueezer.d.ts +27 -1
  39. package/dist/esm/utils/ContextSqueezer.d.ts.map +1 -1
  40. package/dist/esm/utils/ContextSqueezer.js +273 -6
  41. package/dist/esm/utils/ContextSqueezer.js.map +1 -1
  42. package/package.json +2 -2
@@ -29,10 +29,23 @@ export declare function treeShakeCode(code: string, query: string): string;
29
29
  * Squeezes a block of source code
30
30
  */
31
31
  export declare function squeezeCode(code: string): string;
32
+ /**
33
+ * Detects the file path from the first line comment inside a code block
34
+ */
35
+ export declare function detectFilePath(code: string): string | null;
32
36
  /**
33
37
  * Squeezes all markdown code blocks (``` ... ```) inside a prompt string
34
38
  */
35
- export declare function squeezePrompt(prompt: string, query?: string): SqueezeResult;
39
+ export declare function squeezePrompt(prompt: string, query?: string, fileHistory?: Map<string, string>): SqueezeResult;
40
+ /**
41
+ * Extract plain text string content from message formats (string or content block arrays)
42
+ */
43
+ export declare function extractContentText(content: any): string;
44
+ /**
45
+ * Decimates older conversational history turns by replacing them with high-density,
46
+ * single-line structured summaries of what was asked and what was resolved.
47
+ */
48
+ export declare function decimateHistory(messages: any[]): any[];
36
49
  /**
37
50
  * Prunes conversational message history to compress large repeated codeblocks in historical messages.
38
51
  * Keeps only the most recent message's codeblocks fully intact, and prunes older historical messages
@@ -42,4 +55,17 @@ export declare function pruneHistoryMessages(messages: any[]): {
42
55
  messages: any[];
43
56
  tokensSavedEstimate: number;
44
57
  };
58
+ /**
59
+ * Strip import statements and require declarations from JavaScript, TypeScript, Python and CSS code
60
+ */
61
+ export declare function stripImports(code: string): string;
62
+ /**
63
+ * Generate a highly compact, unified line-by-line diff between two versions of code blocks
64
+ */
65
+ export declare function generateAstDiff(oldCode: string, newCode: string): string;
66
+ /**
67
+ * Filters large codebase search results / RAG dumps in the prompt, keeping only the most
68
+ * semantically relevant snippets based on keyword intersection (Jaccard similarity).
69
+ */
70
+ export declare function filterHighDensityRAG(prompt: string, query: string): string;
45
71
  //# sourceMappingURL=ContextSqueezer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContextSqueezer.d.ts","sourceRoot":"","sources":["../../../src/utils/ContextSqueezer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgClD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0BxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,aAAa,CAmC/E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAmDtG"}
1
+ {"version":3,"file":"ContextSqueezer.d.ts","sourceRoot":"","sources":["../../../src/utils/ContextSqueezer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgClD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0BxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,aAAa,CA8Df;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CA0BvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAkDtD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAqDtG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgCjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoExE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiD1E"}
@@ -12,8 +12,14 @@ exports.compactWhitespace = compactWhitespace;
12
12
  exports.detectFunctionDeclaration = detectFunctionDeclaration;
13
13
  exports.treeShakeCode = treeShakeCode;
14
14
  exports.squeezeCode = squeezeCode;
15
+ exports.detectFilePath = detectFilePath;
15
16
  exports.squeezePrompt = squeezePrompt;
17
+ exports.extractContentText = extractContentText;
18
+ exports.decimateHistory = decimateHistory;
16
19
  exports.pruneHistoryMessages = pruneHistoryMessages;
20
+ exports.stripImports = stripImports;
21
+ exports.generateAstDiff = generateAstDiff;
22
+ exports.filterHighDensityRAG = filterHighDensityRAG;
17
23
  /**
18
24
  * Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code
19
25
  */
@@ -91,7 +97,7 @@ function treeShakeCode(code, query) {
91
97
  return squeezeCode(code);
92
98
  }
93
99
  // Strip comments first to preserve tree-shaker comment markers in the final output
94
- const cleanCode = stripComments(code);
100
+ const cleanCode = stripImports(stripComments(code));
95
101
  const lines = cleanCode.split('\n');
96
102
  const resultLines = [];
97
103
  let inFunctionBody = false;
@@ -148,19 +154,58 @@ function treeShakeCode(code, query) {
148
154
  */
149
155
  function squeezeCode(code) {
150
156
  const withoutComments = stripComments(code);
151
- return compactWhitespace(withoutComments);
157
+ const withoutImports = stripImports(withoutComments);
158
+ return compactWhitespace(withoutImports);
159
+ }
160
+ /**
161
+ * Detects the file path from the first line comment inside a code block
162
+ */
163
+ function detectFilePath(code) {
164
+ const firstLine = code.trim().split('\n')[0]?.trim();
165
+ if (!firstLine)
166
+ return null;
167
+ // Matches comments like:
168
+ // // src/proxy/KeyManager.ts
169
+ // # src/proxy/KeyManager.py
170
+ // /* src/proxy/KeyManager.ts */
171
+ const match = firstLine.match(/^(?:\/\/#?|#|\/\*)\s*([a-zA-Z0-9_\-\.\/\\:]{3,120})(?:\s*\*\/)?$/);
172
+ if (match && match[1]) {
173
+ return match[1];
174
+ }
175
+ return null;
152
176
  }
153
177
  /**
154
178
  * Squeezes all markdown code blocks (``` ... ```) inside a prompt string
155
179
  */
156
- function squeezePrompt(prompt, query = '') {
180
+ function squeezePrompt(prompt, query = '', fileHistory) {
181
+ // Apply codebase search RAG filtering first to throw away trash search snippets
182
+ const ragFiltered = filterHighDensityRAG(prompt, query);
157
183
  const codeBlockRegex = /(```[a-zA-Z0-9+#-]*\n)([\s\S]*?)(```)/g;
158
184
  const originalSize = prompt.length;
159
185
  // Clean the query by stripping all code blocks. This prevents false positive matches
160
186
  // on function names that are only present inside attached codebase files.
161
187
  const cleanQuery = query ? query.replace(codeBlockRegex, '').trim() : '';
162
- const squeezed = prompt.replace(codeBlockRegex, (match, prefix, code, suffix) => {
188
+ const squeezed = ragFiltered.replace(codeBlockRegex, (match, prefix, code, suffix) => {
163
189
  try {
190
+ const filePath = detectFilePath(code);
191
+ if (filePath && fileHistory) {
192
+ const previousContent = fileHistory.get(filePath);
193
+ if (previousContent) {
194
+ if (previousContent.trim() === code.trim()) {
195
+ // File is identical! Return a placeholder to completely omit it and save 100% tokens!
196
+ return `${prefix}// [Lemma AST: Omitted ${filePath} - identical to previous message]\n${suffix}`;
197
+ }
198
+ // File has changed! Generate an AST diff instead of squeezing full code
199
+ const diffContent = generateAstDiff(previousContent, code);
200
+ const firstLine = code.split('\n')[0] || '';
201
+ const replacement = `${firstLine}\n${diffContent}`;
202
+ // Update history with the latest version for subsequent incremental diffs
203
+ fileHistory.set(filePath, code);
204
+ return `${prefix}${replacement}\n${suffix}`;
205
+ }
206
+ // First time seeing this file, save the raw content in session history
207
+ fileHistory.set(filePath, code);
208
+ }
164
209
  const language = prefix.match(/```([a-zA-Z0-9+#-]+)/)?.[1] || '';
165
210
  if (['typescript', 'javascript', 'ts', 'js', 'tsx', 'jsx'].includes(language.toLowerCase()) && cleanQuery) {
166
211
  const squeezedCode = treeShakeCode(code, cleanQuery);
@@ -186,6 +231,82 @@ function squeezePrompt(prompt, query = '') {
186
231
  compressionRatio
187
232
  };
188
233
  }
234
+ /**
235
+ * Extract plain text string content from message formats (string or content block arrays)
236
+ */
237
+ function extractContentText(content) {
238
+ if (typeof content === 'string') {
239
+ return content;
240
+ }
241
+ if (Array.isArray(content)) {
242
+ return content
243
+ .map(part => {
244
+ if (part && typeof part === 'object') {
245
+ if (part.type === 'text' && typeof part.text === 'string') {
246
+ return part.text;
247
+ }
248
+ if (typeof part.text === 'string') {
249
+ return part.text;
250
+ }
251
+ }
252
+ return '';
253
+ })
254
+ .filter(Boolean)
255
+ .join('\n');
256
+ }
257
+ if (content && typeof content === 'object') {
258
+ if (typeof content.text === 'string') {
259
+ return content.text;
260
+ }
261
+ }
262
+ return '';
263
+ }
264
+ /**
265
+ * Decimates older conversational history turns by replacing them with high-density,
266
+ * single-line structured summaries of what was asked and what was resolved.
267
+ */
268
+ function decimateHistory(messages) {
269
+ if (!messages || messages.length <= 6) {
270
+ return messages;
271
+ }
272
+ const decimated = [];
273
+ // Keep the first message (typically system prompt or initial prompt) completely intact
274
+ decimated.push(messages[0]);
275
+ // We want to summarize the "middle" turns, keeping the last 4 messages fully intact
276
+ const middleEndIndex = messages.length - 4;
277
+ const summaries = [];
278
+ let idx = 1;
279
+ while (idx < middleEndIndex) {
280
+ const msg = messages[idx];
281
+ const nextMsg = messages[idx + 1];
282
+ const userText = msg.role === 'user' ? extractContentText(msg.content) : '';
283
+ const assistantText = (nextMsg && nextMsg.role === 'assistant') ? extractContentText(nextMsg.content) : '';
284
+ if (userText) {
285
+ const userIntent = userText.length > 80 ? userText.substring(0, 80) + '...' : userText;
286
+ let assistantResolution = '';
287
+ if (assistantText) {
288
+ const cleanAsst = assistantText.replace(/```[\s\S]*?```/g, '[code block]');
289
+ assistantResolution = cleanAsst.length > 120 ? cleanAsst.substring(0, 120) + '...' : cleanAsst;
290
+ }
291
+ summaries.push(`- Turn ${Math.floor(idx / 2) + 1}: User asked: "${userIntent.trim()}" | Assistant resolved: "${assistantResolution.trim().replace(/\\s+/g, ' ')}"`);
292
+ idx += 2;
293
+ }
294
+ else {
295
+ idx++;
296
+ }
297
+ }
298
+ if (summaries.length > 0) {
299
+ decimated.push({
300
+ role: 'system',
301
+ content: `// [Lemma Conversational Context Decimator: Compressed ${summaries.length} older history turns to save tokens]\n${summaries.join('\n')}`
302
+ });
303
+ }
304
+ // Append the remaining messages
305
+ for (let i = middleEndIndex; i < messages.length; i++) {
306
+ decimated.push(messages[i]);
307
+ }
308
+ return decimated;
309
+ }
189
310
  /**
190
311
  * Prunes conversational message history to compress large repeated codeblocks in historical messages.
191
312
  * Keeps only the most recent message's codeblocks fully intact, and prunes older historical messages
@@ -195,10 +316,11 @@ function pruneHistoryMessages(messages) {
195
316
  if (!messages || messages.length <= 2) {
196
317
  return { messages, tokensSavedEstimate: 0 };
197
318
  }
319
+ const decimatedMessages = decimateHistory(messages);
198
320
  let tokensSavedEstimate = 0;
199
- const pruned = messages.map((msg, index) => {
321
+ const pruned = decimatedMessages.map((msg, index) => {
200
322
  // Keep system messages and the last user/assistant turn completely untouched to avoid losing coherence
201
- if (index >= messages.length - 2 || msg.role === 'system') {
323
+ if (index >= decimatedMessages.length - 2 || msg.role === 'system') {
202
324
  return msg;
203
325
  }
204
326
  const codeBlockRegex = /(```[a-zA-Z0-9+#-]*\n)([\s\S]*?)(```)/g;
@@ -238,4 +360,155 @@ function pruneHistoryMessages(messages) {
238
360
  });
239
361
  return { messages: pruned, tokensSavedEstimate };
240
362
  }
363
+ /**
364
+ * Strip import statements and require declarations from JavaScript, TypeScript, Python and CSS code
365
+ */
366
+ function stripImports(code) {
367
+ const lines = code.split('\n');
368
+ let removedCount = 0;
369
+ const processedLines = lines.filter(line => {
370
+ const trimmed = line.trim();
371
+ // JS/TS standard imports: import ... from ... or import '...'
372
+ if (trimmed.startsWith('import ') || trimmed.startsWith('import{') || trimmed.startsWith('import*')) {
373
+ removedCount++;
374
+ return false;
375
+ }
376
+ // CommonJS require statement: const ... = require(...)
377
+ if (trimmed.includes('require(') && (trimmed.startsWith('const ') || trimmed.startsWith('let ') || trimmed.startsWith('var ') || trimmed.startsWith('import '))) {
378
+ removedCount++;
379
+ return false;
380
+ }
381
+ // Python imports: import ... or from ... import ...
382
+ if (trimmed.startsWith('import ') || trimmed.startsWith('from ') && trimmed.includes(' import ')) {
383
+ removedCount++;
384
+ return false;
385
+ }
386
+ // CSS imports: @import ...
387
+ if (trimmed.startsWith('@import ')) {
388
+ removedCount++;
389
+ return false;
390
+ }
391
+ return true;
392
+ });
393
+ if (removedCount > 0) {
394
+ processedLines.unshift(`// [Lemma Squeezer: Squeezed ${removedCount} import/dependency lines]`);
395
+ }
396
+ return processedLines.join('\n');
397
+ }
398
+ /**
399
+ * Generate a highly compact, unified line-by-line diff between two versions of code blocks
400
+ */
401
+ function generateAstDiff(oldCode, newCode) {
402
+ const oldLines = oldCode.split('\n').map(l => l.trimEnd());
403
+ const newLines = newCode.split('\n').map(l => l.trimEnd());
404
+ const diffLines = [];
405
+ let oldIdx = 0;
406
+ let newIdx = 0;
407
+ while (oldIdx < oldLines.length || newIdx < newLines.length) {
408
+ if (oldIdx < oldLines.length && newIdx < newLines.length) {
409
+ if (oldLines[oldIdx] === newLines[newIdx]) {
410
+ oldIdx++;
411
+ newIdx++;
412
+ }
413
+ else {
414
+ // Detect a modified line vs inserted vs deleted
415
+ let matchOffset = -1;
416
+ for (let offset = 1; offset < 5; offset++) {
417
+ if (newIdx + offset < newLines.length && oldLines[oldIdx] === newLines[newIdx + offset]) {
418
+ matchOffset = offset;
419
+ break;
420
+ }
421
+ }
422
+ if (matchOffset !== -1) {
423
+ for (let i = 0; i < matchOffset; i++) {
424
+ diffLines.push(`+ ${newLines[newIdx + i]}`);
425
+ }
426
+ newIdx += matchOffset;
427
+ }
428
+ else {
429
+ let deleteOffset = -1;
430
+ for (let offset = 1; offset < 5; offset++) {
431
+ if (oldIdx + offset < oldLines.length && oldLines[oldIdx + offset] === newLines[newIdx]) {
432
+ deleteOffset = offset;
433
+ break;
434
+ }
435
+ }
436
+ if (deleteOffset !== -1) {
437
+ for (let i = 0; i < deleteOffset; i++) {
438
+ diffLines.push(`- ${oldLines[oldIdx + i]}`);
439
+ }
440
+ oldIdx += deleteOffset;
441
+ }
442
+ else {
443
+ diffLines.push(`- ${oldLines[oldIdx]}`);
444
+ diffLines.push(`+ ${newLines[newIdx]}`);
445
+ oldIdx++;
446
+ newIdx++;
447
+ }
448
+ }
449
+ }
450
+ }
451
+ else if (newIdx < newLines.length) {
452
+ diffLines.push(`+ ${newLines[newIdx]}`);
453
+ newIdx++;
454
+ }
455
+ else if (oldIdx < oldLines.length) {
456
+ diffLines.push(`- ${oldLines[oldIdx]}`);
457
+ oldIdx++;
458
+ }
459
+ }
460
+ if (diffLines.length === 0) {
461
+ return `// [Lemma AST Diff: No structural differences found]`;
462
+ }
463
+ return [
464
+ `// [Lemma AST Incremental Diff: showing only modified/inserted lines]`,
465
+ ...diffLines
466
+ ].join('\n');
467
+ }
468
+ /**
469
+ * Filters large codebase search results / RAG dumps in the prompt, keeping only the most
470
+ * semantically relevant snippets based on keyword intersection (Jaccard similarity).
471
+ */
472
+ function filterHighDensityRAG(prompt, query) {
473
+ // If prompt is short, don't do RAG filtering
474
+ if (prompt.length < 2000 || !query)
475
+ return prompt;
476
+ const searchResultRegex = /(?:Codebase search results|Context from search|Files found from search|Selected codebase snippets|Search results):([\s\S]*?)(?=\n\n\w|\n\n#|$)/i;
477
+ const match = prompt.match(searchResultRegex);
478
+ if (!match || !match[1])
479
+ return prompt;
480
+ const rawSection = match[1];
481
+ // Snippets inside the search results section are usually separated by dashed lines, newlines, or headers
482
+ // Let's split by double newlines or markdown headers or code block borders
483
+ const snippets = rawSection.split(/(?=^#|\/\/ File:|^File:)/m).map(s => s.trim()).filter(Boolean);
484
+ if (snippets.length <= 3)
485
+ return prompt; // Don't filter if there are very few snippets
486
+ const scoredSnippets = snippets.map(snippet => {
487
+ // Calculate Jaccard similarity between snippet and user query
488
+ const wordsQuery = new Set(query.toLowerCase().match(/\w+/g) || []);
489
+ const wordsSnippet = new Set(snippet.toLowerCase().match(/\w+/g) || []);
490
+ let intersection = 0;
491
+ for (const w of wordsQuery) {
492
+ if (wordsSnippet.has(w))
493
+ intersection++;
494
+ }
495
+ const similarity = wordsQuery.size + wordsSnippet.size > 0
496
+ ? intersection / (wordsQuery.size + wordsSnippet.size - intersection)
497
+ : 0;
498
+ return { snippet, similarity };
499
+ });
500
+ // Sort by similarity descending
501
+ scoredSnippets.sort((a, b) => b.similarity - a.similarity);
502
+ // Keep only the top 3 most relevant snippets, or any snippet with a similarity above 0.05
503
+ const threshold = 0.05;
504
+ const kept = scoredSnippets.filter((item, idx) => idx < 3 || item.similarity >= threshold);
505
+ const discardedCount = scoredSnippets.length - kept.length;
506
+ if (discardedCount > 0) {
507
+ const keptSection = kept.map(k => k.snippet).join('\n\n');
508
+ const summary = `\n\n// [Lemma RAG Filter: Omitted ${discardedCount} low-relevance fuzzy-match snippets, saving ~${discardedCount * 300} context tokens]\n\n`;
509
+ const newSection = `${keptSection}${summary}`;
510
+ return prompt.replace(rawSection, newSection);
511
+ }
512
+ return prompt;
513
+ }
241
514
  //# sourceMappingURL=ContextSqueezer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContextSqueezer.js","sourceRoot":"","sources":["../../../src/utils/ContextSqueezer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ContextSqueezer.js","sourceRoot":"","sources":["../../../src/utils/ContextSqueezer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"lemma-proxy.d.ts","sourceRoot":"","sources":["../../../src/cli/lemma-proxy.ts"],"names":[],"mappings":";AA+yCA,wBAAsB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6KhL"}
1
+ {"version":3,"file":"lemma-proxy.d.ts","sourceRoot":"","sources":["../../../src/cli/lemma-proxy.ts"],"names":[],"mappings":";AAw3CA,wBAAsB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6KhL"}
@@ -170,22 +170,28 @@ async function ensureChromaRunning() {
170
170
  }
171
171
  function ensureGitIgnore() {
172
172
  const gi = path.join(process.cwd(), '.gitignore');
173
- const line = '.lemma/';
173
+ let added = false;
174
174
  try {
175
+ let content = '';
175
176
  if (fs.existsSync(gi)) {
176
- const content = fs.readFileSync(gi, 'utf8');
177
- if (!content.includes(line)) {
178
- fs.appendFileSync(gi, `\n# Lemma Context Logs\n${line}\n`);
179
- return true;
180
- }
177
+ content = fs.readFileSync(gi, 'utf8');
181
178
  }
182
- else {
183
- fs.writeFileSync(gi, `# Lemma Context Logs\n${line}\n`);
184
- return true;
179
+ const appendLines = [];
180
+ if (!content.includes('.lemma/')) {
181
+ appendLines.push('# Lemma Context Logs', '.lemma/');
182
+ added = true;
183
+ }
184
+ if (!content.includes('chroma_data/')) {
185
+ appendLines.push('# Lemma Local Vector Database', 'chroma_data/');
186
+ added = true;
187
+ }
188
+ if (appendLines.length > 0) {
189
+ const prefix = content.endsWith('\n') || content === '' ? '' : '\n';
190
+ fs.appendFileSync(gi, prefix + appendLines.join('\n') + '\n');
185
191
  }
186
192
  }
187
193
  catch { }
188
- return false;
194
+ return added;
189
195
  }
190
196
  // ── License helpers ────────────────────────────────────────────────────────────
191
197
  async function loadLicense() {
@@ -500,8 +506,43 @@ async function relayMissStream(res, body, provider, tier) {
500
506
  setSseHeaders(res, false, 1.0, tier);
501
507
  const apiKey = provider === 'openai' ? process.env.OPENAI_API_KEY : process.env.ANTHROPIC_API_KEY;
502
508
  if (!apiKey) {
503
- res.write(`data: ${JSON.stringify({ error: `${provider.toUpperCase()}_API_KEY not set` })}\n\ndata: [DONE]\n\n`);
504
- res.end();
509
+ console.log(`\n⚠️ No API Key found for ${provider.toUpperCase()} stream. Falling back to local Ollama (Zero-Cost Mode)!`);
510
+ const isCloudModel = body.model && (body.model.startsWith('gpt') ||
511
+ body.model.startsWith('claude') ||
512
+ body.model.startsWith('gemini'));
513
+ const localModel = isCloudModel ? 'llama3' : (body.model || 'llama3');
514
+ const payload = JSON.stringify({ ...body, model: localModel, stream: true });
515
+ await new Promise(resolve => {
516
+ const req = http.request({
517
+ hostname: '127.0.0.1',
518
+ port: 11434,
519
+ path: '/v1/chat/completions',
520
+ method: 'POST',
521
+ headers: {
522
+ 'Content-Type': 'application/json',
523
+ 'Content-Length': Buffer.byteLength(payload)
524
+ }
525
+ }, upstream => {
526
+ upstream.on('data', chunk => res.write(chunk));
527
+ upstream.on('end', () => {
528
+ res.write('data: [DONE]\n\n');
529
+ res.end();
530
+ resolve();
531
+ });
532
+ upstream.on('error', err => {
533
+ res.write(`data: ${JSON.stringify({ error: `Ollama stream error: ${err.message}` })}\n\ndata: [DONE]\n\n`);
534
+ res.end();
535
+ resolve();
536
+ });
537
+ });
538
+ req.on('error', err => {
539
+ res.write(`data: ${JSON.stringify({ error: `Failed to connect to local Ollama. Verify that Ollama is running on port 11434. (Original error: ${err.message})` })}\n\ndata: [DONE]\n\n`);
540
+ res.end();
541
+ resolve();
542
+ });
543
+ req.write(payload);
544
+ req.end();
545
+ });
505
546
  return;
506
547
  }
507
548
  const hostname = provider === 'openai' ? 'api.openai.com' : 'api.anthropic.com';
@@ -528,6 +569,7 @@ class LemmaServer {
528
569
  constructor(port, projectName, openBrowser = true) {
529
570
  this.stats = {};
530
571
  this.dashboardPath = '';
572
+ this.sessions = new Map();
531
573
  this.port = port;
532
574
  this.projectName = projectName || detectProject();
533
575
  this.projectDir = ensureProjectDir(this.projectName);
@@ -698,9 +740,23 @@ class LemmaServer {
698
740
  req.body.model = model;
699
741
  // Apply the Agent Multiplexer to local-verify the prompt in parallel
700
742
  const enrichedPrompt = await agentMultiplexer.multiplexPrompt(prompt, model);
743
+ // Resolve conversation session key and retrieve/create the fileHistory map
744
+ let fileHistory;
745
+ if (req.body.messages && req.body.messages.length > 0) {
746
+ try {
747
+ const firstMsg = req.body.messages[0];
748
+ const content = typeof firstMsg.content === 'string' ? firstMsg.content : JSON.stringify(firstMsg.content);
749
+ const sessionKey = crypto.createHash('sha1').update(content).digest('hex');
750
+ if (!this.sessions.has(sessionKey)) {
751
+ this.sessions.set(sessionKey, { fileHistory: new Map() });
752
+ }
753
+ fileHistory = this.sessions.get(sessionKey).fileHistory;
754
+ }
755
+ catch { }
756
+ }
701
757
  // Compress long TS/JS codebase file blocks in the enriched prompt using the Context Squeezer AST Tree-Shaker!
702
758
  // The query context is the user's primary prompt to ensure we keep relevant methods!
703
- const squeezeResult = squeezePrompt(enrichedPrompt, prompt);
759
+ const squeezeResult = squeezePrompt(enrichedPrompt, prompt, fileHistory);
704
760
  const squeezedPrompt = squeezeResult.squeezed;
705
761
  const compressionSavings = squeezeResult.originalSize - squeezeResult.squeezedSize;
706
762
  if (compressionSavings > 0) {
@@ -925,6 +981,14 @@ Adjusted Answer:`;
925
981
  console.log('simply copy-paste this command into your MCP settings:');
926
982
  console.log(`\n \x1b[1m\x1b[33mlemma mcp\x1b[0m\n`);
927
983
  console.log('────────────────────────────────────────────────\n');
984
+ // Auto-start the Local Clipboard Optimizer Watcher in the background
985
+ try {
986
+ const { startClipboardWatcher } = require('../utils/ClipboardWatcher');
987
+ startClipboardWatcher(1000);
988
+ }
989
+ catch (err) {
990
+ console.warn(`⚠️ Could not auto-initialize Clipboard Watcher: ${err.message}`);
991
+ }
928
992
  });
929
993
  process.on('SIGTERM', () => server.close());
930
994
  }
@@ -1159,7 +1223,7 @@ program.command('init')
1159
1223
  console.log('✅ Created .lemma directory (Telepathic Sync enabled)');
1160
1224
  }
1161
1225
  if (ensureGitIgnore()) {
1162
- console.log('✅ Added .lemma/ to .gitignore');
1226
+ console.log('✅ Updated .gitignore with Lemma ignore rules');
1163
1227
  }
1164
1228
  const envFile = path.join(process.cwd(), '.env');
1165
1229
  const lemmaConfig = `\n# Lemma AI Gateway Configuration\nOPENAI_BASE_URL=http://localhost:8081/v1\nLEMMA_PROJECT=${project}\n`;
@@ -1437,6 +1501,22 @@ program.command('autopilot')
1437
1501
  process.exit(1);
1438
1502
  }
1439
1503
  });
1504
+ program.command('clipboard')
1505
+ .description('Start the Lemma Local Clipboard Telepathic Optimizer (auto-squeezes copied code blocks)')
1506
+ .option('--interval <ms>', 'Polling interval in milliseconds', '1000')
1507
+ .action((opts) => {
1508
+ try {
1509
+ const interval = parseInt(opts.interval) || 1000;
1510
+ const { startClipboardWatcher } = require('../utils/ClipboardWatcher');
1511
+ startClipboardWatcher(interval);
1512
+ // Keep process alive
1513
+ process.stdin.resume();
1514
+ }
1515
+ catch (err) {
1516
+ console.error('❌ Exception starting Clipboard Watcher:', err.message);
1517
+ process.exit(1);
1518
+ }
1519
+ });
1440
1520
  if (process.argv[1] && (process.argv[1].includes('lemma') || process.argv[1].endsWith('.cjs') || process.argv[1].endsWith('.js'))) {
1441
1521
  program.parse(process.argv);
1442
1522
  }