@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.
Files changed (47) hide show
  1. package/README.md +50 -13
  2. package/dashboard/dist/assets/{index-CqS7YEGj.js → index-DiidVeI5.js} +65 -65
  3. package/dashboard/dist/assets/{index-CqS7YEGj.js.map → index-DiidVeI5.js.map} +1 -1
  4. package/dashboard/dist/index.html +1 -1
  5. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  6. package/dist/cjs/cli/lemma-proxy.js +79 -12
  7. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  8. package/dist/cjs/mcp/index.js +1 -0
  9. package/dist/cjs/mcp/index.js.map +1 -1
  10. package/dist/cjs/mcp/prompts.d.ts +1 -0
  11. package/dist/cjs/mcp/prompts.d.ts.map +1 -1
  12. package/dist/cjs/mcp/prompts.js +58 -1
  13. package/dist/cjs/mcp/prompts.js.map +1 -1
  14. package/dist/cjs/mcp/resources.d.ts.map +1 -1
  15. package/dist/cjs/mcp/resources.js +3 -2
  16. package/dist/cjs/mcp/resources.js.map +1 -1
  17. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  18. package/dist/cjs/mcp/tools.js +288 -10
  19. package/dist/cjs/mcp/tools.js.map +1 -1
  20. package/dist/cjs/mcp/utils.d.ts.map +1 -1
  21. package/dist/cjs/mcp/utils.js +2 -2
  22. package/dist/cjs/mcp/utils.js.map +1 -1
  23. package/dist/cjs/utils/reportSavings.d.ts.map +1 -1
  24. package/dist/cjs/utils/reportSavings.js +2 -2
  25. package/dist/cjs/utils/reportSavings.js.map +1 -1
  26. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  27. package/dist/esm/cli/lemma-proxy.js +79 -12
  28. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  29. package/dist/esm/mcp/index.js +2 -1
  30. package/dist/esm/mcp/index.js.map +1 -1
  31. package/dist/esm/mcp/prompts.d.ts +1 -0
  32. package/dist/esm/mcp/prompts.d.ts.map +1 -1
  33. package/dist/esm/mcp/prompts.js +57 -0
  34. package/dist/esm/mcp/prompts.js.map +1 -1
  35. package/dist/esm/mcp/resources.d.ts.map +1 -1
  36. package/dist/esm/mcp/resources.js +3 -2
  37. package/dist/esm/mcp/resources.js.map +1 -1
  38. package/dist/esm/mcp/tools.d.ts.map +1 -1
  39. package/dist/esm/mcp/tools.js +288 -10
  40. package/dist/esm/mcp/tools.js.map +1 -1
  41. package/dist/esm/mcp/utils.d.ts.map +1 -1
  42. package/dist/esm/mcp/utils.js +2 -2
  43. package/dist/esm/mcp/utils.js.map +1 -1
  44. package/dist/esm/utils/reportSavings.d.ts.map +1 -1
  45. package/dist/esm/utils/reportSavings.js +2 -2
  46. package/dist/esm/utils/reportSavings.js.map +1 -1
  47. 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-CqS7YEGj.js"></script>
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":";AA+YA,wBAAgB,+BAA+B,CAAC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA4DvF;AAmhED,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"}
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 = process.env.HOME || process.env.USERPROFILE || '~';
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(process.env.HOME || '~', 'Library', 'Application Support', 'Claude');
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(process.env.HOME || '~', '.cursor');
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(process.env.HOME || '~', '.codeium', 'windsurf');
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(process.env.HOME || '~', '.kiro', 'settings'),
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(process.env.HOME || '~', '.codex', 'config.toml');
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 += `#### 📌 Decisión: ${promptText}\n${contentText.substring(0, 500)}${contentText.length > 500 ? '...' : ''}\n\n`;
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. **Cortafuegos Local:** Do not worry about API key exposures. Lemma automatically masks local private variables and credentials.`
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 500 req/mo · Exact cache · Privacy firewall · MCP tools
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
- console.log('\n🧠 \x1b[35mAuto-Setup MCP and redirection overrides for AI IDEs...\x1b[0m');
2330
- autoConfigureAll(project, { configure: opts.configure });
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');