@mneme-ai/core 2.11.0 → 2.13.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.
Files changed (49) hide show
  1. package/dist/cosmic/aurelian.bench.d.ts +25 -0
  2. package/dist/cosmic/aurelian.bench.d.ts.map +1 -0
  3. package/dist/cosmic/aurelian.bench.js +127 -0
  4. package/dist/cosmic/aurelian.bench.js.map +1 -0
  5. package/dist/cosmic/aurelian_audit.d.ts +112 -0
  6. package/dist/cosmic/aurelian_audit.d.ts.map +1 -0
  7. package/dist/cosmic/aurelian_audit.js +236 -0
  8. package/dist/cosmic/aurelian_audit.js.map +1 -0
  9. package/dist/cosmic/aurelian_recheck.test.d.ts +25 -0
  10. package/dist/cosmic/aurelian_recheck.test.d.ts.map +1 -0
  11. package/dist/cosmic/aurelian_recheck.test.js +127 -0
  12. package/dist/cosmic/aurelian_recheck.test.js.map +1 -0
  13. package/dist/cosmic/benchmark.d.ts +47 -0
  14. package/dist/cosmic/benchmark.d.ts.map +1 -0
  15. package/dist/cosmic/benchmark.js +162 -0
  16. package/dist/cosmic/benchmark.js.map +1 -0
  17. package/dist/cosmic/choir.d.ts +93 -0
  18. package/dist/cosmic/choir.d.ts.map +1 -0
  19. package/dist/cosmic/choir.js +140 -0
  20. package/dist/cosmic/choir.js.map +1 -0
  21. package/dist/cosmic/cosmic.test.js +146 -7
  22. package/dist/cosmic/cosmic.test.js.map +1 -1
  23. package/dist/cosmic/diff.d.ts +41 -0
  24. package/dist/cosmic/diff.d.ts.map +1 -0
  25. package/dist/cosmic/diff.js +154 -0
  26. package/dist/cosmic/diff.js.map +1 -0
  27. package/dist/cosmic/echo_commit.d.ts +79 -0
  28. package/dist/cosmic/echo_commit.d.ts.map +1 -0
  29. package/dist/cosmic/echo_commit.js +108 -0
  30. package/dist/cosmic/echo_commit.js.map +1 -0
  31. package/dist/cosmic/echo_commit.test.d.ts +2 -0
  32. package/dist/cosmic/echo_commit.test.d.ts.map +1 -0
  33. package/dist/cosmic/echo_commit.test.js +81 -0
  34. package/dist/cosmic/echo_commit.test.js.map +1 -0
  35. package/dist/cosmic/index.d.ts +83 -0
  36. package/dist/cosmic/index.d.ts.map +1 -1
  37. package/dist/cosmic/index.js +180 -13
  38. package/dist/cosmic/index.js.map +1 -1
  39. package/dist/cosmic/v213.test.d.ts +2 -0
  40. package/dist/cosmic/v213.test.d.ts.map +1 -0
  41. package/dist/cosmic/v213.test.js +267 -0
  42. package/dist/cosmic/v213.test.js.map +1 -0
  43. package/dist/nexus_lock/nexus_lock.test.js +6 -4
  44. package/dist/nexus_lock/nexus_lock.test.js.map +1 -1
  45. package/dist/nexus_lock/soul_prompt_v2.d.ts +6 -1
  46. package/dist/nexus_lock/soul_prompt_v2.d.ts.map +1 -1
  47. package/dist/nexus_lock/soul_prompt_v2.js +5 -3
  48. package/dist/nexus_lock/soul_prompt_v2.js.map +1 -1
  49. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from "vitest";
2
- import { mintSession, publishToCosmic, revokeCosmic, readCosmic, formatCosmicPulseLine } from "./index.js";
2
+ import { mintSession, publishToCosmic, revokeCosmic, readCosmic, formatCosmicPulseLine, heartbeatCosmic, pushHomunculusReturn, readInbox, getCosmicPresence, } from "./index.js";
3
3
  import { createHash } from "node:crypto";
4
4
  // In-memory mock that emulates the COSMIC server enough for client tests.
