@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.
- package/README.md +21 -12
- package/dist/cjs/autopilot/AutopilotWatcher.d.ts +11 -0
- package/dist/cjs/autopilot/AutopilotWatcher.d.ts.map +1 -0
- package/dist/cjs/autopilot/AutopilotWatcher.js +119 -0
- package/dist/cjs/autopilot/AutopilotWatcher.js.map +1 -0
- package/dist/cjs/cli/lemma-proxy.d.ts +10 -0
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -0
- package/dist/cjs/cli/lemma-proxy.js +1268 -0
- package/dist/cjs/cli/lemma-proxy.js.map +1 -0
- package/dist/cjs/cloud/CloudSyncClient.d.ts +10 -0
- package/dist/cjs/cloud/CloudSyncClient.d.ts.map +1 -0
- package/dist/cjs/cloud/CloudSyncClient.js +42 -0
- package/dist/cjs/cloud/CloudSyncClient.js.map +1 -0
- package/dist/cjs/mcp/index.d.ts +2 -0
- package/dist/cjs/mcp/index.d.ts.map +1 -0
- package/dist/cjs/mcp/index.js +260 -0
- package/dist/cjs/mcp/index.js.map +1 -0
- package/dist/cjs/observability/IdeContextSync.d.ts.map +1 -1
- package/dist/cjs/observability/IdeContextSync.js +7 -2
- package/dist/cjs/observability/IdeContextSync.js.map +1 -1
- package/dist/cjs/proxy/AgentMultiplexer.d.ts +9 -0
- package/dist/cjs/proxy/AgentMultiplexer.d.ts.map +1 -0
- package/dist/cjs/proxy/AgentMultiplexer.js +69 -0
- package/dist/cjs/proxy/AgentMultiplexer.js.map +1 -0
- package/dist/cjs/proxy/ComplexityRouter.d.ts +19 -0
- package/dist/cjs/proxy/ComplexityRouter.d.ts.map +1 -0
- package/dist/cjs/proxy/ComplexityRouter.js +79 -0
- package/dist/cjs/proxy/ComplexityRouter.js.map +1 -0
- package/dist/cjs/security/SemanticScrubber.d.ts +25 -0
- package/dist/cjs/security/SemanticScrubber.d.ts.map +1 -0
- package/dist/cjs/security/SemanticScrubber.js +99 -0
- package/dist/cjs/security/SemanticScrubber.js.map +1 -0
- package/dist/cjs/utils/ContextSqueezer.d.ts +44 -0
- package/dist/cjs/utils/ContextSqueezer.d.ts.map +1 -0
- package/dist/cjs/utils/ContextSqueezer.js +201 -0
- package/dist/cjs/utils/ContextSqueezer.js.map +1 -0
- package/dist/esm/autopilot/AutopilotWatcher.d.ts +11 -0
- package/dist/esm/autopilot/AutopilotWatcher.d.ts.map +1 -0
- package/dist/esm/autopilot/AutopilotWatcher.js +112 -0
- package/dist/esm/autopilot/AutopilotWatcher.js.map +1 -0
- package/dist/esm/cli/lemma-proxy.d.ts +10 -0
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -0
- package/dist/esm/cli/lemma-proxy.js +1262 -0
- package/dist/esm/cli/lemma-proxy.js.map +1 -0
- package/dist/esm/cloud/CloudSyncClient.d.ts +10 -0
- package/dist/esm/cloud/CloudSyncClient.d.ts.map +1 -0
- package/dist/esm/cloud/CloudSyncClient.js +35 -0
- package/dist/esm/cloud/CloudSyncClient.js.map +1 -0
- package/dist/esm/mcp/index.d.ts +2 -0
- package/dist/esm/mcp/index.d.ts.map +1 -0
- package/dist/esm/mcp/index.js +255 -0
- package/dist/esm/mcp/index.js.map +1 -0
- package/dist/esm/observability/IdeContextSync.d.ts.map +1 -1
- package/dist/esm/observability/IdeContextSync.js +7 -2
- package/dist/esm/observability/IdeContextSync.js.map +1 -1
- package/dist/esm/proxy/AgentMultiplexer.d.ts +9 -0
- package/dist/esm/proxy/AgentMultiplexer.d.ts.map +1 -0
- package/dist/esm/proxy/AgentMultiplexer.js +62 -0
- package/dist/esm/proxy/AgentMultiplexer.js.map +1 -0
- package/dist/esm/proxy/ComplexityRouter.d.ts +19 -0
- package/dist/esm/proxy/ComplexityRouter.d.ts.map +1 -0
- package/dist/esm/proxy/ComplexityRouter.js +75 -0
- package/dist/esm/proxy/ComplexityRouter.js.map +1 -0
- package/dist/esm/security/SemanticScrubber.d.ts +25 -0
- package/dist/esm/security/SemanticScrubber.d.ts.map +1 -0
- package/dist/esm/security/SemanticScrubber.js +92 -0
- package/dist/esm/security/SemanticScrubber.js.map +1 -0
- package/dist/esm/utils/ContextSqueezer.d.ts +44 -0
- package/dist/esm/utils/ContextSqueezer.d.ts.map +1 -0
- package/dist/esm/utils/ContextSqueezer.js +193 -0
- package/dist/esm/utils/ContextSqueezer.js.map +1 -0
- package/lemma-proxy.cjs +32 -732
- package/package.json +3 -2
- package/src/cloud/CloudSyncClient.js +0 -35
- package/src/proxy/ComplexityRouter.js +0 -37
- 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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"}
|