@mneme-ai/core 1.92.0 → 1.94.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 (56) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +22 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/nucleus_daemon.d.ts.map +1 -1
  6. package/dist/nucleus_daemon.js +36 -3
  7. package/dist/nucleus_daemon.js.map +1 -1
  8. package/dist/qx_supernova/benchmark.d.ts +40 -0
  9. package/dist/qx_supernova/benchmark.d.ts.map +1 -0
  10. package/dist/qx_supernova/benchmark.js +359 -0
  11. package/dist/qx_supernova/benchmark.js.map +1 -0
  12. package/dist/qx_supernova/index.d.ts +27 -0
  13. package/dist/qx_supernova/index.d.ts.map +1 -0
  14. package/dist/qx_supernova/index.js +27 -0
  15. package/dist/qx_supernova/index.js.map +1 -0
  16. package/dist/qx_supernova/infinity_memory.d.ts +67 -0
  17. package/dist/qx_supernova/infinity_memory.d.ts.map +1 -0
  18. package/dist/qx_supernova/infinity_memory.js +119 -0
  19. package/dist/qx_supernova/infinity_memory.js.map +1 -0
  20. package/dist/qx_supernova/quantum_core.d.ts +71 -0
  21. package/dist/qx_supernova/quantum_core.d.ts.map +1 -0
  22. package/dist/qx_supernova/quantum_core.js +134 -0
  23. package/dist/qx_supernova/quantum_core.js.map +1 -0
  24. package/dist/qx_supernova/qx_supernova.test.d.ts +2 -0
  25. package/dist/qx_supernova/qx_supernova.test.d.ts.map +1 -0
  26. package/dist/qx_supernova/qx_supernova.test.js +241 -0
  27. package/dist/qx_supernova/qx_supernova.test.js.map +1 -0
  28. package/dist/qx_supernova/reengineer.d.ts +45 -0
  29. package/dist/qx_supernova/reengineer.d.ts.map +1 -0
  30. package/dist/qx_supernova/reengineer.js +125 -0
  31. package/dist/qx_supernova/reengineer.js.map +1 -0
  32. package/dist/qx_supernova/soul_engine.d.ts +63 -0
  33. package/dist/qx_supernova/soul_engine.d.ts.map +1 -0
  34. package/dist/qx_supernova/soul_engine.js +143 -0
  35. package/dist/qx_supernova/soul_engine.js.map +1 -0
  36. package/dist/qx_supernova/supernova_burst.d.ts +48 -0
  37. package/dist/qx_supernova/supernova_burst.d.ts.map +1 -0
  38. package/dist/qx_supernova/supernova_burst.js +84 -0
  39. package/dist/qx_supernova/supernova_burst.js.map +1 -0
  40. package/dist/system_compat/index.d.ts +119 -0
  41. package/dist/system_compat/index.d.ts.map +1 -0
  42. package/dist/system_compat/index.js +283 -0
  43. package/dist/system_compat/index.js.map +1 -0
  44. package/dist/system_compat/system_compat.test.d.ts +2 -0
  45. package/dist/system_compat/system_compat.test.d.ts.map +1 -0
  46. package/dist/system_compat/system_compat.test.js +208 -0
  47. package/dist/system_compat/system_compat.test.js.map +1 -0
  48. package/dist/token_nova/index.d.ts +181 -0
  49. package/dist/token_nova/index.d.ts.map +1 -0
  50. package/dist/token_nova/index.js +352 -0
  51. package/dist/token_nova/index.js.map +1 -0
  52. package/dist/token_nova/token_nova.test.d.ts +2 -0
  53. package/dist/token_nova/token_nova.test.d.ts.map +1 -0
  54. package/dist/token_nova/token_nova.test.js +223 -0
  55. package/dist/token_nova/token_nova.test.js.map +1 -0
  56. package/package.json +1 -1
