@nxuss/lemma 1.0.5 → 1.1.1
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 +203 -95
- package/dist/cjs/mcp/prompts.d.ts +1 -1
- package/dist/cjs/mcp/prompts.d.ts.map +1 -1
- package/dist/cjs/mcp/prompts.js +24 -0
- package/dist/cjs/mcp/prompts.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +497 -0
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/utils/AutoContextBundle.d.ts +17 -0
- package/dist/cjs/utils/AutoContextBundle.d.ts.map +1 -0
- package/dist/cjs/utils/AutoContextBundle.js +125 -0
- package/dist/cjs/utils/AutoContextBundle.js.map +1 -0
- package/dist/cjs/utils/BulkFileDigest.d.ts +13 -0
- package/dist/cjs/utils/BulkFileDigest.d.ts.map +1 -0
- package/dist/cjs/utils/BulkFileDigest.js +64 -0
- package/dist/cjs/utils/BulkFileDigest.js.map +1 -0
- package/dist/cjs/utils/ConversationCheckpoint.d.ts +14 -0
- package/dist/cjs/utils/ConversationCheckpoint.d.ts.map +1 -0
- package/dist/cjs/utils/ConversationCheckpoint.js +77 -0
- package/dist/cjs/utils/ConversationCheckpoint.js.map +1 -0
- package/dist/cjs/utils/FileFingerprint.d.ts +11 -0
- package/dist/cjs/utils/FileFingerprint.d.ts.map +1 -0
- package/dist/cjs/utils/FileFingerprint.js +64 -0
- package/dist/cjs/utils/FileFingerprint.js.map +1 -0
- package/dist/cjs/utils/GitBlameHeat.d.ts +20 -0
- package/dist/cjs/utils/GitBlameHeat.d.ts.map +1 -0
- package/dist/cjs/utils/GitBlameHeat.js +91 -0
- package/dist/cjs/utils/GitBlameHeat.js.map +1 -0
- package/dist/cjs/utils/ImportTreeContext.d.ts +17 -0
- package/dist/cjs/utils/ImportTreeContext.d.ts.map +1 -0
- package/dist/cjs/utils/ImportTreeContext.js +159 -0
- package/dist/cjs/utils/ImportTreeContext.js.map +1 -0
- package/dist/cjs/utils/PromptPatternCache.d.ts +14 -0
- package/dist/cjs/utils/PromptPatternCache.d.ts.map +1 -0
- package/dist/cjs/utils/PromptPatternCache.js +104 -0
- package/dist/cjs/utils/PromptPatternCache.js.map +1 -0
- package/dist/cjs/utils/RepeatGuard.d.ts +9 -0
- package/dist/cjs/utils/RepeatGuard.d.ts.map +1 -0
- package/dist/cjs/utils/RepeatGuard.js +90 -0
- package/dist/cjs/utils/RepeatGuard.js.map +1 -0
- package/dist/cjs/utils/TestAutofixInterceptor.d.ts +17 -0
- package/dist/cjs/utils/TestAutofixInterceptor.d.ts.map +1 -0
- package/dist/cjs/utils/TestAutofixInterceptor.js +125 -0
- package/dist/cjs/utils/TestAutofixInterceptor.js.map +1 -0
- package/dist/cjs/utils/TokenBudgetedReader.d.ts +14 -0
- package/dist/cjs/utils/TokenBudgetedReader.d.ts.map +1 -0
- package/dist/cjs/utils/TokenBudgetedReader.js +157 -0
- package/dist/cjs/utils/TokenBudgetedReader.js.map +1 -0
- package/dist/cjs/utils/TypeCoverage.d.ts +15 -0
- package/dist/cjs/utils/TypeCoverage.d.ts.map +1 -0
- package/dist/cjs/utils/TypeCoverage.js +141 -0
- package/dist/cjs/utils/TypeCoverage.js.map +1 -0
- package/dist/esm/mcp/prompts.d.ts +1 -1
- package/dist/esm/mcp/prompts.d.ts.map +1 -1
- package/dist/esm/mcp/prompts.js +24 -0
- package/dist/esm/mcp/prompts.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +497 -0
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/utils/AutoContextBundle.d.ts +17 -0
- package/dist/esm/utils/AutoContextBundle.d.ts.map +1 -0
- package/dist/esm/utils/AutoContextBundle.js +86 -0
- package/dist/esm/utils/AutoContextBundle.js.map +1 -0
- package/dist/esm/utils/BulkFileDigest.d.ts +13 -0
- package/dist/esm/utils/BulkFileDigest.d.ts.map +1 -0
- package/dist/esm/utils/BulkFileDigest.js +58 -0
- package/dist/esm/utils/BulkFileDigest.js.map +1 -0
- package/dist/esm/utils/ConversationCheckpoint.d.ts +14 -0
- package/dist/esm/utils/ConversationCheckpoint.d.ts.map +1 -0
- package/dist/esm/utils/ConversationCheckpoint.js +69 -0
- package/dist/esm/utils/ConversationCheckpoint.js.map +1 -0
- package/dist/esm/utils/FileFingerprint.d.ts +11 -0
- package/dist/esm/utils/FileFingerprint.d.ts.map +1 -0
- package/dist/esm/utils/FileFingerprint.js +56 -0
- package/dist/esm/utils/FileFingerprint.js.map +1 -0
- package/dist/esm/utils/GitBlameHeat.d.ts +20 -0
- package/dist/esm/utils/GitBlameHeat.d.ts.map +1 -0
- package/dist/esm/utils/GitBlameHeat.js +85 -0
- package/dist/esm/utils/GitBlameHeat.js.map +1 -0
- package/dist/esm/utils/ImportTreeContext.d.ts +17 -0
- package/dist/esm/utils/ImportTreeContext.d.ts.map +1 -0
- package/dist/esm/utils/ImportTreeContext.js +153 -0
- package/dist/esm/utils/ImportTreeContext.js.map +1 -0
- package/dist/esm/utils/PromptPatternCache.d.ts +14 -0
- package/dist/esm/utils/PromptPatternCache.d.ts.map +1 -0
- package/dist/esm/utils/PromptPatternCache.js +96 -0
- package/dist/esm/utils/PromptPatternCache.js.map +1 -0
- package/dist/esm/utils/RepeatGuard.d.ts +9 -0
- package/dist/esm/utils/RepeatGuard.d.ts.map +1 -0
- package/dist/esm/utils/RepeatGuard.js +83 -0
- package/dist/esm/utils/RepeatGuard.js.map +1 -0
- package/dist/esm/utils/TestAutofixInterceptor.d.ts +17 -0
- package/dist/esm/utils/TestAutofixInterceptor.d.ts.map +1 -0
- package/dist/esm/utils/TestAutofixInterceptor.js +122 -0
- package/dist/esm/utils/TestAutofixInterceptor.js.map +1 -0
- package/dist/esm/utils/TokenBudgetedReader.d.ts +14 -0
- package/dist/esm/utils/TokenBudgetedReader.d.ts.map +1 -0
- package/dist/esm/utils/TokenBudgetedReader.js +118 -0
- package/dist/esm/utils/TokenBudgetedReader.js.map +1 -0
- package/dist/esm/utils/TypeCoverage.d.ts +15 -0
- package/dist/esm/utils/TypeCoverage.d.ts.map +1 -0
- package/dist/esm/utils/TypeCoverage.js +102 -0
- package/dist/esm/utils/TypeCoverage.js.map +1 -0
- 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.
|
|
3
|
+
"version": "1.1.1",
|
|
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",
|