@nxuss/lemma 1.0.5 → 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 (104) hide show
  1. package/README.md +203 -95
  2. package/dist/cjs/mcp/prompts.d.ts +1 -1
  3. package/dist/cjs/mcp/prompts.d.ts.map +1 -1
  4. package/dist/cjs/mcp/prompts.js +24 -0
  5. package/dist/cjs/mcp/prompts.js.map +1 -1
  6. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  7. package/dist/cjs/mcp/tools.js +497 -0
  8. package/dist/cjs/mcp/tools.js.map +1 -1
  9. package/dist/cjs/utils/AutoContextBundle.d.ts +17 -0
  10. package/dist/cjs/utils/AutoContextBundle.d.ts.map +1 -0
  11. package/dist/cjs/utils/AutoContextBundle.js +125 -0
  12. package/dist/cjs/utils/AutoContextBundle.js.map +1 -0
  13. package/dist/cjs/utils/BulkFileDigest.d.ts +13 -0
  14. package/dist/cjs/utils/BulkFileDigest.d.ts.map +1 -0
  15. package/dist/cjs/utils/BulkFileDigest.js +64 -0
  16. package/dist/cjs/utils/BulkFileDigest.js.map +1 -0
  17. package/dist/cjs/utils/ConversationCheckpoint.d.ts +14 -0
  18. package/dist/cjs/utils/ConversationCheckpoint.d.ts.map +1 -0
  19. package/dist/cjs/utils/ConversationCheckpoint.js +77 -0
  20. package/dist/cjs/utils/ConversationCheckpoint.js.map +1 -0
  21. package/dist/cjs/utils/FileFingerprint.d.ts +11 -0
  22. package/dist/cjs/utils/FileFingerprint.d.ts.map +1 -0
  23. package/dist/cjs/utils/FileFingerprint.js +64 -0
  24. package/dist/cjs/utils/FileFingerprint.js.map +1 -0
  25. package/dist/cjs/utils/GitBlameHeat.d.ts +20 -0
  26. package/dist/cjs/utils/GitBlameHeat.d.ts.map +1 -0
  27. package/dist/cjs/utils/GitBlameHeat.js +91 -0
  28. package/dist/cjs/utils/GitBlameHeat.js.map +1 -0
  29. package/dist/cjs/utils/ImportTreeContext.d.ts +17 -0
  30. package/dist/cjs/utils/ImportTreeContext.d.ts.map +1 -0
  31. package/dist/cjs/utils/ImportTreeContext.js +159 -0
  32. package/dist/cjs/utils/ImportTreeContext.js.map +1 -0
  33. package/dist/cjs/utils/PromptPatternCache.d.ts +14 -0
  34. package/dist/cjs/utils/PromptPatternCache.d.ts.map +1 -0
  35. package/dist/cjs/utils/PromptPatternCache.js +104 -0
  36. package/dist/cjs/utils/PromptPatternCache.js.map +1 -0
  37. package/dist/cjs/utils/RepeatGuard.d.ts +9 -0
  38. package/dist/cjs/utils/RepeatGuard.d.ts.map +1 -0
  39. package/dist/cjs/utils/RepeatGuard.js +90 -0
  40. package/dist/cjs/utils/RepeatGuard.js.map +1 -0
  41. package/dist/cjs/utils/TestAutofixInterceptor.d.ts +17 -0
  42. package/dist/cjs/utils/TestAutofixInterceptor.d.ts.map +1 -0
  43. package/dist/cjs/utils/TestAutofixInterceptor.js +125 -0
  44. package/dist/cjs/utils/TestAutofixInterceptor.js.map +1 -0
  45. package/dist/cjs/utils/TokenBudgetedReader.d.ts +14 -0
  46. package/dist/cjs/utils/TokenBudgetedReader.d.ts.map +1 -0
  47. package/dist/cjs/utils/TokenBudgetedReader.js +157 -0
  48. package/dist/cjs/utils/TokenBudgetedReader.js.map +1 -0
  49. package/dist/cjs/utils/TypeCoverage.d.ts +15 -0
  50. package/dist/cjs/utils/TypeCoverage.d.ts.map +1 -0
  51. package/dist/cjs/utils/TypeCoverage.js +141 -0
  52. package/dist/cjs/utils/TypeCoverage.js.map +1 -0
  53. package/dist/esm/mcp/prompts.d.ts +1 -1
  54. package/dist/esm/mcp/prompts.d.ts.map +1 -1
  55. package/dist/esm/mcp/prompts.js +24 -0
  56. package/dist/esm/mcp/prompts.js.map +1 -1
  57. package/dist/esm/mcp/tools.d.ts.map +1 -1
  58. package/dist/esm/mcp/tools.js +497 -0
  59. package/dist/esm/mcp/tools.js.map +1 -1
  60. package/dist/esm/utils/AutoContextBundle.d.ts +17 -0
  61. package/dist/esm/utils/AutoContextBundle.d.ts.map +1 -0
  62. package/dist/esm/utils/AutoContextBundle.js +86 -0
  63. package/dist/esm/utils/AutoContextBundle.js.map +1 -0
  64. package/dist/esm/utils/BulkFileDigest.d.ts +13 -0
  65. package/dist/esm/utils/BulkFileDigest.d.ts.map +1 -0
  66. package/dist/esm/utils/BulkFileDigest.js +58 -0
  67. package/dist/esm/utils/BulkFileDigest.js.map +1 -0
  68. package/dist/esm/utils/ConversationCheckpoint.d.ts +14 -0
  69. package/dist/esm/utils/ConversationCheckpoint.d.ts.map +1 -0
  70. package/dist/esm/utils/ConversationCheckpoint.js +69 -0
  71. package/dist/esm/utils/ConversationCheckpoint.js.map +1 -0
  72. package/dist/esm/utils/FileFingerprint.d.ts +11 -0
  73. package/dist/esm/utils/FileFingerprint.d.ts.map +1 -0
  74. package/dist/esm/utils/FileFingerprint.js +56 -0
  75. package/dist/esm/utils/FileFingerprint.js.map +1 -0
  76. package/dist/esm/utils/GitBlameHeat.d.ts +20 -0
  77. package/dist/esm/utils/GitBlameHeat.d.ts.map +1 -0
  78. package/dist/esm/utils/GitBlameHeat.js +85 -0
  79. package/dist/esm/utils/GitBlameHeat.js.map +1 -0
  80. package/dist/esm/utils/ImportTreeContext.d.ts +17 -0
  81. package/dist/esm/utils/ImportTreeContext.d.ts.map +1 -0
  82. package/dist/esm/utils/ImportTreeContext.js +153 -0
  83. package/dist/esm/utils/ImportTreeContext.js.map +1 -0
  84. package/dist/esm/utils/PromptPatternCache.d.ts +14 -0
  85. package/dist/esm/utils/PromptPatternCache.d.ts.map +1 -0
  86. package/dist/esm/utils/PromptPatternCache.js +96 -0
  87. package/dist/esm/utils/PromptPatternCache.js.map +1 -0
  88. package/dist/esm/utils/RepeatGuard.d.ts +9 -0
  89. package/dist/esm/utils/RepeatGuard.d.ts.map +1 -0
  90. package/dist/esm/utils/RepeatGuard.js +83 -0
  91. package/dist/esm/utils/RepeatGuard.js.map +1 -0
  92. package/dist/esm/utils/TestAutofixInterceptor.d.ts +17 -0
  93. package/dist/esm/utils/TestAutofixInterceptor.d.ts.map +1 -0
  94. package/dist/esm/utils/TestAutofixInterceptor.js +122 -0
  95. package/dist/esm/utils/TestAutofixInterceptor.js.map +1 -0
  96. package/dist/esm/utils/TokenBudgetedReader.d.ts +14 -0
  97. package/dist/esm/utils/TokenBudgetedReader.d.ts.map +1 -0
  98. package/dist/esm/utils/TokenBudgetedReader.js +118 -0
  99. package/dist/esm/utils/TokenBudgetedReader.js.map +1 -0
  100. package/dist/esm/utils/TypeCoverage.d.ts +15 -0
  101. package/dist/esm/utils/TypeCoverage.d.ts.map +1 -0
  102. package/dist/esm/utils/TypeCoverage.js +102 -0
  103. package/dist/esm/utils/TypeCoverage.js.map +1 -0
  104. package/package.json +1 -1