@@ -0,0 +1,283 @@
1
+ /**
2
+ * v1.93.0 -- SYSTEM-COMPAT bot: probe the upgrade environment BEFORE
3
+ * the daemon runs `mneme upgrade --force` so silent failures are
4
+ * impossible.
5
+ *
6
+ * The user's instruction (verbatim):
7
+ * "ต้องมี bot เชคว่าใช้ได้ทุก environment ไหมนะ ทั้ง linux, windows,
8
+ * mac os และแต่ละ os มันก็มีเวอร์ชั่น ต้องเชคด้วย และต้องใช้ได้แบบ
9
+ * smooth super wisdom และไม่มีปัญหากับ node, brew ต้องเข้าใจกันหมด"
10
+ *
11
+ * What this module decides:
12
+ * 1. Is Node new enough? (>= 22)
13
+ * 2. Is the global install path writable WITHOUT sudo?
14
+ * 3. Which package managers are available? (npm / yarn / pnpm / brew / docker)
15
+ * 4. Which upgrade strategy will succeed on THIS machine? (global-npm /
16
+ * user-npm / brew / docker / manual)
17
+ * 5. Final verdict: SAFE (proceed) / DEFER (wait, ask user) / BLOCK
18
+ * (refuse, would damage the system).
19
+ *
20
+ * The daemon calls probeUpgradeEnvironment() before spawning the upgrade.
21
+ * On BLOCK → push a clear inbox message + skip the spawn. On DEFER →
22
+ * push a "needs-attention" inbox + skip. On SAFE → proceed.
23
+ *
24
+ * Pure functions only — every probe returns synchronously. No network,
25
+ * no LLM, no surprises.
26
+ */
27
+ import { spawnSync } from "node:child_process";
28
+ import { existsSync, accessSync, constants, statSync } from "node:fs";
29
+ import { join, dirname } from "node:path";
30
+ import { homedir, platform, release, arch } from "node:os";
31
+ const MIN_NODE_MAJOR = 22;
32
+ // ============================================================
33
+ // OS info
34
+ // ============================================================
35
+ export function probeOs() {
36
+ const p = platform();
37
+ const r = release();
38
+ const a = arch();
39
+ let label;
40
+ if (p === "win32") {
41
+ label = r.startsWith("10.0") ? "Windows 10/11" : `Windows ${r}`;
42
+ }
43
+ else if (p === "darwin") {
44
+ // macOS Darwin major numbers: 22 = Ventura, 23 = Sonoma, 24 = Sequoia.
45
+ const major = parseInt(r.split(".")[0] ?? "0", 10);
46
+ const macLabels = { 20: "macOS Big Sur", 21: "macOS Monterey", 22: "macOS Ventura", 23: "macOS Sonoma", 24: "macOS Sequoia" };
47
+ label = macLabels[major] ?? `macOS ${r}`;
48
+ }
49
+ else if (p === "linux") {
50
+ label = `Linux ${r}`;
51
+ }
52
+ else {
53
+ label = `${p} ${r}`;
54
+ }
55
+ return { platform: p, release: r, arch: a, label };
56
+ }
57
+ // ============================================================
58
+ // Node info
59
+ // ============================================================
60
+ export function probeNode() {
61
+ const version = process.version; // e.g. "v22.7.0"
62
+ const major = parseInt(version.replace(/^v/, "").split(".")[0] ?? "0", 10);
63
+ return {
64
+ version,
65
+ major,
66
+ ok: major >= MIN_NODE_MAJOR,
67
+ minRequired: `v${MIN_NODE_MAJOR}.0.0`,
68
+ };
69
+ }
70
+ /** Shared spawn helper. windowsHide:true keeps the daemon silent. */
71
+ function runCmd(cmd, args) {
72
+ let r;
73
+ try {
74
+ r = spawnSync(cmd, args, { encoding: "utf8", windowsHide: true, timeout: 5000, shell: platform() === "win32" });
75
+ }
76
+ catch (e) {
77
+ return { stdout: "", stderr: e.message, status: -1 };
78
+ }
79
+ return { stdout: r.stdout ?? "", stderr: r.stderr ?? "", status: r.status };
80
+ }
81
+ function whichPath(name) {
82
+ const cmd = platform() === "win32" ? "where" : "which";
83
+ const r = runCmd(cmd, [name]);
84
+ if (r.status !== 0)
85
+ return null;
86
+ return r.stdout.split(/\r?\n/)[0]?.trim() || null;
87
+ }
88
+ function probePm(name, versionFlag = "--version") {
89
+ const path = whichPath(name);
90
+ if (!path)
91
+ return { available: false, version: null, path: null };
92
+ const r = runCmd(name, [versionFlag]);
93
+ if (r.status !== 0)
94
+ return { available: false, version: null, path };
95
+ const version = r.stdout.split(/\r?\n/)[0]?.trim() || null;
96
+ return { available: true, version, path };
97
+ }
98
+ export function probePackageManagers() {
99
+ return {
100
+ npm: probePm("npm"),
101
+ yarn: probePm("yarn"),
102
+ pnpm: probePm("pnpm"),
103
+ brew: probePm("brew"),
104
+ docker: probePm("docker"),
105
+ };
106
+ }
107
+ // ============================================================
108
+ // Global install permissions
109
+ // ============================================================
110
+ export function probeGlobalInstall() {
111
+ // Ask npm where global packages live. This is the canonical answer per
112
+ // user's npm config (handles `nvm`, `volta`, custom prefix, etc.).
113
+ const npmAvailable = whichPath("npm") !== null;
114
+ if (!npmAvailable) {
115
+ return { prefix: null, binDir: null, modulesDir: null, writable: false, needsElevation: true, notWritableReason: "npm not on PATH" };
116
+ }
117
+ const r = runCmd("npm", ["config", "get", "prefix"]);
118
+ if (r.status !== 0) {
119
+ return { prefix: null, binDir: null, modulesDir: null, writable: false, needsElevation: true, notWritableReason: "npm config get prefix failed" };
120
+ }
121
+ const prefix = r.stdout.trim();
122
+ if (!prefix) {
123
+ return { prefix: null, binDir: null, modulesDir: null, writable: false, needsElevation: true, notWritableReason: "empty npm prefix" };
124
+ }
125
+ const isWin = platform() === "win32";
126
+ const binDir = isWin ? prefix : join(prefix, "bin");
127
+ const modulesDir = isWin ? join(prefix, "node_modules") : join(prefix, "lib", "node_modules");
128
+ // Test writability. If the dirs exist, check write access. If not, walk
129
+ // up to the nearest existing parent and check that.
130
+ let writable = false;
131
+ let notWritableReason = null;
132
+ try {
133
+ const targetDir = existsSync(modulesDir) ? modulesDir : nearestExistingAncestor(modulesDir);
134
+ if (targetDir) {
135
+ accessSync(targetDir, constants.W_OK);
136
+ writable = true;
137
+ }
138
+ else {
139
+ notWritableReason = "no existing ancestor directory";
140
+ }
141
+ }
142
+ catch (e) {
143
+ notWritableReason = `not writable: ${e.message}`;
144
+ }
145
+ // On POSIX, /usr/local typically requires sudo. Detect that case.
146
+ const needsElevation = !writable && (prefix.startsWith("/usr") ||
147
+ prefix.startsWith("/opt") ||
148
+ (isWin && /Program Files/i.test(prefix)));
149
+ return { prefix, binDir, modulesDir, writable, needsElevation, notWritableReason };
150
+ }
151
+ function nearestExistingAncestor(p) {
152
+ let cur = p;
153
+ for (let i = 0; i < 10; i++) {
154
+ if (existsSync(cur))
155
+ return cur;
156
+ const parent = dirname(cur);
157
+ if (parent === cur)
158
+ return null;
159
+ cur = parent;
160
+ }
161
+ return null;
162
+ }
163
+ // ============================================================
164
+ // Strategy + verdict
165
+ // ============================================================
166
+ export function decideStrategy(probe) {
167
+ const reasons = [];
168
+ if (!probe.node.ok) {
169
+ reasons.push(`Node ${probe.node.version} is too old (need ${probe.node.minRequired}+). User must upgrade Node first.`);
170
+ return { strategy: "manual", verdict: "BLOCK", reasons };
171
+ }
172
+ // Prefer global npm when the prefix is writable.
173
+ if (probe.packageManagers.npm.available && probe.globalInstall.writable) {
174
+ reasons.push(`npm ${probe.packageManagers.npm.version} available; global prefix ${probe.globalInstall.prefix} is writable.`);
175
+ return { strategy: "global-npm", verdict: "SAFE", reasons };
176
+ }
177
+ // npm available but prefix NOT writable (typical macOS Homebrew-installed Node
178
+ // owned by root, or Linux /usr/local without sudo).
179
+ if (probe.packageManagers.npm.available && !probe.globalInstall.writable) {
180
+ if (probe.globalInstall.needsElevation) {
181
+ reasons.push(`npm global prefix ${probe.globalInstall.prefix} requires elevation. Refusing to auto-sudo. User should set a user-level prefix (npm config set prefix ~/.local) or use Docker.`);
182
+ return { strategy: "user-npm", verdict: "DEFER", reasons };
183
+ }
184
+ reasons.push(`npm global prefix not writable (${probe.globalInstall.notWritableReason ?? "unknown reason"}). Falling back to user-prefix install.`);
185
+ return { strategy: "user-npm", verdict: "SAFE", reasons };
186
+ }
187
+ // macOS + brew + no npm → recommend brew (when the tap ships; today it's manual)
188
+ if (probe.os.platform === "darwin" && probe.packageManagers.brew.available && !probe.packageManagers.npm.available) {
189
+ reasons.push("npm unavailable on this macOS. Brew is available but a Mneme tap is not yet shipped (roadmap). Falling back to Docker.");
190
+ if (probe.packageManagers.docker.available) {
191
+ return { strategy: "docker", verdict: "SAFE", reasons };
192
+ }
193
+ return { strategy: "manual", verdict: "DEFER", reasons };
194
+ }
195
+ // Last resort: Docker
196
+ if (probe.packageManagers.docker.available) {
197
+ reasons.push(`npm unavailable; Docker is available — using container strategy.`);
198
+ return { strategy: "docker", verdict: "SAFE", reasons };
199
+ }
200
+ reasons.push("No supported package manager found (npm, brew, docker all missing). User must install Node ≥ 22 or Docker manually.");
201
+ return { strategy: "manual", verdict: "BLOCK", reasons };
202
+ }
203
+ // ============================================================
204
+ // Top-level probe
205
+ // ============================================================
206
+ export function probeUpgradeEnvironment() {
207
+ const os = probeOs();
208
+ const node = probeNode();
209
+ const packageManagers = probePackageManagers();
210
+ const globalInstall = probeGlobalInstall();
211
+ const { strategy, verdict, reasons } = decideStrategy({ os, node, packageManagers, globalInstall });
212
+ const pulseLine = formatPulseLine({ os, node, verdict, strategy });
213
+ return {
214
+ ts: Date.now(),
215
+ os,
216
+ node,
217
+ packageManagers,
218
+ globalInstall,
219
+ upgradeStrategy: strategy,
220
+ verdict,
221
+ reasons,
222
+ pulseLine,
223
+ };
224
+ }
225
+ export function formatPulseLine(args) {
226
+ const verdictMark = args.verdict === "SAFE" ? "✓" : args.verdict === "DEFER" ? "⏳" : "✗";
227
+ return `SYSTEM-COMPAT ${verdictMark} ${args.verdict} · ${args.os.label} · Node ${args.node.version} · strategy=${args.strategy}`;
228
+ }
229
+ /** Produce the actual shell args the daemon should spawn for a given
230
+ * strategy. Returns null if strategy is "manual" (don't auto-execute). */
231
+ export function commandFor(strategy) {
232
+ switch (strategy) {
233
+ case "global-npm":
234
+ return { cmd: "npm", args: ["install", "-g", "mneme-ai@latest"] };
235
+ case "user-npm":
236
+ return { cmd: "npm", args: ["install", "--prefix", join(homedir(), ".local"), "-g", "mneme-ai@latest"] };
237
+ case "brew":
238
+ return { cmd: "brew", args: ["upgrade", "mneme-ai"] };
239
+ case "docker":
240
+ return { cmd: "docker", args: ["pull", "ghcr.io/patsa2561-art/mneme-ai:latest"] };
241
+ case "manual":
242
+ return null;
243
+ }
244
+ }
245
+ /** Used by stat-based ancestry probes — kept exported so tests can verify
246
+ * the algorithm works on synthetic paths. */
247
+ export function _testNearestAncestor(p) {
248
+ return nearestExistingAncestor(p);
249
+ }
250
+ export function gateDaemonUpgrade() {
251
+ const probe = probeUpgradeEnvironment();
252
+ if (probe.verdict === "BLOCK") {
253
+ return {
254
+ shouldProceed: false,
255
+ inboxLine: `SYSTEM-COMPAT BLOCKED upgrade: ${probe.reasons.join(" · ")}`,
256
+ };
257
+ }
258
+ if (probe.verdict === "DEFER") {
259
+ return {
260
+ shouldProceed: false,
261
+ inboxLine: `SYSTEM-COMPAT DEFERRED upgrade: ${probe.reasons.join(" · ")} — ask user how to proceed`,
262
+ };
263
+ }
264
+ const cmd = commandFor(probe.upgradeStrategy);
265
+ if (!cmd) {
266
+ return {
267
+ shouldProceed: false,
268
+ inboxLine: `SYSTEM-COMPAT could not derive command for strategy=${probe.upgradeStrategy}`,
269
+ };
270
+ }
271
+ return { shouldProceed: true, command: cmd };
272
+ }
273
+ /** Stat helper exported for test introspection only. */
274
+ export function _statSafe(p) {
275
+ try {
276
+ const s = statSync(p);
277
+ return { exists: true, isDir: s.isDirectory() };
278
+ }
279
+ catch {
280
+ return { exists: false, isDir: false };
281
+ }
282
+ }
283
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/system_compat/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=system_compat.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system_compat.test.d.ts","sourceRoot":"","sources":["../../src/system_compat/system_compat.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,208 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { platform } from "node:os";
3
+ import { probeOs, probeNode, probePackageManagers, probeGlobalInstall, decideStrategy, probeUpgradeEnvironment, formatPulseLine, commandFor, gateDaemonUpgrade, } from "./index.js";
4
+ describe("v1.93 SYSTEM-COMPAT · OS probe", () => {
5
+ it("returns platform + release + arch", () => {
6
+ const os = probeOs();
7
+ expect(["win32", "darwin", "linux", "freebsd", "aix", "openbsd", "sunos"]).toContain(os.platform);
8
+ expect(typeof os.release).toBe("string");
9
+ expect(typeof os.arch).toBe("string");
10
+ expect(os.label.length).toBeGreaterThan(0);
11
+ });
12
+ it("labels Windows / macOS / Linux distinctly", () => {
13
+ const os = probeOs();
14
+ if (os.platform === "win32")
15
+ expect(os.label).toMatch(/Windows/);
16
+ if (os.platform === "darwin")
17
+ expect(os.label).toMatch(/macOS/);
18
+ if (os.platform === "linux")
19
+ expect(os.label).toMatch(/Linux/);
20
+ });
21
+ });
22
+ describe("v1.93 SYSTEM-COMPAT · Node probe", () => {
23
+ it("parses major from process.version", () => {
24
+ const n = probeNode();
25
+ expect(n.version).toBe(process.version);
26
+ expect(n.major).toBeGreaterThanOrEqual(20); // anyone running tests has a sane Node
27
+ expect(n.minRequired).toBe("v22.0.0");
28
+ expect(typeof n.ok).toBe("boolean");
29
+ });
30
+ it("ok=true when major >= 22", () => {
31
+ const n = probeNode();
32
+ if (n.major >= 22)
33
+ expect(n.ok).toBe(true);
34
+ else
35
+ expect(n.ok).toBe(false);
36
+ });
37
+ });
38
+ describe("v1.93 SYSTEM-COMPAT · package managers", () => {
39
+ it("returns shape for every checked manager", () => {
40
+ const pm = probePackageManagers();
41
+ for (const key of ["npm", "yarn", "pnpm", "brew", "docker"]) {
42
+ expect(pm[key]).toHaveProperty("available");
43
+ expect(pm[key]).toHaveProperty("version");
44
+ expect(pm[key]).toHaveProperty("path");
45
+ expect(typeof pm[key].available).toBe("boolean");
46
+ }
47
+ });
48
+ it("npm SHOULD be available when running these tests via vitest", () => {
49
+ const pm = probePackageManagers();
50
+ expect(pm.npm.available).toBe(true);
51
+ expect(pm.npm.version).toBeTruthy();
52
+ });
53
+ });
54
+ describe("v1.93 SYSTEM-COMPAT · global-install probe", () => {
55
+ it("returns prefix when npm is available", () => {
56
+ const g = probeGlobalInstall();
57
+ // npm is available in test env; prefix should be a non-empty string
58
+ expect(g.prefix).toBeTruthy();
59
+ expect(g.binDir).toBeTruthy();
60
+ expect(g.modulesDir).toBeTruthy();
61
+ });
62
+ it("writable is a boolean and reflects reality", () => {
63
+ const g = probeGlobalInstall();
64
+ expect(typeof g.writable).toBe("boolean");
65
+ expect(typeof g.needsElevation).toBe("boolean");
66
+ });
67
+ });
68
+ describe("v1.93 SYSTEM-COMPAT · decideStrategy", () => {
69
+ const baseOk = {
70
+ os: { platform: platform(), release: "x", arch: "x64", label: "Test OS" },
71
+ node: { version: "v22.7.0", major: 22, ok: true, minRequired: "v22.0.0" },
72
+ packageManagers: {
73
+ npm: { available: true, version: "10.0.0", path: "/usr/bin/npm" },
74
+ yarn: { available: false, version: null, path: null },
75
+ pnpm: { available: false, version: null, path: null },
76
+ brew: { available: false, version: null, path: null },
77
+ docker: { available: false, version: null, path: null },
78
+ },
79
+ globalInstall: { prefix: "/home/u/.npm-global", binDir: "/home/u/.npm-global/bin", modulesDir: "/home/u/.npm-global/lib/node_modules", writable: true, needsElevation: false, notWritableReason: null },
80
+ };
81
+ it("BLOCKS when Node is too old", () => {
82
+ const d = decideStrategy({ ...baseOk, node: { version: "v20.0.0", major: 20, ok: false, minRequired: "v22.0.0" } });
83
+ expect(d.verdict).toBe("BLOCK");
84
+ expect(d.strategy).toBe("manual");
85
+ expect(d.reasons[0]).toContain("too old");
86
+ });
87
+ it("returns SAFE + global-npm when npm available and prefix writable", () => {
88
+ const d = decideStrategy(baseOk);
89
+ expect(d.verdict).toBe("SAFE");
90
+ expect(d.strategy).toBe("global-npm");
91
+ });
92
+ it("DEFERS when prefix needs elevation (sudo)", () => {
93
+ const d = decideStrategy({
94
+ ...baseOk,
95
+ globalInstall: { prefix: "/usr/local", binDir: "/usr/local/bin", modulesDir: "/usr/local/lib/node_modules", writable: false, needsElevation: true, notWritableReason: "EACCES" },
96
+ });
97
+ expect(d.verdict).toBe("DEFER");
98
+ expect(d.strategy).toBe("user-npm");
99
+ expect(d.reasons.some((r) => r.includes("elevation"))).toBe(true);
100
+ });
101
+ it("falls back to user-npm SAFELY when prefix not writable but no elevation needed", () => {
102
+ const d = decideStrategy({
103
+ ...baseOk,
104
+ globalInstall: { prefix: "/home/u/.npm-global", binDir: "/home/u/.npm-global/bin", modulesDir: "/home/u/.npm-global/lib/node_modules", writable: false, needsElevation: false, notWritableReason: "ENOENT" },
105
+ });
106
+ expect(d.verdict).toBe("SAFE");
107
+ expect(d.strategy).toBe("user-npm");
108
+ });
109
+ it("uses docker when npm gone but docker is around", () => {
110
+ const d = decideStrategy({
111
+ ...baseOk,
112
+ packageManagers: { ...baseOk.packageManagers, npm: { available: false, version: null, path: null }, docker: { available: true, version: "Docker version 27.0.1", path: "/usr/bin/docker" } },
113
+ globalInstall: { prefix: null, binDir: null, modulesDir: null, writable: false, needsElevation: false, notWritableReason: "npm not on PATH" },
114
+ });
115
+ expect(d.verdict).toBe("SAFE");
116
+ expect(d.strategy).toBe("docker");
117
+ });
118
+ it("BLOCKS when nothing is available", () => {
119
+ const d = decideStrategy({
120
+ ...baseOk,
121
+ packageManagers: {
122
+ npm: { available: false, version: null, path: null },
123
+ yarn: { available: false, version: null, path: null },
124
+ pnpm: { available: false, version: null, path: null },
125
+ brew: { available: false, version: null, path: null },
126
+ docker: { available: false, version: null, path: null },
127
+ },
128
+ globalInstall: { prefix: null, binDir: null, modulesDir: null, writable: false, needsElevation: true, notWritableReason: "npm not on PATH" },
129
+ });
130
+ expect(d.verdict).toBe("BLOCK");
131
+ expect(d.strategy).toBe("manual");
132
+ });
133
+ it("macOS + brew + no npm + docker → docker strategy", () => {
134
+ const d = decideStrategy({
135
+ ...baseOk,
136
+ os: { platform: "darwin", release: "23.0.0", arch: "arm64", label: "macOS Sonoma" },
137
+ packageManagers: {
138
+ npm: { available: false, version: null, path: null },
139
+ yarn: { available: false, version: null, path: null },
140
+ pnpm: { available: false, version: null, path: null },
141
+ brew: { available: true, version: "Homebrew 4.0.0", path: "/opt/homebrew/bin/brew" },
142
+ docker: { available: true, version: "27", path: "/usr/local/bin/docker" },
143
+ },
144
+ globalInstall: { prefix: null, binDir: null, modulesDir: null, writable: false, needsElevation: false, notWritableReason: "npm not on PATH" },
145
+ });
146
+ expect(d.verdict).toBe("SAFE");
147
+ expect(d.strategy).toBe("docker");
148
+ });
149
+ });
150
+ describe("v1.93 SYSTEM-COMPAT · top-level probe", () => {
151
+ it("returns a complete probe object", () => {
152
+ const p = probeUpgradeEnvironment();
153
+ expect(p.ts).toBeGreaterThan(0);
154
+ expect(p.os).toBeTruthy();
155
+ expect(p.node).toBeTruthy();
156
+ expect(p.packageManagers).toBeTruthy();
157
+ expect(p.globalInstall).toBeTruthy();
158
+ expect(["SAFE", "DEFER", "BLOCK"]).toContain(p.verdict);
159
+ expect(["global-npm", "user-npm", "brew", "docker", "manual"]).toContain(p.upgradeStrategy);
160
+ expect(p.reasons.length).toBeGreaterThan(0);
161
+ expect(p.pulseLine).toContain("SYSTEM-COMPAT");
162
+ });
163
+ it("pulseLine reflects verdict (✓ / ⏳ / ✗)", () => {
164
+ const p = probeUpgradeEnvironment();
165
+ if (p.verdict === "SAFE")
166
+ expect(p.pulseLine).toContain("✓");
167
+ if (p.verdict === "DEFER")
168
+ expect(p.pulseLine).toContain("⏳");
169
+ if (p.verdict === "BLOCK")
170
+ expect(p.pulseLine).toContain("✗");
171
+ });
172
+ });
173
+ describe("v1.93 SYSTEM-COMPAT · commandFor + daemon gate", () => {
174
+ it("returns the right shell command for each strategy", () => {
175
+ const g = commandFor("global-npm");
176
+ expect(g.cmd).toBe("npm");
177
+ expect(g.args).toContain("-g");
178
+ expect(g.args.some((a) => a.includes("mneme-ai"))).toBe(true);
179
+ const u = commandFor("user-npm");
180
+ expect(u.cmd).toBe("npm");
181
+ expect(u.args).toContain("--prefix");
182
+ const d = commandFor("docker");
183
+ expect(d.cmd).toBe("docker");
184
+ expect(d.args[0]).toBe("pull");
185
+ expect(commandFor("manual")).toBeNull();
186
+ });
187
+ it("gateDaemonUpgrade decides shouldProceed", () => {
188
+ const g = gateDaemonUpgrade();
189
+ expect(typeof g.shouldProceed).toBe("boolean");
190
+ if (g.shouldProceed) {
191
+ expect(g.command).toBeTruthy();
192
+ expect(g.command.cmd).toMatch(/npm|docker|brew/);
193
+ }
194
+ else {
195
+ expect(g.inboxLine).toBeTruthy();
196
+ }
197
+ });
198
+ });
199
+ describe("v1.93 SYSTEM-COMPAT · formatPulseLine", () => {
200
+ it("uses ✓ for SAFE, ⏳ for DEFER, ✗ for BLOCK", () => {
201
+ const os = { platform: "linux", release: "5.10", arch: "x64", label: "Linux" };
202
+ const node = { version: "v22.0.0", major: 22, ok: true, minRequired: "v22.0.0" };
203
+ expect(formatPulseLine({ os, node, verdict: "SAFE", strategy: "global-npm" })).toContain("✓");
204
+ expect(formatPulseLine({ os, node, verdict: "DEFER", strategy: "user-npm" })).toContain("⏳");
205
+ expect(formatPulseLine({ os, node, verdict: "BLOCK", strategy: "manual" })).toContain("✗");
206
+ });
207
+ });
208
+ //# sourceMappingURL=system_compat.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system_compat.test.js","sourceRoot":"","sources":["../../src/system_compat/system_compat.test.ts"],"names":[],"mappings":"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"}