@nxuss/lemma 1.2.4 → 1.3.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 +19 -5
- 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 +39 -5
- 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 +93 -1
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/utils/StateHashCache.d.ts +26 -0
- package/dist/cjs/utils/StateHashCache.d.ts.map +1 -0
- package/dist/cjs/utils/StateHashCache.js +107 -0
- package/dist/cjs/utils/StateHashCache.js.map +1 -0
- package/dist/cjs/utils/TokenReceipt.d.ts +24 -0
- package/dist/cjs/utils/TokenReceipt.d.ts.map +1 -0
- package/dist/cjs/utils/TokenReceipt.js +41 -0
- package/dist/cjs/utils/TokenReceipt.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 +39 -5
- 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 +93 -1
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/utils/StateHashCache.d.ts +26 -0
- package/dist/esm/utils/StateHashCache.d.ts.map +1 -0
- package/dist/esm/utils/StateHashCache.js +100 -0
- package/dist/esm/utils/StateHashCache.js.map +1 -0
- package/dist/esm/utils/TokenReceipt.d.ts +24 -0
- package/dist/esm/utils/TokenReceipt.d.ts.map +1 -0
- package/dist/esm/utils/TokenReceipt.js +36 -0
- package/dist/esm/utils/TokenReceipt.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateHashCache — reasoning cache keyed to the exact content hash of the files
|
|
3
|
+
* a question depends on, instead of semantic similarity between questions.
|
|
4
|
+
*
|
|
5
|
+
* Unlike a fuzzy/vector cache, a hit here is only returned if every referenced
|
|
6
|
+
* file's current sha256 matches the hash recorded when the answer was stored.
|
|
7
|
+
* If any referenced file changed, it's a guaranteed MISS — no stale answers.
|
|
8
|
+
*/
|
|
9
|
+
export interface StateHashEntry {
|
|
10
|
+
id: string;
|
|
11
|
+
query: string;
|
|
12
|
+
answer: string;
|
|
13
|
+
fileHashes: Record<string, string>;
|
|
14
|
+
createdAt: number;
|
|
15
|
+
hits: number;
|
|
16
|
+
}
|
|
17
|
+
export interface StateHashLookupResult {
|
|
18
|
+
status: 'hit' | 'miss';
|
|
19
|
+
entry?: StateHashEntry;
|
|
20
|
+
reason?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Look up a cached answer. Only a hit if every referenced file's hash still matches. */
|
|
23
|
+
export declare function lookupStateHash(projectRoot: string, query: string, filePaths: string[]): StateHashLookupResult;
|
|
24
|
+
/** Store an answer along with the exact hash of every file it depends on. */
|
|
25
|
+
export declare function storeStateHash(projectRoot: string, query: string, answer: string, filePaths: string[]): StateHashEntry;
|
|
26
|
+
//# sourceMappingURL=StateHashCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateHashCache.d.ts","sourceRoot":"","sources":["../../../src/utils/StateHashCache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AA+CD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,GAClB,qBAAqB,CAwBvB;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,GAClB,cAAc,CAmBhB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateHashCache — reasoning cache keyed to the exact content hash of the files
|
|
3
|
+
* a question depends on, instead of semantic similarity between questions.
|
|
4
|
+
*
|
|
5
|
+
* Unlike a fuzzy/vector cache, a hit here is only returned if every referenced
|
|
6
|
+
* file's current sha256 matches the hash recorded when the answer was stored.
|
|
7
|
+
* If any referenced file changed, it's a guaranteed MISS — no stale answers.
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'fs';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import crypto from 'crypto';
|
|
12
|
+
const CACHE_FILE = '.lemma/state-hash-cache.json';
|
|
13
|
+
function getCachePath(projectRoot) {
|
|
14
|
+
return path.join(projectRoot, CACHE_FILE);
|
|
15
|
+
}
|
|
16
|
+
function loadCache(projectRoot) {
|
|
17
|
+
try {
|
|
18
|
+
const p = getCachePath(projectRoot);
|
|
19
|
+
if (fs.existsSync(p))
|
|
20
|
+
return JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
21
|
+
}
|
|
22
|
+
catch { }
|
|
23
|
+
return { entries: [] };
|
|
24
|
+
}
|
|
25
|
+
function saveCache(projectRoot, data) {
|
|
26
|
+
try {
|
|
27
|
+
const dir = path.join(projectRoot, '.lemma');
|
|
28
|
+
if (!fs.existsSync(dir))
|
|
29
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
30
|
+
fs.writeFileSync(getCachePath(projectRoot), JSON.stringify(data, null, 2), 'utf8');
|
|
31
|
+
}
|
|
32
|
+
catch { }
|
|
33
|
+
}
|
|
34
|
+
function sha256(content) {
|
|
35
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
36
|
+
}
|
|
37
|
+
function hashFiles(projectRoot, filePaths) {
|
|
38
|
+
const hashes = {};
|
|
39
|
+
for (const rel of filePaths) {
|
|
40
|
+
try {
|
|
41
|
+
const resolved = path.resolve(projectRoot, rel);
|
|
42
|
+
if (fs.existsSync(resolved)) {
|
|
43
|
+
hashes[rel] = sha256(fs.readFileSync(resolved, 'utf8'));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
hashes[rel] = 'MISSING';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
hashes[rel] = 'ERROR';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return hashes;
|
|
54
|
+
}
|
|
55
|
+
/** Look up a cached answer. Only a hit if every referenced file's hash still matches. */
|
|
56
|
+
export function lookupStateHash(projectRoot, query, filePaths) {
|
|
57
|
+
const data = loadCache(projectRoot);
|
|
58
|
+
const currentHashes = hashFiles(projectRoot, filePaths);
|
|
59
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
60
|
+
const entry = data.entries.find((e) => e.query.trim().toLowerCase() === normalizedQuery);
|
|
61
|
+
if (!entry)
|
|
62
|
+
return { status: 'miss', reason: 'no entry for this exact query' };
|
|
63
|
+
for (const [file, hash] of Object.entries(entry.fileHashes)) {
|
|
64
|
+
if (currentHashes[file] !== hash) {
|
|
65
|
+
return { status: 'miss', reason: `file changed since caching: ${file}` };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Also fail if the caller now depends on a file that wasn't tracked before —
|
|
69
|
+
// conservative: only trust the cache if the tracked set covers what's asked now.
|
|
70
|
+
for (const f of filePaths) {
|
|
71
|
+
if (!(f in entry.fileHashes)) {
|
|
72
|
+
return { status: 'miss', reason: `new dependency not covered by cached entry: ${f}` };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
entry.hits += 1;
|
|
76
|
+
saveCache(projectRoot, data);
|
|
77
|
+
return { status: 'hit', entry };
|
|
78
|
+
}
|
|
79
|
+
/** Store an answer along with the exact hash of every file it depends on. */
|
|
80
|
+
export function storeStateHash(projectRoot, query, answer, filePaths) {
|
|
81
|
+
const data = loadCache(projectRoot);
|
|
82
|
+
const fileHashes = hashFiles(projectRoot, filePaths);
|
|
83
|
+
const entry = {
|
|
84
|
+
id: crypto.randomBytes(6).toString('hex'),
|
|
85
|
+
query,
|
|
86
|
+
answer,
|
|
87
|
+
fileHashes,
|
|
88
|
+
createdAt: Date.now(),
|
|
89
|
+
hits: 0,
|
|
90
|
+
};
|
|
91
|
+
data.entries = data.entries.filter((e) => e.query.trim().toLowerCase() !== query.trim().toLowerCase());
|
|
92
|
+
data.entries.push(entry);
|
|
93
|
+
// Bound cache size so it doesn't grow unboundedly.
|
|
94
|
+
if (data.entries.length > 500) {
|
|
95
|
+
data.entries = data.entries.slice(data.entries.length - 500);
|
|
96
|
+
}
|
|
97
|
+
saveCache(projectRoot, data);
|
|
98
|
+
return entry;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=StateHashCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateHashCache.js","sourceRoot":"","sources":["../../../src/utils/StateHashCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TokenReceipt — an auditable, per-session ledger of how each answer was produced:
|
|
3
|
+
* exact cache hit, semantic cache hit, file read, or fresh reasoning.
|
|
4
|
+
*
|
|
5
|
+
* The point is trust, not just savings: the user (or the model itself) can always
|
|
6
|
+
* ask "where did that answer actually come from" and get a verifiable trail,
|
|
7
|
+
* instead of taking a "X% tokens saved" claim on faith.
|
|
8
|
+
*/
|
|
9
|
+
export type ReceiptEventType = 'exact_cache_hit' | 'semantic_cache_hit' | 'file_read' | 'reasoning' | 'tool_call';
|
|
10
|
+
export interface ReceiptEvent {
|
|
11
|
+
type: ReceiptEventType;
|
|
12
|
+
label: string;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
meta?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
export declare function recordReceiptEvent(type: ReceiptEventType, label: string, meta?: Record<string, unknown>): void;
|
|
17
|
+
export interface ReceiptSummary {
|
|
18
|
+
totalEvents: number;
|
|
19
|
+
byType: Record<ReceiptEventType, number>;
|
|
20
|
+
recent: ReceiptEvent[];
|
|
21
|
+
}
|
|
22
|
+
export declare function getReceiptSummary(limit?: number): ReceiptSummary;
|
|
23
|
+
export declare function clearReceiptLedger(): void;
|
|
24
|
+
//# sourceMappingURL=TokenReceipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenReceipt.d.ts","sourceRoot":"","sources":["../../../src/utils/TokenReceipt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,oBAAoB,GACpB,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAK9G;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,SAAK,GAAG,cAAc,CAc5D;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TokenReceipt — an auditable, per-session ledger of how each answer was produced:
|
|
3
|
+
* exact cache hit, semantic cache hit, file read, or fresh reasoning.
|
|
4
|
+
*
|
|
5
|
+
* The point is trust, not just savings: the user (or the model itself) can always
|
|
6
|
+
* ask "where did that answer actually come from" and get a verifiable trail,
|
|
7
|
+
* instead of taking a "X% tokens saved" claim on faith.
|
|
8
|
+
*/
|
|
9
|
+
const MAX_EVENTS = 2000;
|
|
10
|
+
const sessionLedger = [];
|
|
11
|
+
export function recordReceiptEvent(type, label, meta) {
|
|
12
|
+
sessionLedger.push({ type, label, timestamp: Date.now(), meta });
|
|
13
|
+
if (sessionLedger.length > MAX_EVENTS) {
|
|
14
|
+
sessionLedger.splice(0, sessionLedger.length - MAX_EVENTS);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function getReceiptSummary(limit = 20) {
|
|
18
|
+
const byType = {
|
|
19
|
+
exact_cache_hit: 0,
|
|
20
|
+
semantic_cache_hit: 0,
|
|
21
|
+
file_read: 0,
|
|
22
|
+
reasoning: 0,
|
|
23
|
+
tool_call: 0,
|
|
24
|
+
};
|
|
25
|
+
for (const e of sessionLedger)
|
|
26
|
+
byType[e.type]++;
|
|
27
|
+
return {
|
|
28
|
+
totalEvents: sessionLedger.length,
|
|
29
|
+
byType,
|
|
30
|
+
recent: sessionLedger.slice(-limit),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function clearReceiptLedger() {
|
|
34
|
+
sessionLedger.length = 0;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=TokenReceipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenReceipt.js","sourceRoot":"","sources":["../../../src/utils/TokenReceipt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,UAAU,GAAG,IAAI,CAAC;AAgBxB,MAAM,aAAa,GAAmB,EAAE,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAAC,IAAsB,EAAE,KAAa,EAAE,IAA8B;IACtG,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,IAAI,aAAa,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QACtC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAQD,MAAM,UAAU,iBAAiB,CAAC,KAAK,GAAG,EAAE;IAC1C,MAAM,MAAM,GAAqC;QAC/C,eAAe,EAAE,CAAC;QAClB,kBAAkB,EAAE,CAAC;QACrB,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;KACb,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,aAAa;QAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAChD,OAAO;QACL,WAAW,EAAE,aAAa,CAAC,MAAM;QACjC,MAAM;QACN,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nxuss/lemma",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Intelligent AI Gateway for IDEs & Agents — Semantic cache, Privacy Firewall, Infrastructure Command Center, and Autonomous Cost-Optimization.",
|
|
5
5
|
"main": "./dist/cjs/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|