@mneme-ai/core 2.19.30 → 2.19.31

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 (34) hide show
  1. package/dist/beacon/beacon.test.js +44 -0
  2. package/dist/beacon/beacon.test.js.map +1 -1
  3. package/dist/beacon/index.d.ts.map +1 -1
  4. package/dist/beacon/index.js +5 -1
  5. package/dist/beacon/index.js.map +1 -1
  6. package/dist/cosmic/aurelian_v1931.test.d.ts +2 -0
  7. package/dist/cosmic/aurelian_v1931.test.d.ts.map +1 -0
  8. package/dist/cosmic/aurelian_v1931.test.js +67 -0
  9. package/dist/cosmic/aurelian_v1931.test.js.map +1 -0
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/synapse_sync/index.d.ts +142 -0
  15. package/dist/synapse_sync/index.d.ts.map +1 -0
  16. package/dist/synapse_sync/index.js +323 -0
  17. package/dist/synapse_sync/index.js.map +1 -0
  18. package/dist/synapse_sync/synapse_sync.test.d.ts +2 -0
  19. package/dist/synapse_sync/synapse_sync.test.d.ts.map +1 -0
  20. package/dist/synapse_sync/synapse_sync.test.js +363 -0
  21. package/dist/synapse_sync/synapse_sync.test.js.map +1 -0
  22. package/dist/truth_forensic_pipeline/index.d.ts +24 -0
  23. package/dist/truth_forensic_pipeline/index.d.ts.map +1 -1
  24. package/dist/truth_forensic_pipeline/index.js +110 -4
  25. package/dist/truth_forensic_pipeline/index.js.map +1 -1
  26. package/dist/truth_forensic_pipeline/truth_forensic_pipeline.test.js +83 -0
  27. package/dist/truth_forensic_pipeline/truth_forensic_pipeline.test.js.map +1 -1
  28. package/dist/whats_new.d.ts.map +1 -1
  29. package/dist/whats_new.js +8 -0
  30. package/dist/whats_new.js.map +1 -1
  31. package/dist/wrapper_genesis/index.d.ts.map +1 -1
  32. package/dist/wrapper_genesis/index.js +12 -0
  33. package/dist/wrapper_genesis/index.js.map +1 -1
  34. package/package.json +1 -1
