@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
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nxuss/lemma",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"description": "Intelligent AI Gateway — Semantic cache, Privacy Firewall, and Autonomous Cost-Optimization
|
|
3
|
+
"version": "0.4.8",
|
|
4
|
+
"description": "Intelligent AI Gateway for IDEs & Agents — Semantic cache, Privacy Firewall, and Autonomous Cost-Optimization.",
|
|
5
5
|
"main": "./dist/cjs/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
7
7
|
"types": "./dist/esm/index.d.ts",
|
|
@@ -161,6 +161,7 @@
|
|
|
161
161
|
"homepage": "https://github.com/Nxusbets/lemma#readme",
|
|
162
162
|
"dependencies": {
|
|
163
163
|
"@chroma-core/default-embed": "^0.1.9",
|
|
164
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
164
165
|
"@nxuss/lemma": "^0.4.5",
|
|
165
166
|
"@types/cors": "^2.8.19",
|
|
166
167
|
"axios": "^1.6.0",
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
// Hive Mind - Cloud Sync Client for Team Caching
|
|
2
|
-
const axios = require('axios');
|
|
3
|
-
|
|
4
|
-
class CloudSyncClient {
|
|
5
|
-
constructor(tenantId, cloudUrl) {
|
|
6
|
-
this.tenantId = tenantId || process.env.LEMMA_TENANT_ID;
|
|
7
|
-
this.cloudUrl = cloudUrl || 'https://lemma.nxus.studio/api/v1/tenant-cache';
|
|
8
|
-
this.enabled = !!this.tenantId;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
async get(prompt) {
|
|
12
|
-
if (!this.enabled) return null;
|
|
13
|
-
try {
|
|
14
|
-
const res = await axios.post(`${this.cloudUrl}/query`, { prompt, tenantId: this.tenantId }, { timeout: 1500 });
|
|
15
|
-
if (res.data && res.data.hit) {
|
|
16
|
-
console.log(`[HiveMind] Cloud cache HIT for tenant ${this.tenantId}`);
|
|
17
|
-
return res.data;
|
|
18
|
-
}
|
|
19
|
-
} catch (e) {
|
|
20
|
-
// Fail silently for cache misses or network errors
|
|
21
|
-
}
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async set(prompt, data) {
|
|
26
|
-
if (!this.enabled) return;
|
|
27
|
-
try {
|
|
28
|
-
console.log(`[HiveMind] Pushing new knowledge to cloud cache for tenant ${this.tenantId}`);
|
|
29
|
-
// Fire and forget
|
|
30
|
-
axios.post(`${this.cloudUrl}/store`, { prompt, data, tenantId: this.tenantId }).catch(() => {});
|
|
31
|
-
} catch (e) {}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
module.exports = CloudSyncClient;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
// Complexity Router - Evaluates prompt complexity to optimize LLM cost
|
|
2
|
-
class ComplexityRouter {
|
|
3
|
-
constructor() {
|
|
4
|
-
this.cheapModel = 'gpt-4o-mini';
|
|
5
|
-
this.complexKeywords = ['architecture', 'design', 'debug', 'trace', 'system', 'microservices', 'explain', 'why', 'refactor', 'optimize'];
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
evaluate(prompt, originalModel) {
|
|
9
|
-
if (!prompt || prompt.length < 10) return { model: this.cheapModel, complexity: 'low' };
|
|
10
|
-
|
|
11
|
-
const lower = prompt.toLowerCase();
|
|
12
|
-
let isComplex = false;
|
|
13
|
-
|
|
14
|
-
// Heuristic 1: Prompt Length
|
|
15
|
-
if (prompt.length > 500) {
|
|
16
|
-
isComplex = true;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Heuristic 2: Keywords that imply deep reasoning
|
|
20
|
-
for (const kw of this.complexKeywords) {
|
|
21
|
-
if (lower.includes(kw)) {
|
|
22
|
-
isComplex = true;
|
|
23
|
-
break;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (isComplex) {
|
|
28
|
-
console.log(`[ComplexityRouter] High complexity detected. Routing to ${originalModel}`);
|
|
29
|
-
return { model: originalModel || 'gpt-4o', complexity: 'high' };
|
|
30
|
-
} else {
|
|
31
|
-
console.log(`[ComplexityRouter] Low complexity detected. Routing to ${this.cheapModel}`);
|
|
32
|
-
return { model: this.cheapModel, complexity: 'low' };
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
module.exports = ComplexityRouter;
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
// Privacy Firewall - Semantic Scrubber for PII and Secrets
|
|
2
|
-
class SemanticScrubber {
|
|
3
|
-
constructor() {
|
|
4
|
-
this.patterns = [
|
|
5
|
-
{ name: 'API_KEY', regex: /(sk-[a-zA-Z0-9\-]{20,})/g },
|
|
6
|
-
{ name: 'EMAIL', regex: /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/g },
|
|
7
|
-
{ name: 'TOKEN', regex: /(Bearer\s+[a-zA-Z0-9\-._~+/]+=*)/gi }
|
|
8
|
-
];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
mask(prompt) {
|
|
12
|
-
let maskedPrompt = prompt;
|
|
13
|
-
const tokenMap = {};
|
|
14
|
-
let counter = 1;
|
|
15
|
-
|
|
16
|
-
for (const pattern of this.patterns) {
|
|
17
|
-
maskedPrompt = maskedPrompt.replace(pattern.regex, (match) => {
|
|
18
|
-
const token = `[${pattern.name}_${counter++}]`;
|
|
19
|
-
tokenMap[token] = match;
|
|
20
|
-
return token;
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
if (Object.keys(tokenMap).length > 0) {
|
|
25
|
-
console.log(`[PrivacyFirewall] Masked ${Object.keys(tokenMap).length} secrets.`);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return { maskedPrompt, tokenMap };
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
unmask(responseObj, tokenMap) {
|
|
32
|
-
if (!responseObj || Object.keys(tokenMap).length === 0) return responseObj;
|
|
33
|
-
|
|
34
|
-
let str = typeof responseObj === 'string' ? responseObj : JSON.stringify(responseObj);
|
|
35
|
-
|
|
36
|
-
for (const [token, value] of Object.entries(tokenMap)) {
|
|
37
|
-
str = str.split(token).join(value);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return typeof responseObj === 'string' ? str : JSON.parse(str);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Unmask a single stream chunk string
|
|
44
|
-
unmaskString(str, tokenMap) {
|
|
45
|
-
if (!str || Object.keys(tokenMap).length === 0) return str;
|
|
46
|
-
let unmasked = str;
|
|
47
|
-
for (const [token, value] of Object.entries(tokenMap)) {
|
|
48
|
-
unmasked = unmasked.split(token).join(value);
|
|
49
|
-
}
|
|
50
|
-
return unmasked;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
module.exports = SemanticScrubber;
|