@nxuss/lemma 0.4.5 → 0.4.7

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 (76) hide show
  1. package/README.md +42 -39
  2. package/dist/cjs/autopilot/AutopilotWatcher.d.ts +11 -0
  3. package/dist/cjs/autopilot/AutopilotWatcher.d.ts.map +1 -0
  4. package/dist/cjs/autopilot/AutopilotWatcher.js +119 -0
  5. package/dist/cjs/autopilot/AutopilotWatcher.js.map +1 -0
  6. package/dist/cjs/cli/lemma-proxy.d.ts +10 -0
  7. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -0
  8. package/dist/cjs/cli/lemma-proxy.js +1268 -0
  9. package/dist/cjs/cli/lemma-proxy.js.map +1 -0
  10. package/dist/cjs/cloud/CloudSyncClient.d.ts +10 -0
  11. package/dist/cjs/cloud/CloudSyncClient.d.ts.map +1 -0
  12. package/dist/cjs/cloud/CloudSyncClient.js +42 -0
  13. package/dist/cjs/cloud/CloudSyncClient.js.map +1 -0
  14. package/dist/cjs/mcp/index.d.ts +2 -0
  15. package/dist/cjs/mcp/index.d.ts.map +1 -0
  16. package/dist/cjs/mcp/index.js +260 -0
  17. package/dist/cjs/mcp/index.js.map +1 -0
  18. package/dist/cjs/observability/IdeContextSync.d.ts.map +1 -1
  19. package/dist/cjs/observability/IdeContextSync.js +7 -2
  20. package/dist/cjs/observability/IdeContextSync.js.map +1 -1
  21. package/dist/cjs/proxy/AgentMultiplexer.d.ts +9 -0
  22. package/dist/cjs/proxy/AgentMultiplexer.d.ts.map +1 -0
  23. package/dist/cjs/proxy/AgentMultiplexer.js +69 -0
  24. package/dist/cjs/proxy/AgentMultiplexer.js.map +1 -0
  25. package/dist/cjs/proxy/ComplexityRouter.d.ts +19 -0
  26. package/dist/cjs/proxy/ComplexityRouter.d.ts.map +1 -0
  27. package/dist/cjs/proxy/ComplexityRouter.js +79 -0
  28. package/dist/cjs/proxy/ComplexityRouter.js.map +1 -0
  29. package/dist/cjs/security/SemanticScrubber.d.ts +25 -0
  30. package/dist/cjs/security/SemanticScrubber.d.ts.map +1 -0
  31. package/dist/cjs/security/SemanticScrubber.js +99 -0
  32. package/dist/cjs/security/SemanticScrubber.js.map +1 -0
  33. package/dist/cjs/utils/ContextSqueezer.d.ts +44 -0
  34. package/dist/cjs/utils/ContextSqueezer.d.ts.map +1 -0
  35. package/dist/cjs/utils/ContextSqueezer.js +201 -0
  36. package/dist/cjs/utils/ContextSqueezer.js.map +1 -0
  37. package/dist/esm/autopilot/AutopilotWatcher.d.ts +11 -0
  38. package/dist/esm/autopilot/AutopilotWatcher.d.ts.map +1 -0
  39. package/dist/esm/autopilot/AutopilotWatcher.js +112 -0
  40. package/dist/esm/autopilot/AutopilotWatcher.js.map +1 -0
  41. package/dist/esm/cli/lemma-proxy.d.ts +10 -0
  42. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -0
  43. package/dist/esm/cli/lemma-proxy.js +1262 -0
  44. package/dist/esm/cli/lemma-proxy.js.map +1 -0
  45. package/dist/esm/cloud/CloudSyncClient.d.ts +10 -0
  46. package/dist/esm/cloud/CloudSyncClient.d.ts.map +1 -0
  47. package/dist/esm/cloud/CloudSyncClient.js +35 -0
  48. package/dist/esm/cloud/CloudSyncClient.js.map +1 -0
  49. package/dist/esm/mcp/index.d.ts +2 -0
  50. package/dist/esm/mcp/index.d.ts.map +1 -0
  51. package/dist/esm/mcp/index.js +255 -0
  52. package/dist/esm/mcp/index.js.map +1 -0
  53. package/dist/esm/observability/IdeContextSync.d.ts.map +1 -1
  54. package/dist/esm/observability/IdeContextSync.js +7 -2
  55. package/dist/esm/observability/IdeContextSync.js.map +1 -1
  56. package/dist/esm/proxy/AgentMultiplexer.d.ts +9 -0
  57. package/dist/esm/proxy/AgentMultiplexer.d.ts.map +1 -0
  58. package/dist/esm/proxy/AgentMultiplexer.js +62 -0
  59. package/dist/esm/proxy/AgentMultiplexer.js.map +1 -0
  60. package/dist/esm/proxy/ComplexityRouter.d.ts +19 -0
  61. package/dist/esm/proxy/ComplexityRouter.d.ts.map +1 -0
  62. package/dist/esm/proxy/ComplexityRouter.js +75 -0
  63. package/dist/esm/proxy/ComplexityRouter.js.map +1 -0
  64. package/dist/esm/security/SemanticScrubber.d.ts +25 -0
  65. package/dist/esm/security/SemanticScrubber.d.ts.map +1 -0
  66. package/dist/esm/security/SemanticScrubber.js +92 -0
  67. package/dist/esm/security/SemanticScrubber.js.map +1 -0
  68. package/dist/esm/utils/ContextSqueezer.d.ts +44 -0
  69. package/dist/esm/utils/ContextSqueezer.d.ts.map +1 -0
  70. package/dist/esm/utils/ContextSqueezer.js +193 -0
  71. package/dist/esm/utils/ContextSqueezer.js.map +1 -0
  72. package/lemma-proxy.cjs +12 -738
  73. package/package.json +4 -3
  74. package/src/cloud/CloudSyncClient.js +0 -35
  75. package/src/proxy/ComplexityRouter.js +0 -37
  76. package/src/security/SemanticScrubber.js +0 -54
