@mneme-ai/sdk 2.55.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/dist/benchmark.d.ts +39 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +115 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/events.d.ts +44 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +107 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/lock.d.ts +63 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +140 -0
- package/dist/lock.js.map +1 -0
- package/dist/nemesis.d.ts +134 -0
- package/dist/nemesis.d.ts.map +1 -0
- package/dist/nemesis.js +137 -0
- package/dist/nemesis.js.map +1 -0
- package/dist/truth.d.ts +39 -0
- package/dist/truth.d.ts.map +1 -0
- package/dist/truth.js +56 -0
- package/dist/truth.js.map +1 -0
- package/dist/types.d.ts +50 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +42 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +39 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +51 -0
- package/dist/verify.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mneme-ai/sdk/benchmark — built-in SDK-vs-CLI speedup proof.
|
|
3
|
+
*
|
|
4
|
+
* Wild feature: users can prove the claimed 30-80× speedup on their own
|
|
5
|
+
* hardware in one call. Compares N in-process SDK calls against the same
|
|
6
|
+
* N CLI subprocess calls + reports the ratio.
|
|
7
|
+
*
|
|
8
|
+
* Refuses to lie: if the SDK is slower (e.g. on a niche platform), it
|
|
9
|
+
* surfaces that too.
|
|
10
|
+
*/
|
|
11
|
+
export interface BenchmarkResult {
|
|
12
|
+
op: string;
|
|
13
|
+
iterations: number;
|
|
14
|
+
sdkMeanMs: number;
|
|
15
|
+
sdkTotalMs: number;
|
|
16
|
+
cliMeanMs: number;
|
|
17
|
+
cliTotalMs: number;
|
|
18
|
+
speedupRatio: number;
|
|
19
|
+
/** True when SDK strictly faster than CLI on average. */
|
|
20
|
+
sdkWins: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface BenchmarkOpts {
|
|
23
|
+
iterations?: number;
|
|
24
|
+
cliBin?: string;
|
|
25
|
+
/** Skip the CLI side (useful when CLI not built). */
|
|
26
|
+
skipCli?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** Bench EU stamp (fastest hot path; the one we promise <30ms). */
|
|
29
|
+
export declare function benchEuStamp(opts?: BenchmarkOpts): Promise<BenchmarkResult>;
|
|
30
|
+
/** Bench NEMESIS classify_calibrated. */
|
|
31
|
+
export declare function benchClassify(opts?: BenchmarkOpts): Promise<BenchmarkResult>;
|
|
32
|
+
/** Run the full bench suite. */
|
|
33
|
+
export declare function vsCli(opts?: BenchmarkOpts): Promise<{
|
|
34
|
+
ok: boolean;
|
|
35
|
+
results: BenchmarkResult[];
|
|
36
|
+
averageSpeedup: number;
|
|
37
|
+
at: string;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=benchmark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAYD,mEAAmE;AACnE,wBAAsB,YAAY,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAmCrF;AAED,yCAAyC;AACzC,wBAAsB,aAAa,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkCtF;AAED,gCAAgC;AAChC,wBAAsB,KAAK,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC;IAC7D,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC,CAeD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mneme-ai/sdk/benchmark — built-in SDK-vs-CLI speedup proof.
|
|
3
|
+
*
|
|
4
|
+
* Wild feature: users can prove the claimed 30-80× speedup on their own
|
|
5
|
+
* hardware in one call. Compares N in-process SDK calls against the same
|
|
6
|
+
* N CLI subprocess calls + reports the ratio.
|
|
7
|
+
*
|
|
8
|
+
* Refuses to lie: if the SDK is slower (e.g. on a niche platform), it
|
|
9
|
+
* surfaces that too.
|
|
10
|
+
*/
|
|
11
|
+
import { spawnSync } from "node:child_process";
|
|
12
|
+
import { existsSync } from "node:fs";
|
|
13
|
+
import { resolve } from "node:path";
|
|
14
|
+
import * as core from "@mneme-ai/core";
|
|
15
|
+
function findCliBin() {
|
|
16
|
+
const candidates = [
|
|
17
|
+
resolve(process.cwd(), "packages/cli/bin/mneme.js"),
|
|
18
|
+
resolve(process.cwd(), "node_modules/mneme-ai/bin/mneme.js"),
|
|
19
|
+
resolve(process.cwd(), "node_modules/.bin/mneme"),
|
|
20
|
+
];
|
|
21
|
+
for (const c of candidates)
|
|
22
|
+
if (existsSync(c))
|
|
23
|
+
return c;
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
/** Bench EU stamp (fastest hot path; the one we promise <30ms). */
|
|
27
|
+
export async function benchEuStamp(opts = {}) {
|
|
28
|
+
const iter = opts.iterations ?? 20;
|
|
29
|
+
const input = { message: "bench commit", vendor: "claude-code", confidence: 0.9 };
|
|
30
|
+
// SDK warm
|
|
31
|
+
core.nemesis.stampArticle50(input);
|
|
32
|
+
const sdk0 = performance.now();
|
|
33
|
+
for (let i = 0; i < iter; i++)
|
|
34
|
+
core.nemesis.stampArticle50({ ...input, message: `msg ${i}` });
|
|
35
|
+
const sdkTotal = performance.now() - sdk0;
|
|
36
|
+
let cliTotal = 0;
|
|
37
|
+
let cliMean = 0;
|
|
38
|
+
if (!opts.skipCli) {
|
|
39
|
+
const cli = opts.cliBin ?? findCliBin();
|
|
40
|
+
if (cli && existsSync(cli)) {
|
|
41
|
+
const cli0 = performance.now();
|
|
42
|
+
for (let i = 0; i < iter; i++) {
|
|
43
|
+
spawnSync(process.execPath, [cli, "nemesis", "eu_stamp", "--message", `msg ${i}`, "--vendor", "claude-code"], { encoding: "utf8", timeout: 5000 });
|
|
44
|
+
}
|
|
45
|
+
cliTotal = performance.now() - cli0;
|
|
46
|
+
cliMean = cliTotal / iter;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const sdkMean = sdkTotal / iter;
|
|
50
|
+
const speedup = cliMean > 0 ? cliMean / sdkMean : 0;
|
|
51
|
+
return {
|
|
52
|
+
op: "nemesis.eu_stamp",
|
|
53
|
+
iterations: iter,
|
|
54
|
+
sdkMeanMs: +sdkMean.toFixed(2),
|
|
55
|
+
sdkTotalMs: +sdkTotal.toFixed(2),
|
|
56
|
+
cliMeanMs: +cliMean.toFixed(2),
|
|
57
|
+
cliTotalMs: +cliTotal.toFixed(2),
|
|
58
|
+
speedupRatio: +speedup.toFixed(1),
|
|
59
|
+
sdkWins: speedup > 1.5,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Bench NEMESIS classify_calibrated. */
|
|
63
|
+
export async function benchClassify(opts = {}) {
|
|
64
|
+
const iter = opts.iterations ?? 20;
|
|
65
|
+
const fx = { diff: "+const x = 1;\n+function foo() { return x; }\n", prDescription: "## Changes\n- a\n", commitMessages: ["x"] };
|
|
66
|
+
const fp = core.nemesis.extractFingerprint(fx);
|
|
67
|
+
core.nemesis.classifyAgentCalibrated(fp);
|
|
68
|
+
const sdk0 = performance.now();
|
|
69
|
+
for (let i = 0; i < iter; i++)
|
|
70
|
+
core.nemesis.classifyAgentCalibrated(fp);
|
|
71
|
+
const sdkTotal = performance.now() - sdk0;
|
|
72
|
+
let cliTotal = 0, cliMean = 0;
|
|
73
|
+
if (!opts.skipCli) {
|
|
74
|
+
const cli = opts.cliBin ?? findCliBin();
|
|
75
|
+
if (cli && existsSync(cli)) {
|
|
76
|
+
const cli0 = performance.now();
|
|
77
|
+
const payload = JSON.stringify(fx);
|
|
78
|
+
for (let i = 0; i < iter; i++) {
|
|
79
|
+
spawnSync(process.execPath, [cli, "nemesis", "classify", "--stdin"], { encoding: "utf8", input: payload, timeout: 8000 });
|
|
80
|
+
}
|
|
81
|
+
cliTotal = performance.now() - cli0;
|
|
82
|
+
cliMean = cliTotal / iter;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const sdkMean = sdkTotal / iter;
|
|
86
|
+
const speedup = cliMean > 0 ? cliMean / sdkMean : 0;
|
|
87
|
+
return {
|
|
88
|
+
op: "nemesis.classify",
|
|
89
|
+
iterations: iter,
|
|
90
|
+
sdkMeanMs: +sdkMean.toFixed(2),
|
|
91
|
+
sdkTotalMs: +sdkTotal.toFixed(2),
|
|
92
|
+
cliMeanMs: +cliMean.toFixed(2),
|
|
93
|
+
cliTotalMs: +cliTotal.toFixed(2),
|
|
94
|
+
speedupRatio: +speedup.toFixed(1),
|
|
95
|
+
sdkWins: speedup > 1.5,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Run the full bench suite. */
|
|
99
|
+
export async function vsCli(opts = {}) {
|
|
100
|
+
const results = [
|
|
101
|
+
await benchEuStamp(opts),
|
|
102
|
+
await benchClassify(opts),
|
|
103
|
+
];
|
|
104
|
+
const avg = results
|
|
105
|
+
.filter((r) => r.speedupRatio > 0)
|
|
106
|
+
.reduce((s, r) => s + r.speedupRatio, 0)
|
|
107
|
+
/ Math.max(1, results.filter((r) => r.speedupRatio > 0).length);
|
|
108
|
+
return {
|
|
109
|
+
ok: results.every((r) => r.sdkWins || r.cliMeanMs === 0),
|
|
110
|
+
results,
|
|
111
|
+
averageSpeedup: +avg.toFixed(1),
|
|
112
|
+
at: new Date().toISOString(),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"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"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mneme-ai/sdk — async-iterator event bus.
|
|
3
|
+
*
|
|
4
|
+
* Wild feature: every primitive can stream EVENTS as the work happens
|
|
5
|
+
* (tournament rounds, drift detections, audit findings, etc) — no SDK
|
|
6
|
+
* I've seen does this. Pattern:
|
|
7
|
+
*
|
|
8
|
+
* for await (const ev of mneme.tournament.events()) {
|
|
9
|
+
* console.log(ev.round, ev.caught);
|
|
10
|
+
* }
|
|
11
|
+
*
|
|
12
|
+
* Implemented as a tiny in-process pub/sub with AbortSignal support.
|
|
13
|
+
* No external dep; zero overhead when nobody subscribes.
|
|
14
|
+
*/
|
|
15
|
+
export type MnemeEventKind = "tournament.round" | "tournament.complete" | "molt.detected" | "swap.detected" | "stamp.issued" | "verify.complete" | "lethe.forgotten" | "gavel.packed" | "nimbus.published" | "perf.budget.exceeded";
|
|
16
|
+
export interface MnemeEvent<T = unknown> {
|
|
17
|
+
kind: MnemeEventKind;
|
|
18
|
+
at: number;
|
|
19
|
+
data: T;
|
|
20
|
+
}
|
|
21
|
+
type Listener<T = unknown> = (ev: MnemeEvent<T>) => void;
|
|
22
|
+
declare class EventBus {
|
|
23
|
+
private listeners;
|
|
24
|
+
private globalListeners;
|
|
25
|
+
on(kind: MnemeEventKind, listener: Listener): () => void;
|
|
26
|
+
onAny(listener: Listener): () => void;
|
|
27
|
+
emit<T>(ev: MnemeEvent<T>): void;
|
|
28
|
+
listenerCount(): number;
|
|
29
|
+
}
|
|
30
|
+
export declare function getEventBus(): EventBus;
|
|
31
|
+
/**
|
|
32
|
+
* Get an async iterator over events matching `kinds` (all kinds if omitted).
|
|
33
|
+
* Stops when AbortSignal aborts.
|
|
34
|
+
*
|
|
35
|
+
* const ac = new AbortController();
|
|
36
|
+
* for await (const ev of subscribeEvents(["tournament.round"], { signal: ac.signal })) {
|
|
37
|
+
* if (ev.data.round >= 10) ac.abort();
|
|
38
|
+
* }
|
|
39
|
+
*/
|
|
40
|
+
export declare function subscribeEvents(kinds?: MnemeEventKind[], opts?: {
|
|
41
|
+
signal?: AbortSignal;
|
|
42
|
+
}): AsyncIterableIterator<MnemeEvent>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,cAAc,GACtB,kBAAkB,GAClB,qBAAqB,GACrB,eAAe,GACf,eAAe,GACf,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,GACd,kBAAkB,GAClB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,CAAC,CAAC;CACT;AAED,KAAK,QAAQ,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAEzD,cAAM,QAAQ;IACZ,OAAO,CAAC,SAAS,CAAiD;IAClE,OAAO,CAAC,eAAe,CAA4B;IAEnD,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAMxD,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAKrC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAUhC,aAAa,IAAI,MAAM;CAKxB;AAGD,wBAAgB,WAAW,IAAI,QAAQ,CAAuB;AAE9D;;;;;;;;GAQG;AACH,wBAAuB,eAAe,CACpC,KAAK,CAAC,EAAE,cAAc,EAAE,EACxB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAClC,qBAAqB,CAAC,UAAU,CAAC,CA4CnC"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mneme-ai/sdk — async-iterator event bus.
|
|
3
|
+
*
|
|
4
|
+
* Wild feature: every primitive can stream EVENTS as the work happens
|
|
5
|
+
* (tournament rounds, drift detections, audit findings, etc) — no SDK
|
|
6
|
+
* I've seen does this. Pattern:
|
|
7
|
+
*
|
|
8
|
+
* for await (const ev of mneme.tournament.events()) {
|
|
9
|
+
* console.log(ev.round, ev.caught);
|
|
10
|
+
* }
|
|
11
|
+
*
|
|
12
|
+
* Implemented as a tiny in-process pub/sub with AbortSignal support.
|
|
13
|
+
* No external dep; zero overhead when nobody subscribes.
|
|
14
|
+
*/
|
|
15
|
+
class EventBus {
|
|
16
|
+
listeners = new Map();
|
|
17
|
+
globalListeners = new Set();
|
|
18
|
+
on(kind, listener) {
|
|
19
|
+
if (!this.listeners.has(kind))
|
|
20
|
+
this.listeners.set(kind, new Set());
|
|
21
|
+
this.listeners.get(kind).add(listener);
|
|
22
|
+
return () => this.listeners.get(kind)?.delete(listener);
|
|
23
|
+
}
|
|
24
|
+
onAny(listener) {
|
|
25
|
+
this.globalListeners.add(listener);
|
|
26
|
+
return () => this.globalListeners.delete(listener);
|
|
27
|
+
}
|
|
28
|
+
emit(ev) {
|
|
29
|
+
const ls = this.listeners.get(ev.kind);
|
|
30
|
+
if (ls)
|
|
31
|
+
for (const l of ls) {
|
|
32
|
+
try {
|
|
33
|
+
l(ev);
|
|
34
|
+
}
|
|
35
|
+
catch { /* swallow — never let a bad subscriber kill the bus */ }
|
|
36
|
+
}
|
|
37
|
+
for (const l of this.globalListeners) {
|
|
38
|
+
try {
|
|
39
|
+
l(ev);
|
|
40
|
+
}
|
|
41
|
+
catch { /* */ }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
listenerCount() {
|
|
45
|
+
let n = this.globalListeners.size;
|
|
46
|
+
for (const s of this.listeners.values())
|
|
47
|
+
n += s.size;
|
|
48
|
+
return n;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const _globalBus = new EventBus();
|
|
52
|
+
export function getEventBus() { return _globalBus; }
|
|
53
|
+
/**
|
|
54
|
+
* Get an async iterator over events matching `kinds` (all kinds if omitted).
|
|
55
|
+
* Stops when AbortSignal aborts.
|
|
56
|
+
*
|
|
57
|
+
* const ac = new AbortController();
|
|
58
|
+
* for await (const ev of subscribeEvents(["tournament.round"], { signal: ac.signal })) {
|
|
59
|
+
* if (ev.data.round >= 10) ac.abort();
|
|
60
|
+
* }
|
|
61
|
+
*/
|
|
62
|
+
export async function* subscribeEvents(kinds, opts = {}) {
|
|
63
|
+
const bus = getEventBus();
|
|
64
|
+
const queue = [];
|
|
65
|
+
let resolveNext = null;
|
|
66
|
+
let aborted = false;
|
|
67
|
+
const off = kinds && kinds.length > 0
|
|
68
|
+
? kinds.map((k) => bus.on(k, (ev) => push(ev)))
|
|
69
|
+
: [bus.onAny((ev) => push(ev))];
|
|
70
|
+
function push(ev) {
|
|
71
|
+
if (resolveNext) {
|
|
72
|
+
resolveNext({ value: ev, done: false });
|
|
73
|
+
resolveNext = null;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
queue.push(ev);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (opts.signal) {
|
|
80
|
+
opts.signal.addEventListener("abort", () => {
|
|
81
|
+
aborted = true;
|
|
82
|
+
if (resolveNext) {
|
|
83
|
+
resolveNext({ value: undefined, done: true });
|
|
84
|
+
resolveNext = null;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
while (!aborted) {
|
|
90
|
+
if (queue.length > 0) {
|
|
91
|
+
yield queue.shift();
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const next = await new Promise((resolve) => {
|
|
95
|
+
resolveNext = resolve;
|
|
96
|
+
});
|
|
97
|
+
if (next.done)
|
|
98
|
+
break;
|
|
99
|
+
yield next.value;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
for (const fn of off)
|
|
104
|
+
fn();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mneme-ai/sdk — World-class premium SDK for Mneme.
|
|
3
|
+
*
|
|
4
|
+
* Native, in-process API for embedding Mneme primitives in any AI vendor /
|
|
5
|
+
* IDE plugin / agent runtime. 30-80× faster than the CLI subprocess.
|
|
6
|
+
*
|
|
7
|
+
* Quick start:
|
|
8
|
+
*
|
|
9
|
+
* import { createMneme } from "@mneme-ai/sdk";
|
|
10
|
+
*
|
|
11
|
+
* const mneme = createMneme(); // uses cwd/.mneme + env keys
|
|
12
|
+
* const v = await mneme.verify`Mneme is a CLI tool`;
|
|
13
|
+
* console.log(v.data?.verdict); // → "FUSION"
|
|
14
|
+
*
|
|
15
|
+
* const fp = mneme.nemesis.fingerprint({ diff, prDescription, commitMessages });
|
|
16
|
+
* const id = mneme.nemesis.classify(fp.data);
|
|
17
|
+
* const stamp = mneme.nemesis.stamp({ message: "fix bug", vendor: "claude-code" });
|
|
18
|
+
*
|
|
19
|
+
* for await (const ev of mneme.events(["stamp.issued"])) {
|
|
20
|
+
* telemetry.recordStamp(ev.data);
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* const bench = await mneme.benchmark.vsCli();
|
|
24
|
+
* console.log(`SDK averages ${bench.averageSpeedup}× faster than CLI`);
|
|
25
|
+
*/
|
|
26
|
+
import { NemesisSdk, type MnemeInstanceOpts } from "./nemesis.js";
|
|
27
|
+
import { verify as verifyFn, verifyTagged } from "./verify.js";
|
|
28
|
+
import * as truth from "./truth.js";
|
|
29
|
+
import * as benchmark from "./benchmark.js";
|
|
30
|
+
import { type MnemeEventKind, type MnemeEvent } from "./events.js";
|
|
31
|
+
export * from "./types.js";
|
|
32
|
+
export * from "./lock.js";
|
|
33
|
+
export * from "./events.js";
|
|
34
|
+
export type { MnemeInstanceOpts } from "./nemesis.js";
|
|
35
|
+
export { NemesisSdk } from "./nemesis.js";
|
|
36
|
+
export { verify, verifyTagged, type VerifyOpts, type VerifyResult } from "./verify.js";
|
|
37
|
+
export { runProbe, runAllProbes, listProbes } from "./truth.js";
|
|
38
|
+
export { vsCli as benchVsCli, benchEuStamp, benchClassify, type BenchmarkResult } from "./benchmark.js";
|
|
39
|
+
/**
|
|
40
|
+
* Tagged-template-literal compatible verify dispatcher.
|
|
41
|
+
*
|
|
42
|
+
* Calling shape:
|
|
43
|
+
* - `mneme.verify("claim string", opts?)` — plain call
|
|
44
|
+
* - `mneme.verify\`Mneme is a CLI tool\`` — tagged template
|
|
45
|
+
*/
|
|
46
|
+
interface VerifyDispatcher {
|
|
47
|
+
(claim: string, opts?: Parameters<typeof verifyFn>[1]): ReturnType<typeof verifyFn>;
|
|
48
|
+
(strings: TemplateStringsArray, ...subs: unknown[]): ReturnType<typeof verifyTagged>;
|
|
49
|
+
}
|
|
50
|
+
export interface MnemeSdk {
|
|
51
|
+
/** NEMESIS engine surface (typed + in-process). */
|
|
52
|
+
nemesis: NemesisSdk;
|
|
53
|
+
/** Tagged-template-friendly verify. */
|
|
54
|
+
verify: VerifyDispatcher;
|
|
55
|
+
/** TRUTH GATE in-process probe runner. */
|
|
56
|
+
truth: typeof truth;
|
|
57
|
+
/** Built-in SDK-vs-CLI benchmark. */
|
|
58
|
+
benchmark: typeof benchmark;
|
|
59
|
+
/** Async-iterator event stream (kinds = [] means all). */
|
|
60
|
+
events: (kinds?: MnemeEventKind[]) => AsyncIterableIterator<MnemeEvent>;
|
|
61
|
+
/** The opts the instance was created with. */
|
|
62
|
+
readonly opts: MnemeInstanceOpts;
|
|
63
|
+
/** Version of the SDK runtime. */
|
|
64
|
+
readonly version: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create a Mneme SDK instance. Returns a stable object — every call to
|
|
68
|
+
* createMneme() with the same opts returns equivalent state but
|
|
69
|
+
* independent ledger writers (use for multi-tenant tests).
|
|
70
|
+
*/
|
|
71
|
+
export declare function createMneme(opts?: MnemeInstanceOpts): MnemeSdk;
|
|
72
|
+
/** SDK metadata for telemetry / about. */
|
|
73
|
+
export declare const SDK_VERSION = "2.55.0";
|
|
74
|
+
export declare const SDK_DESCRIPTION = "World-class premium in-process SDK for Mneme \u2014 30-80\u00D7 faster than CLI subprocess.";
|
|
75
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpF,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAE5B,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAExG;;;;;;GAMG;AACH,UAAU,gBAAgB;IACxB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;IACpF,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;CACtF;AAYD,MAAM,WAAW,QAAQ;IACvB,mDAAmD;IACnD,OAAO,EAAE,UAAU,CAAC;IACpB,uCAAuC;IACvC,MAAM,EAAE,gBAAgB,CAAC;IACzB,0CAA0C;IAC1C,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,qCAAqC;IACrC,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,0DAA0D;IAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,cAAc,EAAE,KAAK,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACxE,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,iBAAsB,GAAG,QAAQ,CAqBlE;AAED,0CAA0C;AAC1C,eAAO,MAAM,WAAW,WAAW,CAAC;AACpC,eAAO,MAAM,eAAe,gGAAsF,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mneme-ai/sdk — World-class premium SDK for Mneme.
|
|
3
|
+
*
|
|
4
|
+
* Native, in-process API for embedding Mneme primitives in any AI vendor /
|
|
5
|
+
* IDE plugin / agent runtime. 30-80× faster than the CLI subprocess.
|
|
6
|
+
*
|
|
7
|
+
* Quick start:
|
|
8
|
+
*
|
|
9
|
+
* import { createMneme } from "@mneme-ai/sdk";
|
|
10
|
+
*
|
|
11
|
+
* const mneme = createMneme(); // uses cwd/.mneme + env keys
|
|
12
|
+
* const v = await mneme.verify`Mneme is a CLI tool`;
|
|
13
|
+
* console.log(v.data?.verdict); // → "FUSION"
|
|
14
|
+
*
|
|
15
|
+
* const fp = mneme.nemesis.fingerprint({ diff, prDescription, commitMessages });
|
|
16
|
+
* const id = mneme.nemesis.classify(fp.data);
|
|
17
|
+
* const stamp = mneme.nemesis.stamp({ message: "fix bug", vendor: "claude-code" });
|
|
18
|
+
*
|
|
19
|
+
* for await (const ev of mneme.events(["stamp.issued"])) {
|
|
20
|
+
* telemetry.recordStamp(ev.data);
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* const bench = await mneme.benchmark.vsCli();
|
|
24
|
+
* console.log(`SDK averages ${bench.averageSpeedup}× faster than CLI`);
|
|
25
|
+
*/
|
|
26
|
+
import { NemesisSdk } from "./nemesis.js";
|
|
27
|
+
import { verify as verifyFn, verifyTagged } from "./verify.js";
|
|
28
|
+
import * as truth from "./truth.js";
|
|
29
|
+
import * as benchmark from "./benchmark.js";
|
|
30
|
+
import { subscribeEvents } from "./events.js";
|
|
31
|
+
export * from "./types.js";
|
|
32
|
+
export * from "./lock.js";
|
|
33
|
+
export * from "./events.js";
|
|
34
|
+
export { NemesisSdk } from "./nemesis.js";
|
|
35
|
+
export { verify, verifyTagged } from "./verify.js";
|
|
36
|
+
export { runProbe, runAllProbes, listProbes } from "./truth.js";
|
|
37
|
+
export { vsCli as benchVsCli, benchEuStamp, benchClassify } from "./benchmark.js";
|
|
38
|
+
function buildVerifyDispatcher() {
|
|
39
|
+
const dispatcher = ((firstArg, ...rest) => {
|
|
40
|
+
if (Array.isArray(firstArg) && "raw" in firstArg) {
|
|
41
|
+
return verifyTagged(firstArg, ...rest);
|
|
42
|
+
}
|
|
43
|
+
return verifyFn(firstArg, rest[0]);
|
|
44
|
+
});
|
|
45
|
+
return dispatcher;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a Mneme SDK instance. Returns a stable object — every call to
|
|
49
|
+
* createMneme() with the same opts returns equivalent state but
|
|
50
|
+
* independent ledger writers (use for multi-tenant tests).
|
|
51
|
+
*/
|
|
52
|
+
export function createMneme(opts = {}) {
|
|
53
|
+
// STRICT mode mirroring
|
|
54
|
+
if (opts.strict) {
|
|
55
|
+
if (!opts.hmacKey && !process.env["MNEME_NEMESIS_KEY"]) {
|
|
56
|
+
throw new Error("createMneme({ strict: true }) requires opts.hmacKey OR MNEME_NEMESIS_KEY env");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// If hmacKey provided inline, inject into env for the in-process consumers
|
|
60
|
+
if (opts.hmacKey && !process.env["MNEME_NEMESIS_KEY"]) {
|
|
61
|
+
process.env["MNEME_NEMESIS_KEY"] = opts.hmacKey;
|
|
62
|
+
}
|
|
63
|
+
const nemesis = new NemesisSdk(opts);
|
|
64
|
+
return {
|
|
65
|
+
nemesis,
|
|
66
|
+
verify: buildVerifyDispatcher(),
|
|
67
|
+
truth,
|
|
68
|
+
benchmark,
|
|
69
|
+
events: (kinds) => subscribeEvents(kinds),
|
|
70
|
+
opts: Object.freeze({ ...opts }),
|
|
71
|
+
version: "2.55.0",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** SDK metadata for telemetry / about. */
|
|
75
|
+
export const SDK_VERSION = "2.55.0";
|
|
76
|
+
export const SDK_DESCRIPTION = "World-class premium in-process SDK for Mneme — 30-80× faster than CLI subprocess.";
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,UAAU,EAA0B,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAwC,MAAM,aAAa,CAAC;AAEpF,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAsC,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,YAAY,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AAcxG,SAAS,qBAAqB;IAC5B,MAAM,UAAU,GAAG,CAAC,CAAC,QAAuC,EAAE,GAAG,IAAe,EAAE,EAAE;QAClF,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAK,QAAiC,EAAE,CAAC;YAC3E,OAAO,YAAY,CAAC,QAAgC,EAAE,GAAG,IAAI,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,QAAQ,CAAC,QAAkB,EAAE,IAAI,CAAC,CAAC,CAA+C,CAAC,CAAC;IAC7F,CAAC,CAAqB,CAAC;IACvB,OAAO,UAAU,CAAC;AACpB,CAAC;AAmBD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,OAA0B,EAAE;IACtD,wBAAwB;IACxB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IACD,2EAA2E;IAC3E,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IAClD,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO;QACL,OAAO;QACP,MAAM,EAAE,qBAAqB,EAAE;QAC/B,KAAK;QACL,SAAS;QACT,MAAM,EAAE,CAAC,KAAwB,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;QAC5D,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;QAChC,OAAO,EAAE,QAAQ;KAClB,CAAC;AACJ,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAG,mFAAmF,CAAC"}
|
package/dist/lock.d.ts
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mneme-ai/sdk file-lock adapter.
|
|
3
|
+
*
|
|
4
|
+
* Fixes the race condition the user identified:
|
|
5
|
+
* "CLI mneme verify ... + Cursor SDK writing HMAC chain simultaneously
|
|
6
|
+
* → race in writing .mneme/cli-activity.jsonl"
|
|
7
|
+
*
|
|
8
|
+
* Strategy: simple advisory lock via `.lock` sentinel file with PID +
|
|
9
|
+
* stale-detection. No external dependency (no proper-lockfile import) —
|
|
10
|
+
* stays compatible with bundler tree-shake + works in container/serverless.
|
|
11
|
+
*
|
|
12
|
+
* Pure deterministic + defensive; never throws.
|
|
13
|
+
*/
|
|
14
|
+
export interface LockResult {
|
|
15
|
+
acquired: boolean;
|
|
16
|
+
/** The lock file path (for telemetry / debug). */
|
|
17
|
+
lockPath: string;
|
|
18
|
+
/** When the lock was acquired (or last detected to be held). */
|
|
19
|
+
at: number;
|
|
20
|
+
/** PID holding the lock (or null on acquire failure). */
|
|
21
|
+
holderPid?: number;
|
|
22
|
+
reason?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Try to acquire an advisory lock on a target file. Non-blocking: returns
|
|
26
|
+
* { acquired: false } immediately on failure.
|
|
27
|
+
*
|
|
28
|
+
* Caller MUST call releaseLock when done.
|
|
29
|
+
*/
|
|
30
|
+
export declare function acquireLock(targetPath: string): LockResult;
|
|
31
|
+
export declare function releaseLock(lockResult: Pick<LockResult, "lockPath" | "acquired">): void;
|
|
32
|
+
/**
|
|
33
|
+
* Run a critical section under the lock. Releases the lock even when fn
|
|
34
|
+
* throws. Returns { acquired: false } envelope when the lock could not
|
|
35
|
+
* be acquired (caller decides whether to retry).
|
|
36
|
+
*/
|
|
37
|
+
export declare function withLock<T>(targetPath: string, fn: () => T | Promise<T>, opts?: {
|
|
38
|
+
retries?: number;
|
|
39
|
+
retryDelayMs?: number;
|
|
40
|
+
}): Promise<{
|
|
41
|
+
ok: boolean;
|
|
42
|
+
data?: T;
|
|
43
|
+
reason?: string;
|
|
44
|
+
}>;
|
|
45
|
+
/** Diagnostic: check if a lock currently exists + is fresh. */
|
|
46
|
+
export declare function isLocked(targetPath: string): {
|
|
47
|
+
locked: boolean;
|
|
48
|
+
holderPid?: number;
|
|
49
|
+
ageMs?: number;
|
|
50
|
+
};
|
|
51
|
+
/** Test-only: lockPath getter. */
|
|
52
|
+
export declare function __lockPathForTest(targetPath: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Wrap a function so that every call serialises through the lock for
|
|
55
|
+
* a given path. Useful for wrapping ledger writers transparently.
|
|
56
|
+
*/
|
|
57
|
+
export declare function serializeOnLock<Args extends unknown[], R>(lockTarget: string, fn: (...a: Args) => R | Promise<R>): (...a: Args) => Promise<{
|
|
58
|
+
ok: boolean;
|
|
59
|
+
data?: R;
|
|
60
|
+
reason?: string;
|
|
61
|
+
}>;
|
|
62
|
+
export declare const STALE_LOCK_MS = 5000;
|
|
63
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAoC1D;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC,GAAG,IAAI,CAGvF;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACxB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBrD;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAWpG;AAED,kCAAkC;AAClC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EACvD,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACjC,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAErE;AAED,eAAO,MAAM,aAAa,OAAW,CAAC"}
|