@mneme-ai/matrix 2.167.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/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `mneme-matrix` โ€” serve the Matrix Rail gRPC wire server on 127.0.0.1, or self-test.
4
+ * mneme-matrix serve [--port 50561]
5
+ * mneme-matrix selftest
6
+ */
7
+ import { createMatrixServer } from "./server.js";
8
+ import { grpcGauntlet } from "./gauntlet.js";
9
+ async function main() {
10
+ const args = process.argv.slice(2);
11
+ const cmd = args[0] ?? "serve";
12
+ if (cmd === "selftest") {
13
+ const g = await grpcGauntlet();
14
+ process.stdout.write(`๐Ÿ›ฐ MATRIX gRPC self-test โ€” ${g.score}/100\n`);
15
+ for (const c of g.checks)
16
+ process.stdout.write(` ${c.pass ? "โœ“" : "โœ—"} ${c.name} โ€” ${c.detail}\n`);
17
+ process.stdout.write(` metrics: health ${g.metrics.healthMs}ms ยท ping ${g.metrics.pingMs}ms ยท ${(g.metrics.largePayloadBytes / 1e6).toFixed(1)}MB round-trip ${g.metrics.roundTripMs}ms\n`);
18
+ process.exit(g.score === 100 ? 0 : 2);
19
+ }
20
+ if (cmd === "serve") {
21
+ const pIdx = args.indexOf("--port");
22
+ const port = pIdx >= 0 ? parseInt(args[pIdx + 1] ?? "0", 10) : 50561;
23
+ const srv = await createMatrixServer({ port });
24
+ process.stdout.write(`๐Ÿ›ฐ Matrix Rail gRPC on 127.0.0.1:${srv.port} (loopback only ยท proof-carrying ยท chunked pipe). Ctrl-C to stop.\n`);
25
+ process.on("SIGINT", () => { srv.stop().then(() => process.exit(0)); });
26
+ process.on("SIGTERM", () => { srv.stop().then(() => process.exit(0)); });
27
+ return;
28
+ }
29
+ process.stderr.write(`unknown command: ${cmd}\nusage: mneme-matrix serve [--port N] | selftest\n`);
30
+ process.exit(1);
31
+ }
32
+ main().catch((e) => { process.stderr.write(`matrix error: ${e.message}\n`); process.exit(1); });
33
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAE/B,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACpE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACpG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,QAAQ,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,CAAC;QAC7L,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,GAAG,CAAC,IAAI,qEAAqE,CAAC,CAAC;QACxI,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,qDAAqD,CAAC,CAAC;IACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAkB,CAAW,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Matrix Rail gRPC client helpers โ€” used by tests, the gauntlet, the CLI, and as
3
+ * the reference any-language agents follow. Unary Invoke + chunked Pipe.
4
+ */
5
+ import * as grpc from "@grpc/grpc-js";
6
+ export interface MatrixClient {
7
+ _c: grpc.Client;
8
+ close: () => void;
9
+ }
10
+ export interface ToolReply {
11
+ ok: boolean;
12
+ data_json: string;
13
+ wisdom: string;
14
+ proof_json: string;
15
+ error: string;
16
+ }
17
+ export declare function connect(addr: string): MatrixClient;
18
+ export declare function health(client: MatrixClient): Promise<{
19
+ ok: boolean;
20
+ version: string;
21
+ tools: number;
22
+ note: string;
23
+ }>;
24
+ /** Unary Invoke โ€” the typed door to any tool. */
25
+ export declare function invoke(client: MatrixClient, tool: string, argsJson?: string, heldRoot?: string): Promise<ToolReply>;
26
+ /**
27
+ * Pipe-invoke: send the request through the CHUNKED bidi pipe (any size, integrity-
28
+ * checked) and reassemble the reply. Proves a large payload flows past the 4MB cap.
29
+ */
30
+ export declare function pipeInvoke(client: MatrixClient, tool: string, argsJson?: string, heldRoot?: string): Promise<ToolReply>;
31
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAgBtC,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE;AACpE,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAEhH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAOlD;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAGnH;AAED,iDAAiD;AACjD,wBAAgB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAO,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAG7G;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAO,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAkBjH"}
package/dist/client.js ADDED
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Matrix Rail gRPC client helpers โ€” used by tests, the gauntlet, the CLI, and as
3
+ * the reference any-language agents follow. Unary Invoke + chunked Pipe.
4
+ */
5
+ import * as grpc from "@grpc/grpc-js";
6
+ import * as protoLoader from "@grpc/proto-loader";
7
+ import { fileURLToPath } from "node:url";
8
+ import { dirname, join } from "node:path";
9
+ import { matrix } from "@mneme-ai/core";
10
+ const PROTO_PATH = join(dirname(fileURLToPath(import.meta.url)), "..", "proto", "mneme.proto");
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ function MatrixClientCtor() {
13
+ const def = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: Number, enums: String, defaults: true, oneofs: true });
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ const pkg = grpc.loadPackageDefinition(def);
16
+ return pkg.mneme.Matrix;
17
+ }
18
+ export function connect(addr) {
19
+ const Ctor = MatrixClientCtor();
20
+ const c = new Ctor(addr, grpc.credentials.createInsecure(), {
21
+ "grpc.max_receive_message_length": 8 * 1024 * 1024,
22
+ "grpc.max_send_message_length": 8 * 1024 * 1024,
23
+ });
24
+ return { _c: c, close: () => c.close() };
25
+ }
26
+ export function health(client) {
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ return new Promise((resolve, reject) => client._c.Health({}, (e, r) => (e ? reject(e) : resolve(r))));
29
+ }
30
+ /** Unary Invoke โ€” the typed door to any tool. */
31
+ export function invoke(client, tool, argsJson = "{}", heldRoot = "") {
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ return new Promise((resolve, reject) => client._c.Invoke({ tool, args_json: argsJson, held_root: heldRoot }, (e, r) => (e ? reject(e) : resolve(r))));
34
+ }
35
+ const toWire = (f) => ({ id: f.id, seq: f.seq, total: f.total, orig_bytes: f.origBytes, gz: f.gz, data: Buffer.from(f.data) });
36
+ const fromWire = (w) => ({ id: String(w.id), seq: Number(w.seq), total: Number(w.total), origBytes: Number(w.orig_bytes), gz: !!w.gz, data: w.data instanceof Uint8Array ? w.data : Uint8Array.from(w.data ?? []) });
37
+ /**
38
+ * Pipe-invoke: send the request through the CHUNKED bidi pipe (any size, integrity-
39
+ * checked) and reassemble the reply. Proves a large payload flows past the 4MB cap.
40
+ */
41
+ export function pipeInvoke(client, tool, argsJson = "{}", heldRoot = "") {
42
+ return new Promise((resolve, reject) => {
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ const call = client._c.Pipe();
45
+ const replyFrames = [];
46
+ call.on("data", (w) => { try {
47
+ replyFrames.push(fromWire(w));
48
+ }
49
+ catch { /* */ } });
50
+ call.on("error", (e) => reject(e));
51
+ call.on("end", () => {
52
+ const asm = matrix.reassemble(replyFrames);
53
+ if (!asm.ok)
54
+ return reject(new Error(`reply pipe integrity: ${asm.reason}`));
55
+ try {
56
+ resolve(JSON.parse(new TextDecoder().decode(asm.payload)));
57
+ }
58
+ catch (e) {
59
+ reject(e);
60
+ }
61
+ });
62
+ // stream the request as frames
63
+ const reqBytes = new TextEncoder().encode(JSON.stringify({ tool, argsJson, heldRoot }));
64
+ for (const f of matrix.chunkFrame(reqBytes))
65
+ call.write(toWire(f));
66
+ call.end();
67
+ });
68
+ }
69
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface GrpcGauntlet {
2
+ score: number;
3
+ metrics: {
4
+ healthMs: number;
5
+ pingMs: number;
6
+ largePayloadBytes: number;
7
+ framesOverWire: number;
8
+ roundTripMs: number;
9
+ };
10
+ checks: Array<{
11
+ name: string;
12
+ pass: boolean;
13
+ detail: string;
14
+ }>;
15
+ }
16
+ export declare function grpcGauntlet(): Promise<GrpcGauntlet>;
17
+ //# sourceMappingURL=gauntlet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gauntlet.d.ts","sourceRoot":"","sources":["../src/gauntlet.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACtH,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,CA4C1D"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * grpcGauntlet โ€” the LIVE, measured proof that the Matrix wire works: start a
3
+ * server on an ephemeral loopback port, run real round-trips, MEASURE, shut down.
4
+ * Honest numbers, not adjectives.
5
+ */
6
+ import { createMatrixServer } from "./server.js";
7
+ import { connect, health, invoke, pipeInvoke } from "./client.js";
8
+ import { createHash } from "node:crypto";
9
+ function entropy(n, seed = 1) {
10
+ const out = new Uint8Array(n);
11
+ let off = 0, ctr = 0;
12
+ while (off < n) {
13
+ const b = createHash("sha256").update(`${seed}:${ctr++}`).digest();
14
+ const t = Math.min(b.length, n - off);
15
+ out.set(b.subarray(0, t), off);
16
+ off += t;
17
+ }
18
+ return out;
19
+ }
20
+ export async function grpcGauntlet() {
21
+ const checks = [];
22
+ const metrics = { healthMs: 0, pingMs: 0, largePayloadBytes: 0, framesOverWire: 0, roundTripMs: 0 };
23
+ const srv = await createMatrixServer({ port: 0 });
24
+ const client = connect(`127.0.0.1:${srv.port}`);
25
+ try {
26
+ // 1) Health โ€” the server is up on loopback + advertises the tool surface
27
+ let t = Date.now();
28
+ const h = await health(client);
29
+ metrics.healthMs = Date.now() - t;
30
+ checks.push({ name: "health round-trips on 127.0.0.1", pass: h.ok === true && h.tools > 0, detail: `tools=${h.tools} v=${h.version} ${metrics.healthMs}ms` });
31
+ // 2) Unary Invoke (ping) โ€” the typed door works
32
+ t = Date.now();
33
+ const p = await invoke(client, "matrix.ping");
34
+ metrics.pingMs = Date.now() - t;
35
+ checks.push({ name: "unary Invoke works", pass: p.ok === true && JSON.parse(p.data_json).pong === true, detail: `${metrics.pingMs}ms` });
36
+ // 3) THE BIG ONE โ€” a 5MB payload flows through the chunked Pipe byte-identical
37
+ // (past gRPC's 4MB cap, which would reject a single message).
38
+ const big = entropy(5_000_000, 42);
39
+ const bigStr = Buffer.from(big).toString("base64"); // ~6.7MB string, well over 4MB
40
+ metrics.largePayloadBytes = bigStr.length;
41
+ t = Date.now();
42
+ const echoed = await pipeInvoke(client, "matrix.echo", JSON.stringify({ payload: bigStr }));
43
+ metrics.roundTripMs = Date.now() - t;
44
+ const back = echoed.ok ? JSON.parse(echoed.data_json).payload : "";
45
+ checks.push({ name: "5MB+ payload flows through chunked Pipe byte-identical", pass: back === bigStr, detail: `${(bigStr.length / 1e6).toFixed(1)}MB round-trip ${metrics.roundTripMs}ms (4MB cap bypassed)` });
46
+ // 4) pipe integrity surfaces on a real wire (a real tool via Pipe carries a proof)
47
+ const real = await pipeInvoke(client, "matrix.ping");
48
+ checks.push({ name: "Pipe carries a real call end-to-end", pass: real.ok === true, detail: "request frames in โ†’ reply frames out" });
49
+ // 5) unknown tool fails cleanly (server stays up โ€” fail-open)
50
+ const bad = await invoke(client, "no.such.tool");
51
+ const stillUp = await health(client);
52
+ checks.push({ name: "unknown tool fails cleanly, server stays up", pass: bad.ok === false && stillUp.ok === true, detail: bad.error.slice(0, 40) });
53
+ const pass = checks.every((c) => c.pass);
54
+ return { score: pass ? 100 : 0, metrics, checks };
55
+ }
56
+ finally {
57
+ client.close();
58
+ await srv.stop();
59
+ }
60
+ }
61
+ //# sourceMappingURL=gauntlet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gauntlet.js","sourceRoot":"","sources":["../src/gauntlet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,OAAO,CAAC,CAAS,EAAE,IAAI,GAAG,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAAC,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IACpD,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAAC,GAAG,IAAI,CAAC,CAAC;IAAC,CAAC;IACxK,OAAO,GAAG,CAAC;AACb,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAA2D,EAAE,CAAC;IAC1E,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACpG,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,yEAAyE;QACzE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAE9J,gDAAgD;QAChD,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC9C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAEzI,+EAA+E;QAC/E,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,+BAA+B;QACnF,OAAO,CAAC,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;QAC1C,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAyB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wDAAwD,EAAE,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,WAAW,uBAAuB,EAAE,CAAC,CAAC;QAE/M,mFAAmF;QACnF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,MAAM,EAAE,sCAAsC,EAAE,CAAC,CAAC;QAErI,8DAA8D;QAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,6CAA6C,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAEpJ,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACpD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @mneme-ai/matrix โ€” THE MATRIX RAIL gRPC wire server (local-first).
3
+ * One typed, signed, streaming pipe any AI agent (any language) crosses to reach
4
+ * every Mneme function. Wraps @mneme-ai/core's pipe core. See docs/MATRIX.md.
5
+ */
6
+ export { createMatrixServer, buildImpl, type ServeOptions, type RunningServer } from "./server.js";
7
+ export { connect, health, invoke, pipeInvoke, type MatrixClient, type ToolReply } from "./client.js";
8
+ export { grpcGauntlet, type GrpcGauntlet } from "./gauntlet.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @mneme-ai/matrix โ€” THE MATRIX RAIL gRPC wire server (local-first).
3
+ * One typed, signed, streaming pipe any AI agent (any language) crosses to reach
4
+ * every Mneme function. Wraps @mneme-ai/core's pipe core. See docs/MATRIX.md.
5
+ */
6
+ export { createMatrixServer, buildImpl } from "./server.js";
7
+ export { connect, health, invoke, pipeInvoke } from "./client.js";
8
+ export { grpcGauntlet } from "./gauntlet.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAyC,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAqC,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,YAAY,EAAqB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * THE MATRIX RAIL โ€” gRPC wire server (local-first).
3
+ *
4
+ * The wire shell around @mneme-ai/core's pipe core. Any AI agent, any language,
5
+ * connects over HTTP/2 + Protobuf to reach EVERY Mneme function through one typed
6
+ * door โ€” and a chunked bidi pipe so any-size payload flows byte-identical.
7
+ *
8
+ * Molecules of intelligence at every joint:
9
+ * โ€ข binds 127.0.0.1 ONLY (insecure creds are fine on loopback โ€” no network, air-gap intact)
10
+ * โ€ข Invoke bridges to the SAME tool registry the MCP server uses (buildRuntime +
11
+ * buildToolMap) โ†’ all ~960 tools, zero logic duplication, seamless
12
+ * โ€ข every Invoke response carries a TRUSTLESS Ed25519 `_proof` (verify offline)
13
+ * โ€ข Pipe reassembles with the core's full integrity check (dropped/reordered/
14
+ * tampered chunk caught) and re-chunks the reply โ†’ the 4MB cap is never hit
15
+ * โ€ข every handler is TOTAL โ€” a thrown tool never crashes the server
16
+ * โ€ข fail-open: if a tool/runtime is unavailable, the call returns ok:false, the
17
+ * server stays up, and the agent can fall back to MCP/CLI
18
+ */
19
+ import * as grpc from "@grpc/grpc-js";
20
+ /** The discovery file any agent reads to find the running rail (zero-command wiring). */
21
+ export declare function discoveryPath(cwd: string): string;
22
+ export interface ServeOptions {
23
+ cwd?: string;
24
+ host?: string;
25
+ port?: number;
26
+ idleMs?: number;
27
+ }
28
+ export interface RunningServer {
29
+ server: grpc.Server;
30
+ port: number;
31
+ host: string;
32
+ stop: () => Promise<void>;
33
+ }
34
+ /** Build the gRPC service implementation bound to a repo root. Pure of network.
35
+ * `touch` is called on every request so the server can self-reap when idle. */
36
+ export declare function buildImpl(cwd: string, touch?: () => void): {
37
+ Invoke: (call: any, cb: any) => void;
38
+ Health: (_call: any, cb: any) => void;
39
+ Pipe: (call: any) => void;
40
+ };
41
+ /** Start the Matrix gRPC server on loopback. Resolves with the bound port. */
42
+ export declare function createMatrixServer(opts?: ServeOptions): Promise<RunningServer>;
43
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAStC,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAA+C;AAcjG,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAOD;gFACgF;AAChF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,IAAe;mBAuChD,GAAG,MAAM,GAAG;oBAOX,GAAG,MAAM,GAAG;iBAGf,GAAG;EAsBnB;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAyClF"}
package/dist/server.js ADDED
@@ -0,0 +1,213 @@
1
+ /**
2
+ * THE MATRIX RAIL โ€” gRPC wire server (local-first).
3
+ *
4
+ * The wire shell around @mneme-ai/core's pipe core. Any AI agent, any language,
5
+ * connects over HTTP/2 + Protobuf to reach EVERY Mneme function through one typed
6
+ * door โ€” and a chunked bidi pipe so any-size payload flows byte-identical.
7
+ *
8
+ * Molecules of intelligence at every joint:
9
+ * โ€ข binds 127.0.0.1 ONLY (insecure creds are fine on loopback โ€” no network, air-gap intact)
10
+ * โ€ข Invoke bridges to the SAME tool registry the MCP server uses (buildRuntime +
11
+ * buildToolMap) โ†’ all ~960 tools, zero logic duplication, seamless
12
+ * โ€ข every Invoke response carries a TRUSTLESS Ed25519 `_proof` (verify offline)
13
+ * โ€ข Pipe reassembles with the core's full integrity check (dropped/reordered/
14
+ * tampered chunk caught) and re-chunks the reply โ†’ the 4MB cap is never hit
15
+ * โ€ข every handler is TOTAL โ€” a thrown tool never crashes the server
16
+ * โ€ข fail-open: if a tool/runtime is unavailable, the call returns ok:false, the
17
+ * server stays up, and the agent can fall back to MCP/CLI
18
+ */
19
+ import * as grpc from "@grpc/grpc-js";
20
+ import * as protoLoader from "@grpc/proto-loader";
21
+ import { fileURLToPath } from "node:url";
22
+ import { dirname, join } from "node:path";
23
+ import { trustless, matrix } from "@mneme-ai/core";
24
+ import { buildRuntime, buildToolMap } from "@mneme-ai/mcp";
25
+ import { createRequire } from "node:module";
26
+ import { writeFileSync, rmSync, mkdirSync, existsSync } from "node:fs";
27
+ /** The discovery file any agent reads to find the running rail (zero-command wiring). */
28
+ export function discoveryPath(cwd) { return join(cwd, ".mneme", "matrix.json"); }
29
+ const PROTO_PATH = join(dirname(fileURLToPath(import.meta.url)), "..", "proto", "mneme.proto");
30
+ const req = createRequire(import.meta.url);
31
+ function version() { try {
32
+ return req("../package.json").version ?? "0.0.0";
33
+ }
34
+ catch {
35
+ return "0.0.0";
36
+ } }
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ function loadMatrixService() {
39
+ const def = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: Number, enums: String, defaults: true, oneofs: true });
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ const pkg = grpc.loadPackageDefinition(def);
42
+ return pkg.mneme.Matrix.service;
43
+ }
44
+ const toWire = (f) => ({ id: f.id, seq: f.seq, total: f.total, orig_bytes: f.origBytes, gz: f.gz, data: Buffer.from(f.data) });
45
+ const fromWire = (w) => ({ id: String(w.id), seq: Number(w.seq), total: Number(w.total), origBytes: Number(w.orig_bytes), gz: !!w.gz, data: w.data instanceof Uint8Array ? w.data : Uint8Array.from(w.data ?? []) });
46
+ /** Build the gRPC service implementation bound to a repo root. Pure of network.
47
+ * `touch` is called on every request so the server can self-reap when idle. */
48
+ export function buildImpl(cwd, touch = () => { }) {
49
+ const toolMap = buildToolMap();
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ let runtime = null;
52
+ let runtimeErr = "";
53
+ async function getRuntime() {
54
+ if (runtime)
55
+ return runtime;
56
+ if (runtimeErr)
57
+ return null;
58
+ try {
59
+ runtime = await buildRuntime(cwd);
60
+ return runtime;
61
+ }
62
+ catch (e) {
63
+ runtimeErr = e.message;
64
+ return null;
65
+ }
66
+ }
67
+ /** The bridge: a tool name + JSON args โ†’ a proof-carrying ToolResponse. Total. */
68
+ async function invoke(tool, argsJson, _heldRoot) {
69
+ try {
70
+ // infra self-test fast-paths โ€” no runtime, no registry (so the wire can be
71
+ // proven for any-size data without building the heavy store/embedder).
72
+ if (tool === "matrix.ping")
73
+ return { ok: true, data_json: JSON.stringify({ pong: true, version: version() }), wisdom: "pong", proof_json: "", error: "" };
74
+ if (tool === "matrix.echo")
75
+ return { ok: true, data_json: argsJson || "{}", wisdom: "echo", proof_json: "", error: "" };
76
+ const t = toolMap.get(tool);
77
+ if (!t)
78
+ return { ok: false, data_json: "{}", wisdom: "", proof_json: "", error: `unknown tool: ${tool}` };
79
+ const rt = await getRuntime();
80
+ if (!rt)
81
+ return { ok: false, data_json: "{}", wisdom: "", proof_json: "", error: `runtime unavailable: ${runtimeErr}` };
82
+ let args = {};
83
+ try {
84
+ args = argsJson ? JSON.parse(argsJson) : {};
85
+ }
86
+ catch {
87
+ return { ok: false, data_json: "{}", wisdom: "", proof_json: "", error: "args_json is not valid JSON" };
88
+ }
89
+ const resp = await t.handler(rt, args);
90
+ const data = (resp?.data ?? {});
91
+ // proof-per-message: bind the response data to an offline-verifiable Ed25519 receipt
92
+ const wrapped = trustless.proofWrap(cwd, `matrix:${tool}`, typeof data === "object" && data ? data : { value: data });
93
+ const proof = wrapped["_proof"];
94
+ return { ok: true, data_json: JSON.stringify(data), wisdom: String(resp?.wisdom ?? ""), proof_json: JSON.stringify(proof ?? null), error: "" };
95
+ }
96
+ catch (e) {
97
+ return { ok: false, data_json: "{}", wisdom: "", proof_json: "", error: e.message };
98
+ }
99
+ }
100
+ return {
101
+ // unary
102
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+ Invoke: (call, cb) => {
104
+ touch();
105
+ const r = call.request ?? {};
106
+ invoke(String(r.tool ?? ""), String(r.args_json ?? ""), r.held_root).then((res) => cb(null, res)).catch((e) => cb(null, { ok: false, data_json: "{}", wisdom: "", proof_json: "", error: e.message }));
107
+ },
108
+ // unary
109
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
110
+ Health: (_call, cb) => { touch(); cb(null, { ok: true, version: version(), tools: toolMap.size, note: "Matrix Rail โ€” 127.0.0.1, proof-carrying, chunked pipe" }); },
111
+ // bidi stream: client streams request frames โ†’ reassemble โ†’ invoke โ†’ stream reply frames
112
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
+ Pipe: (call) => {
114
+ touch();
115
+ const frames = [];
116
+ call.on("data", (w) => { touch(); try {
117
+ frames.push(fromWire(w));
118
+ }
119
+ catch { /* skip bad frame */ } });
120
+ call.on("error", () => { try {
121
+ call.end();
122
+ }
123
+ catch { /* */ } });
124
+ call.on("end", () => {
125
+ (async () => {
126
+ try {
127
+ const asm = matrix.reassemble(frames);
128
+ if (!asm.ok) {
129
+ for (const f of matrix.chunkFrame(JSON.stringify({ ok: false, error: `pipe integrity: ${asm.reason}` })))
130
+ call.write(toWire(f));
131
+ call.end();
132
+ return;
133
+ }
134
+ const reqMsg = matrix.decodeRequest(asm.payload);
135
+ if (!reqMsg) {
136
+ for (const f of matrix.chunkFrame(JSON.stringify({ ok: false, error: "pipe payload is not a ToolRequest" })))
137
+ call.write(toWire(f));
138
+ call.end();
139
+ return;
140
+ }
141
+ const res = await invoke(reqMsg.tool, reqMsg.argsJson, reqMsg.heldRoot);
142
+ for (const f of matrix.chunkFrame(JSON.stringify(res)))
143
+ call.write(toWire(f));
144
+ call.end();
145
+ }
146
+ catch (e) {
147
+ try {
148
+ for (const f of matrix.chunkFrame(JSON.stringify({ ok: false, error: e.message })))
149
+ call.write(toWire(f));
150
+ call.end();
151
+ }
152
+ catch { /* */ }
153
+ }
154
+ })();
155
+ });
156
+ },
157
+ };
158
+ }
159
+ /** Start the Matrix gRPC server on loopback. Resolves with the bound port. */
160
+ export function createMatrixServer(opts = {}) {
161
+ const host = opts.host ?? "127.0.0.1";
162
+ const port = opts.port ?? 0;
163
+ const cwd = opts.cwd ?? process.cwd();
164
+ // SELF-REAPING: the rail shuts itself down after `idleMs` with no requests, so a
165
+ // demand-spawned rail never lingers as an orphan (0 = never reap; tests pass 0).
166
+ const idleMs = opts.idleMs ?? 900_000; // 15 min default
167
+ let lastActivity = Date.now();
168
+ const touch = () => { lastActivity = Date.now(); };
169
+ const server = new grpc.Server({
170
+ // we CHUNK, so we never need to raise the cap โ€” but keep it explicit + sane.
171
+ "grpc.max_receive_message_length": 8 * 1024 * 1024,
172
+ "grpc.max_send_message_length": 8 * 1024 * 1024,
173
+ });
174
+ server.addService(loadMatrixService(), buildImpl(cwd, touch));
175
+ return new Promise((resolve, reject) => {
176
+ server.bindAsync(`${host}:${port}`, grpc.ServerCredentials.createInsecure(), (err, boundPort) => {
177
+ if (err)
178
+ return reject(err);
179
+ // write the discovery file so any agent (any language) finds the rail with
180
+ // NO user command. Best-effort + only for the default loopback serve (skip
181
+ // ephemeral test ports so parallel tests don't fight over the file).
182
+ const disc = discoveryPath(cwd);
183
+ const writeDiscovery = host === "127.0.0.1" && (opts.port ?? 0) !== 0;
184
+ if (writeDiscovery) {
185
+ try {
186
+ mkdirSync(join(cwd, ".mneme"), { recursive: true });
187
+ writeFileSync(disc, JSON.stringify({ host, port: boundPort, pid: process.pid, version: version(), proto: PROTO_PATH, idleMs, at: new Date().toISOString() }));
188
+ }
189
+ catch { /* best-effort */ }
190
+ }
191
+ const cleanup = () => { if (writeDiscovery) {
192
+ try {
193
+ if (existsSync(disc))
194
+ rmSync(disc);
195
+ }
196
+ catch { /* */ }
197
+ } };
198
+ const stop = () => new Promise((res) => { if (reaper)
199
+ clearInterval(reaper); server.tryShutdown(() => { cleanup(); res(); }); });
200
+ // the idle reaper โ€” unref'd so it never keeps the process alive on its own.
201
+ let reaper = null;
202
+ if (idleMs > 0) {
203
+ reaper = setInterval(() => { if (Date.now() - lastActivity > idleMs) {
204
+ void stop();
205
+ } }, Math.min(60_000, Math.max(1_000, Math.floor(idleMs / 5))));
206
+ if (typeof reaper.unref === "function")
207
+ reaper.unref();
208
+ }
209
+ resolve({ server, port: boundPort, host, stop });
210
+ });
211
+ });
212
+ }
213
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@mneme-ai/matrix",
3
+ "version": "2.167.0",
4
+ "description": "THE MATRIX RAIL โ€” the local-first gRPC wire server for Mneme. Any AI agent (any language) connects over HTTP/2 + Protobuf to reach every Mneme function through one typed, signed, streaming pipe. Invoke (unary, proof-carrying) + Pipe (bidi, chunked โ†’ any-size data flows byte-identical, past gRPC's 4MB cap). Binds 127.0.0.1 only; fail-open; wraps @mneme-ai/core's pipe core.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "mneme-matrix": "./dist/bin.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ },
16
+ "./proto": "./proto/mneme.proto"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/patsa2561-art/mneme-ai.git",
21
+ "directory": "packages/matrix"
22
+ },
23
+ "homepage": "https://github.com/patsa2561-art/mneme-ai#readme",
24
+ "bugs": {
25
+ "url": "https://github.com/patsa2561-art/mneme-ai/issues"
26
+ },
27
+ "license": "MIT",
28
+ "files": [
29
+ "dist",
30
+ "proto",
31
+ "README.md"
32
+ ],
33
+ "dependencies": {
34
+ "@grpc/grpc-js": "^1.12.5",
35
+ "@grpc/proto-loader": "^0.7.13",
36
+ "@mneme-ai/core": "2.167.0",
37
+ "@mneme-ai/mcp": "2.167.0"
38
+ }
39
+ }
@@ -0,0 +1,35 @@
1
+ // THE MATRIX RAIL โ€” Mneme's local-first gRPC contract.
2
+ // One typed door (Invoke) to every Mneme function + one chunked bidi pipe (Pipe)
3
+ // so ANY-size payload flows byte-identical, past gRPC's 4MB message cap.
4
+ syntax = "proto3";
5
+ package mneme;
6
+
7
+ service Matrix {
8
+ // Generic gateway โ€” maps 1:1 to the tool registry. Every current AND future
9
+ // tool is reachable here with no schema change. Response carries a TRUSTLESS proof.
10
+ rpc Invoke (ToolRequest) returns (ToolResponse);
11
+
12
+ // The chunked bidi pipe: a client streams the request as ordered, manifested
13
+ // frames; the server reassembles (full integrity check), processes, and streams
14
+ // the response back as frames. Each frame is small (<256KB) so the 4MB cap is
15
+ // never hit, regardless of total payload size.
16
+ rpc Pipe (stream Frame) returns (stream Frame);
17
+
18
+ rpc Health (HealthRequest) returns (HealthReply);
19
+ }
20
+
21
+ message ToolRequest { string tool = 1; string args_json = 2; string held_root = 3; }
22
+ message ToolResponse { bool ok = 1; string data_json = 2; string wisdom = 3; string proof_json = 4; string error = 5; }
23
+
24
+ // One frame of the Matrix pipe (mirrors @mneme-ai/core matrix.Frame).
25
+ message Frame {
26
+ string id = 1; // sha256 of the whole ORIGINAL payload (== integrity manifest)
27
+ uint32 seq = 2; // 0-based order
28
+ uint32 total = 3; // total frame count
29
+ uint32 orig_bytes = 4; // original (decompressed) length
30
+ bool gz = 5; // data is gzip-compressed
31
+ bytes data = 6; // the (possibly compressed) slice
32
+ }
33
+
34
+ message HealthRequest {}
35
+ message HealthReply { bool ok = 1; string version = 2; uint32 tools = 3; string note = 4; }