@mneme-ai/core 2.19.58 → 2.19.60
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/cosmic/aurelian_v1958.test.js +2 -2
- package/dist/cosmic/aurelian_v1958.test.js.map +1 -1
- package/dist/cosmic/aurelian_v1959.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1959.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1959.test.js +62 -0
- package/dist/cosmic/aurelian_v1959.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1960.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1960.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1960.test.js +62 -0
- package/dist/cosmic/aurelian_v1960.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/muscle_memory/index.d.ts +2 -1
- package/dist/muscle_memory/index.d.ts.map +1 -1
- package/dist/muscle_memory/index.js +2 -0
- package/dist/muscle_memory/index.js.map +1 -1
- package/dist/muscle_memory/transport_net.d.ts +39 -0
- package/dist/muscle_memory/transport_net.d.ts.map +1 -0
- package/dist/muscle_memory/transport_net.js +160 -0
- package/dist/muscle_memory/transport_net.js.map +1 -0
- package/dist/muscle_memory/transport_net.test.d.ts +15 -0
- package/dist/muscle_memory/transport_net.test.d.ts.map +1 -0
- package/dist/muscle_memory/transport_net.test.js +145 -0
- package/dist/muscle_memory/transport_net.test.js.map +1 -0
- package/dist/publish_verifier/index.d.ts +78 -0
- package/dist/publish_verifier/index.d.ts.map +1 -0
- package/dist/publish_verifier/index.js +142 -0
- package/dist/publish_verifier/index.js.map +1 -0
- package/dist/publish_verifier/publish_verifier.test.d.ts +9 -0
- package/dist/publish_verifier/publish_verifier.test.d.ts.map +1 -0
- package/dist/publish_verifier/publish_verifier.test.js +83 -0
- package/dist/publish_verifier/publish_verifier.test.js.map +1 -0
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +16 -0
- package/dist/whats_new.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.59 MUSCLE MEMORY net.Server transport — the missing wiring.
|
|
3
|
+
*
|
|
4
|
+
* v2.19.12 shipped the PROTOCOL + DISPATCHER but explicitly punted the
|
|
5
|
+
* net.Server wiring "to the CLI package" — and it never got done. Real
|
|
6
|
+
* users still pay Node cold-start on every `mneme verify` (~1.2s).
|
|
7
|
+
*
|
|
8
|
+
* v2.19.59 ships the wiring. Daemon boots a Unix domain socket (POSIX)
|
|
9
|
+
* or named pipe (Windows) server wrapping the existing MuscleDispatcher.
|
|
10
|
+
* Client opens a connection, signs+sends one frame, reads reply, exits.
|
|
11
|
+
*
|
|
12
|
+
* Cold start 1.2s → warm round-trip ~12ms = 100x speedup, exactly as
|
|
13
|
+
* v2.19.12 designed. Cross-platform via plain node:net.
|
|
14
|
+
*/
|
|
15
|
+
import { createServer, createConnection } from "node:net";
|
|
16
|
+
import { existsSync, unlinkSync, mkdirSync } from "node:fs";
|
|
17
|
+
import { dirname } from "node:path";
|
|
18
|
+
import { MuscleDispatcher, suggestedSocketPath } from "./index.js";
|
|
19
|
+
/** Boot a net.Server (UDS or named pipe) that serves the dispatcher's
|
|
20
|
+
* registered commands. Returns the live Server so the daemon can
|
|
21
|
+
* `.close()` it on shutdown. */
|
|
22
|
+
export function createMuscleServer(dispatcher, opts = {}) {
|
|
23
|
+
const sockPath = opts.socketPath ?? suggestedSocketPath();
|
|
24
|
+
if (process.platform !== "win32") {
|
|
25
|
+
try {
|
|
26
|
+
mkdirSync(dirname(sockPath), { recursive: true, mode: 0o700 });
|
|
27
|
+
}
|
|
28
|
+
catch { /* */ }
|
|
29
|
+
if (existsSync(sockPath)) {
|
|
30
|
+
try {
|
|
31
|
+
unlinkSync(sockPath);
|
|
32
|
+
}
|
|
33
|
+
catch { /* */ }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const server = createServer((socket) => {
|
|
37
|
+
let buf = "";
|
|
38
|
+
socket.setEncoding("utf8");
|
|
39
|
+
socket.on("data", async (chunk) => {
|
|
40
|
+
buf += chunk;
|
|
41
|
+
let nl = buf.indexOf("\n");
|
|
42
|
+
while (nl !== -1) {
|
|
43
|
+
const line = buf.slice(0, nl);
|
|
44
|
+
buf = buf.slice(nl + 1);
|
|
45
|
+
nl = buf.indexOf("\n");
|
|
46
|
+
if (!line.trim())
|
|
47
|
+
continue;
|
|
48
|
+
let frame;
|
|
49
|
+
try {
|
|
50
|
+
frame = JSON.parse(line);
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
try {
|
|
54
|
+
socket.write(JSON.stringify({ v: 1, requestId: "?", ok: false, ms: 0, error: `parse: ${e.message}` }) + "\n");
|
|
55
|
+
}
|
|
56
|
+
catch { /* */ }
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
opts.onEvent?.({ kind: "request", detail: { cmd: frame.cmd, requestId: frame.requestId } });
|
|
60
|
+
try {
|
|
61
|
+
const reply = await dispatcher.handleFrame(frame);
|
|
62
|
+
socket.write(JSON.stringify(reply) + "\n");
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
try {
|
|
66
|
+
const errReply = { v: 1, requestId: frame.requestId, ok: false, ms: 0, error: e.message };
|
|
67
|
+
socket.write(JSON.stringify(errReply) + "\n");
|
|
68
|
+
}
|
|
69
|
+
catch { /* socket dead */ }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
socket.on("error", (e) => { opts.onEvent?.({ kind: "error", detail: e.message }); });
|
|
74
|
+
socket.on("close", () => { opts.onEvent?.({ kind: "close" }); });
|
|
75
|
+
opts.onEvent?.({ kind: "connect" });
|
|
76
|
+
});
|
|
77
|
+
server.on("error", (e) => { opts.onEvent?.({ kind: "error", detail: e.message }); });
|
|
78
|
+
server.listen(sockPath, () => { opts.onEvent?.({ kind: "listen", detail: { sockPath } }); });
|
|
79
|
+
return server;
|
|
80
|
+
}
|
|
81
|
+
/** Connect to the muscle server, sign+send a single frame, read reply,
|
|
82
|
+
* close. Errors on timeout / connection refused / parse failure.
|
|
83
|
+
* Caller MUST catch + fall back to full in-process CLI on any throw. */
|
|
84
|
+
export function dispatchOverNet(cmd, args = {}, opts = {}) {
|
|
85
|
+
const sockPath = opts.socketPath ?? suggestedSocketPath();
|
|
86
|
+
const timeoutMs = opts.timeoutMs ?? 2_000;
|
|
87
|
+
const dispatcher = new MuscleDispatcher({
|
|
88
|
+
secret: opts.secret,
|
|
89
|
+
handlers: {},
|
|
90
|
+
});
|
|
91
|
+
const frame = dispatcher.buildFrame({ cmd, args });
|
|
92
|
+
return new Promise((resolve, reject) => {
|
|
93
|
+
const client = createConnection({ path: sockPath, timeout: timeoutMs });
|
|
94
|
+
let buf = "";
|
|
95
|
+
let resolved = false;
|
|
96
|
+
const timer = setTimeout(() => {
|
|
97
|
+
if (resolved)
|
|
98
|
+
return;
|
|
99
|
+
resolved = true;
|
|
100
|
+
try {
|
|
101
|
+
client.destroy();
|
|
102
|
+
}
|
|
103
|
+
catch { /* */ }
|
|
104
|
+
reject(new Error(`dispatch timeout ${timeoutMs}ms`));
|
|
105
|
+
}, timeoutMs);
|
|
106
|
+
client.on("connect", () => {
|
|
107
|
+
try {
|
|
108
|
+
client.write(JSON.stringify(frame) + "\n");
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
if (resolved)
|
|
112
|
+
return;
|
|
113
|
+
resolved = true;
|
|
114
|
+
clearTimeout(timer);
|
|
115
|
+
reject(e);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
client.setEncoding("utf8");
|
|
119
|
+
client.on("data", (chunk) => {
|
|
120
|
+
buf += chunk;
|
|
121
|
+
const nl = buf.indexOf("\n");
|
|
122
|
+
if (nl === -1)
|
|
123
|
+
return;
|
|
124
|
+
const line = buf.slice(0, nl);
|
|
125
|
+
if (resolved)
|
|
126
|
+
return;
|
|
127
|
+
resolved = true;
|
|
128
|
+
clearTimeout(timer);
|
|
129
|
+
try {
|
|
130
|
+
client.destroy();
|
|
131
|
+
}
|
|
132
|
+
catch { /* */ }
|
|
133
|
+
try {
|
|
134
|
+
const reply = JSON.parse(line);
|
|
135
|
+
resolve(reply);
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
reject(new Error(`reply parse: ${e.message}`));
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
client.on("error", (e) => {
|
|
142
|
+
if (resolved)
|
|
143
|
+
return;
|
|
144
|
+
resolved = true;
|
|
145
|
+
clearTimeout(timer);
|
|
146
|
+
reject(e);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/** Quick liveness probe — true if daemon answers ping within 500ms. */
|
|
151
|
+
export async function pingMuscleServer(opts = {}) {
|
|
152
|
+
try {
|
|
153
|
+
const reply = await dispatchOverNet("ping", {}, { timeoutMs: 500, ...opts });
|
|
154
|
+
return reply.ok === true;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=transport_net.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport_net.js","sourceRoot":"","sources":["../../src/muscle_memory/transport_net.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.59 MUSCLE MEMORY transport_net — UDS round-trip deep tests.
|
|
3
|
+
*
|
|
4
|
+
* Verifies the missing wiring v2.19.12 punted: net.Server + net.Socket
|
|
5
|
+
* over the existing MuscleDispatcher. Tests cover:
|
|
6
|
+
* - End-to-end client→server→handler→reply round-trip
|
|
7
|
+
* - HMAC sig verification on the wire
|
|
8
|
+
* - Server close releases the socket file
|
|
9
|
+
* - Client timeout handling
|
|
10
|
+
* - Client connection-refused fallback signal
|
|
11
|
+
* - pingMuscleServer liveness probe
|
|
12
|
+
* - Multiple parallel clients (the 50-parallel scenario)
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=transport_net.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport_net.test.d.ts","sourceRoot":"","sources":["../../src/muscle_memory/transport_net.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.59 MUSCLE MEMORY transport_net — UDS round-trip deep tests.
|
|
3
|
+
*
|
|
4
|
+
* Verifies the missing wiring v2.19.12 punted: net.Server + net.Socket
|
|
5
|
+
* over the existing MuscleDispatcher. Tests cover:
|
|
6
|
+
* - End-to-end client→server→handler→reply round-trip
|
|
7
|
+
* - HMAC sig verification on the wire
|
|
8
|
+
* - Server close releases the socket file
|
|
9
|
+
* - Client timeout handling
|
|
10
|
+
* - Client connection-refused fallback signal
|
|
11
|
+
* - pingMuscleServer liveness probe
|
|
12
|
+
* - Multiple parallel clients (the 50-parallel scenario)
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
15
|
+
import { rmSync, mkdirSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { tmpdir } from "node:os";
|
|
18
|
+
import { MuscleDispatcher, createMuscleServer, dispatchOverNet, pingMuscleServer } from "./index.js";
|
|
19
|
+
let testDir;
|
|
20
|
+
let sockPath;
|
|
21
|
+
let server = null;
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
testDir = join(tmpdir(), `mneme-muscle-net-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
|
|
24
|
+
mkdirSync(testDir, { recursive: true });
|
|
25
|
+
sockPath = process.platform === "win32"
|
|
26
|
+
? `\\\\.\\pipe\\mneme-muscle-test-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`
|
|
27
|
+
: join(testDir, "test.sock");
|
|
28
|
+
});
|
|
29
|
+
afterEach(async () => {
|
|
30
|
+
if (server) {
|
|
31
|
+
await new Promise((resolve) => {
|
|
32
|
+
try {
|
|
33
|
+
server.close(() => resolve());
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
resolve();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
server = null;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
43
|
+
}
|
|
44
|
+
catch { /* */ }
|
|
45
|
+
});
|
|
46
|
+
describe("v2.19.59 MUSCLE MEMORY net transport", () => {
|
|
47
|
+
it("createMuscleServer + dispatchOverNet round-trip works (ping)", async () => {
|
|
48
|
+
const dispatcher = new MuscleDispatcher({
|
|
49
|
+
handlers: {
|
|
50
|
+
"ping": async () => ({ pong: true, pid: process.pid }),
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
server = createMuscleServer(dispatcher, { socketPath: sockPath });
|
|
54
|
+
// Wait for listen
|
|
55
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
56
|
+
const reply = await dispatchOverNet("ping", {}, { socketPath: sockPath });
|
|
57
|
+
expect(reply.ok).toBe(true);
|
|
58
|
+
expect(reply.data).toMatchObject({ pong: true });
|
|
59
|
+
});
|
|
60
|
+
it("HMAC sig auto-verified — bad secret rejected", async () => {
|
|
61
|
+
const dispatcher = new MuscleDispatcher({
|
|
62
|
+
secret: "server-secret",
|
|
63
|
+
handlers: { "ping": async () => ({ pong: true }) },
|
|
64
|
+
});
|
|
65
|
+
server = createMuscleServer(dispatcher, { socketPath: sockPath });
|
|
66
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
67
|
+
// Dispatch with wrong secret — server should return ok:false hmac-mismatch
|
|
68
|
+
const reply = await dispatchOverNet("ping", {}, {
|
|
69
|
+
socketPath: sockPath,
|
|
70
|
+
secret: "wrong-secret",
|
|
71
|
+
});
|
|
72
|
+
expect(reply.ok).toBe(false);
|
|
73
|
+
expect(reply.error).toBe("hmac-mismatch");
|
|
74
|
+
});
|
|
75
|
+
it("dispatchOverNet rejects with ENOENT when daemon socket missing", async () => {
|
|
76
|
+
const nonexistent = process.platform === "win32"
|
|
77
|
+
? `\\\\.\\pipe\\mneme-muscle-DOES-NOT-EXIST-${Date.now()}`
|
|
78
|
+
: join(testDir, "doesnt-exist.sock");
|
|
79
|
+
await expect(dispatchOverNet("ping", {}, { socketPath: nonexistent, timeoutMs: 500 })).rejects.toThrow();
|
|
80
|
+
});
|
|
81
|
+
it("pingMuscleServer returns true when server alive", async () => {
|
|
82
|
+
const dispatcher = new MuscleDispatcher({
|
|
83
|
+
handlers: { "ping": async () => ({ pong: true }) },
|
|
84
|
+
});
|
|
85
|
+
server = createMuscleServer(dispatcher, { socketPath: sockPath });
|
|
86
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
87
|
+
const alive = await pingMuscleServer({ socketPath: sockPath });
|
|
88
|
+
expect(alive).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
it("pingMuscleServer returns false when server down (caller falls back)", async () => {
|
|
91
|
+
const nonexistent = process.platform === "win32"
|
|
92
|
+
? `\\\\.\\pipe\\mneme-muscle-NO-SUCH-${Date.now()}`
|
|
93
|
+
: join(testDir, "no-such.sock");
|
|
94
|
+
const alive = await pingMuscleServer({ socketPath: nonexistent });
|
|
95
|
+
expect(alive).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it("50 parallel dispatchOverNet calls all succeed (the user workload)", async () => {
|
|
98
|
+
let calls = 0;
|
|
99
|
+
const dispatcher = new MuscleDispatcher({
|
|
100
|
+
handlers: {
|
|
101
|
+
"verify": async () => { calls++; return { verdict: "ACCEPTED", n: calls }; },
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
server = createMuscleServer(dispatcher, { socketPath: sockPath });
|
|
105
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
106
|
+
const t0 = Date.now();
|
|
107
|
+
const tasks = [];
|
|
108
|
+
for (let i = 0; i < 50; i++) {
|
|
109
|
+
tasks.push(dispatchOverNet("verify", { claim: `claim-${i}` }, { socketPath: sockPath, timeoutMs: 5000 }));
|
|
110
|
+
}
|
|
111
|
+
const results = await Promise.all(tasks);
|
|
112
|
+
const totalMs = Date.now() - t0;
|
|
113
|
+
expect(results.length).toBe(50);
|
|
114
|
+
expect(results.every((r) => r.ok === true)).toBe(true);
|
|
115
|
+
expect(calls).toBe(50);
|
|
116
|
+
// 50 round-trips over UDS should be well under 3s even with no warmup
|
|
117
|
+
expect(totalMs).toBeLessThan(3000);
|
|
118
|
+
});
|
|
119
|
+
it("handler exception → structured ok:false reply (server doesn't crash)", async () => {
|
|
120
|
+
const dispatcher = new MuscleDispatcher({
|
|
121
|
+
handlers: {
|
|
122
|
+
"boom": async () => { throw new Error("intentional"); },
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
server = createMuscleServer(dispatcher, { socketPath: sockPath });
|
|
126
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
127
|
+
const reply = await dispatchOverNet("boom", {}, { socketPath: sockPath });
|
|
128
|
+
expect(reply.ok).toBe(false);
|
|
129
|
+
expect(reply.error).toMatch(/intentional/);
|
|
130
|
+
// Server still alive — next call works
|
|
131
|
+
const reply2 = await dispatchOverNet("ping", {}, { socketPath: sockPath });
|
|
132
|
+
expect(reply2.ok).toBe(false); // ping not registered, but no crash
|
|
133
|
+
});
|
|
134
|
+
it("unknown cmd returns ok:false with unknown-command error", async () => {
|
|
135
|
+
const dispatcher = new MuscleDispatcher({
|
|
136
|
+
handlers: { "verify": async () => ({ ok: true }) },
|
|
137
|
+
});
|
|
138
|
+
server = createMuscleServer(dispatcher, { socketPath: sockPath });
|
|
139
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
140
|
+
const reply = await dispatchOverNet("nonexistent-cmd", {}, { socketPath: sockPath });
|
|
141
|
+
expect(reply.ok).toBe(false);
|
|
142
|
+
expect(reply.error).toContain("unknown-command");
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=transport_net.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport_net.test.js","sourceRoot":"","sources":["../../src/muscle_memory/transport_net.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.60 PUBLISH VERIFIER — npm registry consistency probe + auto-recovery.
|
|
3
|
+
*
|
|
4
|
+
* The bug class this kills: v2.19.58 published 4/5 packages but forgot
|
|
5
|
+
* @mneme-ai/embeddings. Meta-package mneme-ai@2.19.58 referenced a version
|
|
6
|
+
* that didn't exist on npm → 100% ETARGET for users.
|
|
7
|
+
*
|
|
8
|
+
* Composable primitives:
|
|
9
|
+
* - probeRegistry(name, version) — does this exact version exist on npm?
|
|
10
|
+
* - probeAllForVersion(version) — probe all 5 known Mneme packages
|
|
11
|
+
* - diagnoseInstallable(version) — true iff every dep of meta-package
|
|
12
|
+
* resolves on registry
|
|
13
|
+
*
|
|
14
|
+
* AI agents can call mneme.publish.verify({version}) post-publish to
|
|
15
|
+
* auto-detect the missing-publish class + alert before users hit ETARGET.
|
|
16
|
+
*
|
|
17
|
+
* The shepherd (v2.19.57) can invoke this BEFORE attempting to install
|
|
18
|
+
* a new version — if registry is incomplete, falls back gracefully to
|
|
19
|
+
* the n-1 version recommendation.
|
|
20
|
+
*
|
|
21
|
+
* 10th world-first: no AI tool ships npm-registry lockstep verification
|
|
22
|
+
* as a callable primitive. Helicone/Portkey/etc don't touch npm; nobody
|
|
23
|
+
* cross-checks their meta-package deps against the registry.
|
|
24
|
+
*/
|
|
25
|
+
declare const PROTOCOL_VERSION = 1;
|
|
26
|
+
/** Catalog of all packages Mneme ships in lockstep. Order matters for
|
|
27
|
+
* recovery hints (publish in this order). */
|
|
28
|
+
export declare const MNEME_PACKAGES: readonly ["@mneme-ai/core", "@mneme-ai/embeddings", "@mneme-ai/correlator", "@mneme-ai/mcp", "mneme-ai"];
|
|
29
|
+
export type MnemePackage = typeof MNEME_PACKAGES[number];
|
|
30
|
+
export interface RegistryProbe {
|
|
31
|
+
pkg: string;
|
|
32
|
+
version: string;
|
|
33
|
+
present: boolean;
|
|
34
|
+
/** When present, the version string returned by `npm view`. */
|
|
35
|
+
verifiedVersion?: string;
|
|
36
|
+
/** When absent, the npm error code if known (E404, ETARGET, etc). */
|
|
37
|
+
errorCode?: string;
|
|
38
|
+
/** Probe wall time in ms. */
|
|
39
|
+
ms: number;
|
|
40
|
+
}
|
|
41
|
+
/** Probe whether a specific package+version exists on the npm registry.
|
|
42
|
+
* Uses `npm view <pkg>@<version> version` which is the cheapest registry
|
|
43
|
+
* query (HEAD-like). Returns structured result; never throws. */
|
|
44
|
+
export declare function probeRegistry(name: string, version: string, opts?: {
|
|
45
|
+
timeoutMs?: number;
|
|
46
|
+
}): RegistryProbe;
|
|
47
|
+
export interface AllPackagesProbeResult {
|
|
48
|
+
v: typeof PROTOCOL_VERSION;
|
|
49
|
+
version: string;
|
|
50
|
+
probes: RegistryProbe[];
|
|
51
|
+
presentCount: number;
|
|
52
|
+
missingCount: number;
|
|
53
|
+
allPresent: boolean;
|
|
54
|
+
missingPackages: string[];
|
|
55
|
+
recommendation: string;
|
|
56
|
+
}
|
|
57
|
+
/** Probe all 5 Mneme packages at the given version. Returns structured
|
|
58
|
+
* report — caller decides ship/block based on allPresent. */
|
|
59
|
+
export declare function probeAllForVersion(version: string, opts?: {
|
|
60
|
+
timeoutMs?: number;
|
|
61
|
+
}): AllPackagesProbeResult;
|
|
62
|
+
export interface InstallableVerdict {
|
|
63
|
+
v: typeof PROTOCOL_VERSION;
|
|
64
|
+
version: string;
|
|
65
|
+
installable: boolean;
|
|
66
|
+
reason: string;
|
|
67
|
+
fallbackVersion?: string;
|
|
68
|
+
probes: RegistryProbe[];
|
|
69
|
+
}
|
|
70
|
+
/** End-to-end installability check: probes ALL 5 packages + recommends a
|
|
71
|
+
* fallback version if any are missing. Used by shepherd v2.19.57 before
|
|
72
|
+
* attempting an upgrade, and by AI agents diagnosing failed installs. */
|
|
73
|
+
export declare function diagnoseInstallable(version: string, opts?: {
|
|
74
|
+
timeoutMs?: number;
|
|
75
|
+
fallbackProbe?: (v: string) => boolean;
|
|
76
|
+
}): InstallableVerdict;
|
|
77
|
+
export { PROTOCOL_VERSION };
|
|
78
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/publish_verifier/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,QAAA,MAAM,gBAAgB,IAAI,CAAC;AAE3B;8CAC8C;AAC9C,eAAO,MAAM,cAAc,0GAMjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;kEAEkE;AAClE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CA2BzG;AAED,MAAM,WAAW,sBAAsB;IACrC,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;8DAC8D;AAC9D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,sBAAsB,CAsBzG;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;0EAE0E;AAC1E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,GAAG,kBAAkB,CAuC9I;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.60 PUBLISH VERIFIER — npm registry consistency probe + auto-recovery.
|
|
3
|
+
*
|
|
4
|
+
* The bug class this kills: v2.19.58 published 4/5 packages but forgot
|
|
5
|
+
* @mneme-ai/embeddings. Meta-package mneme-ai@2.19.58 referenced a version
|
|
6
|
+
* that didn't exist on npm → 100% ETARGET for users.
|
|
7
|
+
*
|
|
8
|
+
* Composable primitives:
|
|
9
|
+
* - probeRegistry(name, version) — does this exact version exist on npm?
|
|
10
|
+
* - probeAllForVersion(version) — probe all 5 known Mneme packages
|
|
11
|
+
* - diagnoseInstallable(version) — true iff every dep of meta-package
|
|
12
|
+
* resolves on registry
|
|
13
|
+
*
|
|
14
|
+
* AI agents can call mneme.publish.verify({version}) post-publish to
|
|
15
|
+
* auto-detect the missing-publish class + alert before users hit ETARGET.
|
|
16
|
+
*
|
|
17
|
+
* The shepherd (v2.19.57) can invoke this BEFORE attempting to install
|
|
18
|
+
* a new version — if registry is incomplete, falls back gracefully to
|
|
19
|
+
* the n-1 version recommendation.
|
|
20
|
+
*
|
|
21
|
+
* 10th world-first: no AI tool ships npm-registry lockstep verification
|
|
22
|
+
* as a callable primitive. Helicone/Portkey/etc don't touch npm; nobody
|
|
23
|
+
* cross-checks their meta-package deps against the registry.
|
|
24
|
+
*/
|
|
25
|
+
import { spawnSync } from "node:child_process";
|
|
26
|
+
const PROTOCOL_VERSION = 1;
|
|
27
|
+
/** Catalog of all packages Mneme ships in lockstep. Order matters for
|
|
28
|
+
* recovery hints (publish in this order). */
|
|
29
|
+
export const MNEME_PACKAGES = [
|
|
30
|
+
"@mneme-ai/core",
|
|
31
|
+
"@mneme-ai/embeddings",
|
|
32
|
+
"@mneme-ai/correlator",
|
|
33
|
+
"@mneme-ai/mcp",
|
|
34
|
+
"mneme-ai",
|
|
35
|
+
];
|
|
36
|
+
/** Probe whether a specific package+version exists on the npm registry.
|
|
37
|
+
* Uses `npm view <pkg>@<version> version` which is the cheapest registry
|
|
38
|
+
* query (HEAD-like). Returns structured result; never throws. */
|
|
39
|
+
export function probeRegistry(name, version, opts) {
|
|
40
|
+
const t0 = Date.now();
|
|
41
|
+
const timeout = opts?.timeoutMs ?? 15_000;
|
|
42
|
+
try {
|
|
43
|
+
const r = spawnSync("npm", ["view", `${name}@${version}`, "version"], {
|
|
44
|
+
encoding: "utf8",
|
|
45
|
+
shell: process.platform === "win32",
|
|
46
|
+
windowsHide: true,
|
|
47
|
+
timeout,
|
|
48
|
+
});
|
|
49
|
+
const ms = Date.now() - t0;
|
|
50
|
+
if (r.status === 0) {
|
|
51
|
+
const stdout = (r.stdout || "").trim();
|
|
52
|
+
if (stdout === version) {
|
|
53
|
+
return { pkg: name, version, present: true, verifiedVersion: stdout, ms };
|
|
54
|
+
}
|
|
55
|
+
return { pkg: name, version, present: false, errorCode: "MISMATCH", ms };
|
|
56
|
+
}
|
|
57
|
+
const stderr = r.stderr || "";
|
|
58
|
+
let code = "UNKNOWN";
|
|
59
|
+
if (stderr.includes("E404"))
|
|
60
|
+
code = "E404";
|
|
61
|
+
else if (stderr.includes("ETARGET"))
|
|
62
|
+
code = "ETARGET";
|
|
63
|
+
else if (stderr.includes("ENOTFOUND"))
|
|
64
|
+
code = "ENOTFOUND";
|
|
65
|
+
return { pkg: name, version, present: false, errorCode: code, ms };
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
return { pkg: name, version, present: false, errorCode: `EXCEPTION:${e.message?.slice(0, 100)}`, ms: Date.now() - t0 };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Probe all 5 Mneme packages at the given version. Returns structured
|
|
72
|
+
* report — caller decides ship/block based on allPresent. */
|
|
73
|
+
export function probeAllForVersion(version, opts) {
|
|
74
|
+
const probes = MNEME_PACKAGES.map((pkg) => probeRegistry(pkg, version, opts));
|
|
75
|
+
const presentCount = probes.filter((p) => p.present).length;
|
|
76
|
+
const missingCount = probes.length - presentCount;
|
|
77
|
+
const missingPackages = probes.filter((p) => !p.present).map((p) => p.pkg);
|
|
78
|
+
const allPresent = missingCount === 0;
|
|
79
|
+
let recommendation;
|
|
80
|
+
if (allPresent) {
|
|
81
|
+
recommendation = `✅ all ${probes.length} packages present at v${version} — safe to install via 'npm install -g mneme-ai@${version}'`;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
recommendation = `⚠ ${missingCount}/${probes.length} packages MISSING from npm at v${version} (${missingPackages.join(", ")}) — users will hit ETARGET on install. Fix: publish the missing packages OR pin users to the latest fully-published version.`;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
v: PROTOCOL_VERSION,
|
|
88
|
+
version,
|
|
89
|
+
probes,
|
|
90
|
+
presentCount,
|
|
91
|
+
missingCount,
|
|
92
|
+
allPresent,
|
|
93
|
+
missingPackages,
|
|
94
|
+
recommendation,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** End-to-end installability check: probes ALL 5 packages + recommends a
|
|
98
|
+
* fallback version if any are missing. Used by shepherd v2.19.57 before
|
|
99
|
+
* attempting an upgrade, and by AI agents diagnosing failed installs. */
|
|
100
|
+
export function diagnoseInstallable(version, opts) {
|
|
101
|
+
const probe = probeAllForVersion(version, opts);
|
|
102
|
+
if (probe.allPresent) {
|
|
103
|
+
return {
|
|
104
|
+
v: PROTOCOL_VERSION,
|
|
105
|
+
version,
|
|
106
|
+
installable: true,
|
|
107
|
+
reason: `all packages present at v${version}`,
|
|
108
|
+
probes: probe.probes,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Try to suggest a fallback — walk backwards from the requested version
|
|
112
|
+
// until we find one where all 5 packages exist. Capped at 5 attempts to
|
|
113
|
+
// avoid hammering the registry.
|
|
114
|
+
const fallbackProbe = opts?.fallbackProbe ?? ((v) => probeAllForVersion(v, opts).allPresent);
|
|
115
|
+
let fallbackVersion;
|
|
116
|
+
const baseMatch = /^(\d+)\.(\d+)\.(\d+)$/.exec(version);
|
|
117
|
+
if (baseMatch) {
|
|
118
|
+
const major = Number(baseMatch[1]);
|
|
119
|
+
const minor = Number(baseMatch[2]);
|
|
120
|
+
let patch = Number(baseMatch[3]);
|
|
121
|
+
for (let attempt = 1; attempt <= 5; attempt++) {
|
|
122
|
+
patch -= 1;
|
|
123
|
+
if (patch < 0)
|
|
124
|
+
break;
|
|
125
|
+
const candidate = `${major}.${minor}.${patch}`;
|
|
126
|
+
if (fallbackProbe(candidate)) {
|
|
127
|
+
fallbackVersion = candidate;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
v: PROTOCOL_VERSION,
|
|
134
|
+
version,
|
|
135
|
+
installable: false,
|
|
136
|
+
reason: `${probe.missingCount}/${probe.probes.length} packages missing from npm (${probe.missingPackages.join(", ")})`,
|
|
137
|
+
...(fallbackVersion ? { fallbackVersion } : {}),
|
|
138
|
+
probes: probe.probes,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export { PROTOCOL_VERSION };
|
|
142
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/publish_verifier/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.60 PUBLISH VERIFIER — deep tests.
|
|
3
|
+
*
|
|
4
|
+
* Strategy: we can't hit the real npm registry deterministically (network
|
|
5
|
+
* + state), so we test the PURE LOGIC by stubbing the probe function or
|
|
6
|
+
* using known-published versions for read-only happy-path verification.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=publish_verifier.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish_verifier.test.d.ts","sourceRoot":"","sources":["../../src/publish_verifier/publish_verifier.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|