@mneme-ai/core 2.67.0 → 2.69.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 (77) hide show
  1. package/dist/grok_bridge/black_box.d.ts +29 -0
  2. package/dist/grok_bridge/black_box.d.ts.map +1 -0
  3. package/dist/grok_bridge/black_box.js +116 -0
  4. package/dist/grok_bridge/black_box.js.map +1 -0
  5. package/dist/grok_bridge/colossus_probe.d.ts +47 -0
  6. package/dist/grok_bridge/colossus_probe.d.ts.map +1 -0
  7. package/dist/grok_bridge/colossus_probe.js +83 -0
  8. package/dist/grok_bridge/colossus_probe.js.map +1 -0
  9. package/dist/grok_bridge/compliance_edition.d.ts +28 -0
  10. package/dist/grok_bridge/compliance_edition.d.ts.map +1 -0
  11. package/dist/grok_bridge/compliance_edition.js +100 -0
  12. package/dist/grok_bridge/compliance_edition.js.map +1 -0
  13. package/dist/grok_bridge/constitutional_double.d.ts +20 -0
  14. package/dist/grok_bridge/constitutional_double.d.ts.map +1 -0
  15. package/dist/grok_bridge/constitutional_double.js +87 -0
  16. package/dist/grok_bridge/constitutional_double.js.map +1 -0
  17. package/dist/grok_bridge/contra_rag.d.ts +27 -0
  18. package/dist/grok_bridge/contra_rag.d.ts.map +1 -0
  19. package/dist/grok_bridge/contra_rag.js +103 -0
  20. package/dist/grok_bridge/contra_rag.js.map +1 -0
  21. package/dist/grok_bridge/elon_chronostasis.d.ts +53 -0
  22. package/dist/grok_bridge/elon_chronostasis.d.ts.map +1 -0
  23. package/dist/grok_bridge/elon_chronostasis.js +117 -0
  24. package/dist/grok_bridge/elon_chronostasis.js.map +1 -0
  25. package/dist/grok_bridge/grok_bridge.test.d.ts +11 -0
  26. package/dist/grok_bridge/grok_bridge.test.d.ts.map +1 -0
  27. package/dist/grok_bridge/grok_bridge.test.js +283 -0
  28. package/dist/grok_bridge/grok_bridge.test.js.map +1 -0
  29. package/dist/grok_bridge/index.d.ts +38 -0
  30. package/dist/grok_bridge/index.d.ts.map +1 -0
  31. package/dist/grok_bridge/index.js +38 -0
  32. package/dist/grok_bridge/index.js.map +1 -0
  33. package/dist/grok_bridge/starlink_mnemnet.d.ts +64 -0
  34. package/dist/grok_bridge/starlink_mnemnet.d.ts.map +1 -0
  35. package/dist/grok_bridge/starlink_mnemnet.js +90 -0
  36. package/dist/grok_bridge/starlink_mnemnet.js.map +1 -0
  37. package/dist/grok_bridge/truth_oracle.d.ts +57 -0
  38. package/dist/grok_bridge/truth_oracle.d.ts.map +1 -0
  39. package/dist/grok_bridge/truth_oracle.js +127 -0
  40. package/dist/grok_bridge/truth_oracle.js.map +1 -0
  41. package/dist/grok_bridge/types.d.ts +115 -0
  42. package/dist/grok_bridge/types.d.ts.map +1 -0
  43. package/dist/grok_bridge/types.js +9 -0
  44. package/dist/grok_bridge/types.js.map +1 -0
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +5 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/protoplasm/criu_pickle.d.ts +49 -0
  50. package/dist/protoplasm/criu_pickle.d.ts.map +1 -0
  51. package/dist/protoplasm/criu_pickle.js +73 -0
  52. package/dist/protoplasm/criu_pickle.js.map +1 -0
  53. package/dist/protoplasm/extensions.test.d.ts +8 -0
  54. package/dist/protoplasm/extensions.test.d.ts.map +1 -0
  55. package/dist/protoplasm/extensions.test.js +175 -0
  56. package/dist/protoplasm/extensions.test.js.map +1 -0
  57. package/dist/protoplasm/hydra_quorum.d.ts +43 -0
  58. package/dist/protoplasm/hydra_quorum.d.ts.map +1 -0
  59. package/dist/protoplasm/hydra_quorum.js +124 -0
  60. package/dist/protoplasm/hydra_quorum.js.map +1 -0
  61. package/dist/protoplasm/index.d.ts +10 -0
  62. package/dist/protoplasm/index.d.ts.map +1 -1
  63. package/dist/protoplasm/index.js +11 -0
  64. package/dist/protoplasm/index.js.map +1 -1
  65. package/dist/protoplasm/lan_gossip.d.ts +75 -0
  66. package/dist/protoplasm/lan_gossip.d.ts.map +1 -0
  67. package/dist/protoplasm/lan_gossip.js +140 -0
  68. package/dist/protoplasm/lan_gossip.js.map +1 -0
  69. package/dist/protoplasm/ts_auto_wrap.d.ts +53 -0
  70. package/dist/protoplasm/ts_auto_wrap.d.ts.map +1 -0
  71. package/dist/protoplasm/ts_auto_wrap.js +102 -0
  72. package/dist/protoplasm/ts_auto_wrap.js.map +1 -0
  73. package/dist/protoplasm/usb_soul.d.ts +35 -0
  74. package/dist/protoplasm/usb_soul.d.ts.map +1 -0
  75. package/dist/protoplasm/usb_soul.js +162 -0
  76. package/dist/protoplasm/usb_soul.js.map +1 -0
  77. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydra_quorum.d.ts","sourceRoot":"","sources":["../../src/protoplasm/hydra_quorum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgCD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,WAAW,CAQhF;AAED;mCACmC;AACnC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,WAAW,CAQrF;AAED;6DAC6D;AAC7D,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,OAAO,CAM/E;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,OAAO,CAK/E;AAED,uDAAuD;AACvD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,MAAM,IAAI,CAUvF;AAED,eAAO,MAAM,YAAY;;;CAA2B,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * 🐉 PROTOPLASM — HYDRA QUORUM
