@nxuss/lemma 0.4.6 → 0.4.8

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 +21 -12
  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 +32 -732
  73. package/package.json +3 -2
  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,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ComplexityRouter = void 0;
4
+ class ComplexityRouter {
5
+ constructor(config = {}) {
6
+ this.cheapModel = config.cheapModel || 'gpt-4o-mini';
7
+ this.complexKeywords = config.complexKeywords || [
8
+ 'architecture', 'design', 'debug', 'trace', 'system', 'microservices',
9
+ 'refactor', 'optimize', 'implement', 'algorithm', 'distributed',
10
+ 'consensus', 'security', 'complex', 'concurrency', 'deadlock',
11
+ 'performance', 'bottleneck', 'memory leak', 'race condition'
12
+ ];
13
+ this.syntaxDensityThreshold = config.complexityThreshold || 0.05; // 5% syntax characters
14
+ }
15
+ updateConfig(config) {
16
+ if (config.cheapModel)
17
+ this.cheapModel = config.cheapModel;
18
+ if (config.complexKeywords)
19
+ this.complexKeywords = config.complexKeywords;
20
+ if (config.complexityThreshold)
21
+ this.syntaxDensityThreshold = config.complexityThreshold;
22
+ }
23
+ evaluate(prompt, originalModel) {
24
+ // If user explicitly requested a local or nomic model, keep it
25
+ const isLocal = originalModel?.startsWith('llama') ||
26
+ originalModel?.startsWith('mistral') ||
27
+ originalModel?.startsWith('ollama') ||
28
+ originalModel?.startsWith('nomic');
29
+ if (isLocal) {
30
+ return { model: originalModel || 'gpt-4o', complexity: 'high' };
31
+ }
32
+ if (!prompt || prompt.length < 10) {
33
+ return { model: originalModel ? this.cheapModel : 'gpt-4o-mini', complexity: 'low' };
34
+ }
35
+ const lower = prompt.toLowerCase();
36
+ let isComplex = false;
37
+ let complexityReason = '';
38
+ // Heuristic 1: Code blocks presence (Markdown)
39
+ if (prompt.includes('```')) {
40
+ isComplex = true;
41
+ complexityReason = 'Contains multiline code blocks';
42
+ }
43
+ // Heuristic 2: Syntax density check
44
+ if (!isComplex) {
45
+ const codeIndicators = (prompt.match(/[{}[\]();=<>+\-*/&|^%]/g) || []).length;
46
+ const density = codeIndicators / prompt.length;
47
+ if (density > this.syntaxDensityThreshold && prompt.length > 80) {
48
+ isComplex = true;
49
+ complexityReason = `High syntax density (${(density * 100).toFixed(1)}%)`;
50
+ }
51
+ }
52
+ // Heuristic 3: Keywords that imply deep reasoning
53
+ if (!isComplex) {
54
+ for (const kw of this.complexKeywords) {
55
+ if (lower.includes(kw)) {
56
+ isComplex = true;
57
+ complexityReason = `Matches complex keyword: "${kw}"`;
58
+ break;
59
+ }
60
+ }
61
+ }
62
+ // Heuristic 4: Prompt Length (super long prompts require high reasoning context)
63
+ if (!isComplex && prompt.length > 1000) {
64
+ isComplex = true;
65
+ complexityReason = `Large prompt context (${prompt.length} chars)`;
66
+ }
67
+ if (isComplex) {
68
+ console.log(`[ComplexityRouter] High complexity detected (${complexityReason}). Routing to ${originalModel || 'gpt-4o'}`);
69
+ return { model: originalModel || 'gpt-4o', complexity: 'high' };
70
+ }
71
+ else {
72
+ console.log(`[ComplexityRouter] Low complexity detected. Routing to ${this.cheapModel}`);
73
+ return { model: this.cheapModel, complexity: 'low' };
74
+ }
75
+ }
76
+ }
77
+ exports.ComplexityRouter = ComplexityRouter;
78
+ exports.default = ComplexityRouter;
79
+ //# 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,99 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SemanticScrubber = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ class SemanticScrubber {
10
+ constructor() {
11
+ this.patterns = [];
12
+ this.configPath = path_1.default.join(process.cwd(), 'lemma.config.json');
13
+ this.loadPatterns();
14
+ }
15
+ loadPatterns() {
16
+ // Standard patterns
17
+ const defaultPatterns = [
18
+ { name: 'API_KEY', regex: /(sk-[a-zA-Z0-9\-]{20,})/g },
19
+ { name: 'EMAIL', regex: /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/g },
20
+ { name: 'TOKEN', regex: /(Bearer\s+[a-zA-Z0-9\-._~+/]+=*)/gi }
21
+ ];
22
+ try {
23
+ if (fs_1.default.existsSync(this.configPath)) {
24
+ const rawConfig = fs_1.default.readFileSync(this.configPath, 'utf8');
25
+ const config = JSON.parse(rawConfig);
26
+ const scrubberConfig = config.security?.scrubber || {};
27
+ if (scrubberConfig.disabled) {
28
+ this.patterns = [];
29
+ console.log('[PrivacyFirewall] SemanticScrubber is disabled via config.');
30
+ return;
31
+ }
32
+ if (scrubberConfig.patterns && Array.isArray(scrubberConfig.patterns)) {
33
+ const loadedPatterns = [];
34
+ for (const p of scrubberConfig.patterns) {
35
+ if (p.name && p.regex) {
36
+ try {
37
+ const regexObj = typeof p.regex === 'string' ? new RegExp(p.regex, 'gi') : p.regex;
38
+ loadedPatterns.push({ name: p.name, regex: regexObj });
39
+ }
40
+ catch (err) {
41
+ console.warn(`[PrivacyFirewall] Invalid custom pattern regex: "${p.regex}". Error: ${err.message}`);
42
+ }
43
+ }
44
+ }
45
+ if (loadedPatterns.length > 0) {
46
+ this.patterns = loadedPatterns;
47
+ console.log(`[PrivacyFirewall] Loaded ${this.patterns.length} custom mask patterns.`);
48
+ return;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ catch (e) {
54
+ console.warn(`[PrivacyFirewall] Error loading lemma.config.json: ${e.message}. Using defaults.`);
55
+ }
56
+ this.patterns = defaultPatterns;
57
+ }
58
+ mask(prompt) {
59
+ let maskedPrompt = prompt;
60
+ const tokenMap = {};
61
+ let counter = 1;
62
+ if (this.patterns.length === 0) {
63
+ return { maskedPrompt, tokenMap };
64
+ }
65
+ for (const pattern of this.patterns) {
66
+ maskedPrompt = maskedPrompt.replace(pattern.regex, (match) => {
67
+ const token = `[${pattern.name}_${counter++}]`;
68
+ tokenMap[token] = match;
69
+ return token;
70
+ });
71
+ }
72
+ if (Object.keys(tokenMap).length > 0) {
73
+ console.log(`[PrivacyFirewall] Masked ${Object.keys(tokenMap).length} secrets.`);
74
+ }
75
+ return { maskedPrompt, tokenMap };
76
+ }
77
+ unmask(responseObj, tokenMap) {
78
+ if (!responseObj || Object.keys(tokenMap).length === 0)
79
+ return responseObj;
80
+ let str = typeof responseObj === 'string' ? responseObj : JSON.stringify(responseObj);
81
+ for (const [token, value] of Object.entries(tokenMap)) {
82
+ str = str.split(token).join(value);
83
+ }
84
+ return typeof responseObj === 'string' ? str : JSON.parse(str);
85
+ }
86
+ // Unmask a single stream chunk string
87
+ unmaskString(str, tokenMap) {
88
+ if (!str || Object.keys(tokenMap).length === 0)
89
+ return str;
90
+ let unmasked = str;
91
+ for (const [token, value] of Object.entries(tokenMap)) {
92
+ unmasked = unmasked.split(token).join(value);
93
+ }
94
+ return unmasked;
95
+ }
96
+ }
97
+ exports.SemanticScrubber = SemanticScrubber;
98
+ exports.default = SemanticScrubber;
99
+ //# 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,201 @@
1
+ "use strict";
2
+ /**
3
+ * Context Squeezer - Token Compactor for AI Prompts and Logs
4
+ *
5
+ * This utility compresses source code snippets and logs to their absolute
6
+ * semantic minimum by stripping comments, excessive whitespace, and boilerplate,
7
+ * saving up to 80% of token consumption in LLM context windows.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.stripComments = stripComments;
11
+ exports.compactWhitespace = compactWhitespace;
12
+ exports.treeShakeCode = treeShakeCode;
13
+ exports.squeezeCode = squeezeCode;
14
+ exports.squeezePrompt = squeezePrompt;
15
+ exports.pruneHistoryMessages = pruneHistoryMessages;
16
+ /**
17
+ * Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code
18
+ */
19
+ function stripComments(code) {
20
+ // 1. Remove multi-line comments /* ... */
21
+ let clean = code.replace(/\/\*[\s\S]*?\*\//g, '');
22
+ // 2. Remove single-line comments // ...
23
+ // Be careful not to strip URL protocols like http:// or https://
24
+ const lines = clean.split('\n');
25
+ const processedLines = lines.map(line => {
26
+ // If the line contains a URL, do not strip comments or do it carefully
27
+ if (line.includes('http://') || line.includes('https://')) {
28
+ // Find comment symbol not preceded by : or within a string (simple heuristic)
29
+ const urlIndex = line.indexOf('://');
30
+ const commentIndex = line.indexOf('//');
31
+ if (commentIndex !== -1 && commentIndex < urlIndex) {
32
+ return line.substring(0, commentIndex);
33
+ }
34
+ // If comment is after the URL
35
+ const postUrlComment = line.indexOf('//', urlIndex + 3);
36
+ if (postUrlComment !== -1) {
37
+ return line.substring(0, postUrlComment);
38
+ }
39
+ return line;
40
+ }
41
+ const commentIndex = line.indexOf('//');
42
+ if (commentIndex !== -1) {
43
+ return line.substring(0, commentIndex);
44
+ }
45
+ return line;
46
+ });
47
+ return processedLines.join('\n');
48
+ }
49
+ /**
50
+ * Compress code structure by removing redundant whitespace and blank lines
51
+ */
52
+ function compactWhitespace(code) {
53
+ return code
54
+ .split('\n')
55
+ .map(line => line.trimEnd()) // Trim trailing spaces
56
+ .filter(line => line.trim().length > 0) // Remove empty lines
57
+ .join('\n')
58
+ .replace(/[ \t]+/g, ' '); // Collapse multiple spaces/tabs into a single space
59
+ }
60
+ /**
61
+ * Compresses very long TypeScript/JavaScript files by keeping only the function/class signatures
62
+ * and removing function body implementation details for functions that are not mentioned in the query!
63
+ */
64
+ function treeShakeCode(code, query) {
65
+ // If code is short, do normal squeezing
66
+ if (code.length < 500) {
67
+ return squeezeCode(code);
68
+ }
69
+ // Strip comments first to preserve tree-shaker comment markers in the final output
70
+ const cleanCode = stripComments(code);
71
+ const lines = cleanCode.split('\n');
72
+ const resultLines = [];
73
+ let inFunctionBody = false;
74
+ let bodyBracesCount = 0;
75
+ let skippedLinesCount = 0;
76
+ for (let i = 0; i < lines.length; i++) {
77
+ const line = lines[i];
78
+ const trimmed = line.trim();
79
+ if (inFunctionBody) {
80
+ // Track curly braces to know when the function body ends
81
+ const opens = (line.match(/\{/g) || []).length;
82
+ const closes = (line.match(/\}/g) || []).length;
83
+ bodyBracesCount += opens - closes;
84
+ if (bodyBracesCount <= 0) {
85
+ inFunctionBody = false;
86
+ resultLines.push(`/* ... [Lemma AST Tree-Shaker: body omitted to save ${skippedLinesCount + 1} lines] ... */ }`);
87
+ }
88
+ else {
89
+ skippedLinesCount++;
90
+ }
91
+ continue;
92
+ }
93
+ // Detect function/method declarations
94
+ const isFunc = trimmed.startsWith('function ') ||
95
+ trimmed.startsWith('export function ') ||
96
+ trimmed.startsWith('async function ') ||
97
+ trimmed.startsWith('export async function ') ||
98
+ (trimmed.includes('(') && trimmed.includes('{') && (trimmed.startsWith('public ') || trimmed.startsWith('private ') || trimmed.startsWith('async ') || trimmed.startsWith('static ')));
99
+ if (isFunc && trimmed.endsWith('{')) {
100
+ // Find the name of the function
101
+ let funcName = '';
102
+ if (trimmed.includes('(')) {
103
+ const parts = trimmed.split('(');
104
+ if (parts[0]) {
105
+ const words = parts[0].trim().split(/\s+/);
106
+ funcName = words.pop() || '';
107
+ }
108
+ }
109
+ // If a function name is found, and it is NOT mentioned in the user's query, and it is not 'constructor'
110
+ if (funcName && funcName.length > 2 && funcName !== 'constructor' && query && !query.toLowerCase().includes(funcName.toLowerCase())) {
111
+ inFunctionBody = true;
112
+ bodyBracesCount = 1;
113
+ skippedLinesCount = 0;
114
+ resultLines.push(line);
115
+ continue;
116
+ }
117
+ }
118
+ resultLines.push(line);
119
+ }
120
+ return compactWhitespace(resultLines.join('\n'));
121
+ }
122
+ /**
123
+ * Squeezes a block of source code
124
+ */
125
+ function squeezeCode(code) {
126
+ const withoutComments = stripComments(code);
127
+ return compactWhitespace(withoutComments);
128
+ }
129
+ /**
130
+ * Squeezes all markdown code blocks (``` ... ```) inside a prompt string
131
+ */
132
+ function squeezePrompt(prompt, query = '') {
133
+ const codeBlockRegex = /(```[a-zA-Z0-9+#-]*\n)([\s\S]*?)(```)/g;
134
+ const originalSize = prompt.length;
135
+ const squeezed = prompt.replace(codeBlockRegex, (match, prefix, code, suffix) => {
136
+ try {
137
+ const language = prefix.match(/```([a-zA-Z0-9+#-]+)/)?.[1] || '';
138
+ if (['typescript', 'javascript', 'ts', 'js', 'tsx', 'jsx'].includes(language.toLowerCase()) && query) {
139
+ const squeezedCode = treeShakeCode(code, query);
140
+ return `${prefix}${squeezedCode}\n${suffix}`;
141
+ }
142
+ else {
143
+ const squeezedCode = squeezeCode(code);
144
+ return `${prefix}${squeezedCode}\n${suffix}`;
145
+ }
146
+ }
147
+ catch {
148
+ return match; // Fallback to original block if processing fails
149
+ }
150
+ });
151
+ const squeezedSize = squeezed.length;
152
+ const compressionRatio = originalSize > 0
153
+ ? parseFloat(((originalSize - squeezedSize) / originalSize).toFixed(4))
154
+ : 0;
155
+ return {
156
+ squeezed,
157
+ originalSize,
158
+ squeezedSize,
159
+ compressionRatio
160
+ };
161
+ }
162
+ /**
163
+ * Prunes conversational message history to compress large repeated codeblocks in historical messages.
164
+ * Keeps only the most recent message's codeblocks fully intact, and prunes older historical messages
165
+ * if they are extremely large and contain redundant code blocks.
166
+ */
167
+ function pruneHistoryMessages(messages) {
168
+ if (!messages || messages.length <= 2) {
169
+ return { messages, tokensSavedEstimate: 0 };
170
+ }
171
+ let tokensSavedEstimate = 0;
172
+ const pruned = messages.map((msg, index) => {
173
+ // Keep system messages and the last user/assistant turn completely untouched to avoid losing coherence
174
+ if (index >= messages.length - 2 || msg.role === 'system') {
175
+ return msg;
176
+ }
177
+ if (typeof msg.content !== 'string') {
178
+ return msg;
179
+ }
180
+ // Check if the message contains massive codeblocks
181
+ const codeBlockRegex = /(```[a-zA-Z0-9+#-]*\n)([\s\S]*?)(```)/g;
182
+ const matches = msg.content.match(codeBlockRegex);
183
+ if (matches && matches.length > 0) {
184
+ let content = msg.content;
185
+ content = content.replace(codeBlockRegex, (match, prefix, code, suffix) => {
186
+ // If codeblock is larger than 120 characters, prune it to a simple lightweight summary reference!
187
+ if (code.length > 120) {
188
+ const lines = code.trim().split('\n');
189
+ const summary = `// [Lemma History Squeezer: Compacted ${lines.length} lines of code here to protect context limit]`;
190
+ tokensSavedEstimate += (code.length - summary.length);
191
+ return `${prefix}${summary}\n${suffix}`;
192
+ }
193
+ return match;
194
+ });
195
+ return { ...msg, content };
196
+ }
197
+ return msg;
198
+ });
199
+ return { messages: pruned, tokensSavedEstimate };
200
+ }
201
+ //# 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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"}
@@ -0,0 +1,11 @@
1
+ export declare class AutopilotWatcher {
2
+ private isRunning;
3
+ private watchDir;
4
+ private debounceTimer;
5
+ private activeBuildProcess;
6
+ constructor(watchDir?: string);
7
+ start(): void;
8
+ private triggerBuildAndHeal;
9
+ stop(): void;
10
+ }
11
+ //# sourceMappingURL=AutopilotWatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutopilotWatcher.d.ts","sourceRoot":"","sources":["../../../src/autopilot/AutopilotWatcher.ts"],"names":[],"mappings":"AAKA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,kBAAkB,CAAa;gBAE3B,QAAQ,GAAE,MAAc;IAIpC,KAAK;IAuBL,OAAO,CAAC,mBAAmB;IA+E3B,IAAI;CAML"}
@@ -0,0 +1,112 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { exec } from 'child_process';
4
+ import { performAutoHeal } from '../cli/lemma-proxy';
5
+ export class AutopilotWatcher {
6
+ constructor(watchDir = 'src') {
7
+ this.isRunning = false;
8
+ this.debounceTimer = null;
9
+ this.activeBuildProcess = null;
10
+ this.watchDir = path.resolve(process.cwd(), watchDir);
11
+ }
12
+ start() {
13
+ if (this.isRunning)
14
+ return;
15
+ this.isRunning = true;
16
+ console.log(`\n🛸 \x1b[35m[Autopilot]\x1b[0m Starting active background watcher on: ${this.watchDir}`);
17
+ console.log(`💡 \x1b[36mAutopilot is actively monitoring your saves. Make code errors and watch them heal!\x1b[0m\n`);
18
+ if (!fs.existsSync(this.watchDir)) {
19
+ console.log(`⚠️ Watch directory ${this.watchDir} does not exist. Creating it.`);
20
+ fs.mkdirSync(this.watchDir, { recursive: true });
21
+ }
22
+ // Watch files recursively natively (mac supports recursive natively)
23
+ fs.watch(this.watchDir, { recursive: true }, (eventType, filename) => {
24
+ if (!filename || filename.endsWith('.fixed') || filename.includes('.lemma'))
25
+ return;
26
+ // Debounce trigger
27
+ if (this.debounceTimer)
28
+ clearTimeout(this.debounceTimer);
29
+ this.debounceTimer = setTimeout(() => {
30
+ this.triggerBuildAndHeal(filename);
31
+ }, 1500);
32
+ });
33
+ }
34
+ triggerBuildAndHeal(modifiedFile) {
35
+ if (this.activeBuildProcess) {
36
+ this.activeBuildProcess.kill();
37
+ this.activeBuildProcess = null;
38
+ }
39
+ console.log(`\n📝 \x1b[33m[Autopilot]\x1b[0m Change detected in ${modifiedFile}. Running background compilation...`);
40
+ // Determine the project root as the parent of watchDir
41
+ const projectRoot = path.dirname(this.watchDir);
42
+ // Determine the build/validation command
43
+ let cmd = 'npx tsc --noEmit';
44
+ if (!fs.existsSync(path.join(projectRoot, 'tsconfig.json'))) {
45
+ cmd = 'npm run build';
46
+ }
47
+ this.activeBuildProcess = exec(cmd, { cwd: projectRoot }, async (error, stdout, stderr) => {
48
+ this.activeBuildProcess = null;
49
+ if (!error) {
50
+ console.log(`✨ \x1b[32m[Autopilot] Build compiled perfectly!\x1b[0m`);
51
+ return;
52
+ }
53
+ const output = stdout + '\n' + stderr;
54
+ console.log(`❌ \x1b[31m[Autopilot] Compilation error detected!\x1b[0m`);
55
+ // Parse TypeScript compiler output
56
+ // Standard format: src/utils/ContextSqueezer.ts:130:50 - error TS7006: Parameter 'match' implicitly has an 'any' type.
57
+ const tsErrorRegex = /([^\s\n]+\.ts)[\s\(:]+(\d+)[\s,:]+(\d+)?[\s\)]*[\s-:]+error\s+([^\n]+)/;
58
+ const match = output.match(tsErrorRegex);
59
+ if (match) {
60
+ const file = match[1];
61
+ const line = match[2];
62
+ const errorMsg = match[4];
63
+ console.log(`🩺 \x1b[35m[Autopilot] Parser details:\x1b[0m File: ${file}, Line: ${line}, Error: ${errorMsg}`);
64
+ // Write the crash state to both projectRoot/.lemma/live-context.md and process.cwd()/.lemma/live-context.md
65
+ const contextDirs = [
66
+ path.join(projectRoot, '.lemma'),
67
+ path.join(process.cwd(), '.lemma')
68
+ ];
69
+ for (const dir of contextDirs) {
70
+ if (!fs.existsSync(dir)) {
71
+ fs.mkdirSync(dir, { recursive: true });
72
+ }
73
+ const absoluteFile = path.resolve(projectRoot, file);
74
+ const liveContextContent = `# Autopilot Telemetry Crash Report
75
+ Timestamp: ${new Date().toISOString()}
76
+ Message: ${errorMsg} in ${absoluteFile}:${line}
77
+ Stack:
78
+ at ${absoluteFile}:${line}:0
79
+ `;
80
+ fs.writeFileSync(path.join(dir, 'live-context.md'), liveContextContent, 'utf8');
81
+ }
82
+ // Execute performAutoHeal in apply mode!
83
+ console.log(`⚡ \x1b[35m[Autopilot] Calling auto-healing agent...\x1b[0m`);
84
+ try {
85
+ const res = await performAutoHeal(true);
86
+ if (res.success) {
87
+ console.log(`✔ \x1b[32m[Autopilot] Auto-healed: ${res.message}\x1b[0m\n`);
88
+ }
89
+ else {
90
+ console.log(`⚠️ \x1b[33m[Autopilot] Healing agent failed: ${res.message}\x1b[0m\n`);
91
+ }
92
+ }
93
+ catch (err) {
94
+ console.log(`⚠️ \x1b[33m[Autopilot] Healing agent error: ${err.message}\x1b[0m\n`);
95
+ }
96
+ }
97
+ else {
98
+ console.log(`⚠️ \x1b[33m[Autopilot] Could not parse compile error layout automatically. Output:\x1b[0m`);
99
+ console.log(output.trim().substring(0, 300) + '...');
100
+ }
101
+ });
102
+ }
103
+ stop() {
104
+ this.isRunning = false;
105
+ if (this.debounceTimer)
106
+ clearTimeout(this.debounceTimer);
107
+ if (this.activeBuildProcess)
108
+ this.activeBuildProcess.kill();
109
+ console.log(`🛸 \x1b[35m[Autopilot]\x1b[0m Background watcher stopped.`);
110
+ }
111
+ }
112
+ //# sourceMappingURL=AutopilotWatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutopilotWatcher.js","sourceRoot":"","sources":["../../../src/autopilot/AutopilotWatcher.ts"],"names":[],"mappings":"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"}