5
5
  function makeMockServer() {
@@ -7,20 +7,61 @@ function makeMockServer() {
7
7
  return (async (input, init) => {
8
8
  const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
9
9
  const u = new URL(url);
10
- const m = u.pathname.match(/^\/api\/v1\/sessions\/([A-Za-z0-9_-]+)(\.json|\/revoke)?$/);
10
+ const method = init?.method ?? "GET";
11
+ // v2.12 routes
12
+ let m = u.pathname.match(/^\/api\/v1\/sessions\/([A-Za-z0-9_-]+)\/heartbeat$/);
13
+ if (m) {
14
+ const sess = sessions.get(m[1]);
15
+ if (!sess)
16
+ return new Response(JSON.stringify({ error: "no session" }), { status: 404 });
17
+ sess.lastHb = Date.now();
18
+ return new Response(JSON.stringify({ ok: true, ts: sess.lastHb, zombie: false }), { status: 200 });
19
+ }
20
+ m = u.pathname.match(/^\/api\/v1\/sessions\/([A-Za-z0-9_-]+)\/inbox$/);
21
+ if (m) {
22
+ const sess = sessions.get(m[1]);
23
+ if (!sess)
24
+ return new Response(JSON.stringify({ error: "no session" }), { status: 404 });
25
+ if (method === "POST") {
26
+ sess.inbox.push({ receivedAt: new Date().toISOString(), vendor: "test", body: String(init?.body ?? "") });
27
+ return new Response(JSON.stringify({ ok: true, count: sess.inbox.length }), { status: 201 });
28
+ }
29
+ if (method === "GET") {
30
+ const items = sess.inbox.slice();
31
+ const drained = init?.headers?.["x-drain"] === "1";
32
+ if (drained)
33
+ sess.inbox.length = 0;
34
+ return new Response(JSON.stringify({ items, count: items.length, drained }), { status: 200 });
35
+ }
36
+ }
37
+ m = u.pathname.match(/^\/api\/v1\/sessions\/([A-Za-z0-9_-]+)\/presence$/);
38
+ if (m) {
39
+ const sess = sessions.get(m[1]);
40
+ if (!sess)
41
+ return new Response(JSON.stringify({ error: "no session" }), { status: 404 });
42
+ return new Response(JSON.stringify({
43
+ token: m[1], watchers: sess.watchers, publishCount: sess.count,
44
+ lastPublishTs: sess.lastTs, lastHeartbeatTs: sess.lastHb || null, zombie: false,
45
+ }), { status: 200 });
46
+ }
47
+ // v2.11 routes
48
+ m = u.pathname.match(/^\/api\/v1\/sessions\/([A-Za-z0-9_-]+)(\.json|\/revoke)?$/);
11
49
  if (!m)
12
50
  return new Response(JSON.stringify({ error: "no route" }), { status: 404 });
13
51
  const token = m[1];
14
52
  const suffix = m[2];
15
- if (init?.method === "POST" && suffix === "/revoke") {
53
+ if (method === "POST" && suffix === "/revoke") {
16
54
  sessions.delete(token);
17
55
  return new Response(JSON.stringify({ ok: true }), { status: 200 });
18
56
  }
19
- if (init?.method === "POST" && !suffix) {
57
+ if (method === "POST" && !suffix) {
20
58
  const body = JSON.parse(init.body);
21
59
  const exists = sessions.get(token);
22
60
  if (!exists) {
23
- sessions.set(token, { state: body.state, adminSecretHash: body.adminSecretHash, count: 1, lastTs: Date.now() });
61
+ sessions.set(token, {
62
+ state: body.state, adminSecretHash: body.adminSecretHash,
63
+ count: 1, lastTs: Date.now(), lastHb: 0, inbox: [], watchers: [],
64
+ });
24
65
  return new Response(JSON.stringify({ ok: true, count: 1, prevSig: null, newSig: "sig1" }), { status: 201 });
25
66
  }
26
67
  exists.state = body.state;
@@ -28,11 +69,14 @@ function makeMockServer() {
28
69
  exists.lastTs = Date.now();
29
70
  return new Response(JSON.stringify({ ok: true, count: exists.count, prevSig: "sig" + (exists.count - 1), newSig: "sig" + exists.count }), { status: 200 });
30
71
  }
31
- if (init?.method === undefined && suffix === ".json") {
72
+ if (method === "GET" && suffix === ".json") {
32
73
  const sess = sessions.get(token);
33
74
  if (!sess)
34
75
  return new Response(JSON.stringify({ error: "not found" }), { status: 404 });
35
- return new Response(JSON.stringify({ token, state: sess.state, lastPublishTs: sess.lastTs, publishCount: sess.count, stale: false }), { status: 200 });
76
+ return new Response(JSON.stringify({
77
+ token, state: sess.state, lastPublishTs: sess.lastTs, publishCount: sess.count,
78
+ stale: false, zombie: false, watchers: sess.watchers.length,
79
+ }), { status: 200 });
36
80
  }
37
81
  return new Response(JSON.stringify({ error: "no route" }), { status: 404 });
38
82
  });
@@ -120,4 +164,99 @@ describe("v2.11 COSMIC LINK · client", () => {
120
164
  expect(line).toContain("sig=abcdef12");
121
165
  });
122
166
  });
167
+ describe("v2.12 COSMIC LINK · NOBEL helpers", () => {
168
+ it("heartbeatCosmic refreshes liveness with HMAC", async () => {
169
+ const fetch = makeMockServer();
170
+ const s = mintSession({ serverUrl: "https://cosmic.example.com" });
171
+ await publishToCosmic({ session: s, state: { v: "2.12.0" }, fetchOverride: fetch });
172
+ const r = await heartbeatCosmic(s, fetch);
173
+ expect(r.ok).toBe(true);
174
+ expect(r.zombie).toBe(false);
175
+ expect(typeof r.ts).toBe("number");
176
+ });
177
+ it("heartbeatCosmic on unknown token returns 404", async () => {
178
+ const fetch = makeMockServer();
179
+ const s = mintSession({ serverUrl: "https://cosmic.example.com" });
180
+ const r = await heartbeatCosmic(s, fetch);
181
+ expect(r.ok).toBe(false);
182
+ expect(r.error).toContain("no session");
183
+ });
184
+ it("heartbeatCosmic includes Authorization Bearer header", async () => {
185
+ let captured;
186
+ const sniff = (async (_input, init) => {
187
+ captured = init?.headers?.["authorization"];
188
+ return new Response(JSON.stringify({ ok: true, ts: 1, zombie: false }), { status: 200 });
189
+ });
190
+ const s = mintSession({ serverUrl: "https://x.com" });
191
+ await heartbeatCosmic(s, sniff);
192
+ expect(captured).toMatch(/^Bearer [0-9a-f]{64}$/);
193
+ });
194
+ it("pushHomunculusReturn POSTs to /inbox endpoint (open, no auth)", async () => {
195
+ const fetch = makeMockServer();
196
+ const s = mintSession({ serverUrl: "https://cosmic.example.com" });
197
+ await publishToCosmic({ session: s, state: {}, fetchOverride: fetch });
198
+ const r = await pushHomunculusReturn(s.jsonUrl, "# HOMUNCULUS RETURN\necho: ack", fetch);
199
+ expect(r.ok).toBe(true);
200
+ expect(r.count).toBe(1);
201
+ });
202
+ it("pushHomunculusReturn derives /inbox from .json URL", async () => {
203
+ let calledUrl;
204
+ const sniff = (async (input) => {
205
+ calledUrl = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
206
+ return new Response(JSON.stringify({ ok: true, count: 1 }), { status: 201 });
207
+ });
208
+ await pushHomunculusReturn("https://x.com/api/v1/sessions/abc.json", "body", sniff);
209
+ expect(calledUrl).toBe("https://x.com/api/v1/sessions/abc/inbox");
210
+ });
211
+ it("readInbox drains when drain=true (HMAC-auth)", async () => {
212
+ const fetch = makeMockServer();
213
+ const s = mintSession({ serverUrl: "https://cosmic.example.com" });
214
+ await publishToCosmic({ session: s, state: {}, fetchOverride: fetch });
215
+ await pushHomunculusReturn(s.jsonUrl, "first", fetch);
216
+ await pushHomunculusReturn(s.jsonUrl, "second", fetch);
217
+ const r1 = await readInbox(s, { fetchOverride: fetch });
218
+ expect(r1.ok).toBe(true);
219
+ expect(r1.count).toBe(2);
220
+ expect(r1.drained).toBe(false);
221
+ const r2 = await readInbox(s, { drain: true, fetchOverride: fetch });
222
+ expect(r2.drained).toBe(true);
223
+ const r3 = await readInbox(s, { fetchOverride: fetch });
224
+ expect(r3.count).toBe(0);
225
+ });
226
+ it("readInbox returns ok=false on network error", async () => {
227
+ const fail = async () => { throw new Error("ENOTFOUND"); };
228
+ const s = mintSession({ serverUrl: "https://cosmic.example.com" });
229
+ const r = await readInbox(s, { fetchOverride: fail });
230
+ expect(r.ok).toBe(false);
231
+ expect(r.error).toContain("ENOTFOUND");
232
+ });
233
+ it("getCosmicPresence returns watcher list + zombie flag", async () => {
234
+ const fetch = makeMockServer();
235
+ const s = mintSession({ serverUrl: "https://cosmic.example.com" });
236
+ await publishToCosmic({ session: s, state: {}, fetchOverride: fetch });
237
+ const r = await getCosmicPresence(s.jsonUrl, fetch);
238
+ expect(r.ok).toBe(true);
239
+ expect(Array.isArray(r.watchers)).toBe(true);
240
+ expect(r.zombie).toBe(false);
241
+ expect(r.publishCount).toBe(1);
242
+ });
243
+ it("getCosmicPresence derives /presence URL from /.json URL", async () => {
244
+ let calledUrl;
245
+ const sniff = (async (input) => {
246
+ calledUrl = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
247
+ return new Response(JSON.stringify({ watchers: [] }), { status: 200 });
248
+ });
249
+ await getCosmicPresence("https://x.com/api/v1/sessions/abc.json", sniff);
250
+ expect(calledUrl).toBe("https://x.com/api/v1/sessions/abc/presence");
251
+ });
252
+ it("readCosmic exposes new v2.12 fields (zombie, watchers count)", async () => {
253
+ const fetch = makeMockServer();
254
+ const s = mintSession({ serverUrl: "https://cosmic.example.com" });
255
+ await publishToCosmic({ session: s, state: { v: "2.12.0" }, fetchOverride: fetch });
256
+ const raw = await fetch(s.jsonUrl);
257
+ const j = await raw.json();
258
+ expect(j.zombie).toBe(false);
259
+ expect(typeof j.watchers).toBe("number");
260
+ });
261
+ });
123
262
  //# sourceMappingURL=cosmic.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cosmic.test.js","sourceRoot":"","sources":["../../src/cosmic/cosmic.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cosmic.test.js","sourceRoot":"","sources":["../../src/cosmic/cosmic.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * v2.13.0 — Minimal JSON Patch (RFC 6902 subset) for cosmic incremental
3
+ * publishes.
4
+ *
5
+ * Why not pull a dep? Cosmic state is small (typically < 4KB), the patch
6
+ * shape is bounded (publishes are version + commit + timestamp updates),
7
+ * and the cosmic server is single-file zero-deps. A 100-line implementation
8
+ * we control beats a 50KB transitive tree we don't.
9
+ *
10
+ * Supported ops: add / replace / remove. Move/copy/test omitted as they
11
+ * don't appear in any cosmic state-update pattern.
12
+ *
13
+ * Path encoding follows RFC 6901 (JSON Pointer): "/a/b" → state.a.b.
14
+ * "/" is the root. ~0 escapes ~, ~1 escapes /.
15
+ */
16
+ export interface JsonPatchOp {
17
+ op: "add" | "replace" | "remove";
18
+ path: string;
19
+ value?: unknown;
20
+ }
21
+ type JsonValue = unknown;
22
+ /**
23
+ * Diff two JSON values; returns a list of patch ops that, applied to `before`,
24
+ * produce `after`. Optimised for cosmic state shape (objects of scalars +
25
+ * small arrays). Arrays are handled by full-replace when they differ — a
26
+ * cosmic publish never makes large array edits, so structural array diffing
27
+ * isn't worth the byte cost.
28
+ */
29
+ export declare function makePatch(before: JsonValue, after: JsonValue, prefix?: string): JsonPatchOp[];
30
+ /** Apply a patch list to a deep copy of `state` and return the new value. */
31
+ export declare function applyPatch(state: JsonValue, ops: JsonPatchOp[]): JsonValue;
32
+ /**
33
+ * Decide whether a patch is "worth shipping" vs sending the full state.
34
+ * For cosmic, shipping the patch is only smarter than the full state when
35
+ * the patch is materially smaller. We require at least 30% reduction OR
36
+ * a 200-byte savings — below that, the round-trip risk (server applies
37
+ * patch wrong, drift) outweighs the byte win.
38
+ */
39
+ export declare function patchIsWorthIt(beforeBytes: number, patchBytes: number): boolean;
40
+ export {};
41
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/cosmic/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,KAAK,SAAS,GAAG,OAAO,CAAC;AAoBzB;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAK,GAAG,WAAW,EAAE,CA8BzF;AAoBD,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,SAAS,CAM1E;AA4BD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAK/E"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * v2.13.0 — Minimal JSON Patch (RFC 6902 subset) for cosmic incremental
3
+ * publishes.
4
+ *
5
+ * Why not pull a dep? Cosmic state is small (typically < 4KB), the patch
6
+ * shape is bounded (publishes are version + commit + timestamp updates),
7
+ * and the cosmic server is single-file zero-deps. A 100-line implementation
8
+ * we control beats a 50KB transitive tree we don't.
9
+ *
10
+ * Supported ops: add / replace / remove. Move/copy/test omitted as they
11
+ * don't appear in any cosmic state-update pattern.
12
+ *
13
+ * Path encoding follows RFC 6901 (JSON Pointer): "/a/b" → state.a.b.
14
+ * "/" is the root. ~0 escapes ~, ~1 escapes /.
15
+ */
16
+ function isObject(v) {
17
+ return typeof v === "object" && v !== null && !Array.isArray(v);
18
+ }
19
+ function escapePart(s) {
20
+ return s.replace(/~/g, "~0").replace(/\//g, "~1");
21
+ }
22
+ function unescapePart(s) {
23
+ return s.replace(/~1/g, "/").replace(/~0/g, "~");
24
+ }
25
+ function pointerToParts(ptr) {
26
+ if (ptr === "" || ptr === "/")
27
+ return [];
28
+ return ptr.split("/").slice(1).map(unescapePart);
29
+ }
30
+ /**
31
+ * Diff two JSON values; returns a list of patch ops that, applied to `before`,
32
+ * produce `after`. Optimised for cosmic state shape (objects of scalars +
33
+ * small arrays). Arrays are handled by full-replace when they differ — a
34
+ * cosmic publish never makes large array edits, so structural array diffing
35
+ * isn't worth the byte cost.
36
+ */
37
+ export function makePatch(before, after, prefix = "") {
38
+ // Same reference / primitive equal — no-op.
39
+ if (before === after)
40
+ return [];
41
+ if (typeof before !== typeof after || Array.isArray(before) !== Array.isArray(after) || (before === null) !== (after === null)) {
42
+ return [{ op: "replace", path: prefix || "/", value: after }];
43
+ }
44
+ if (Array.isArray(before) && Array.isArray(after)) {
45
+ // Compare structurally; if arrays match shallowly, no op. Otherwise replace.
46
+ if (before.length === after.length && before.every((v, i) => deepEqual(v, after[i])))
47
+ return [];
48
+ return [{ op: "replace", path: prefix || "/", value: after }];
49
+ }
50
+ if (isObject(before) && isObject(after)) {
51
+ const ops = [];
52
+ // Removals first — keys present in before but not after.
53
+ for (const k of Object.keys(before)) {
54
+ if (!(k in after))
55
+ ops.push({ op: "remove", path: `${prefix}/${escapePart(k)}` });
56
+ }
57
+ // Additions / replacements.
58
+ for (const k of Object.keys(after)) {
59
+ const path = `${prefix}/${escapePart(k)}`;
60
+ if (!(k in before))
61
+ ops.push({ op: "add", path, value: after[k] });
62
+ else if (!deepEqual(before[k], after[k])) {
63
+ // Recurse so we get fine-grained patches inside nested objects.
64
+ ops.push(...makePatch(before[k], after[k], path));
65
+ }
66
+ }
67
+ return ops;
68
+ }
69
+ // Both are scalars and differ.
70
+ return [{ op: "replace", path: prefix || "/", value: after }];
71
+ }
72
+ function deepEqual(a, b) {
73
+ if (a === b)
74
+ return true;
75
+ if (a === null || b === null)
76
+ return a === b;
77
+ if (typeof a !== typeof b)
78
+ return false;
79
+ if (Array.isArray(a) && Array.isArray(b)) {
80
+ if (a.length !== b.length)
81
+ return false;
82
+ for (let i = 0; i < a.length; i++)
83
+ if (!deepEqual(a[i], b[i]))
84
+ return false;
85
+ return true;
86
+ }
87
+ if (isObject(a) && isObject(b)) {
88
+ const ak = Object.keys(a), bk = Object.keys(b);
89
+ if (ak.length !== bk.length)
90
+ return false;
91
+ for (const k of ak)
92
+ if (!deepEqual(a[k], b[k]))
93
+ return false;
94
+ return true;
95
+ }
96
+ return false;
97
+ }
98
+ /** Apply a patch list to a deep copy of `state` and return the new value. */
99
+ export function applyPatch(state, ops) {
100
+ let cur = JSON.parse(JSON.stringify(state ?? null));
101
+ for (const op of ops) {
102
+ cur = applyOne(cur, op);
103
+ }
104
+ return cur;
105
+ }
106
+ function applyOne(state, op) {
107
+ const parts = pointerToParts(op.path);
108
+ if (parts.length === 0) {
109
+ // Operating on root.
110
+ if (op.op === "remove")
111
+ return null;
112
+ return op.value ?? null;
113
+ }
114
+ const last = parts[parts.length - 1];
115
+ let cur = state;
116
+ for (let i = 0; i < parts.length - 1; i++) {
117
+ const k = parts[i];
118
+ if (!isObject(cur) && !Array.isArray(cur))
119
+ throw new Error(`patch path traverses non-object at ${parts.slice(0, i + 1).join("/")}`);
120
+ cur = cur[k];
121
+ if (cur === undefined)
122
+ throw new Error(`patch path missing at ${parts.slice(0, i + 1).join("/")}`);
123
+ }
124
+ if (!isObject(cur) && !Array.isArray(cur))
125
+ throw new Error(`patch parent not container for ${op.path}`);
126
+ if (op.op === "remove") {
127
+ if (Array.isArray(cur))
128
+ cur.splice(parseInt(last, 10), 1);
129
+ else
130
+ delete cur[last];
131
+ }
132
+ else {
133
+ if (Array.isArray(cur))
134
+ cur[parseInt(last, 10)] = op.value;
135
+ else
136
+ cur[last] = op.value;
137
+ }
138
+ return state;
139
+ }
140
+ /**
141
+ * Decide whether a patch is "worth shipping" vs sending the full state.
142
+ * For cosmic, shipping the patch is only smarter than the full state when
143
+ * the patch is materially smaller. We require at least 30% reduction OR
144
+ * a 200-byte savings — below that, the round-trip risk (server applies
145
+ * patch wrong, drift) outweighs the byte win.
146
+ */
147
+ export function patchIsWorthIt(beforeBytes, patchBytes) {
148
+ const saving = beforeBytes - patchBytes;
149
+ if (saving <= 0)
150
+ return false;
151
+ const ratio = saving / beforeBytes;
152
+ return ratio >= 0.3 || saving >= 200;
153
+ }
154
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/cosmic/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * v2.13.0 — ECHO-FROM-COMMITS
3
+ *
4
+ * "When every server in your choir is unreachable AND your laptop is
5
+ * closed AND the dpaste rescue paste was deleted — git itself still
6
+ * remembers. The last cosmic state lives as an HMAC-signed git note
7
+ * on HEAD. Clone the repo, run `git notes show`, recover the state
8
+ * with zero network."
9
+ *
10
+ * Wild because: every other handoff system assumes "the network is up".
11
+ * ECHO-FROM-COMMITS treats the user's git history as the deepest possible
12
+ * fallback. State travels with the code that produced it. A teammate
13
+ * pulling the repo six months later can verify what the AI thought was
14
+ * true at commit X.
15
+ *
16
+ * Wise because: it composes with git's existing storage, refspecs, and
17
+ * push semantics. Nothing custom; just a structured payload in the
18
+ * `refs/notes/cosmic` namespace.
19
+ *
20
+ * Performance: writes ~1KB per commit. git's own gc handles cleanup.
21
+ * Reads are O(1) via `git notes show`.
22
+ */
23
+ export interface EchoEnvelope {
24
+ v: 1;
25
+ /** ISO timestamp of when the echo was written. */
26
+ ts: string;
27
+ /** Cosmic state at the time of the echo. */
28
+ state: Record<string, unknown>;
29
+ /** Optional cosmic publicUrl — useful for the reader to know the live URL. */
30
+ cosmicUrl?: string;
31
+ /** Per-seat hashes if echoed alongside a CELESTIAL CHOIR session. */
32
+ choirHashes?: Array<{
33
+ serverUrl: string;
34
+ stateHash: string;
35
+ }>;
36
+ /** HMAC over canonical(envelope-without-sig). */
37
+ sig: string;
38
+ }
39
+ export interface WriteEchoInput {
40
+ repoDir: string;
41
+ commitSha?: string;
42
+ state: Record<string, unknown>;
43
+ cosmicUrl?: string;
44
+ choirHashes?: Array<{
45
+ serverUrl: string;
46
+ stateHash: string;
47
+ }>;
48
+ /** HMAC secret — must be the same secret the reader uses to verify. */
49
+ secret: string;
50
+ }
51
+ export interface WriteEchoResult {
52
+ ok: boolean;
53
+ commitSha?: string;
54
+ envelope?: EchoEnvelope;
55
+ error?: string;
56
+ }
57
+ /** Write an HMAC-signed echo envelope as a git note on the target commit. */
58
+ export declare function writeEchoToCommit(input: WriteEchoInput): WriteEchoResult;
59
+ export interface ReadEchoResult {
60
+ ok: boolean;
61
+ commitSha?: string;
62
+ envelope?: EchoEnvelope;
63
+ /** True iff the HMAC verified against the supplied secret. */
64
+ verified: boolean;
65
+ reason?: string;
66
+ }
67
+ /** Read + verify an echo envelope from the target commit. */
68
+ export declare function readEchoFromCommit(repoDir: string, commitSha: string | undefined, secret: string): ReadEchoResult;
69
+ /** Push the echoes ref to a remote so collaborators get them on fetch. */
70
+ export declare function pushEchoesToRemote(repoDir: string, remote?: string): {
71
+ ok: boolean;
72
+ error?: string;
73
+ };
74
+ /** Pull the echoes ref from a remote. */
75
+ export declare function fetchEchoesFromRemote(repoDir: string, remote?: string): {
76
+ ok: boolean;
77
+ error?: string;
78
+ };
79
+ //# sourceMappingURL=echo_commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"echo_commit.d.ts","sourceRoot":"","sources":["../../src/cosmic/echo_commit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,CAAC,CAAC;IACL,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;CACb;AAmBD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAyBxE;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAoBjH;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAGtG;AAED,yCAAyC;AACzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAGzG"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * v2.13.0 — ECHO-FROM-COMMITS
3
+ *
4
+ * "When every server in your choir is unreachable AND your laptop is
5
+ * closed AND the dpaste rescue paste was deleted — git itself still
6
+ * remembers. The last cosmic state lives as an HMAC-signed git note
7
+ * on HEAD. Clone the repo, run `git notes show`, recover the state
8
+ * with zero network."
9
+ *
10
+ * Wild because: every other handoff system assumes "the network is up".
11
+ * ECHO-FROM-COMMITS treats the user's git history as the deepest possible
12
+ * fallback. State travels with the code that produced it. A teammate
13
+ * pulling the repo six months later can verify what the AI thought was
14
+ * true at commit X.
15
+ *
16
+ * Wise because: it composes with git's existing storage, refspecs, and
17
+ * push semantics. Nothing custom; just a structured payload in the
18
+ * `refs/notes/cosmic` namespace.
19
+ *
20
+ * Performance: writes ~1KB per commit. git's own gc handles cleanup.
21
+ * Reads are O(1) via `git notes show`.
22
+ */
23
+ import { spawnSync } from "node:child_process";
24
+ import { createHmac, timingSafeEqual } from "node:crypto";
25
+ const NOTES_REF = "refs/notes/cosmic";
26
+ function gitArgs(repoDir, args) {
27
+ const r = spawnSync("git", args, { cwd: repoDir, encoding: "utf8" });
28
+ return { ok: r.status === 0, stdout: r.stdout?.trim() ?? "", stderr: r.stderr?.trim() ?? "" };
29
+ }
30
+ /** Stable JSON serialisation so the HMAC matches across implementations. */
31
+ function canonicalise(v) {
32
+ if (v === null || typeof v !== "object")
33
+ return JSON.stringify(v);
34
+ if (Array.isArray(v))
35
+ return "[" + v.map(canonicalise).join(",") + "]";
36
+ const keys = Object.keys(v).sort();
37
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canonicalise(v[k])).join(",") + "}";
38
+ }
39
+ function signEnvelope(env, secret) {
40
+ return createHmac("sha256", secret).update(canonicalise(env)).digest("hex");
41
+ }
42
+ /** Write an HMAC-signed echo envelope as a git note on the target commit. */
43
+ export function writeEchoToCommit(input) {
44
+ // Resolve target commit.
45
+ const ref = input.commitSha ?? "HEAD";
46
+ const rev = gitArgs(input.repoDir, ["rev-parse", ref]);
47
+ if (!rev.ok)
48
+ return { ok: false, error: `git rev-parse failed: ${rev.stderr}` };
49
+ const sha = rev.stdout;
50
+ const envWithoutSig = {
51
+ v: 1,
52
+ ts: new Date().toISOString(),
53
+ state: input.state,
54
+ ...(input.cosmicUrl ? { cosmicUrl: input.cosmicUrl } : {}),
55
+ ...(input.choirHashes ? { choirHashes: input.choirHashes } : {}),
56
+ };
57
+ const sig = signEnvelope(envWithoutSig, input.secret);
58
+ const envelope = { ...envWithoutSig, sig };
59
+ const payload = JSON.stringify(envelope);
60
+ // git notes add -f --ref refs/notes/cosmic -m <payload> <sha>
61
+ // -f overwrites any prior echo on the same commit (last-write-wins).
62
+ const add = gitArgs(input.repoDir, [
63
+ "notes", "--ref", NOTES_REF, "add", "-f", "-m", payload, sha,
64
+ ]);
65
+ if (!add.ok)
66
+ return { ok: false, error: `git notes add failed: ${add.stderr}` };
67
+ return { ok: true, commitSha: sha, envelope };
68
+ }
69
+ /** Read + verify an echo envelope from the target commit. */
70
+ export function readEchoFromCommit(repoDir, commitSha, secret) {
71
+ const ref = commitSha ?? "HEAD";
72
+ const rev = gitArgs(repoDir, ["rev-parse", ref]);
73
+ if (!rev.ok)
74
+ return { ok: false, verified: false, reason: `git rev-parse failed: ${rev.stderr}` };
75
+ const sha = rev.stdout;
76
+ const show = gitArgs(repoDir, ["notes", "--ref", NOTES_REF, "show", sha]);
77
+ if (!show.ok)
78
+ return { ok: false, commitSha: sha, verified: false, reason: `no echo at ${sha.slice(0, 8)}` };
79
+ let envelope;
80
+ try {
81
+ envelope = JSON.parse(show.stdout);
82
+ }
83
+ catch {
84
+ return { ok: false, commitSha: sha, verified: false, reason: "envelope is not valid JSON" };
85
+ }
86
+ // Verify HMAC.
87
+ const { sig, ...rest } = envelope;
88
+ const expected = signEnvelope(rest, secret);
89
+ let verified = false;
90
+ try {
91
+ verified = timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(sig, "hex"));
92
+ }
93
+ catch {
94
+ verified = false;
95
+ }
96
+ return { ok: true, commitSha: sha, envelope, verified, reason: verified ? undefined : "HMAC mismatch — wrong secret or tampered" };
97
+ }
98
+ /** Push the echoes ref to a remote so collaborators get them on fetch. */
99
+ export function pushEchoesToRemote(repoDir, remote = "origin") {
100
+ const r = gitArgs(repoDir, ["push", remote, `${NOTES_REF}:${NOTES_REF}`]);
101
+ return { ok: r.ok, error: r.ok ? undefined : r.stderr };
102
+ }
103
+ /** Pull the echoes ref from a remote. */
104
+ export function fetchEchoesFromRemote(repoDir, remote = "origin") {
105
+ const r = gitArgs(repoDir, ["fetch", remote, `${NOTES_REF}:${NOTES_REF}`]);
106
+ return { ok: r.ok, error: r.ok ? undefined : r.stderr };
107
+ }
108
+ //# sourceMappingURL=echo_commit.js.map