@nxuss/lemma 0.7.8 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -13
- package/dashboard/dist/assets/{index-CqS7YEGj.js → index-DiidVeI5.js} +65 -65
- package/dashboard/dist/assets/{index-CqS7YEGj.js.map → index-DiidVeI5.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +79 -12
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/mcp/index.js +1 -0
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts.d.ts +1 -0
- package/dist/cjs/mcp/prompts.d.ts.map +1 -1
- package/dist/cjs/mcp/prompts.js +58 -1
- package/dist/cjs/mcp/prompts.js.map +1 -1
- package/dist/cjs/mcp/resources.d.ts.map +1 -1
- package/dist/cjs/mcp/resources.js +3 -2
- package/dist/cjs/mcp/resources.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +288 -10
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/mcp/utils.d.ts.map +1 -1
- package/dist/cjs/mcp/utils.js +2 -2
- package/dist/cjs/mcp/utils.js.map +1 -1
- package/dist/cjs/utils/reportSavings.d.ts.map +1 -1
- package/dist/cjs/utils/reportSavings.js +2 -2
- package/dist/cjs/utils/reportSavings.js.map +1 -1
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +79 -12
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/mcp/index.js +2 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts.d.ts +1 -0
- package/dist/esm/mcp/prompts.d.ts.map +1 -1
- package/dist/esm/mcp/prompts.js +57 -0
- package/dist/esm/mcp/prompts.js.map +1 -1
- package/dist/esm/mcp/resources.d.ts.map +1 -1
- package/dist/esm/mcp/resources.js +3 -2
- package/dist/esm/mcp/resources.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +288 -10
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/mcp/utils.d.ts.map +1 -1
- package/dist/esm/mcp/utils.js +2 -2
- package/dist/esm/mcp/utils.js.map +1 -1
- package/dist/esm/utils/reportSavings.d.ts.map +1 -1
- package/dist/esm/utils/reportSavings.js +2 -2
- package/dist/esm/utils/reportSavings.js.map +1 -1
- package/package.json +1 -2
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>lemma Dashboard - Agent Orchestration Hub</title>
|
|
8
|
-
<script type="module" crossorigin src="/dashboard/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/dashboard/assets/index-DiidVeI5.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/dashboard/assets/index-DtEKr0hI.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lemma-proxy.d.ts","sourceRoot":"","sources":["../../../src/cli/lemma-proxy.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"lemma-proxy.d.ts","sourceRoot":"","sources":["../../../src/cli/lemma-proxy.ts"],"names":[],"mappings":";AA0bA,wBAAgB,+BAA+B,CAAC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA4DvF;AA2iED,wBAAsB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6KhL"}
|
|
@@ -14,7 +14,9 @@ const crypto_1 = __importDefault(require("crypto"));
|
|
|
14
14
|
const chromadb_1 = require("chromadb");
|
|
15
15
|
const https_1 = __importDefault(require("https"));
|
|
16
16
|
const http_1 = __importDefault(require("http"));
|
|
17
|
+
const os_1 = __importDefault(require("os"));
|
|
17
18
|
const axios_1 = __importDefault(require("axios"));
|
|
19
|
+
const readline_1 = __importDefault(require("readline"));
|
|
18
20
|
function getVersion() {
|
|
19
21
|
const paths = [
|
|
20
22
|
path_1.default.join(__dirname, '../../package.json'),
|
|
@@ -34,6 +36,10 @@ function getVersion() {
|
|
|
34
36
|
return '0.5.4';
|
|
35
37
|
}
|
|
36
38
|
const VERSION = getVersion();
|
|
39
|
+
function ask(query) {
|
|
40
|
+
const rl = readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
|
|
41
|
+
return new Promise(resolve => rl.question(query, ans => { rl.close(); resolve(ans); }));
|
|
42
|
+
}
|
|
37
43
|
const ComplexityRouter_1 = __importDefault(require("../proxy/ComplexityRouter"));
|
|
38
44
|
const SemanticScrubber_1 = __importDefault(require("../security/SemanticScrubber"));
|
|
39
45
|
const CloudSyncClient_1 = __importDefault(require("../cloud/CloudSyncClient"));
|
|
@@ -49,7 +55,7 @@ const semanticScrubber = new SemanticScrubber_1.default();
|
|
|
49
55
|
const cloudSync = new CloudSyncClient_1.default();
|
|
50
56
|
const agentMultiplexer = new AgentMultiplexer_1.AgentMultiplexer();
|
|
51
57
|
// ── Paths ──────────────────────────────────────────────────────────────────────
|
|
52
|
-
const HOME =
|
|
58
|
+
const HOME = os_1.default.homedir();
|
|
53
59
|
const CACHE_DIR = path_1.default.join(HOME, '.lemma-cache');
|
|
54
60
|
const PID_FILE = path_1.default.join(CACHE_DIR, 'proxy.pid');
|
|
55
61
|
const PORT_FILE = path_1.default.join(CACHE_DIR, 'proxy.port');
|
|
@@ -163,7 +169,7 @@ function autoConfigureAll(project, opts) {
|
|
|
163
169
|
fs_1.default.mkdirSync(mcpDir, { recursive: true });
|
|
164
170
|
}
|
|
165
171
|
// Register lemma MCP server in Claude Desktop config
|
|
166
|
-
const claudeConfigDir = path_1.default.join(
|
|
172
|
+
const claudeConfigDir = path_1.default.join(os_1.default.homedir(), 'Library', 'Application Support', 'Claude');
|
|
167
173
|
const claudeConfigFile = path_1.default.join(claudeConfigDir, 'claude_desktop_config.json');
|
|
168
174
|
if (fs_1.default.existsSync(claudeConfigDir)) {
|
|
169
175
|
let claudeConfig = { mcpServers: {} };
|
|
@@ -189,7 +195,7 @@ function autoConfigureAll(project, opts) {
|
|
|
189
195
|
}
|
|
190
196
|
}
|
|
191
197
|
// Register lemma MCP server in Cursor config
|
|
192
|
-
const cursorConfigDir = path_1.default.join(
|
|
198
|
+
const cursorConfigDir = path_1.default.join(os_1.default.homedir(), '.cursor');
|
|
193
199
|
const cursorConfigFile = path_1.default.join(cursorConfigDir, 'mcp.json');
|
|
194
200
|
if (fs_1.default.existsSync(cursorConfigDir)) {
|
|
195
201
|
let cursorConfig = { mcpServers: {} };
|
|
@@ -214,7 +220,7 @@ function autoConfigureAll(project, opts) {
|
|
|
214
220
|
}
|
|
215
221
|
}
|
|
216
222
|
// Register lemma MCP server in Windsurf config
|
|
217
|
-
const windsurfConfigDir = path_1.default.join(
|
|
223
|
+
const windsurfConfigDir = path_1.default.join(os_1.default.homedir(), '.codeium', 'windsurf');
|
|
218
224
|
const windsurfConfigFile = path_1.default.join(windsurfConfigDir, 'mcp_config.json');
|
|
219
225
|
if (fs_1.default.existsSync(windsurfConfigDir)) {
|
|
220
226
|
let windsurfConfig = { mcpServers: {} };
|
|
@@ -241,7 +247,7 @@ function autoConfigureAll(project, opts) {
|
|
|
241
247
|
}
|
|
242
248
|
// Register lemma MCP server in Kiro config
|
|
243
249
|
const kiroDirs = [
|
|
244
|
-
path_1.default.join(
|
|
250
|
+
path_1.default.join(os_1.default.homedir(), '.kiro', 'settings'),
|
|
245
251
|
path_1.default.join(process.cwd(), '.kiro', 'settings'),
|
|
246
252
|
];
|
|
247
253
|
for (const kiroDir of kiroDirs) {
|
|
@@ -313,7 +319,7 @@ function autoConfigureAll(project, opts) {
|
|
|
313
319
|
catch { }
|
|
314
320
|
}
|
|
315
321
|
// Register lemma MCP server in Codex CLI config (~/.codex/config.toml)
|
|
316
|
-
const codexConfigFile = path_1.default.join(
|
|
322
|
+
const codexConfigFile = path_1.default.join(os_1.default.homedir(), '.codex', 'config.toml');
|
|
317
323
|
const codexConfigDir = path_1.default.dirname(codexConfigFile);
|
|
318
324
|
if (fs_1.default.existsSync(codexConfigDir)) {
|
|
319
325
|
try {
|
|
@@ -334,6 +340,42 @@ enabled = true
|
|
|
334
340
|
}
|
|
335
341
|
catch { }
|
|
336
342
|
}
|
|
343
|
+
// Register lemma MCP server in Claude Code Extension config (.mcp.json project scope)
|
|
344
|
+
const claudeMcpFile = path_1.default.join(process.cwd(), '.mcp.json');
|
|
345
|
+
if (!fs_1.default.existsSync(claudeMcpFile)) {
|
|
346
|
+
try {
|
|
347
|
+
const claudeConfig = {
|
|
348
|
+
mcpServers: {
|
|
349
|
+
lemma: {
|
|
350
|
+
command: 'npx',
|
|
351
|
+
args: ['-y', '@nxuss/lemma', 'mcp'],
|
|
352
|
+
},
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
fs_1.default.writeFileSync(claudeMcpFile, JSON.stringify(claudeConfig, null, 2));
|
|
356
|
+
console.log('✅ [Claude Code] Registered lemma MCP server in .mcp.json');
|
|
357
|
+
}
|
|
358
|
+
catch { }
|
|
359
|
+
}
|
|
360
|
+
// Register lemma MCP server in Claude Code user config (~/.claude.json user scope)
|
|
361
|
+
const claudeUserMcpFile = path_1.default.join(os_1.default.homedir(), '.claude.json');
|
|
362
|
+
try {
|
|
363
|
+
let claudeUserConfig = {};
|
|
364
|
+
if (fs_1.default.existsSync(claudeUserMcpFile)) {
|
|
365
|
+
claudeUserConfig = JSON.parse(fs_1.default.readFileSync(claudeUserMcpFile, 'utf8'));
|
|
366
|
+
}
|
|
367
|
+
if (!claudeUserConfig.mcpServers)
|
|
368
|
+
claudeUserConfig.mcpServers = {};
|
|
369
|
+
if (!claudeUserConfig.mcpServers.lemma) {
|
|
370
|
+
claudeUserConfig.mcpServers.lemma = {
|
|
371
|
+
command: 'npx',
|
|
372
|
+
args: ['-y', '@nxuss/lemma', 'mcp'],
|
|
373
|
+
};
|
|
374
|
+
fs_1.default.writeFileSync(claudeUserMcpFile, JSON.stringify(claudeUserConfig, null, 2));
|
|
375
|
+
console.log('✅ [Claude Code] Registered lemma MCP server in ~/.claude.json');
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
catch { }
|
|
337
379
|
console.log(`✅ Auto-configured Lemma for [${project}]`);
|
|
338
380
|
}
|
|
339
381
|
const EVENT_LOG = [];
|
|
@@ -342,7 +384,8 @@ const MAX_EVENTS = 100;
|
|
|
342
384
|
const MCP_STATUS = {
|
|
343
385
|
lastActivity: Date.now(),
|
|
344
386
|
toolCallCount: 0,
|
|
345
|
-
status: 'idle'
|
|
387
|
+
status: 'idle',
|
|
388
|
+
mcpEnabled: true,
|
|
346
389
|
};
|
|
347
390
|
function logEvent(event) {
|
|
348
391
|
const ev = { id: Math.random().toString(36).slice(2, 11), timestamp: Date.now(), ...event };
|
|
@@ -975,12 +1018,20 @@ class LemmaServer {
|
|
|
975
1018
|
}
|
|
976
1019
|
res.json({
|
|
977
1020
|
status,
|
|
1021
|
+
enabled: MCP_STATUS.mcpEnabled,
|
|
978
1022
|
lastActivity: new Date(MCP_STATUS.lastActivity).toISOString(),
|
|
979
1023
|
toolCallCount: MCP_STATUS.toolCallCount,
|
|
980
1024
|
secondsSinceActive: Math.floor(secondsSinceActive),
|
|
981
1025
|
uptime: Math.floor(process.uptime())
|
|
982
1026
|
});
|
|
983
1027
|
});
|
|
1028
|
+
// MCP Toggle endpoint
|
|
1029
|
+
this.app.post('/api/mcp/toggle', (req, res) => {
|
|
1030
|
+
MCP_STATUS.mcpEnabled = !MCP_STATUS.mcpEnabled;
|
|
1031
|
+
const state = MCP_STATUS.mcpEnabled ? 'enabled' : 'disabled';
|
|
1032
|
+
console.log(`🔄 [MCP] Toggled ${state}`);
|
|
1033
|
+
res.json({ enabled: MCP_STATUS.mcpEnabled, status: state });
|
|
1034
|
+
});
|
|
984
1035
|
// Project registration from MCP handshake
|
|
985
1036
|
this.app.post('/api/handshake', (req, res) => {
|
|
986
1037
|
const { projectPath, projectName, stack } = req.body;
|
|
@@ -1367,7 +1418,7 @@ class LemmaServer {
|
|
|
1367
1418
|
const responseObj = JSON.parse(meta.response);
|
|
1368
1419
|
const contentText = responseObj.choices?.[0]?.message?.content || responseObj.content?.[0]?.text || '';
|
|
1369
1420
|
const promptText = typeof meta.prompt === 'string' ? meta.prompt : 'Architecture Note';
|
|
1370
|
-
archMemoriesText += `#### 📌
|
|
1421
|
+
archMemoriesText += `#### 📌 Decision: ${promptText}\n${contentText.substring(0, 500)}${contentText.length > 500 ? '...' : ''}\n\n`;
|
|
1371
1422
|
}
|
|
1372
1423
|
catch { }
|
|
1373
1424
|
}
|
|
@@ -1401,7 +1452,7 @@ class LemmaServer {
|
|
|
1401
1452
|
`1. **Respect Core Stack:** Adhere strictly to the codebase structure and libraries listed above.`,
|
|
1402
1453
|
`2. **Leverage the Brain:** Use Lemma MCP tools (\`search_memory\` and \`store_memory\`) to retrieve past solutions and register key architectural changes.`,
|
|
1403
1454
|
`3. **Optimize Context:** Keep conversations focused. Lemma transparently compresses repetitive logs and file blocks to protect context window limits.`,
|
|
1404
|
-
`4. **
|
|
1455
|
+
` 4. **Privacy Firewall:** Do not worry about API key exposures. Lemma automatically masks local private variables and credentials.`
|
|
1405
1456
|
].filter(Boolean).join('\n');
|
|
1406
1457
|
res.json({ success: true, markdown: mentalModel });
|
|
1407
1458
|
}
|
|
@@ -2045,7 +2096,7 @@ commander_1.program
|
|
|
2045
2096
|
.version(VERSION)
|
|
2046
2097
|
.addHelpText('after', `
|
|
2047
2098
|
\x1b[1mPlan Comparison\x1b[0m
|
|
2048
|
-
\x1b[32mFree\x1b[0m
|
|
2099
|
+
\x1b[32mFree\x1b[0m ${FREE_LIMIT} req/mo · Exact cache · Privacy firewall · MCP tools
|
|
2049
2100
|
\x1b[35mPro\x1b[0m Unlimited · Semantic cache · Cloud sync · Autopilot · Heal
|
|
2050
2101
|
\x1b[36mhttps://lemma.nxus.studio/upgrade\x1b[0m
|
|
2051
2102
|
|
|
@@ -2297,6 +2348,7 @@ commander_1.program.command('activate <key>')
|
|
|
2297
2348
|
commander_1.program.command('init')
|
|
2298
2349
|
.description('Initialize Lemma in the current project (auto-discovery)')
|
|
2299
2350
|
.option('--no-configure', 'Skip automatic configuration of editors, shell overrides, and Claude Desktop')
|
|
2351
|
+
.option('--yes', 'Skip prompts and accept defaults')
|
|
2300
2352
|
.action(async (opts) => {
|
|
2301
2353
|
const project = detectProject();
|
|
2302
2354
|
console.log(`\n🛠️ Initializing Lemma for [${project}]...`);
|
|
@@ -2326,8 +2378,23 @@ commander_1.program.command('init')
|
|
|
2326
2378
|
fs_1.default.writeFileSync(envFile, lemmaConfig);
|
|
2327
2379
|
console.log('✅ Created .env with Lemma configuration');
|
|
2328
2380
|
}
|
|
2329
|
-
|
|
2330
|
-
|
|
2381
|
+
// Prompt before modifying IDE configs unless --yes or --no-configure
|
|
2382
|
+
if (opts.configure !== false) {
|
|
2383
|
+
if (opts.yes) {
|
|
2384
|
+
console.log('\n🧠 \x1b[35mAuto-configuring MCP for AI IDEs...\x1b[0m');
|
|
2385
|
+
}
|
|
2386
|
+
else {
|
|
2387
|
+
const ans = await ask('\n🧠 Configure MCP servers for your IDEs (Claude, Cursor, Windsurf, VS Code, Kiro, Codex)? (Y/n): ');
|
|
2388
|
+
if (ans.toLowerCase() === 'n' || ans.toLowerCase() === 'no') {
|
|
2389
|
+
opts.configure = false;
|
|
2390
|
+
console.log('⏭️ Skipping IDE auto-configuration');
|
|
2391
|
+
}
|
|
2392
|
+
else {
|
|
2393
|
+
console.log(' Auto-configuring...');
|
|
2394
|
+
}
|
|
2395
|
+
}
|
|
2396
|
+
}
|
|
2397
|
+
autoConfigureAll(project, { configure: opts.configure !== false });
|
|
2331
2398
|
injectIdeRules(project);
|
|
2332
2399
|
console.log('\n✨ Project initialized for the Agentic Era!\n');
|
|
2333
2400
|
console.log('\x1b[1mNext steps:\x1b[0m');
|