mneme-ai 3.22.0 → 3.23.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.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `mneme live` — the real-time health of Mneme's background support for AI agents.
3
+ * Gathers live facts (daemon heartbeat · hook wired · every provider's send+clear readiness +
4
+ * reachability · relay · state integrity · an end-to-end pipeline canary) and renders one verdict:
5
+ * LIVE / DEGRADED / DOWN — with auto-heal. Catches SILENT breakage before a user ever hits it.
6
+ */
7
+ import type { Command } from "commander";
8
+ export declare function registerLiveCommands(program: Command): void;
9
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/commands/live.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiD3D"}
@@ -0,0 +1,110 @@
1
+ import { existsSync, readFileSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { get as httpsGet, request as httpsRequest } from "node:https";
4
+ import { spawn } from "node:child_process";
5
+ import { live } from "@mneme-ai/core";
6
+ function out(s) { process.stdout.write(s + "\n"); }
7
+ function ping(url) { return new Promise((res) => { try {
8
+ const r = httpsGet(url, (x) => { x.resume(); res((x.statusCode ?? 0) > 0 && (x.statusCode ?? 0) < 500); });
9
+ r.on("error", () => res(false));
10
+ r.setTimeout(6000, () => { r.destroy(); res(false); });
11
+ }
12
+ catch {
13
+ res(false);
14
+ } }); }
15
+ function postForm(host, path, body) { return new Promise((res) => { try {
16
+ const r = httpsRequest({ hostname: host, path, method: "POST", headers: { "content-type": "application/x-www-form-urlencoded", "content-length": Buffer.byteLength(body) } }, (x) => { x.resume(); res(x.statusCode ?? 0); });
17
+ r.on("error", () => res(0));
18
+ r.setTimeout(6000, () => { r.destroy(); res(0); });
19
+ r.write(body);
20
+ r.end();
21
+ }
22
+ catch {
23
+ res(0);
24
+ } }); }
25
+ export function registerLiveCommands(program) {
26
+ program.command("vitals").description("📡 MNEME LIVE — is Mneme actually supporting your AI agent right now? One verdict (LIVE/DEGRADED/DOWN) from real probes: daemon · hook · every provider's send+clear readiness · relay · state · an end-to-end pipeline canary. Catches silent breakage.")
27
+ .option("--heal", "auto-run the safe heal actions (restart daemon, etc.)")
28
+ .option("--json", "machine-readable report")
29
+ .action(async (o) => {
30
+ const cwd = process.cwd();
31
+ const m = (p) => join(cwd, ".mneme", "pager", p);
32
+ // daemon heartbeat
33
+ let daemonHeartbeatAgeMs = null;
34
+ try {
35
+ if (existsSync(m("daemon.heartbeat")))
36
+ daemonHeartbeatAgeMs = Date.now() - statSync(m("daemon.heartbeat")).mtimeMs;
37
+ }
38
+ catch { /* */ }
39
+ // hook
40
+ let hookWired = false;
41
+ try {
42
+ for (const f of [".claude/settings.json", ".claude/settings.local.json"]) {
43
+ const p = join(cwd, f);
44
+ if (existsSync(p) && readFileSync(p, "utf8").includes("pager request"))
45
+ hookWired = true;
46
+ }
47
+ }
48
+ catch { /* */ }
49
+ // config + providers
50
+ let cfg = {};
51
+ try {
52
+ cfg = JSON.parse(readFileSync(m("config.json"), "utf8"));
53
+ }
54
+ catch { /* */ }
55
+ let provs = {};
56
+ try {
57
+ provs = JSON.parse(readFileSync(join(cwd, ".mneme", "keryx", "providers.json"), "utf8"));
58
+ }
59
+ catch { /* */ }
60
+ const tgCfg = cfg["telegramToken"] ? { token: String(cfg["telegramToken"]) } : null;
61
+ // reachability probes (real, short-timeout)
62
+ const tgReach = tgCfg ? await ping(`https://api.telegram.org/bot${tgCfg.token}/getMe`) : null;
63
+ const lineReach = provs.line?.channelId && provs.line?.channelSecret ? (await postForm("api.line.me", "/v2/oauth/accessToken", `grant_type=client_credentials&client_id=${provs.line.channelId}&client_secret=${provs.line.channelSecret}`)) === 200 : null;
64
+ const relayCfg = cfg["keryxRelay"] ? String(cfg["keryxRelay"]) : "";
65
+ const relayReach = relayCfg ? await ping(`${relayCfg.replace(/\/$/, "")}/keryx/drain?daemon=default`) : null;
66
+ // state + canary
67
+ let stateOk = true;
68
+ try {
69
+ JSON.parse(readFileSync(m("state.json"), "utf8"));
70
+ }
71
+ catch {
72
+ stateOk = existsSync(m("state.json")) ? false : true;
73
+ }
74
+ const canary = live.approvalCanary();
75
+ const facts = {
76
+ daemonHeartbeatAgeMs, hookWired,
77
+ relay: relayCfg ? { configured: true, reachable: relayReach } : { configured: false, reachable: null },
78
+ providers: [
79
+ { name: "telegram", cfg: tgCfg, reachable: tgReach },
80
+ { name: "line", cfg: provs.line ?? null, reachable: lineReach },
81
+ { name: "slack", cfg: provs.slack ?? null }, { name: "discord", cfg: provs.discord ?? null }, { name: "whatsapp", cfg: provs.whatsapp ?? null },
82
+ ],
83
+ stateOk, canaryOk: canary.ok,
84
+ };
85
+ const rep = live.evaluateLiveness(facts);
86
+ if (o.json) {
87
+ out(JSON.stringify({ ...rep, canary }, null, 2));
88
+ return;
89
+ }
90
+ const ico = rep.verdict === "live" ? "🟢" : rep.verdict === "degraded" ? "🟡" : "🔴";
91
+ out(`📡 MNEME LIVE — ${ico} ${rep.summary}`);
92
+ for (const p of rep.probes)
93
+ out(` ${p.status === "live" ? "✓" : p.status === "degraded" ? "▴" : "✗"} ${p.name.padEnd(20)} ${p.detail}${p.heal ? ` → ${p.heal}` : ""}`);
94
+ if (!canary.ok)
95
+ out(` canary steps: ${canary.steps.filter((s) => !s.ok).map((s) => s.step).join(", ")} FAILED`);
96
+ if (o.heal && rep.heals.length) {
97
+ out(`\n🔧 healing: ${rep.heals.join(" · ")}`);
98
+ if (rep.heals.includes("mneme pager doctor")) {
99
+ try {
100
+ spawn(process.execPath, [process.argv[1], "pager", "doctor"], { stdio: "ignore", detached: true }).unref();
101
+ out(" ✓ daemon restart kicked");
102
+ }
103
+ catch { /* */ }
104
+ }
105
+ }
106
+ if (rep.verdict !== "live")
107
+ process.exitCode = 2;
108
+ });
109
+ }
110
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/commands/live.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmMA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmmNvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoMA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAomNvD"}
package/dist/index.js CHANGED
@@ -113,6 +113,7 @@ import { registerThymosCommands } from "./commands/thymos.js";
113
113
  import { registerInfraCommands } from "./commands/infra.js";
114
114
  import { registerAphelionCommands } from "./commands/aphelion.js";
115
115
  import { registerOrbitalCommands } from "./commands/orbital.js";
116
+ import { registerLiveCommands } from "./commands/live.js";
116
117
  import { registerAdamasCommands } from "./commands/adamas.js";
117
118
  import { registerPrismCommands } from "./commands/prism.js";
118
119
  import { registerGoldilocksCommands } from "./commands/goldilocks.js";
@@ -4793,6 +4794,7 @@ export async function run(argv) {
4793
4794
  registerInfraCommands(program);
4794
4795
  registerAphelionCommands(program);
4795
4796
  registerOrbitalCommands(program);
4797
+ registerLiveCommands(program);
4796
4798
  registerAdamasCommands(program);
4797
4799
  registerPrismCommands(program);
4798
4800
  registerGoldilocksCommands(program);