@@ -0,0 +1,19 @@
1
+ export interface ComplexityRouterConfig {
2
+ cheapModel?: string;
3
+ complexKeywords?: string[];
4
+ complexityThreshold?: number;
5
+ disabled?: boolean;
6
+ }
7
+ export declare class ComplexityRouter {
8
+ private cheapModel;
9
+ private complexKeywords;
10
+ private syntaxDensityThreshold;
11
+ constructor(config?: ComplexityRouterConfig);
12
+ updateConfig(config: ComplexityRouterConfig): void;
13
+ evaluate(prompt: string, originalModel?: string): {
14
+ model: string;
15
+ complexity: 'low' | 'high';
16
+ };
17
+ }
18
+ export default ComplexityRouter;
19
+ //# sourceMappingURL=ComplexityRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComplexityRouter.d.ts","sourceRoot":"","sources":["../../../src/proxy/ComplexityRouter.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,sBAAsB,CAAS;gBAE3B,MAAM,GAAE,sBAA2B;IAWxC,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAMlD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE;CA4DvG;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,75 @@
1
+ export class ComplexityRouter {
2
+ constructor(config = {}) {
3
+ this.cheapModel = config.cheapModel || 'gpt-4o-mini';
4
+ this.complexKeywords = config.complexKeywords || [
5
+ 'architecture', 'design', 'debug', 'trace', 'system', 'microservices',
6
+ 'refactor', 'optimize', 'implement', 'algorithm', 'distributed',
7
+ 'consensus', 'security', 'complex', 'concurrency', 'deadlock',
8
+ 'performance', 'bottleneck', 'memory leak', 'race condition'
9
+ ];
10
+ this.syntaxDensityThreshold = config.complexityThreshold || 0.05; // 5% syntax characters
11
+ }
12
+ updateConfig(config) {
13
+ if (config.cheapModel)
14
+ this.cheapModel = config.cheapModel;
15
+ if (config.complexKeywords)
16
+ this.complexKeywords = config.complexKeywords;
17
+ if (config.complexityThreshold)
18
+ this.syntaxDensityThreshold = config.complexityThreshold;
19
+ }
20
+ evaluate(prompt, originalModel) {
21
+ // If user explicitly requested a local or nomic model, keep it
22
+ const isLocal = originalModel?.startsWith('llama') ||
23
+ originalModel?.startsWith('mistral') ||
24
+ originalModel?.startsWith('ollama') ||
25
+ originalModel?.startsWith('nomic');
26
+ if (isLocal) {
27
+ return { model: originalModel || 'gpt-4o', complexity: 'high' };
28
+ }
29
+ if (!prompt || prompt.length < 10) {
30
+ return { model: originalModel ? this.cheapModel : 'gpt-4o-mini', complexity: 'low' };
31
+ }
32
+ const lower = prompt.toLowerCase();
33
+ let isComplex = false;
34
+ let complexityReason = '';
35
+ // Heuristic 1: Code blocks presence (Markdown)
36
+ if (prompt.includes('```')) {
37
+ isComplex = true;
38
+ complexityReason = 'Contains multiline code blocks';
39
+ }
40
+ // Heuristic 2: Syntax density check
41
+ if (!isComplex) {
42
+ const codeIndicators = (prompt.match(/[{}[\]();=<>+\-*/&|^%]/g) || []).length;
43
+ const density = codeIndicators / prompt.length;
44
+ if (density > this.syntaxDensityThreshold && prompt.length > 80) {
45
+ isComplex = true;
46
+ complexityReason = `High syntax density (${(density * 100).toFixed(1)}%)`;
47
+ }
48
+ }
49
+ // Heuristic 3: Keywords that imply deep reasoning
50
+ if (!isComplex) {
51
+ for (const kw of this.complexKeywords) {
52
+ if (lower.includes(kw)) {
53
+ isComplex = true;
54
+ complexityReason = `Matches complex keyword: "${kw}"`;
55
+ break;
56
+ }
57
+ }
58
+ }
59
+ // Heuristic 4: Prompt Length (super long prompts require high reasoning context)
60
+ if (!isComplex && prompt.length > 1000) {
61
+ isComplex = true;
62
+ complexityReason = `Large prompt context (${prompt.length} chars)`;
63
+ }
64
+ if (isComplex) {
65
+ console.log(`[ComplexityRouter] High complexity detected (${complexityReason}). Routing to ${originalModel || 'gpt-4o'}`);
66
+ return { model: originalModel || 'gpt-4o', complexity: 'high' };
67
+ }
68
+ else {
69
+ console.log(`[ComplexityRouter] Low complexity detected. Routing to ${this.cheapModel}`);
70
+ return { model: this.cheapModel, complexity: 'low' };
71
+ }
72
+ }
73
+ }
74
+ export default ComplexityRouter;
75
+ //# sourceMappingURL=ComplexityRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComplexityRouter.js","sourceRoot":"","sources":["../../../src/proxy/ComplexityRouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface ScrubberPattern {
2
+ name: string;
3
+ regex: RegExp;
4
+ }
5
+ export interface ScrubberConfig {
6
+ disabled?: boolean;
7
+ patterns?: Array<{
8
+ name: string;
9
+ regex: string | RegExp;
10
+ }>;
11
+ }
12
+ export declare class SemanticScrubber {
13
+ private patterns;
14
+ private configPath;
15
+ constructor();
16
+ private loadPatterns;
17
+ mask(prompt: string): {
18
+ maskedPrompt: string;
19
+ tokenMap: Record<string, string>;
20
+ };
21
+ unmask<T>(responseObj: T, tokenMap: Record<string, string>): T;
22
+ unmaskString(str: string, tokenMap: Record<string, string>): string;
23
+ }
24
+ export default SemanticScrubber;
25
+ //# sourceMappingURL=SemanticScrubber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticScrubber.d.ts","sourceRoot":"","sources":["../../../src/security/SemanticScrubber.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,UAAU,CAAiD;;IAMnE,OAAO,CAAC,YAAY;IA8Cb,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAwBhF,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;IAa9D,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;CAQ3E;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,92 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ export class SemanticScrubber {
4
+ constructor() {
5
+ this.patterns = [];
6
+ this.configPath = path.join(process.cwd(), 'lemma.config.json');
7
+ this.loadPatterns();
8
+ }
9
+ loadPatterns() {
10
+ // Standard patterns
11
+ const defaultPatterns = [
12
+ { name: 'API_KEY', regex: /(sk-[a-zA-Z0-9\-]{20,})/g },
13
+ { name: 'EMAIL', regex: /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/g },
14
+ { name: 'TOKEN', regex: /(Bearer\s+[a-zA-Z0-9\-._~+/]+=*)/gi }
15
+ ];
16
+ try {
17
+ if (fs.existsSync(this.configPath)) {
18
+ const rawConfig = fs.readFileSync(this.configPath, 'utf8');
19
+ const config = JSON.parse(rawConfig);
20
+ const scrubberConfig = config.security?.scrubber || {};
21
+ if (scrubberConfig.disabled) {
22
+ this.patterns = [];
23
+ console.log('[PrivacyFirewall] SemanticScrubber is disabled via config.');
24
+ return;
25
+ }
26
+ if (scrubberConfig.patterns && Array.isArray(scrubberConfig.patterns)) {
27
+ const loadedPatterns = [];
28
+ for (const p of scrubberConfig.patterns) {
29
+ if (p.name && p.regex) {
30
+ try {
31
+ const regexObj = typeof p.regex === 'string' ? new RegExp(p.regex, 'gi') : p.regex;
32
+ loadedPatterns.push({ name: p.name, regex: regexObj });
33
+ }
34
+ catch (err) {
35
+ console.warn(`[PrivacyFirewall] Invalid custom pattern regex: "${p.regex}". Error: ${err.message}`);
36
+ }
37
+ }
38
+ }
39
+ if (loadedPatterns.length > 0) {
40
+ this.patterns = loadedPatterns;
41
+ console.log(`[PrivacyFirewall] Loaded ${this.patterns.length} custom mask patterns.`);
42
+ return;
43
+ }
44
+ }
45
+ }
46
+ }
47
+ catch (e) {
48
+ console.warn(`[PrivacyFirewall] Error loading lemma.config.json: ${e.message}. Using defaults.`);
49
+ }
50
+ this.patterns = defaultPatterns;
51
+ }
52
+ mask(prompt) {
53
+ let maskedPrompt = prompt;
54
+ const tokenMap = {};
55
+ let counter = 1;
56
+ if (this.patterns.length === 0) {
57
+ return { maskedPrompt, tokenMap };
58
+ }
59
+ for (const pattern of this.patterns) {
60
+ maskedPrompt = maskedPrompt.replace(pattern.regex, (match) => {
61
+ const token = `[${pattern.name}_${counter++}]`;
62
+ tokenMap[token] = match;
63
+ return token;
64
+ });
65
+ }
66
+ if (Object.keys(tokenMap).length > 0) {
67
+ console.log(`[PrivacyFirewall] Masked ${Object.keys(tokenMap).length} secrets.`);
68
+ }
69
+ return { maskedPrompt, tokenMap };
70
+ }
71
+ unmask(responseObj, tokenMap) {
72
+ if (!responseObj || Object.keys(tokenMap).length === 0)
73
+ return responseObj;
74
+ let str = typeof responseObj === 'string' ? responseObj : JSON.stringify(responseObj);
75
+ for (const [token, value] of Object.entries(tokenMap)) {
76
+ str = str.split(token).join(value);
77
+ }
78
+ return typeof responseObj === 'string' ? str : JSON.parse(str);
79
+ }
80
+ // Unmask a single stream chunk string
81
+ unmaskString(str, tokenMap) {
82
+ if (!str || Object.keys(tokenMap).length === 0)
83
+ return str;
84
+ let unmasked = str;
85
+ for (const [token, value] of Object.entries(tokenMap)) {
86
+ unmasked = unmasked.split(token).join(value);
87
+ }
88
+ return unmasked;
89
+ }
90
+ }
91
+ export default SemanticScrubber;
92
+ //# sourceMappingURL=SemanticScrubber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticScrubber.js","sourceRoot":"","sources":["../../../src/security/SemanticScrubber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Context Squeezer - Token Compactor for AI Prompts and Logs
3
+ *
4
+ * This utility compresses source code snippets and logs to their absolute
5
+ * semantic minimum by stripping comments, excessive whitespace, and boilerplate,
6
+ * saving up to 80% of token consumption in LLM context windows.
7
+ */
8
+ export interface SqueezeResult {
9
+ squeezed: string;
10
+ originalSize: number;
11
+ squeezedSize: number;
12
+ compressionRatio: number;
13
+ }
14
+ /**
15
+ * Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code
16
+ */
17
+ export declare function stripComments(code: string): string;
18
+ /**
19
+ * Compress code structure by removing redundant whitespace and blank lines
20
+ */
21
+ export declare function compactWhitespace(code: string): string;
22
+ /**
23
+ * Compresses very long TypeScript/JavaScript files by keeping only the function/class signatures
24
+ * and removing function body implementation details for functions that are not mentioned in the query!
25
+ */
26
+ export declare function treeShakeCode(code: string, query: string): string;
27
+ /**
28
+ * Squeezes a block of source code
29
+ */
30
+ export declare function squeezeCode(code: string): string;
31
+ /**
32
+ * Squeezes all markdown code blocks (``` ... ```) inside a prompt string
33
+ */
34
+ export declare function squeezePrompt(prompt: string, query?: string): SqueezeResult;
35
+ /**
36
+ * Prunes conversational message history to compress large repeated codeblocks in historical messages.
37
+ * Keeps only the most recent message's codeblocks fully intact, and prunes older historical messages
38
+ * if they are extremely large and contain redundant code blocks.
39
+ */
40
+ export declare function pruneHistoryMessages(messages: any[]): {
41
+ messages: any[];
42
+ tokensSavedEstimate: number;
43
+ };
44
+ //# sourceMappingURL=ContextSqueezer.d.ts.map
@@ -0,0 +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;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAkEjE;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,CA+B/E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAuCtG"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Context Squeezer - Token Compactor for AI Prompts and Logs
3
+ *
4
+ * This utility compresses source code snippets and logs to their absolute
5
+ * semantic minimum by stripping comments, excessive whitespace, and boilerplate,
6
+ * saving up to 80% of token consumption in LLM context windows.
7
+ */
8
+ /**
9
+ * Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code
10
+ */
11
+ export function stripComments(code) {
12
+ // 1. Remove multi-line comments /* ... */
13
+ let clean = code.replace(/\/\*[\s\S]*?\*\//g, '');
14
+ // 2. Remove single-line comments // ...
15
+ // Be careful not to strip URL protocols like http:// or https://
16
+ const lines = clean.split('\n');
17
+ const processedLines = lines.map(line => {
18
+ // If the line contains a URL, do not strip comments or do it carefully
19
+ if (line.includes('http://') || line.includes('https://')) {
20
+ // Find comment symbol not preceded by : or within a string (simple heuristic)
21
+ const urlIndex = line.indexOf('://');
22
+ const commentIndex = line.indexOf('//');
23
+ if (commentIndex !== -1 && commentIndex < urlIndex) {
24
+ return line.substring(0, commentIndex);
25
+ }
26
+ // If comment is after the URL
27
+ const postUrlComment = line.indexOf('//', urlIndex + 3);
28
+ if (postUrlComment !== -1) {
29
+ return line.substring(0, postUrlComment);
30
+ }
31
+ return line;
32
+ }
33
+ const commentIndex = line.indexOf('//');
34
+ if (commentIndex !== -1) {
35
+ return line.substring(0, commentIndex);
36
+ }
37
+ return line;
38
+ });
39
+ return processedLines.join('\n');
40
+ }
41
+ /**
42
+ * Compress code structure by removing redundant whitespace and blank lines
43
+ */
44
+ export function compactWhitespace(code) {
45
+ return code
46
+ .split('\n')
47
+ .map(line => line.trimEnd()) // Trim trailing spaces
48
+ .filter(line => line.trim().length > 0) // Remove empty lines
49
+ .join('\n')
50
+ .replace(/[ \t]+/g, ' '); // Collapse multiple spaces/tabs into a single space
51
+ }
52
+ /**
53
+ * Compresses very long TypeScript/JavaScript files by keeping only the function/class signatures
54
+ * and removing function body implementation details for functions that are not mentioned in the query!
55
+ */
56
+ export function treeShakeCode(code, query) {
57
+ // If code is short, do normal squeezing
58
+ if (code.length < 500) {
59
+ return squeezeCode(code);
60
+ }
61
+ // Strip comments first to preserve tree-shaker comment markers in the final output
62
+ const cleanCode = stripComments(code);
63
+ const lines = cleanCode.split('\n');
64
+ const resultLines = [];
65
+ let inFunctionBody = false;
66
+ let bodyBracesCount = 0;
67
+ let skippedLinesCount = 0;
68
+ for (let i = 0; i < lines.length; i++) {
69
+ const line = lines[i];
70
+ const trimmed = line.trim();
71
+ if (inFunctionBody) {
72
+ // Track curly braces to know when the function body ends
73
+ const opens = (line.match(/\{/g) || []).length;
74
+ const closes = (line.match(/\}/g) || []).length;
75
+ bodyBracesCount += opens - closes;
76
+ if (bodyBracesCount <= 0) {
77
+ inFunctionBody = false;
78
+ resultLines.push(`/* ... [Lemma AST Tree-Shaker: body omitted to save ${skippedLinesCount + 1} lines] ... */ }`);
79
+ }
80
+ else {
81
+ skippedLinesCount++;
82
+ }
83
+ continue;
84
+ }
85
+ // Detect function/method declarations
86
+ const isFunc = trimmed.startsWith('function ') ||
87
+ trimmed.startsWith('export function ') ||
88
+ trimmed.startsWith('async function ') ||
89
+ trimmed.startsWith('export async function ') ||
90
+ (trimmed.includes('(') && trimmed.includes('{') && (trimmed.startsWith('public ') || trimmed.startsWith('private ') || trimmed.startsWith('async ') || trimmed.startsWith('static ')));
91
+ if (isFunc && trimmed.endsWith('{')) {
92
+ // Find the name of the function
93
+ let funcName = '';
94
+ if (trimmed.includes('(')) {
95
+ const parts = trimmed.split('(');
96
+ if (parts[0]) {
97
+ const words = parts[0].trim().split(/\s+/);
98
+ funcName = words.pop() || '';
99
+ }
100
+ }
101
+ // If a function name is found, and it is NOT mentioned in the user's query, and it is not 'constructor'
102
+ if (funcName && funcName.length > 2 && funcName !== 'constructor' && query && !query.toLowerCase().includes(funcName.toLowerCase())) {
103
+ inFunctionBody = true;
104
+ bodyBracesCount = 1;
105
+ skippedLinesCount = 0;
106
+ resultLines.push(line);
107
+ continue;
108
+ }
109
+ }
110
+ resultLines.push(line);
111
+ }
112
+ return compactWhitespace(resultLines.join('\n'));
113
+ }
114
+ /**
115
+ * Squeezes a block of source code
116
+ */
117
+ export function squeezeCode(code) {
118
+ const withoutComments = stripComments(code);
119
+ return compactWhitespace(withoutComments);
120
+ }
121
+ /**
122
+ * Squeezes all markdown code blocks (``` ... ```) inside a prompt string
123
+ */
124
+ export function squeezePrompt(prompt, query = '') {
125
+ const codeBlockRegex = /(```[a-zA-Z0-9+#-]*\n)([\s\S]*?)(```)/g;
126
+ const originalSize = prompt.length;
127
+ const squeezed = prompt.replace(codeBlockRegex, (match, prefix, code, suffix) => {
128
+ try {
129
+ const language = prefix.match(/```([a-zA-Z0-9+#-]+)/)?.[1] || '';
130
+ if (['typescript', 'javascript', 'ts', 'js', 'tsx', 'jsx'].includes(language.toLowerCase()) && query) {
131
+ const squeezedCode = treeShakeCode(code, query);
132
+ return `${prefix}${squeezedCode}\n${suffix}`;
133
+ }
134
+ else {
135
+ const squeezedCode = squeezeCode(code);
136
+ return `${prefix}${squeezedCode}\n${suffix}`;
137
+ }
138
+ }
139
+ catch {
140
+ return match; // Fallback to original block if processing fails
141
+ }
142
+ });
143
+ const squeezedSize = squeezed.length;
144
+ const compressionRatio = originalSize > 0
145
+ ? parseFloat(((originalSize - squeezedSize) / originalSize).toFixed(4))
146
+ : 0;
147
+ return {
148
+ squeezed,
149
+ originalSize,
150
+ squeezedSize,
151
+ compressionRatio
152
+ };
153
+ }
154
+ /**
155
+ * Prunes conversational message history to compress large repeated codeblocks in historical messages.
156
+ * Keeps only the most recent message's codeblocks fully intact, and prunes older historical messages
157
+ * if they are extremely large and contain redundant code blocks.
158
+ */
159
+ export function pruneHistoryMessages(messages) {
160
+ if (!messages || messages.length <= 2) {
161
+ return { messages, tokensSavedEstimate: 0 };
162
+ }
163
+ let tokensSavedEstimate = 0;
164
+ const pruned = messages.map((msg, index) => {
165
+ // Keep system messages and the last user/assistant turn completely untouched to avoid losing coherence
166
+ if (index >= messages.length - 2 || msg.role === 'system') {
167
+ return msg;
168
+ }
169
+ if (typeof msg.content !== 'string') {
170
+ return msg;
171
+ }
172
+ // Check if the message contains massive codeblocks
173
+ const codeBlockRegex = /(```[a-zA-Z0-9+#-]*\n)([\s\S]*?)(```)/g;
174
+ const matches = msg.content.match(codeBlockRegex);
175
+ if (matches && matches.length > 0) {
176
+ let content = msg.content;
177
+ content = content.replace(codeBlockRegex, (match, prefix, code, suffix) => {
178
+ // If codeblock is larger than 120 characters, prune it to a simple lightweight summary reference!
179
+ if (code.length > 120) {
180
+ const lines = code.trim().split('\n');
181
+ const summary = `// [Lemma History Squeezer: Compacted ${lines.length} lines of code here to protect context limit]`;
182
+ tokensSavedEstimate += (code.length - summary.length);
183
+ return `${prefix}${summary}\n${suffix}`;
184
+ }
185
+ return match;
186
+ });
187
+ return { ...msg, content };
188
+ }
189
+ return msg;
190
+ });
191
+ return { messages: pruned, tokensSavedEstimate };
192
+ }
193
+ //# sourceMappingURL=ContextSqueezer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextSqueezer.js","sourceRoot":"","sources":["../../../src/utils/ContextSqueezer.ts"],"names":[],"mappings":"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"}