@@ -0,0 +1,118 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import * as ts from 'typescript';
4
+ function estimateTokens(text) {
5
+ return Math.ceil(text.length / 4);
6
+ }
7
+ function extractSections(filePath, content) {
8
+ const sections = [];
9
+ const lines = content.split('\n');
10
+ try {
11
+ const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
12
+ function visit(node) {
13
+ if (ts.isFunctionDeclaration(node) ||
14
+ ts.isMethodDeclaration(node) ||
15
+ ts.isArrowFunction(node) ||
16
+ ts.isFunctionExpression(node) ||
17
+ ts.isClassDeclaration(node) ||
18
+ ts.isInterfaceDeclaration(node) ||
19
+ ts.isTypeAliasDeclaration(node) ||
20
+ ts.isEnumDeclaration(node) ||
21
+ ts.isVariableStatement(node)) {
22
+ const start = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line;
23
+ const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line;
24
+ const name = ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node) ||
25
+ ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isEnumDeclaration(node)
26
+ ? node.name?.getText(sourceFile) || '(anonymous)'
27
+ : ts.isVariableStatement(node)
28
+ ? node.declarationList.declarations[0]?.name.getText(sourceFile) || '(const)'
29
+ : '(method)';
30
+ const kind = ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node) ? 'function'
31
+ : ts.isClassDeclaration(node) ? 'class'
32
+ : ts.isInterfaceDeclaration(node) ? 'interface'
33
+ : ts.isTypeAliasDeclaration(node) ? 'type'
34
+ : ts.isEnumDeclaration(node) ? 'enum'
35
+ : ts.isVariableStatement(node) ? 'const'
36
+ : 'method';
37
+ sections.push({
38
+ start,
39
+ end: Math.min(end, lines.length - 1),
40
+ text: lines.slice(start, end + 1).join('\n'),
41
+ label: `${kind} ${name}`,
42
+ });
43
+ }
44
+ ts.forEachChild(node, visit);
45
+ }
46
+ visit(sourceFile);
47
+ }
48
+ catch { }
49
+ if (sections.length === 0) {
50
+ const chunkSize = 50;
51
+ for (let i = 0; i < lines.length; i += chunkSize) {
52
+ const end = Math.min(i + chunkSize - 1, lines.length - 1);
53
+ sections.push({
54
+ start: i,
55
+ end,
56
+ text: lines.slice(i, end + 1).join('\n'),
57
+ label: `chunk L${i + 1}-${end + 1}`,
58
+ });
59
+ }
60
+ }
61
+ return sections;
62
+ }
63
+ function scoreRelevance(text, query) {
64
+ if (!query)
65
+ return 1;
66
+ const lowerText = text.toLowerCase();
67
+ const queryTokens = query.toLowerCase().split(/\s+/).filter(Boolean);
68
+ let score = 0;
69
+ for (const token of queryTokens) {
70
+ const matches = (lowerText.match(new RegExp(token.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')) || []).length;
71
+ score += matches;
72
+ }
73
+ return score;
74
+ }
75
+ export function readTokenBudgeted(filePath, projectRoot, query = '', maxTokens = 2000) {
76
+ const resolved = path.resolve(projectRoot, filePath);
77
+ if (!fs.existsSync(resolved)) {
78
+ return { filePath, content: '', tokensUsed: 0, tokensBudget: maxTokens, truncated: false, relevantSections: [] };
79
+ }
80
+ const content = fs.readFileSync(resolved, 'utf8');
81
+ const totalTokens = estimateTokens(content);
82
+ if (totalTokens <= maxTokens) {
83
+ return { filePath, content, tokensUsed: totalTokens, tokensBudget: maxTokens, truncated: false, relevantSections: [] };
84
+ }
85
+ const sections = extractSections(filePath, content);
86
+ const scored = sections.map(s => ({
87
+ ...s,
88
+ relevance: scoreRelevance(s.text, query),
89
+ tokens: estimateTokens(s.text),
90
+ }));
91
+ scored.sort((a, b) => b.relevance - a.relevance);
92
+ const selected = [];
93
+ let tokensUsed = 0;
94
+ for (const s of scored) {
95
+ if (tokensUsed + s.tokens > maxTokens && selected.length >= 2)
96
+ continue;
97
+ selected.push(s);
98
+ tokensUsed += s.tokens;
99
+ if (tokensUsed >= maxTokens)
100
+ break;
101
+ }
102
+ selected.sort((a, b) => a.start - b.start);
103
+ const resultContent = selected.map(s => s.text).join('\n\n');
104
+ const relevantSections = selected.map(s => ({
105
+ start: s.start + 1,
106
+ end: s.end + 1,
107
+ reason: s.label,
108
+ }));
109
+ return {
110
+ filePath,
111
+ content: resultContent,
112
+ tokensUsed,
113
+ tokensBudget: maxTokens,
114
+ truncated: true,
115
+ relevantSections,
116
+ };
117
+ }
118
+ //# 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,102 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import * as ts from 'typescript';
4
+ function getSourceFile(filePath) {
5
+ try {
6
+ const content = fs.readFileSync(filePath, 'utf8');
7
+ return ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ }
13
+ function countAny(node, _sourceFile) {
14
+ let count = 0;
15
+ function walk(n) {
16
+ if (n.kind === ts.SyntaxKind.AnyKeyword)
17
+ count++;
18
+ ts.forEachChild(n, walk);
19
+ }
20
+ walk(node);
21
+ return count;
22
+ }
23
+ function hasTypeAnnotation(node) {
24
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isArrowFunction(node)) {
25
+ return !!node.type;
26
+ }
27
+ if (ts.isVariableDeclaration(node) || ts.isPropertyDeclaration(node) || ts.isParameter(node)) {
28
+ return !!node.type;
29
+ }
30
+ return false;
31
+ }
32
+ export function analyzeTypeCoverage(filePath, projectRoot) {
33
+ const resolved = path.resolve(projectRoot, filePath);
34
+ if (!fs.existsSync(resolved)) {
35
+ return {
36
+ file: filePath, totalDeclarations: 0, typedDeclarations: 0,
37
+ coveragePercent: 0, anyCount: 0, missingTypes: [], score: 0,
38
+ };
39
+ }
40
+ const sourceFile = getSourceFile(resolved);
41
+ if (!sourceFile) {
42
+ return {
43
+ file: filePath, totalDeclarations: 0, typedDeclarations: 0,
44
+ coveragePercent: 0, anyCount: 0, missingTypes: [], score: 0,
45
+ };
46
+ }
47
+ let totalDeclarations = 0;
48
+ let typedDeclarations = 0;
49
+ let anyCount = 0;
50
+ const missingTypes = [];
51
+ function visit(node) {
52
+ if (ts.isFunctionDeclaration(node) ||
53
+ ts.isMethodDeclaration(node) ||
54
+ ts.isArrowFunction(node) ||
55
+ ts.isFunctionExpression(node)) {
56
+ if (node.name || ts.isArrowFunction(node)) {
57
+ totalDeclarations++;
58
+ if (hasTypeAnnotation(node))
59
+ typedDeclarations++;
60
+ else {
61
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
62
+ missingTypes.push({ line: pos.line + 1, code: node.getText(sourceFile).slice(0, 80) });
63
+ }
64
+ }
65
+ }
66
+ if (ts.isVariableDeclaration(node) || ts.isPropertyDeclaration(node)) {
67
+ totalDeclarations++;
68
+ if (hasTypeAnnotation(node))
69
+ typedDeclarations++;
70
+ else {
71
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
72
+ missingTypes.push({ line: pos.line + 1, code: node.getText(sourceFile).slice(0, 80) });
73
+ }
74
+ }
75
+ if (ts.isParameter(node)) {
76
+ totalDeclarations++;
77
+ if (hasTypeAnnotation(node))
78
+ typedDeclarations++;
79
+ else {
80
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
81
+ missingTypes.push({ line: pos.line + 1, code: node.getText(sourceFile).slice(0, 80) });
82
+ }
83
+ }
84
+ anyCount += countAny(node, sourceFile);
85
+ ts.forEachChild(node, visit);
86
+ }
87
+ visit(sourceFile);
88
+ const coveragePercent = totalDeclarations > 0
89
+ ? Math.round((typedDeclarations / totalDeclarations) * 1000) / 10
90
+ : 100;
91
+ const score = Math.max(0, Math.min(100, coveragePercent - anyCount * 5 - (missingTypes.length > 10 ? 10 : missingTypes.length)));
92
+ return {
93
+ file: filePath,
94
+ totalDeclarations,
95
+ typedDeclarations,
96
+ coveragePercent,
97
+ anyCount,
98
+ missingTypes: missingTypes.slice(0, 20),
99
+ score: Math.round(score * 10) / 10,
100
+ };
101
+ }
102
+ //# 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxuss/lemma",
3
- "version": "1.0.5",
3
+ "version": "1.1.0",
4
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",