@nxuss/lemma 1.0.4 → 1.1.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 (105) hide show
  1. package/README.md +203 -95
  2. package/bin/init.js +4 -1
  3. package/dist/cjs/mcp/prompts.d.ts +1 -1
  4. package/dist/cjs/mcp/prompts.d.ts.map +1 -1
  5. package/dist/cjs/mcp/prompts.js +24 -0
  6. package/dist/cjs/mcp/prompts.js.map +1 -1
  7. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  8. package/dist/cjs/mcp/tools.js +497 -0
  9. package/dist/cjs/mcp/tools.js.map +1 -1
  10. package/dist/cjs/utils/AutoContextBundle.d.ts +17 -0
  11. package/dist/cjs/utils/AutoContextBundle.d.ts.map +1 -0
  12. package/dist/cjs/utils/AutoContextBundle.js +125 -0
  13. package/dist/cjs/utils/AutoContextBundle.js.map +1 -0
  14. package/dist/cjs/utils/BulkFileDigest.d.ts +13 -0
  15. package/dist/cjs/utils/BulkFileDigest.d.ts.map +1 -0
  16. package/dist/cjs/utils/BulkFileDigest.js +64 -0
  17. package/dist/cjs/utils/BulkFileDigest.js.map +1 -0
  18. package/dist/cjs/utils/ConversationCheckpoint.d.ts +14 -0
  19. package/dist/cjs/utils/ConversationCheckpoint.d.ts.map +1 -0
  20. package/dist/cjs/utils/ConversationCheckpoint.js +77 -0
  21. package/dist/cjs/utils/ConversationCheckpoint.js.map +1 -0
  22. package/dist/cjs/utils/FileFingerprint.d.ts +11 -0
  23. package/dist/cjs/utils/FileFingerprint.d.ts.map +1 -0
  24. package/dist/cjs/utils/FileFingerprint.js +64 -0
  25. package/dist/cjs/utils/FileFingerprint.js.map +1 -0
  26. package/dist/cjs/utils/GitBlameHeat.d.ts +20 -0
  27. package/dist/cjs/utils/GitBlameHeat.d.ts.map +1 -0
  28. package/dist/cjs/utils/GitBlameHeat.js +91 -0
  29. package/dist/cjs/utils/GitBlameHeat.js.map +1 -0
  30. package/dist/cjs/utils/ImportTreeContext.d.ts +17 -0
  31. package/dist/cjs/utils/ImportTreeContext.d.ts.map +1 -0
  32. package/dist/cjs/utils/ImportTreeContext.js +159 -0
  33. package/dist/cjs/utils/ImportTreeContext.js.map +1 -0
  34. package/dist/cjs/utils/PromptPatternCache.d.ts +14 -0
  35. package/dist/cjs/utils/PromptPatternCache.d.ts.map +1 -0
  36. package/dist/cjs/utils/PromptPatternCache.js +104 -0
  37. package/dist/cjs/utils/PromptPatternCache.js.map +1 -0
  38. package/dist/cjs/utils/RepeatGuard.d.ts +9 -0
  39. package/dist/cjs/utils/RepeatGuard.d.ts.map +1 -0
  40. package/dist/cjs/utils/RepeatGuard.js +90 -0
  41. package/dist/cjs/utils/RepeatGuard.js.map +1 -0
  42. package/dist/cjs/utils/TestAutofixInterceptor.d.ts +17 -0
  43. package/dist/cjs/utils/TestAutofixInterceptor.d.ts.map +1 -0
  44. package/dist/cjs/utils/TestAutofixInterceptor.js +125 -0
  45. package/dist/cjs/utils/TestAutofixInterceptor.js.map +1 -0
  46. package/dist/cjs/utils/TokenBudgetedReader.d.ts +14 -0
  47. package/dist/cjs/utils/TokenBudgetedReader.d.ts.map +1 -0
  48. package/dist/cjs/utils/TokenBudgetedReader.js +157 -0
  49. package/dist/cjs/utils/TokenBudgetedReader.js.map +1 -0
  50. package/dist/cjs/utils/TypeCoverage.d.ts +15 -0
  51. package/dist/cjs/utils/TypeCoverage.d.ts.map +1 -0
  52. package/dist/cjs/utils/TypeCoverage.js +141 -0
  53. package/dist/cjs/utils/TypeCoverage.js.map +1 -0
  54. package/dist/esm/mcp/prompts.d.ts +1 -1
  55. package/dist/esm/mcp/prompts.d.ts.map +1 -1
  56. package/dist/esm/mcp/prompts.js +24 -0
  57. package/dist/esm/mcp/prompts.js.map +1 -1
  58. package/dist/esm/mcp/tools.d.ts.map +1 -1
  59. package/dist/esm/mcp/tools.js +497 -0
  60. package/dist/esm/mcp/tools.js.map +1 -1
  61. package/dist/esm/utils/AutoContextBundle.d.ts +17 -0
  62. package/dist/esm/utils/AutoContextBundle.d.ts.map +1 -0
  63. package/dist/esm/utils/AutoContextBundle.js +86 -0
  64. package/dist/esm/utils/AutoContextBundle.js.map +1 -0
  65. package/dist/esm/utils/BulkFileDigest.d.ts +13 -0
  66. package/dist/esm/utils/BulkFileDigest.d.ts.map +1 -0
  67. package/dist/esm/utils/BulkFileDigest.js +58 -0
  68. package/dist/esm/utils/BulkFileDigest.js.map +1 -0
  69. package/dist/esm/utils/ConversationCheckpoint.d.ts +14 -0
  70. package/dist/esm/utils/ConversationCheckpoint.d.ts.map +1 -0
  71. package/dist/esm/utils/ConversationCheckpoint.js +69 -0
  72. package/dist/esm/utils/ConversationCheckpoint.js.map +1 -0
  73. package/dist/esm/utils/FileFingerprint.d.ts +11 -0
  74. package/dist/esm/utils/FileFingerprint.d.ts.map +1 -0
  75. package/dist/esm/utils/FileFingerprint.js +56 -0
  76. package/dist/esm/utils/FileFingerprint.js.map +1 -0
  77. package/dist/esm/utils/GitBlameHeat.d.ts +20 -0
  78. package/dist/esm/utils/GitBlameHeat.d.ts.map +1 -0
  79. package/dist/esm/utils/GitBlameHeat.js +85 -0
  80. package/dist/esm/utils/GitBlameHeat.js.map +1 -0
  81. package/dist/esm/utils/ImportTreeContext.d.ts +17 -0
  82. package/dist/esm/utils/ImportTreeContext.d.ts.map +1 -0
  83. package/dist/esm/utils/ImportTreeContext.js +153 -0
  84. package/dist/esm/utils/ImportTreeContext.js.map +1 -0
  85. package/dist/esm/utils/PromptPatternCache.d.ts +14 -0
  86. package/dist/esm/utils/PromptPatternCache.d.ts.map +1 -0
  87. package/dist/esm/utils/PromptPatternCache.js +96 -0
  88. package/dist/esm/utils/PromptPatternCache.js.map +1 -0
  89. package/dist/esm/utils/RepeatGuard.d.ts +9 -0
  90. package/dist/esm/utils/RepeatGuard.d.ts.map +1 -0
  91. package/dist/esm/utils/RepeatGuard.js +83 -0
  92. package/dist/esm/utils/RepeatGuard.js.map +1 -0
  93. package/dist/esm/utils/TestAutofixInterceptor.d.ts +17 -0
  94. package/dist/esm/utils/TestAutofixInterceptor.d.ts.map +1 -0
  95. package/dist/esm/utils/TestAutofixInterceptor.js +122 -0
  96. package/dist/esm/utils/TestAutofixInterceptor.js.map +1 -0
  97. package/dist/esm/utils/TokenBudgetedReader.d.ts +14 -0
  98. package/dist/esm/utils/TokenBudgetedReader.d.ts.map +1 -0
  99. package/dist/esm/utils/TokenBudgetedReader.js +118 -0
  100. package/dist/esm/utils/TokenBudgetedReader.js.map +1 -0
  101. package/dist/esm/utils/TypeCoverage.d.ts +15 -0
  102. package/dist/esm/utils/TypeCoverage.d.ts.map +1 -0
  103. package/dist/esm/utils/TypeCoverage.js +102 -0
  104. package/dist/esm/utils/TypeCoverage.js.map +1 -0
  105. package/package.json +1 -1
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.readTokenBudgeted = readTokenBudgeted;
40
+ const fs_1 = __importDefault(require("fs"));
41
+ const path_1 = __importDefault(require("path"));
42
+ const ts = __importStar(require("typescript"));
43
+ function estimateTokens(text) {
44
+ return Math.ceil(text.length / 4);
45
+ }
46
+ function extractSections(filePath, content) {
47
+ const sections = [];
48
+ const lines = content.split('\n');
49
+ try {
50
+ const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
51
+ function visit(node) {
52
+ if (ts.isFunctionDeclaration(node) ||
53
+ ts.isMethodDeclaration(node) ||
54
+ ts.isArrowFunction(node) ||
55
+ ts.isFunctionExpression(node) ||
56
+ ts.isClassDeclaration(node) ||
57
+ ts.isInterfaceDeclaration(node) ||
58
+ ts.isTypeAliasDeclaration(node) ||
59
+ ts.isEnumDeclaration(node) ||
60
+ ts.isVariableStatement(node)) {
61
+ const start = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line;
62
+ const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line;
63
+ const name = ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node) ||
64
+ ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isEnumDeclaration(node)
65
+ ? node.name?.getText(sourceFile) || '(anonymous)'
66
+ : ts.isVariableStatement(node)
67
+ ? node.declarationList.declarations[0]?.name.getText(sourceFile) || '(const)'
68
+ : '(method)';
69
+ const kind = ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node) ? 'function'
70
+ : ts.isClassDeclaration(node) ? 'class'
71
+ : ts.isInterfaceDeclaration(node) ? 'interface'
72
+ : ts.isTypeAliasDeclaration(node) ? 'type'
73
+ : ts.isEnumDeclaration(node) ? 'enum'
74
+ : ts.isVariableStatement(node) ? 'const'
75
+ : 'method';
76
+ sections.push({
77
+ start,
78
+ end: Math.min(end, lines.length - 1),
79
+ text: lines.slice(start, end + 1).join('\n'),
80
+ label: `${kind} ${name}`,
81
+ });
82
+ }
83
+ ts.forEachChild(node, visit);
84
+ }
85
+ visit(sourceFile);
86
+ }
87
+ catch { }
88
+ if (sections.length === 0) {
89
+ const chunkSize = 50;
90
+ for (let i = 0; i < lines.length; i += chunkSize) {
91
+ const end = Math.min(i + chunkSize - 1, lines.length - 1);
92
+ sections.push({
93
+ start: i,
94
+ end,
95
+ text: lines.slice(i, end + 1).join('\n'),
96
+ label: `chunk L${i + 1}-${end + 1}`,
97
+ });
98
+ }
99
+ }
100
+ return sections;
101
+ }
102
+ function scoreRelevance(text, query) {
103
+ if (!query)
104
+ return 1;
105
+ const lowerText = text.toLowerCase();
106
+ const queryTokens = query.toLowerCase().split(/\s+/).filter(Boolean);
107
+ let score = 0;
108
+ for (const token of queryTokens) {
109
+ const matches = (lowerText.match(new RegExp(token.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')) || []).length;
110
+ score += matches;
111
+ }
112
+ return score;
113
+ }
114
+ function readTokenBudgeted(filePath, projectRoot, query = '', maxTokens = 2000) {
115
+ const resolved = path_1.default.resolve(projectRoot, filePath);
116
+ if (!fs_1.default.existsSync(resolved)) {
117
+ return { filePath, content: '', tokensUsed: 0, tokensBudget: maxTokens, truncated: false, relevantSections: [] };
118
+ }
119
+ const content = fs_1.default.readFileSync(resolved, 'utf8');
120
+ const totalTokens = estimateTokens(content);
121
+ if (totalTokens <= maxTokens) {
122
+ return { filePath, content, tokensUsed: totalTokens, tokensBudget: maxTokens, truncated: false, relevantSections: [] };
123
+ }
124
+ const sections = extractSections(filePath, content);
125
+ const scored = sections.map(s => ({
126
+ ...s,
127
+ relevance: scoreRelevance(s.text, query),
128
+ tokens: estimateTokens(s.text),
129
+ }));
130
+ scored.sort((a, b) => b.relevance - a.relevance);
131
+ const selected = [];
132
+ let tokensUsed = 0;
133
+ for (const s of scored) {
134
+ if (tokensUsed + s.tokens > maxTokens && selected.length >= 2)
135
+ continue;
136
+ selected.push(s);
137
+ tokensUsed += s.tokens;
138
+ if (tokensUsed >= maxTokens)
139
+ break;
140
+ }
141
+ selected.sort((a, b) => a.start - b.start);
142
+ const resultContent = selected.map(s => s.text).join('\n\n');
143
+ const relevantSections = selected.map(s => ({
144
+ start: s.start + 1,
145
+ end: s.end + 1,
146
+ reason: s.label,
147
+ }));
148
+ return {
149
+ filePath,
150
+ content: resultContent,
151
+ tokensUsed,
152
+ tokensBudget: maxTokens,
153
+ truncated: true,
154
+ relevantSections,
155
+ };
156
+ }
157
+ //# sourceMappingURL=TokenBudgetedReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenBudgetedReader.js","sourceRoot":"","sources":["../../../src/utils/TokenBudgetedReader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface MissingType {
2
+ line: number;
3
+ code: string;
4
+ }
5
+ export interface TypeCoverageResult {
6
+ file: string;
7
+ totalDeclarations: number;
8
+ typedDeclarations: number;
9
+ coveragePercent: number;
10
+ anyCount: number;
11
+ missingTypes: MissingType[];
12
+ score: number;
13
+ }
14
+ export declare function analyzeTypeCoverage(filePath: string, projectRoot: string): TypeCoverageResult;
15
+ //# sourceMappingURL=TypeCoverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeCoverage.d.ts","sourceRoot":"","sources":["../../../src/utils/TypeCoverage.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AA+BD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAgF7F"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.analyzeTypeCoverage = analyzeTypeCoverage;
40
+ const fs_1 = __importDefault(require("fs"));
41
+ const path_1 = __importDefault(require("path"));
42
+ const ts = __importStar(require("typescript"));
43
+ function getSourceFile(filePath) {
44
+ try {
45
+ const content = fs_1.default.readFileSync(filePath, 'utf8');
46
+ return ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ function countAny(node, _sourceFile) {
53
+ let count = 0;
54
+ function walk(n) {
55
+ if (n.kind === ts.SyntaxKind.AnyKeyword)
56
+ count++;
57
+ ts.forEachChild(n, walk);
58
+ }
59
+ walk(node);
60
+ return count;
61
+ }
62
+ function hasTypeAnnotation(node) {
63
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isArrowFunction(node)) {
64
+ return !!node.type;
65
+ }
66
+ if (ts.isVariableDeclaration(node) || ts.isPropertyDeclaration(node) || ts.isParameter(node)) {
67
+ return !!node.type;
68
+ }
69
+ return false;
70
+ }
71
+ function analyzeTypeCoverage(filePath, projectRoot) {
72
+ const resolved = path_1.default.resolve(projectRoot, filePath);
73
+ if (!fs_1.default.existsSync(resolved)) {
74
+ return {
75
+ file: filePath, totalDeclarations: 0, typedDeclarations: 0,
76
+ coveragePercent: 0, anyCount: 0, missingTypes: [], score: 0,
77
+ };
78
+ }
79
+ const sourceFile = getSourceFile(resolved);
80
+ if (!sourceFile) {
81
+ return {
82
+ file: filePath, totalDeclarations: 0, typedDeclarations: 0,
83
+ coveragePercent: 0, anyCount: 0, missingTypes: [], score: 0,
84
+ };
85
+ }
86
+ let totalDeclarations = 0;
87
+ let typedDeclarations = 0;
88
+ let anyCount = 0;
89
+ const missingTypes = [];
90
+ function visit(node) {
91
+ if (ts.isFunctionDeclaration(node) ||
92
+ ts.isMethodDeclaration(node) ||
93
+ ts.isArrowFunction(node) ||
94
+ ts.isFunctionExpression(node)) {
95
+ if (node.name || ts.isArrowFunction(node)) {
96
+ totalDeclarations++;
97
+ if (hasTypeAnnotation(node))
98
+ typedDeclarations++;
99
+ else {
100
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
101
+ missingTypes.push({ line: pos.line + 1, code: node.getText(sourceFile).slice(0, 80) });
102
+ }
103
+ }
104
+ }
105
+ if (ts.isVariableDeclaration(node) || ts.isPropertyDeclaration(node)) {
106
+ totalDeclarations++;
107
+ if (hasTypeAnnotation(node))
108
+ typedDeclarations++;
109
+ else {
110
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
111
+ missingTypes.push({ line: pos.line + 1, code: node.getText(sourceFile).slice(0, 80) });
112
+ }
113
+ }
114
+ if (ts.isParameter(node)) {
115
+ totalDeclarations++;
116
+ if (hasTypeAnnotation(node))
117
+ typedDeclarations++;
118
+ else {
119
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
120
+ missingTypes.push({ line: pos.line + 1, code: node.getText(sourceFile).slice(0, 80) });
121
+ }
122
+ }
123
+ anyCount += countAny(node, sourceFile);
124
+ ts.forEachChild(node, visit);
125
+ }
126
+ visit(sourceFile);
127
+ const coveragePercent = totalDeclarations > 0
128
+ ? Math.round((typedDeclarations / totalDeclarations) * 1000) / 10
129
+ : 100;
130
+ const score = Math.max(0, Math.min(100, coveragePercent - anyCount * 5 - (missingTypes.length > 10 ? 10 : missingTypes.length)));
131
+ return {
132
+ file: filePath,
133
+ totalDeclarations,
134
+ typedDeclarations,
135
+ coveragePercent,
136
+ anyCount,
137
+ missingTypes: missingTypes.slice(0, 20),
138
+ score: Math.round(score * 10) / 10,
139
+ };
140
+ }
141
+ //# sourceMappingURL=TypeCoverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeCoverage.js","sourceRoot":"","sources":["../../../src/utils/TypeCoverage.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
2
  export declare const LEMMA_SYSTEM_PROMPT = "You are connected to Lemma \u2014 an intelligent local-first AI gateway.\nLemma gives you a set of tools you MUST use proactively and automatically. NEVER ask the user\nto call a tool manually. YOU invoke the tools. The user should experience zero friction.\n\n## MANDATORY AUTOMATIC BEHAVIORS\n\n### 1. Before reading ANY file \u2192 call get_ast_hologram first\nWhen you need to understand the structure of a codebase or navigate files, ALWAYS call\n`get_ast_hologram` first (with the relevant dirPath, e.g. \"src\"). Use the returned symbol\nmap to pinpoint exactly which files to read. NEVER blindly read every file one by one.\n\n### 2. Before answering ANY technical question \u2192 call query_hybrid_consensus first\nBEFORE making any reasoning or cloud LLM call, ALWAYS call `query_hybrid_consensus` with\nthe user's question. If similarity \u2265 80%, return the cached answer immediately \u2014 no cloud\ncall needed. Only proceed with your own reasoning if the Brain returns a MISS.\n\n### 3. When you start working on ANY file \u2192 call get_telepathic_hints automatically\nWhenever the user mentions a file or you are about to read/edit a file, IMMEDIATELY call\n`get_telepathic_hints` with that file's path. Surface the results to the user as relevant\ncontext BEFORE doing any work. Do not ask permission \u2014 just do it.\n\n### 4. Before applying ANY code patch \u2192 call validate_patch_sandbox first\nNEVER call `write_workspace_file` or `apply_workspace_patch` without FIRST calling\n`validate_patch_sandbox` with the proposed content. Only proceed with the write if the\nverdict is \"\u2705 SAFE TO APPLY\". If it fails, fix the issues and re-validate.\n\n### 5. After solving any technical problem \u2192 call store_memory automatically\nAfter resolving a bug, implementing a feature, or answering a significant technical question,\nALWAYS call `store_memory` to persist the solution. Use a descriptive query key so it can\nbe retrieved in future sessions across ALL projects.\n\n### 6. Workspace navigation \u2192 always use Lemma tools, NEVER guess file contents\n- Use `list_workspace_dir` to navigate structure\n- Use `read_workspace_file` (auto-compresses + scrubs secrets) instead of asking the user\n- Use `search_workspace` for text search across files\n- Use `run_workspace_command` for builds, tests, linters\n\n### 7. Privacy is automatic\n`read_workspace_file` and `search_workspace` automatically scrub API keys and PII.\nYou never need to manually sanitize file content.\n\n## LEMMA RESOURCES (auto-subscribe when available)\n- `lemma://runtime/context` \u2014 live crash logs. Read this FIRST when the user reports a bug.\n- `lemma://multiverse/timeline` \u2014 AST history. Use when the user says \"it was working before\".\n- `lemma://project/onboarding` \u2014 architecture map. Read at session start in new repos.\n- `lemma://stats/usage` \u2014 token savings report.\n\nRemember: the user hired YOU to be autonomous. Act like it.";
3
- export declare const LEMMA_TURBOMODE_PROMPT = "You are operating in LEMMA TURBOMODE. Your goal: multiply the user's LLM membership 50x by spending 50x fewer tokens per task. Every token counts. Every cache hit is a membership extension.\n\n## MANDATORY TURBOMODE RULES \u2014 VIOLATE THESE AND YOU WASTE THE USER'S MONEY\n\n### 0. Before ANYTHING \u2192 check token_budget\nEvery 5 turns, call `token_budget` to check your consumption. If multiplier drops below 10x, optimize harder.\n\n### 1. Before sending ANY code \u2192 call turbosqueeze\nBEFORE including ANY code block in your response, run it through `turbosqueeze` first. Strip comments, collapse whitespace, remove imports. A 500-line file becomes 50 lines. This is your #1 token saver.\n\n### 2. Before reasoning \u2192 call smarter_cache (threshold 0.75)\nNEVER reason from scratch. Call `smarter_cache` with the user's exact question. If similarity >= 75%, return the cached answer INSTANTLY. Zero cloud tokens spent. Only reason if you get a MISS.\n\n### 3. Before every new turn \u2192 call compress_context\nAt the start of any extended interaction, call `compress_context` on the full message history. Keep only the last 3 turns intact. Summarize everything before that into 2 sentences. This keeps your context window lean.\n\n### 4. Before reading files \u2192 call get_ast_hologram\nNEVER read files blindly. Always call `get_ast_hologram` first to locate the exact symbols you need. Then read only those specific files. Each unnecessary file read wastes 1000+ tokens.\n\n### 5. After every solution \u2192 call store_memory automatically\nEvery bug fix, feature, or answer MUST be stored via `store_memory`. This creates a permanent cache hit for future sessions. The first time costs tokens; every time after is FREE.\n\n### 6. Answer concisely \u2014 no fluff\n- No \"Sure, I can help you with that\" \u2014 just do it.\n- No explanation of what you did \u2014 unless asked.\n- No markdown formatting in internal responses.\n- No repeating the user's question back to them.\n\n### 7. Use batch_tool_calls aggressively\nAny set of independent operations (read 3 files, search 2 patterns, check cache for 2 questions) \u2014 use `batch_tool_calls` to run them in parallel. Single round-trip > multiple sequential calls.\n\n## TURBOMODE SCORING\n- Cache HIT = perfect score (0 tokens spent)\n- Cache MISS + compress = good score (< 100 tokens spent on overhead)\n- Reasoning from scratch = bad score (only when absolutely necessary)\n- Reading full files without hologram = FAIL (wasteful)\n\nRemember: this user has a deadline. Every token you save is time and money. Make every token count.";
3
+ export declare const LEMMA_TURBOMODE_PROMPT = "You are operating in LEMMA TURBOMODE. Your goal: multiply the user's LLM membership 50x by spending 50x fewer tokens per task. Every token counts. Every cache hit is a membership extension.\n\n## MANDATORY TURBOMODE RULES \u2014 VIOLATE THESE AND YOU WASTE THE USER'S MONEY\n\n### 0. Before ANYTHING \u2192 check token_budget\nEvery 5 turns, call `token_budget` to check your consumption. If multiplier drops below 10x, optimize harder.\n\n### 1. Before sending ANY code \u2192 call turbosqueeze\nBEFORE including ANY code block in your response, run it through `turbosqueeze` first. Strip comments, collapse whitespace, remove imports. A 500-line file becomes 50 lines. This is your #1 token saver.\n\n### 2. Before reasoning \u2192 call smarter_cache (threshold 0.75)\nNEVER reason from scratch. Call `smarter_cache` with the user's exact question. If similarity >= 75%, return the cached answer INSTANTLY. Zero cloud tokens spent. Only reason if you get a MISS.\n\n### 3. Before every new turn \u2192 call compress_context\nAt the start of any extended interaction, call `compress_context` on the full message history. Keep only the last 3 turns intact. Summarize everything before that into 2 sentences. This keeps your context window lean.\n\n### 4. Before reading files \u2192 call get_ast_hologram\nNEVER read files blindly. Always call `get_ast_hologram` first to locate the exact symbols you need. Then read only those specific files. Each unnecessary file read wastes 1000+ tokens.\n\n### 4b. Before re-reading a file \u2192 call file_fingerprint\nBefore calling read_workspace_file, check if the file hash has changed since last read. If status is 'unchanged', skip the read entirely. Only read when hash differs.\n\n### 4c. Before deep file analysis \u2192 use import_tree_context + type_coverage_report\nInstead of reading full files to understand architecture, call import_tree_context (import graph) and type_coverage_report (type safety). Both are zero-token tools.\n\n### 4d. Before investigating code ownership \u2192 call git_blame_heat\nFor questions about who wrote code, why it's risky, or change history, call git_blame_heat instead of reasoning. Zero LLM cost.\n\n### 5. After every solution \u2192 call store_memory automatically\nEvery bug fix, feature, or answer MUST be stored via `store_memory`. This creates a permanent cache hit for future sessions. The first time costs tokens; every time after is FREE.\n\n### 6. Answer concisely \u2014 no fluff\n- No \"Sure, I can help you with that\" \u2014 just do it.\n- No explanation of what you did \u2014 unless asked.\n- No markdown formatting in internal responses.\n- No repeating the user's question back to them.\n\n### 7. Use batch_tool_calls aggressively\nAny set of independent operations (read 3 files, search 2 patterns, check cache for 2 questions) \u2014 use `batch_tool_calls` to run them in parallel. Single round-trip > multiple sequential calls.\n\n### 8. Before multi-file operations \u2192 use auto_context_bundle or bulk_file_digest\nInstead of reading files one by one, use `auto_context_bundle` (one file, everything included) or `bulk_file_digest` (multiple files, one call). Both save 75-80% round-trips.\n\n### 9. Before outputting long responses \u2192 check repeat_guard\nCall `repeat_guard` with your draft output to avoid repeating yourself. Saves 10-15% of output tokens.\n\n### 10. When resuming work \u2192 load conversation_checkpoint\nAt session start or when user says \"continuemos\", call `conversation_checkpoint` with action \"load\" to restore context without re-explaining.\n\n### 11. When tests fail \u2192 use test_autofix_interceptor\nInstead of manually reading errors and reasoning, call `test_autofix_interceptor` to get failures + Brain-suggested fixes in one call.\n\n### 12. For common prompt patterns \u2192 use prompt_pattern_cache\nBefore generating repetitive prompts (\"explain this\", \"review this\", \"write tests\"), check `prompt_pattern_cache` action \"find\" for cached templates.\n\n## TURBOMODE SCORING\n- Cache HIT = perfect score (0 tokens spent)\n- Cache MISS + compress = good score (< 100 tokens spent on overhead)\n- Reasoning from scratch = bad score (only when absolutely necessary)\n- Reading full files without hologram = FAIL (wasteful)\n\nRemember: this user has a deadline. Every token you save is time and money. Make every token count.";
4
4
  export declare function setupPromptsHandlers(server: Server): void;
5
5
  //# sourceMappingURL=prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/mcp/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,eAAO,MAAM,mBAAmB,m6FA+C4B,CAAC;AAE7D,eAAO,MAAM,sBAAsB,4jFAqCiE,CAAC;AAErG,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAiDzD"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/mcp/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,eAAO,MAAM,mBAAmB,m6FA+C4B,CAAC;AAE7D,eAAO,MAAM,sBAAsB,yyIA6DiE,CAAC;AAErG,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAiDzD"}
@@ -66,6 +66,15 @@ At the start of any extended interaction, call \`compress_context\` on the full
66
66
  ### 4. Before reading files → call get_ast_hologram
67
67
  NEVER read files blindly. Always call \`get_ast_hologram\` first to locate the exact symbols you need. Then read only those specific files. Each unnecessary file read wastes 1000+ tokens.
68
68
 
69
+ ### 4b. Before re-reading a file → call file_fingerprint
70
+ Before calling read_workspace_file, check if the file hash has changed since last read. If status is 'unchanged', skip the read entirely. Only read when hash differs.
71
+
72
+ ### 4c. Before deep file analysis → use import_tree_context + type_coverage_report
73
+ Instead of reading full files to understand architecture, call import_tree_context (import graph) and type_coverage_report (type safety). Both are zero-token tools.
74
+
75
+ ### 4d. Before investigating code ownership → call git_blame_heat
76
+ For questions about who wrote code, why it's risky, or change history, call git_blame_heat instead of reasoning. Zero LLM cost.
77
+
69
78
  ### 5. After every solution → call store_memory automatically
70
79
  Every bug fix, feature, or answer MUST be stored via \`store_memory\`. This creates a permanent cache hit for future sessions. The first time costs tokens; every time after is FREE.
71
80
 
@@ -78,6 +87,21 @@ Every bug fix, feature, or answer MUST be stored via \`store_memory\`. This crea
78
87
  ### 7. Use batch_tool_calls aggressively
79
88
  Any set of independent operations (read 3 files, search 2 patterns, check cache for 2 questions) — use \`batch_tool_calls\` to run them in parallel. Single round-trip > multiple sequential calls.
80
89
 
90
+ ### 8. Before multi-file operations → use auto_context_bundle or bulk_file_digest
91
+ Instead of reading files one by one, use \`auto_context_bundle\` (one file, everything included) or \`bulk_file_digest\` (multiple files, one call). Both save 75-80% round-trips.
92
+
93
+ ### 9. Before outputting long responses → check repeat_guard
94
+ Call \`repeat_guard\` with your draft output to avoid repeating yourself. Saves 10-15% of output tokens.
95
+
96
+ ### 10. When resuming work → load conversation_checkpoint
97
+ At session start or when user says "continuemos", call \`conversation_checkpoint\` with action "load" to restore context without re-explaining.
98
+
99
+ ### 11. When tests fail → use test_autofix_interceptor
100
+ Instead of manually reading errors and reasoning, call \`test_autofix_interceptor\` to get failures + Brain-suggested fixes in one call.
101
+
102
+ ### 12. For common prompt patterns → use prompt_pattern_cache
103
+ Before generating repetitive prompts ("explain this", "review this", "write tests"), check \`prompt_pattern_cache\` action "find" for cached templates.
104
+
81
105
  ## TURBOMODE SCORING
82
106
  - Cache HIT = perfect score (0 tokens spent)
83
107
  - Cache MISS + compress = good score (< 100 tokens spent on overhead)
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/mcp/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAEtG,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4DA+CyB,CAAC;AAE7D,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oGAqC8D,CAAC;AAErG,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QAC5D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE,+JAA+J;oBAC5K,SAAS,EAAE,EAAE;iBACd;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE,wOAAwO;oBACrP,SAAS,EAAE,EAAE;iBACd;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjE,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC9C,OAAO;gBACL,WAAW,EAAE,qCAAqC;gBAClD,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,mBAAmB;yBAC1B;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC9C,OAAO;gBACL,WAAW,EAAE,8CAA8C;gBAC3D,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,sBAAsB;yBAC7B;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/mcp/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAEtG,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4DA+CyB,CAAC;AAE7D,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oGA6D8D,CAAC;AAErG,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QAC5D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE,+JAA+J;oBAC5K,SAAS,EAAE,EAAE;iBACd;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE,wOAAwO;oBACrP,SAAS,EAAE,EAAE;iBACd;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjE,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC9C,OAAO;gBACL,WAAW,EAAE,qCAAqC;gBAClD,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,mBAAmB;yBAC1B;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC9C,OAAO;gBACL,WAAW,EAAE,8CAA8C;gBAC3D,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,sBAAsB;yBAC7B;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA41BnE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAC1C,IAAI,CA2DN"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAkgCnE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAC1C,IAAI,CA2DN"}