@@ -0,0 +1,323 @@
1
+ /**
2
+ * v2.19.31 — MNEME CROSS-DEVICE SYNAPSE SYNC (Phase D of SYNAPSE GENESIS)
3
+ *
4
+ * "บั๊กใหญ่มาก — ไม่สามารถ sync brain ข้าม device ได้. ต้องทำให้ใช้
5
+ * ได้ ผมถึงบอกว่าคุณต้องเทสเยอะๆ ว่ามัน sync brain ได้จริงๆ ข้าม mobile
6
+ * + computer + notebook"
7
+ * — user mandate, 2026-05-17
8
+ *
9
+ * Diagnosis: v2.19.29 SYNAPSE GENESIS learned weights locally. v2.19.30
10
+ * SOUL EMBALMING preserved them across BAN. Neither handles the third
11
+ * axis: the user works on mobile, laptop, and desktop. Each grows its
12
+ * own synapse store. Without a merge protocol, every device re-learns
13
+ * the same lessons from scratch and the brain never unifies.
14
+ *
15
+ * The protocol must be:
16
+ * - CRDT (commutative, associative, idempotent) so merge order
17
+ * doesn't matter (mobile→laptop ≡ laptop→mobile)
18
+ * - "Last-strongest-wins" per synapse key — the device that has
19
+ * observed a synapse most strongly / most recently provides the
20
+ * canonical weight, BUT permanent=true is sticky (once any device
21
+ * has crystallised a synapse, the merged result is permanent too)
22
+ * - Cumulative observationCount — total reinforcement across all
23
+ * devices, never lose evidence
24
+ * - HMAC-signed export envelopes — receivers verify before merging
25
+ * - Vendor-neutral — transport is caller-supplied (git branch via
26
+ * DIASPORA, HTTP bridge, USB stick, QR-code chain via BEACON,
27
+ * whatever the user prefers)
28
+ *
29
+ * Composes onto:
30
+ * - v2.19.29 Phase A HEBBIAN (SynapseWeight / SynapseStore types)
31
+ * - v2.19.30 SOUL EMBALMING (HMAC chain pattern)
32
+ * - v1.72 DIASPORA (transport — caller wires git/HTTP/QR)
33
+ *
34
+ * Honest scope:
35
+ * - PURE FUNCTION merge. Never throws.
36
+ * - HMAC-signed envelopes — forged exports auto-dropped.
37
+ * - Deterministic: same inputs → same merged store + same provenance map.
38
+ * - Defensive: empty exports, single-device, NaN weights, key collisions
39
+ * handled silently. 24/7 safe.
40
+ * - "permanent OR" semantics — never demotes a permanent synapse.
41
+ */
42
+ import { createHmac, timingSafeEqual } from "node:crypto";
43
+ const PROTOCOL_VERSION = 1;
44
+ function canon(v) {
45
+ if (v === null || typeof v !== "object")
46
+ return JSON.stringify(v);
47
+ if (Array.isArray(v))
48
+ return "[" + v.map(canon).join(",") + "]";
49
+ const keys = Object.keys(v).sort();
50
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
51
+ }
52
+ function defaultSecret() {
53
+ return process.env["MNEME_SYNAPSE_SYNC_SECRET"] || `mneme-synapse-sync-v${PROTOCOL_VERSION}`;
54
+ }
55
+ function hmacHex(body, secret) {
56
+ return createHmac("sha256", secret).update(canon(body)).digest("hex");
57
+ }
58
+ function safeEqHex(a, b) {
59
+ try {
60
+ return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ /**
67
+ * Package a local store for cross-device transport.
68
+ * The envelope is HMAC-signed so receivers can detect tampering.
69
+ */
70
+ export function exportForSync(input) {
71
+ const sec = input.secret ?? defaultSecret();
72
+ const exportedAtMs = input.nowMs ?? Date.now();
73
+ const body = {
74
+ v: PROTOCOL_VERSION,
75
+ deviceId: input.deviceId,
76
+ exportedAtMs,
77
+ store: input.store,
78
+ };
79
+ const sig = hmacHex(body, sec);
80
+ return { ...body, sig };
81
+ }
82
+ /** Verify an export envelope's HMAC. Returns false on forged / tampered envelopes. */
83
+ export function verifySyncExport(envelope, secret) {
84
+ if (!envelope || typeof envelope !== "object")
85
+ return false;
86
+ if (envelope.v !== PROTOCOL_VERSION)
87
+ return false;
88
+ if (typeof envelope.deviceId !== "string" || envelope.deviceId.length === 0)
89
+ return false;
90
+ if (typeof envelope.exportedAtMs !== "number" || !Number.isFinite(envelope.exportedAtMs))
91
+ return false;
92
+ if (!envelope.store || typeof envelope.store !== "object")
93
+ return false;
94
+ const sec = secret ?? defaultSecret();
95
+ const { sig, ...body } = envelope;
96
+ return safeEqHex(hmacHex(body, sec), sig);
97
+ }
98
+ /**
99
+ * CRDT merge rule applied per synapse-key across devices:
100
+ *
101
+ * weight: max( device.weight ) — "strongest wins"
102
+ * lastObservedAtMs: max( device.lastObservedAtMs ) — "most recent wins"
103
+ * observationCount: sum( device.observationCount ) — cumulative evidence
104
+ * permanent: OR( device.permanent ) — sticky / monotone
105
+ * permanentSinceWeight: min(>0) of device.permanentSinceWeight — first to crystallise
106
+ *
107
+ * Winner deviceId is the one whose (weight, lastObservedAtMs) pair lexicographically
108
+ * sorts highest — deterministic tie-break by deviceId ascending.
109
+ *
110
+ * Commutativity proof (sketch): max / sum / OR / min-over-positives are all
111
+ * commutative and associative; tie-break by deviceId is a total order, so
112
+ * mergeOrder doesn't matter.
113
+ */
114
+ function mergeWeightsAcrossDevices(input) {
115
+ const first = input[0];
116
+ const key = first.weight.key;
117
+ let mergedWeight = -Infinity;
118
+ let mergedLastMs = -Infinity;
119
+ let mergedObs = 0;
120
+ let mergedPermanent = false;
121
+ let mergedPermanentSinceWeight = 0;
122
+ // Winner tracking (deterministic tie-break)
123
+ let winnerDeviceId = first.deviceId;
124
+ let winnerWeight = -Infinity;
125
+ let winnerLastMs = -Infinity;
126
+ for (const { deviceId, weight: w } of input) {
127
+ if (Number.isFinite(w.weight) && w.weight > mergedWeight)
128
+ mergedWeight = w.weight;
129
+ if (Number.isFinite(w.lastObservedAtMs) && w.lastObservedAtMs > mergedLastMs)
130
+ mergedLastMs = w.lastObservedAtMs;
131
+ mergedObs += Math.max(0, w.observationCount | 0);
132
+ if (w.permanent)
133
+ mergedPermanent = true;
134
+ if (w.permanentSinceWeight > 0) {
135
+ mergedPermanentSinceWeight = mergedPermanentSinceWeight === 0
136
+ ? w.permanentSinceWeight
137
+ : Math.min(mergedPermanentSinceWeight, w.permanentSinceWeight);
138
+ }
139
+ // Winner: highest weight, tie-break by latest ts, then by deviceId asc.
140
+ const wWeight = Number.isFinite(w.weight) ? w.weight : -Infinity;
141
+ const wLast = Number.isFinite(w.lastObservedAtMs) ? w.lastObservedAtMs : -Infinity;
142
+ if (wWeight > winnerWeight ||
143
+ (wWeight === winnerWeight && wLast > winnerLastMs) ||
144
+ (wWeight === winnerWeight && wLast === winnerLastMs && deviceId < winnerDeviceId)) {
145
+ winnerDeviceId = deviceId;
146
+ winnerWeight = wWeight;
147
+ winnerLastMs = wLast;
148
+ }
149
+ }
150
+ // Clamp -Infinity guards (single-device empty case)
151
+ if (mergedWeight === -Infinity)
152
+ mergedWeight = 0;
153
+ if (mergedLastMs === -Infinity)
154
+ mergedLastMs = 0;
155
+ return {
156
+ key,
157
+ winnerDeviceId,
158
+ // Sort contributors by deviceId for deterministic output (commutativity).
159
+ contributors: input.map((x) => ({
160
+ deviceId: x.deviceId,
161
+ weight: x.weight.weight,
162
+ observationCount: x.weight.observationCount,
163
+ lastObservedAtMs: x.weight.lastObservedAtMs,
164
+ permanent: x.weight.permanent,
165
+ })).sort((a, b) => a.deviceId.localeCompare(b.deviceId)),
166
+ mergedWeight,
167
+ mergedObservationCount: mergedObs,
168
+ mergedPermanent,
169
+ mergedLastObservedAtMs: mergedLastMs,
170
+ };
171
+ }
172
+ /**
173
+ * Merge N device exports into one canonical synapse store.
174
+ *
175
+ * Verifies each envelope's HMAC first; bad envelopes go into `rejectedDevices`
176
+ * and contribute nothing. Duplicate deviceIds: last-export-wins (most recent
177
+ * exportedAtMs).
178
+ *
179
+ * The merged store gets a freshly-recomputed signature with the local secret
180
+ * (so it can re-export). Caller (daemon) typically writes the merged store
181
+ * back to disk as the new local synapse_genesis state.
182
+ */
183
+ export function mergeSynapseStores(input) {
184
+ const sec = input.secret ?? defaultSecret();
185
+ const storeSec = input.storeSecret
186
+ ?? process.env["MNEME_SYNAPSE_GENESIS_SECRET"]
187
+ ?? "mneme-synapse-genesis-v1";
188
+ const verifiedByDevice = new Map();
189
+ const rejected = [];
190
+ for (const env of input.exports ?? []) {
191
+ if (!verifySyncExport(env, sec)) {
192
+ if (env?.deviceId && typeof env.deviceId === "string")
193
+ rejected.push(env.deviceId);
194
+ continue;
195
+ }
196
+ const existing = verifiedByDevice.get(env.deviceId);
197
+ if (!existing || env.exportedAtMs > existing.exportedAtMs) {
198
+ verifiedByDevice.set(env.deviceId, env);
199
+ }
200
+ }
201
+ const participatingDevices = Array.from(verifiedByDevice.keys()).sort();
202
+ // Bucket weights by key
203
+ const byKey = new Map();
204
+ for (const [deviceId, env] of verifiedByDevice) {
205
+ for (const w of env.store?.weights ?? []) {
206
+ if (!w || typeof w.key !== "string")
207
+ continue;
208
+ const list = byKey.get(w.key) ?? [];
209
+ list.push({ deviceId, weight: w });
210
+ byKey.set(w.key, list);
211
+ }
212
+ }
213
+ const provenance = [];
214
+ const mergedWeights = [];
215
+ // Deterministic output order: sort keys lex
216
+ for (const key of Array.from(byKey.keys()).sort()) {
217
+ const bucket = byKey.get(key);
218
+ const prov = mergeWeightsAcrossDevices(bucket);
219
+ provenance.push(prov);
220
+ const exemplar = bucket[0].weight;
221
+ // permanentSinceWeight: min positive across contributors (first to crystallise)
222
+ let permSince = 0;
223
+ for (const c of bucket) {
224
+ if (c.weight.permanentSinceWeight > 0) {
225
+ permSince = permSince === 0 ? c.weight.permanentSinceWeight : Math.min(permSince, c.weight.permanentSinceWeight);
226
+ }
227
+ }
228
+ mergedWeights.push({
229
+ key,
230
+ eventPattern: exemplar.eventPattern,
231
+ toolName: exemplar.toolName,
232
+ weight: prov.mergedWeight,
233
+ observationCount: prov.mergedObservationCount,
234
+ lastObservedAtMs: prov.mergedLastObservedAtMs,
235
+ permanentSinceWeight: permSince,
236
+ permanent: prov.mergedPermanent,
237
+ });
238
+ }
239
+ // lastDecayedAtMs: max across participating stores
240
+ let lastDecayedAtMs = null;
241
+ for (const env of verifiedByDevice.values()) {
242
+ const t = env.store?.lastDecayedAtMs;
243
+ if (typeof t === "number" && Number.isFinite(t)) {
244
+ lastDecayedAtMs = lastDecayedAtMs === null ? t : Math.max(lastDecayedAtMs, t);
245
+ }
246
+ }
247
+ const baseStore = {
248
+ v: 1,
249
+ weights: mergedWeights,
250
+ lastDecayedAtMs,
251
+ };
252
+ const storeSig = createHmac("sha256", storeSec).update(canon(baseStore)).digest("hex");
253
+ const store = { ...baseStore, sig: storeSig };
254
+ return {
255
+ v: PROTOCOL_VERSION,
256
+ store,
257
+ provenance,
258
+ participatingDevices,
259
+ rejectedDevices: Array.from(new Set(rejected)).sort(),
260
+ };
261
+ }
262
+ /**
263
+ * DIASPORA-shape adapter: serialize an export envelope to a JSON path the
264
+ * caller's transport (git branch `diaspora/synapse-<deviceId>`, HTTP PUT,
265
+ * QR-chain, USB stick) can carry. Returns the canonical bytes + the
266
+ * recommended file path; the caller's chosen transport actually moves it.
267
+ */
268
+ export function packForDiaspora(envelope) {
269
+ // Sanitise: keep only [a-zA-Z0-9_-], then collapse runs of dots/slashes/etc.
270
+ // Two-stage scrub catches path traversal (..), shell metachars, and unicode.
271
+ const safeId = envelope.deviceId
272
+ .replace(/[^a-zA-Z0-9_-]/g, "_") // any non-alphanumeric → _
273
+ .replace(/_+/g, "_") // collapse runs
274
+ .replace(/^[_-]+|[_-]+$/g, "") // trim edges
275
+ .slice(0, 64) || "device";
276
+ return {
277
+ path: `.mneme/diaspora/synapse-${safeId}.json`,
278
+ bytes: JSON.stringify(envelope),
279
+ branchHint: `diaspora/synapse-${safeId}`,
280
+ };
281
+ }
282
+ /**
283
+ * DIASPORA-shape unpack: read JSON bytes a caller fetched via their
284
+ * transport and return the typed envelope. Returns null on parse failure.
285
+ */
286
+ export function unpackFromDiaspora(bytes) {
287
+ try {
288
+ const obj = JSON.parse(bytes);
289
+ if (obj && typeof obj === "object" && obj.v === PROTOCOL_VERSION)
290
+ return obj;
291
+ return null;
292
+ }
293
+ catch {
294
+ return null;
295
+ }
296
+ }
297
+ export function computeSyncStats(result) {
298
+ let permanent = 0;
299
+ let multiDevice = 0;
300
+ let observations = 0;
301
+ for (const p of result.provenance) {
302
+ if (p.mergedPermanent)
303
+ permanent++;
304
+ if (p.contributors.length > 1)
305
+ multiDevice++;
306
+ observations += p.mergedObservationCount;
307
+ }
308
+ return {
309
+ participatingDevices: result.participatingDevices.length,
310
+ rejectedDevices: result.rejectedDevices.length,
311
+ totalSynapses: result.store.weights.length,
312
+ permanentSynapses: permanent,
313
+ multiDeviceSynapses: multiDevice,
314
+ unifiedObservations: observations,
315
+ };
316
+ }
317
+ export function formatSyncStatsLine(s) {
318
+ return `🧬 SYNC ${s.participatingDevices}dev · ${s.totalSynapses} synapses · ${s.multiDeviceSynapses} multi-dev · ${s.permanentSynapses} perm · ${s.unifiedObservations} obs · ${s.rejectedDevices} rejected`;
319
+ }
320
+ export const SYNAPSE_SYNC_TUNABLES = Object.freeze({
321
+ PROTOCOL_VERSION,
322
+ });
323
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/synapse_sync/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=synapse_sync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synapse_sync.test.d.ts","sourceRoot":"","sources":["../../src/synapse_sync/synapse_sync.test.ts"],"names":[],"mappings":""}