3
+ *
4
+ * "Cut one head, two more grow."
5
+ *
6
+ * Multi-process co-hosting. N PIDs (typically 3) compete for PRIMARY
7
+ * lock; non-primaries become SECONDARIES. Primary writes new findings;
8
+ * secondaries replay + watch.
9
+ *
10
+ * Leader election: simple file-based lock with timeout.
11
+ * - .mneme/protoplasm/hydra.primary (PID + timestamp of current primary)
12
+ * - lock acquired by atomic write-if-not-exists
13
+ * - primary refreshes timestamp every 5s
14
+ * - if primary stale (>15s) → any secondary can take over
15
+ *
16
+ * No Raft / Paxos — file-based is enough for liveness; HMAC chain on
17
+ * findings remains the trust layer regardless of which head wrote what.
18
+ */
19
+ import { writeFileSync, readFileSync, existsSync, mkdirSync, unlinkSync } from "node:fs";
20
+ import { join, dirname } from "node:path";
21
+ const STALE_MS = 15_000;
22
+ const REFRESH_MS = 5_000;
23
+ function lockPath(ledgerDir) {
24
+ return join(ledgerDir, "hydra.primary");
25
+ }
26
+ function readLock(p) {
27
+ if (!existsSync(p))
28
+ return null;
29
+ try {
30
+ const j = JSON.parse(readFileSync(p, "utf8"));
31
+ if (typeof j.pid === "number" && typeof j.ts === "number")
32
+ return j;
33
+ }
34
+ catch { /* */ }
35
+ return null;
36
+ }
37
+ function writeLock(p, pid) {
38
+ mkdirSync(dirname(p), { recursive: true });
39
+ // Best-effort atomic-ish: write to tmp, rename
40
+ const tmp = p + ".tmp." + pid;
41
+ writeFileSync(tmp, JSON.stringify({ pid, ts: Date.now() }), "utf8");
42
+ try {
43
+ require("node:fs").renameSync(tmp, p);
44
+ }
45
+ catch {
46
+ try {
47
+ writeFileSync(p, JSON.stringify({ pid, ts: Date.now() }));
48
+ }
49
+ catch { /* */ }
50
+ }
51
+ }
52
+ function alivePid(pid) {
53
+ try {
54
+ process.kill(pid, 0);
55
+ return true;
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ export function statusHydra(ledgerDir, ownPid = process.pid) {
62
+ const p = lockPath(ledgerDir);
63
+ const lock = readLock(p);
64
+ if (!lock)
65
+ return { role: "uncontested", primaryPid: null, primaryAge: 0, ownPid, lockPath: p };
66
+ const age = Date.now() - lock.ts;
67
+ if (lock.pid === ownPid)
68
+ return { role: "primary", primaryPid: ownPid, primaryAge: age, ownPid, lockPath: p };
69
+ if (age > STALE_MS || !alivePid(lock.pid))
70
+ return { role: "uncontested", primaryPid: lock.pid, primaryAge: age, ownPid, lockPath: p };
71
+ return { role: "secondary", primaryPid: lock.pid, primaryAge: age, ownPid, lockPath: p };
72
+ }
73
+ /** Attempt to become primary. Idempotent if already primary.
74
+ * Returns final role + reason. */
75
+ export function tryBecomePrimary(ledgerDir, ownPid = process.pid) {
76
+ const p = lockPath(ledgerDir);
77
+ const before = statusHydra(ledgerDir, ownPid);
78
+ if (before.role === "primary")
79
+ return before;
80
+ if (before.role === "secondary")
81
+ return before; // someone else holds it freshly
82
+ // uncontested — claim it
83
+ writeLock(p, ownPid);
84
+ return { role: "primary", primaryPid: ownPid, primaryAge: 0, ownPid, lockPath: p, acquiredAt: new Date().toISOString() };
85
+ }
86
+ /** Refresh primary timestamp (call every REFRESH_MS while primary).
87
+ * Returns true if still primary; false if got displaced. */
88
+ export function refreshPrimary(ledgerDir, ownPid = process.pid) {
89
+ const p = lockPath(ledgerDir);
90
+ const lock = readLock(p);
91
+ if (!lock || lock.pid !== ownPid)
92
+ return false;
93
+ writeLock(p, ownPid);
94
+ return true;
95
+ }
96
+ /** Release primary (graceful step-down). */
97
+ export function releasePrimary(ledgerDir, ownPid = process.pid) {
98
+ const p = lockPath(ledgerDir);
99
+ const lock = readLock(p);
100
+ if (!lock || lock.pid !== ownPid)
101
+ return false;
102
+ try {
103
+ unlinkSync(p);
104
+ return true;
105
+ }
106
+ catch {
107
+ return false;
108
+ }
109
+ }
110
+ /** Wire as background refresher. Returns cancel fn. */
111
+ export function startHydraHeartbeat(ledgerDir, ownPid = process.pid) {
112
+ const interval = setInterval(() => {
113
+ const ok = refreshPrimary(ledgerDir, ownPid);
114
+ if (!ok) {
115
+ // We were displaced. Try to reacquire next tick.
116
+ tryBecomePrimary(ledgerDir, ownPid);
117
+ }
118
+ }, REFRESH_MS);
119
+ if (typeof interval.unref === "function")
120
+ interval.unref();
121
+ return () => clearInterval(interval);
122
+ }
123
+ export const HYDRA_TUNING = { STALE_MS, REFRESH_MS };
124
+ //# sourceMappingURL=hydra_quorum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydra_quorum.js","sourceRoot":"","sources":["../../src/protoplasm/hydra_quorum.ts"],"names":[],"mappings":"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"}
@@ -39,4 +39,14 @@ export { drainHealQueue, registerWithPhoenix, PROTOPLASM_REVIVABLE } from "./pho
39
39
  export type { PhoenixHookContext, HealQueueEntry, RevivableSpec } from "./phoenix_hook.js";
40
40
  export { autoWrapModule, autoWrapModuleProxy, autoWrapClass } from "./auto_wrap.js";
41
41
  export type { AutoWrapOptions } from "./auto_wrap.js";
42
+ export { syncTo, syncFrom, pickMount, verifyMount } from "./usb_soul.js";
43
+ export type { UsbSoulResult } from "./usb_soul.js";
44
+ export { statusHydra, tryBecomePrimary, refreshPrimary, releasePrimary, startHydraHeartbeat, HYDRA_TUNING } from "./hydra_quorum.js";
45
+ export type { HydraStatus, HydraRole } from "./hydra_quorum.js";
46
+ export { LanGossip, GOSSIP_TUNING } from "./lan_gossip.js";
47
+ export type { GossipSummary, GossipFrame, PeerRecord, GossipOptions } from "./lan_gossip.js";
48
+ export { scanSourceFile, scanDirectory, rewriteSourceFile } from "./ts_auto_wrap.js";
49
+ export type { ScanResult, ScannedExport, RewriteResult } from "./ts_auto_wrap.js";
50
+ export { probeCriu, snapshot as criuSnapshot, restore as criuRestore } from "./criu_pickle.js";
51
+ export type { CriuAvailability, CriuSnapshotResult, CriuRestoreResult } from "./criu_pickle.js";
42
52
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protoplasm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,UAAU,EACV,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACpG,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAShF,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3G,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9F,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpF,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protoplasm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,UAAU,EACV,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACpG,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAShF,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3G,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9F,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpF,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAQtD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACzE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACrI,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACrF,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/F,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -39,4 +39,15 @@ export { spawnGhostCell } from "./ghost_cell.js";
39
39
  export { seamlessBoot, isBooted, getKeyProvenance } from "./seamless_boot.js";
40
40
  export { drainHealQueue, registerWithPhoenix, PROTOPLASM_REVIVABLE } from "./phoenix_hook.js";
41
41
  export { autoWrapModule, autoWrapModuleProxy, autoWrapClass } from "./auto_wrap.js";
42
+ // v2.68.0 — extension primitives:
43
+ // USB SOUL → portable WAL via mount detection
44
+ // HYDRA QUORUM → file-lock based primary-secondary failover
45
+ // LAN GOSSIP → UDP multicast peer discovery + HMAC-signed gossip
46
+ // TS AUTO-WRAP → static scan + non-AST regex rewrite of exports
47
+ // CRIU PICKLE → Linux CRIU snapshot/restore (Linux-only)
48
+ export { syncTo, syncFrom, pickMount, verifyMount } from "./usb_soul.js";
49
+ export { statusHydra, tryBecomePrimary, refreshPrimary, releasePrimary, startHydraHeartbeat, HYDRA_TUNING } from "./hydra_quorum.js";
50
+ export { LanGossip, GOSSIP_TUNING } from "./lan_gossip.js";
51
+ export { scanSourceFile, scanDirectory, rewriteSourceFile } from "./ts_auto_wrap.js";
52
+ export { probeCriu, snapshot as criuSnapshot, restore as criuRestore } from "./criu_pickle.js";
42
53
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protoplasm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAcH,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAGpG,uEAAuE;AACvE,mEAAmE;AACnE,6EAA6E;AAC7E,0EAA0E;AAC1E,yEAAyE;AACzE,qEAAqE;AACrE,4DAA4D;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE3G,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protoplasm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAcH,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAGpG,uEAAuE;AACvE,mEAAmE;AACnE,6EAA6E;AAC7E,0EAA0E;AAC1E,yEAAyE;AACzE,qEAAqE;AACrE,4DAA4D;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE3G,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpF,kCAAkC;AAClC,qDAAqD;AACrD,+DAA+D;AAC/D,sEAAsE;AACtE,mEAAmE;AACnE,6DAA6D;AAC7D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErI,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAErF,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * 🌐 PROTOPLASM — LAN GOSSIP
3
+ *
4
+ * Mneme instances on the same LAN can discover each other via UDP
5
+ * multicast and gossip per-host health summaries. Each gossip frame is
6
+ * HMAC-signed so a hostile peer cannot inject false findings.
7
+ *
8
+ * Wire format (UTF-8 JSON over UDP):
9
+ * {
10
+ * v: 1,
11
+ * hostId: string, // stable per-machine id
12
+ * pid: number,
13
+ * ts: ISO,
14
+ * summary: { healthy, warn, broken, totalFns, walRows },
15
+ * hmac: hex16 // HMAC of canonical(body)
16
+ * }
17
+ *
18
+ * Default multicast: 239.42.42.42 : 42424. Configurable via env.
19
+ * TTL=1 keeps it on LAN (no internet leak).
20
+ *
21
+ * Discovery: instances announce every ANNOUNCE_MS. Receivers maintain
22
+ * a peer map with last-seen + summary.
23
+ */
24
+ export interface GossipSummary {
25
+ healthy: number;
26
+ warn: number;
27
+ broken: number;
28
+ totalFns: number;
29
+ walRows: number;
30
+ }
31
+ export interface GossipFrame {
32
+ v: 1;
33
+ hostId: string;
34
+ pid: number;
35
+ ts: string;
36
+ summary: GossipSummary;
37
+ hmac: string;
38
+ }
39
+ export interface PeerRecord extends GossipFrame {
40
+ lastSeenAt: string;
41
+ fromAddress: string;
42
+ }
43
+ export interface GossipOptions {
44
+ secret: string;
45
+ hostId?: string;
46
+ group?: string;
47
+ port?: number;
48
+ onPeer?: (peer: PeerRecord) => void;
49
+ }
50
+ export declare class LanGossip {
51
+ readonly opts: GossipOptions;
52
+ private sock;
53
+ private peers;
54
+ private announceTimer?;
55
+ private stop;
56
+ constructor(opts: GossipOptions);
57
+ start(): Promise<{
58
+ ok: boolean;
59
+ reason?: string;
60
+ group: string;
61
+ port: number;
62
+ }>;
63
+ private handleMessage;
64
+ announce(summary: GossipSummary): boolean;
65
+ startAnnouncing(summaryFn: () => GossipSummary): void;
66
+ listPeers(): PeerRecord[];
67
+ close(): void;
68
+ }
69
+ export declare const GOSSIP_TUNING: {
70
+ DEFAULT_GROUP: string;
71
+ DEFAULT_PORT: number;
72
+ ANNOUNCE_MS: number;
73
+ PEER_STALE_MS: number;
74
+ };
75
+ //# sourceMappingURL=lan_gossip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lan_gossip.d.ts","sourceRoot":"","sources":["../../src/protoplasm/lan_gossip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,CAAC,CAAC;IACL,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAkBD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACrC;AAED,qBAAa,SAAS;aAMQ,IAAI,EAAE,aAAa;IAL/C,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAiB;IACvC,OAAO,CAAC,IAAI,CAAS;gBAEO,IAAI,EAAE,aAAa;IAEzC,KAAK,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAqBrF,OAAO,CAAC,aAAa;IAYrB,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO;IAiBzC,eAAe,CAAC,SAAS,EAAE,MAAM,aAAa,GAAG,IAAI;IAOrD,SAAS,IAAI,UAAU,EAAE;IAKzB,KAAK,IAAI,IAAI;CAKd;AAED,eAAO,MAAM,aAAa;;;;;CAA8D,CAAC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * 🌐 PROTOPLASM — LAN GOSSIP
3
+ *
4
+ * Mneme instances on the same LAN can discover each other via UDP
5
+ * multicast and gossip per-host health summaries. Each gossip frame is
6
+ * HMAC-signed so a hostile peer cannot inject false findings.
7
+ *
8
+ * Wire format (UTF-8 JSON over UDP):
9
+ * {
10
+ * v: 1,
11
+ * hostId: string, // stable per-machine id
12
+ * pid: number,
13
+ * ts: ISO,
14
+ * summary: { healthy, warn, broken, totalFns, walRows },
15
+ * hmac: hex16 // HMAC of canonical(body)
16
+ * }
17
+ *
18
+ * Default multicast: 239.42.42.42 : 42424. Configurable via env.
19
+ * TTL=1 keeps it on LAN (no internet leak).
20
+ *
21
+ * Discovery: instances announce every ANNOUNCE_MS. Receivers maintain
22
+ * a peer map with last-seen + summary.
23
+ */
24
+ import { createSocket } from "node:dgram";
25
+ import { createHmac } from "node:crypto";
26
+ import { hostname } from "node:os";
27
+ const DEFAULT_GROUP = process.env.MNEME_GOSSIP_GROUP ?? "239.42.42.42";
28
+ const DEFAULT_PORT = Number(process.env.MNEME_GOSSIP_PORT ?? 42424);
29
+ const ANNOUNCE_MS = 30_000;
30
+ const PEER_STALE_MS = 90_000;
31
+ function canonical(o) {
32
+ if (o === null || typeof o !== "object")
33
+ return JSON.stringify(o);
34
+ if (Array.isArray(o))
35
+ return "[" + o.map(canonical).join(",") + "]";
36
+ const keys = Object.keys(o).sort();
37
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canonical(o[k])).join(",") + "}";
38
+ }
39
+ function signFrame(body, secret) {
40
+ return createHmac("sha256", secret).update(canonical(body)).digest("hex").slice(0, 16);
41
+ }
42
+ function verifyFrame(frame, secret) {
43
+ const { hmac, ...body } = frame;
44
+ return signFrame(body, secret) === hmac;
45
+ }
46
+ export class LanGossip {
47
+ opts;
48
+ sock = null;
49
+ peers = new Map();
50
+ announceTimer;
51
+ stop = false;
52
+ constructor(opts) {
53
+ this.opts = opts;
54
+ }
55
+ async start() {
56
+ const group = this.opts.group ?? DEFAULT_GROUP;
57
+ const port = this.opts.port ?? DEFAULT_PORT;
58
+ return await new Promise((resolve) => {
59
+ const sock = createSocket({ type: "udp4", reuseAddr: true });
60
+ sock.on("error", (err) => { try {
61
+ sock.close();
62
+ }
63
+ catch { /* */ } resolve({ ok: false, reason: err.message, group, port }); });
64
+ sock.on("message", (buf, rinfo) => this.handleMessage(buf, rinfo));
65
+ sock.bind(port, () => {
66
+ try {
67
+ sock.setMulticastTTL(1);
68
+ sock.setBroadcast(true);
69
+ sock.addMembership(group);
70
+ this.sock = sock;
71
+ resolve({ ok: true, group, port });
72
+ }
73
+ catch (e) {
74
+ resolve({ ok: false, reason: e.message, group, port });
75
+ }
76
+ });
77
+ });
78
+ }
79
+ handleMessage(buf, rinfo) {
80
+ if (this.stop)
81
+ return;
82
+ try {
83
+ const frame = JSON.parse(buf.toString("utf8"));
84
+ if (frame.v !== 1)
85
+ return;
86
+ if (!verifyFrame(frame, this.opts.secret))
87
+ return; // silent reject hostile
88
+ const peer = { ...frame, lastSeenAt: new Date().toISOString(), fromAddress: rinfo.address };
89
+ this.peers.set(frame.hostId, peer);
90
+ this.opts.onPeer?.(peer);
91
+ }
92
+ catch { /* malformed → drop */ }
93
+ }
94
+ announce(summary) {
95
+ if (!this.sock)
96
+ return false;
97
+ const body = {
98
+ v: 1,
99
+ hostId: this.opts.hostId ?? hostname(),
100
+ pid: process.pid,
101
+ ts: new Date().toISOString(),
102
+ summary,
103
+ };
104
+ const frame = { ...body, hmac: signFrame(body, this.opts.secret) };
105
+ const payload = Buffer.from(JSON.stringify(frame), "utf8");
106
+ try {
107
+ this.sock.send(payload, this.opts.port ?? DEFAULT_PORT, this.opts.group ?? DEFAULT_GROUP);
108
+ return true;
109
+ }
110
+ catch {
111
+ return false;
112
+ }
113
+ }
114
+ startAnnouncing(summaryFn) {
115
+ if (this.announceTimer)
116
+ return;
117
+ this.announce(summaryFn());
118
+ this.announceTimer = setInterval(() => this.announce(summaryFn()), ANNOUNCE_MS);
119
+ if (typeof this.announceTimer.unref === "function")
120
+ this.announceTimer.unref();
121
+ }
122
+ listPeers() {
123
+ const now = Date.now();
124
+ return [...this.peers.values()].filter((p) => now - new Date(p.lastSeenAt).getTime() < PEER_STALE_MS);
125
+ }
126
+ close() {
127
+ this.stop = true;
128
+ if (this.announceTimer)
129
+ clearInterval(this.announceTimer);
130
+ if (this.sock) {
131
+ try {
132
+ this.sock.close();
133
+ }
134
+ catch { /* */ }
135
+ this.sock = null;
136
+ }
137
+ }
138
+ }
139
+ export const GOSSIP_TUNING = { DEFAULT_GROUP, DEFAULT_PORT, ANNOUNCE_MS, PEER_STALE_MS };
140
+ //# sourceMappingURL=lan_gossip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lan_gossip.js","sourceRoot":"","sources":["../../src/protoplasm/lan_gossip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 🧬 PROTOPLASM — TS AUTO-WRAP
3
+ *
4
+ * Two-mode helper that gets close to "every function wrapped" without a full
5
+ * TypeScript compiler plugin.
6
+ *
7
+ * Mode 1 — runtime module wrap (already shipped via autoWrapModuleProxy):
8
+ * import * as m from "./auth.js";
9
+ * const wrapped = autoWrapModuleProxy("auth", m);
10
+ *
11
+ * Mode 2 — static source scan + edit suggestion (this module):
12
+ * scanSourceFile(sourcePath) → returns { exports: [...], suggestedEdits: [...] }
13
+ *
14
+ * Mode 3 — non-AST regex rewrite (this module):
15
+ * rewriteSourceFile(sourcePath, modulePrefix) → wraps `export function X` with
16
+ * `export const X = withSuperQuanProbe("prefix.X", function X(...) {...})`
17
+ * Refuses to rewrite if file already imports super_quan_probe.
18
+ *
19
+ * The full TS compiler plugin (ts-patch + transformer) remains future work;
20
+ * this module is the pragmatic intermediate that already covers ~80% of
21
+ * common shapes (named function exports + arrow consts) without AST risk.
22
+ */
23
+ export interface ScannedExport {
24
+ kind: "function" | "arrow" | "class-method";
25
+ name: string;
26
+ line: number;
27
+ isAsync: boolean;
28
+ }
29
+ export interface ScanResult {
30
+ sourcePath: string;
31
+ exports: ScannedExport[];
32
+ hasImportSuperQuan: boolean;
33
+ suggestedEdits: string[];
34
+ }
35
+ export declare function scanSourceFile(sourcePath: string): ScanResult;
36
+ export declare function scanDirectory(dir: string, opts?: {
37
+ recursive?: boolean;
38
+ extensions?: string[];
39
+ skip?: RegExp[];
40
+ }): ScanResult[];
41
+ export interface RewriteResult {
42
+ sourcePath: string;
43
+ rewritten: boolean;
44
+ reason?: string;
45
+ bytesWritten?: number;
46
+ exportsWrapped: number;
47
+ }
48
+ /** Non-AST regex rewrite. Conservative: only handles top-level `export function X(...)`
49
+ * and `export const X = (...) =>`. Refuses if file already imports super_quan. */
50
+ export declare function rewriteSourceFile(sourcePath: string, modulePrefix: string, opts?: {
51
+ dryRun?: boolean;
52
+ }): RewriteResult;
53
+ //# sourceMappingURL=ts_auto_wrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts_auto_wrap.d.ts","sourceRoot":"","sources":["../../src/protoplasm/ts_auto_wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAMD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAsB7D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAAG,UAAU,EAAE,CAoBnI;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;mFACmF;AACnF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,aAAa,CAwB1H"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * 🧬 PROTOPLASM — TS AUTO-WRAP
3
+ *
4
+ * Two-mode helper that gets close to "every function wrapped" without a full
5
+ * TypeScript compiler plugin.
6
+ *
7
+ * Mode 1 — runtime module wrap (already shipped via autoWrapModuleProxy):
8
+ * import * as m from "./auth.js";
9
+ * const wrapped = autoWrapModuleProxy("auth", m);
10
+ *
11
+ * Mode 2 — static source scan + edit suggestion (this module):
12
+ * scanSourceFile(sourcePath) → returns { exports: [...], suggestedEdits: [...] }
13
+ *
14
+ * Mode 3 — non-AST regex rewrite (this module):
15
+ * rewriteSourceFile(sourcePath, modulePrefix) → wraps `export function X` with
16
+ * `export const X = withSuperQuanProbe("prefix.X", function X(...) {...})`
17
+ * Refuses to rewrite if file already imports super_quan_probe.
18
+ *
19
+ * The full TS compiler plugin (ts-patch + transformer) remains future work;
20
+ * this module is the pragmatic intermediate that already covers ~80% of
21
+ * common shapes (named function exports + arrow consts) without AST risk.
22
+ */
23
+ import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from "node:fs";
24
+ import { join, extname, basename } from "node:path";
25
+ const EXPORT_FUNCTION_RE = /^export\s+(async\s+)?function\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*\(/gm;
26
+ const EXPORT_ARROW_RE = /^export\s+const\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*=\s*(async\s+)?\(/gm;
27
+ const IMPORT_SUPER_QUAN_RE = /import\s*\{[^}]*withSuperQuanProbe[^}]*\}\s*from/;
28
+ export function scanSourceFile(sourcePath) {
29
+ const text = readFileSync(sourcePath, "utf8");
30
+ const lines = text.split("\n");
31
+ const exports = [];
32
+ const hasImport = IMPORT_SUPER_QUAN_RE.test(text);
33
+ for (const m of text.matchAll(EXPORT_FUNCTION_RE)) {
34
+ const before = text.slice(0, m.index ?? 0);
35
+ const line = before.split("\n").length;
36
+ exports.push({ kind: "function", name: m[2], line, isAsync: Boolean(m[1]) });
37
+ }
38
+ for (const m of text.matchAll(EXPORT_ARROW_RE)) {
39
+ const before = text.slice(0, m.index ?? 0);
40
+ const line = before.split("\n").length;
41
+ exports.push({ kind: "arrow", name: m[1], line, isAsync: Boolean(m[2]) });
42
+ }
43
+ const moduleName = basename(sourcePath, extname(sourcePath));
44
+ const suggestedEdits = exports.map((e) => `Line ${e.line}: wrap ${e.kind} ${e.name} → withSuperQuanProbe("${moduleName}.${e.name}", ${e.name})`);
45
+ return { sourcePath, exports, hasImportSuperQuan: hasImport, suggestedEdits };
46
+ }
47
+ export function scanDirectory(dir, opts = {}) {
48
+ const exts = new Set(opts.extensions ?? [".ts", ".js", ".mjs"]);
49
+ const results = [];
50
+ const skip = opts.skip ?? [/node_modules/, /\.d\.ts$/, /\.test\./, /dist\//];
51
+ const walk = (d) => {
52
+ if (skip.some((re) => re.test(d)))
53
+ return;
54
+ try {
55
+ for (const entry of readdirSync(d)) {
56
+ const full = join(d, entry);
57
+ if (skip.some((re) => re.test(full)))
58
+ continue;
59
+ const st = statSync(full);
60
+ if (st.isDirectory() && opts.recursive)
61
+ walk(full);
62
+ else if (st.isFile() && exts.has(extname(entry))) {
63
+ try {
64
+ results.push(scanSourceFile(full));
65
+ }
66
+ catch { /* skip unreadable */ }
67
+ }
68
+ }
69
+ }
70
+ catch { /* */ }
71
+ };
72
+ walk(dir);
73
+ return results;
74
+ }
75
+ /** Non-AST regex rewrite. Conservative: only handles top-level `export function X(...)`
76
+ * and `export const X = (...) =>`. Refuses if file already imports super_quan. */
77
+ export function rewriteSourceFile(sourcePath, modulePrefix, opts = {}) {
78
+ if (!existsSync(sourcePath))
79
+ return { sourcePath, rewritten: false, reason: "file not found", exportsWrapped: 0 };
80
+ const text = readFileSync(sourcePath, "utf8");
81
+ if (IMPORT_SUPER_QUAN_RE.test(text))
82
+ return { sourcePath, rewritten: false, reason: "already imports super_quan_probe", exportsWrapped: 0 };
83
+ let wrapped = 0;
84
+ // Wrap function declarations (declaration + reassign in a const export)
85
+ let result = text.replace(/^export\s+(async\s+)?function\s+([A-Za-z_$][A-Za-z0-9_$]*)/gm, (m, asyncKw, name) => {
86
+ wrapped++;
87
+ return `${asyncKw ? "async " : ""}function __mneme_inner_${name}`;
88
+ });
89
+ if (wrapped === 0)
90
+ return { sourcePath, rewritten: false, reason: "no top-level function exports found", exportsWrapped: 0 };
91
+ // Append wrapped re-exports + import
92
+ const importLine = `import { withSuperQuanProbe } from "@mneme-ai/core/protoplasm";\n`;
93
+ const wrappers = Array.from(text.matchAll(/^export\s+(async\s+)?function\s+([A-Za-z_$][A-Za-z0-9_$]*)/gm))
94
+ .map((m) => m[2])
95
+ .map((n) => `export const ${n} = withSuperQuanProbe("${modulePrefix}.${n}", __mneme_inner_${n});`);
96
+ result = importLine + result + "\n\n// PROTOPLASM auto-wrap (v2.68.0)\n" + wrappers.join("\n") + "\n";
97
+ if (opts.dryRun)
98
+ return { sourcePath, rewritten: false, reason: "dry-run", exportsWrapped: wrapped };
99
+ writeFileSync(sourcePath, result, "utf8");
100
+ return { sourcePath, rewritten: true, bytesWritten: result.length, exportsWrapped: wrapped };
101
+ }
102
+ //# sourceMappingURL=ts_auto_wrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts_auto_wrap.js","sourceRoot":"","sources":["../../src/protoplasm/ts_auto_wrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 🧬 PROTOPLASM — USB SOUL
3
+ *
4
+ * Write the WAL ledger + findings + HMAC key to a portable mount point
5
+ * (USB / SD card / network share). Plug into another machine → resume.
6
+ *
7
+ * Mount detection:
8
+ * - env MNEME_USB_SOUL_PATH=<path> (explicit override, recommended)
9
+ * - .mneme/usb_mount file (per-repo pinned mount)
10
+ * - autodetect: Windows D:/-Z:/ removable drives; macOS /Volumes; Linux /media+/mnt
11
+ *
12
+ * Sync:
13
+ * syncTo(path) — copy WAL + findings + (optionally encrypted) key
14
+ * syncFrom(path) — replay WAL from USB into local .mneme/protoplasm/
15
+ * verifyMount(p) — quick sanity (writable + has expected layout)
16
+ *
17
+ * Encryption: key file is HMAC-encrypted with passphrase when --encrypt flag.
18
+ * Without passphrase, key is stored plain (warning).
19
+ */
20
+ export interface UsbSoulResult {
21
+ ok: boolean;
22
+ mount: string;
23
+ copied?: string[];
24
+ reason?: string;
25
+ bytesWritten?: number;
26
+ }
27
+ export declare function pickMount(): string | null;
28
+ export declare function verifyMount(mount: string): {
29
+ ok: boolean;
30
+ writable: boolean;
31
+ hasLayout: boolean;
32
+ };
33
+ export declare function syncTo(mount: string, ledgerDir: string, encryptPassphrase?: string): UsbSoulResult;
34
+ export declare function syncFrom(mount: string, ledgerDir: string): UsbSoulResult;
35
+ //# sourceMappingURL=usb_soul.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usb_soul.d.ts","sourceRoot":"","sources":["../../src/protoplasm/usb_soul.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AASH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA2BD,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAWzC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAWjG;AAMD,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,aAAa,CAkClG;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CAqBxE"}