smart-claude-memory-mcp 2.1.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 (104) hide show
  1. package/.claude-plugin/plugin.json +38 -0
  2. package/CHANGELOG.md +52 -0
  3. package/LICENSE +21 -0
  4. package/README.md +790 -0
  5. package/dist/chunker.js +33 -0
  6. package/dist/chunker.js.map +1 -0
  7. package/dist/config.js +23 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/curriculum/daemon.js +190 -0
  10. package/dist/curriculum/daemon.js.map +1 -0
  11. package/dist/curriculum/scanner.js +237 -0
  12. package/dist/curriculum/scanner.js.map +1 -0
  13. package/dist/index.js +429 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/lib/migrations.js +128 -0
  16. package/dist/lib/migrations.js.map +1 -0
  17. package/dist/ollama.js +59 -0
  18. package/dist/ollama.js.map +1 -0
  19. package/dist/project-detect.js +102 -0
  20. package/dist/project-detect.js.map +1 -0
  21. package/dist/project.js +26 -0
  22. package/dist/project.js.map +1 -0
  23. package/dist/sleep/daemon.js +215 -0
  24. package/dist/sleep/daemon.js.map +1 -0
  25. package/dist/sleep/miner.js +285 -0
  26. package/dist/sleep/miner.js.map +1 -0
  27. package/dist/supabase.js +405 -0
  28. package/dist/supabase.js.map +1 -0
  29. package/dist/telemetry/emit.js +19 -0
  30. package/dist/telemetry/emit.js.map +1 -0
  31. package/dist/telemetry/pruner.js +141 -0
  32. package/dist/telemetry/pruner.js.map +1 -0
  33. package/dist/telemetry/types.js +2 -0
  34. package/dist/telemetry/types.js.map +1 -0
  35. package/dist/tools/backlog.js +599 -0
  36. package/dist/tools/backlog.js.map +1 -0
  37. package/dist/tools/batch-freeze-patterns.js +243 -0
  38. package/dist/tools/batch-freeze-patterns.js.map +1 -0
  39. package/dist/tools/bloat-audit.js +101 -0
  40. package/dist/tools/bloat-audit.js.map +1 -0
  41. package/dist/tools/checkpoint.js +259 -0
  42. package/dist/tools/checkpoint.js.map +1 -0
  43. package/dist/tools/compact.js +60 -0
  44. package/dist/tools/compact.js.map +1 -0
  45. package/dist/tools/conflict.js +102 -0
  46. package/dist/tools/conflict.js.map +1 -0
  47. package/dist/tools/curriculum.js +225 -0
  48. package/dist/tools/curriculum.js.map +1 -0
  49. package/dist/tools/frozen-cache.js +106 -0
  50. package/dist/tools/frozen-cache.js.map +1 -0
  51. package/dist/tools/health.js +368 -0
  52. package/dist/tools/health.js.map +1 -0
  53. package/dist/tools/hygiene.js +309 -0
  54. package/dist/tools/hygiene.js.map +1 -0
  55. package/dist/tools/image.js +107 -0
  56. package/dist/tools/image.js.map +1 -0
  57. package/dist/tools/list-global-patterns.js +101 -0
  58. package/dist/tools/list-global-patterns.js.map +1 -0
  59. package/dist/tools/orchestrator.js +113 -0
  60. package/dist/tools/orchestrator.js.map +1 -0
  61. package/dist/tools/policy.js +90 -0
  62. package/dist/tools/policy.js.map +1 -0
  63. package/dist/tools/refactor.js +220 -0
  64. package/dist/tools/refactor.js.map +1 -0
  65. package/dist/tools/save.js +42 -0
  66. package/dist/tools/save.js.map +1 -0
  67. package/dist/tools/search.js +189 -0
  68. package/dist/tools/search.js.map +1 -0
  69. package/dist/tools/setup.js +868 -0
  70. package/dist/tools/setup.js.map +1 -0
  71. package/dist/tools/shared-schemas.js +24 -0
  72. package/dist/tools/shared-schemas.js.map +1 -0
  73. package/dist/tools/skills.js +174 -0
  74. package/dist/tools/skills.js.map +1 -0
  75. package/dist/tools/sleep.js +239 -0
  76. package/dist/tools/sleep.js.map +1 -0
  77. package/dist/tools/sovereign-constitution.js +319 -0
  78. package/dist/tools/sovereign-constitution.js.map +1 -0
  79. package/dist/tools/summarize.js +55 -0
  80. package/dist/tools/summarize.js.map +1 -0
  81. package/dist/tools/sync.js +255 -0
  82. package/dist/tools/sync.js.map +1 -0
  83. package/dist/tools/system_dashboard.js +181 -0
  84. package/dist/tools/system_dashboard.js.map +1 -0
  85. package/dist/tools/update-rule.js +15 -0
  86. package/dist/tools/update-rule.js.map +1 -0
  87. package/dist/tools/verification.js +333 -0
  88. package/dist/tools/verification.js.map +1 -0
  89. package/dist/trajectory/daemon.js +270 -0
  90. package/dist/trajectory/daemon.js.map +1 -0
  91. package/dist/trajectory/stripper.js +124 -0
  92. package/dist/trajectory/stripper.js.map +1 -0
  93. package/dist/trajectory/summarizer.js +77 -0
  94. package/dist/trajectory/summarizer.js.map +1 -0
  95. package/dist/transactions/checkpoint.js +272 -0
  96. package/dist/transactions/checkpoint.js.map +1 -0
  97. package/dist/verification-gate.js +43 -0
  98. package/dist/verification-gate.js.map +1 -0
  99. package/dist/version.js +16 -0
  100. package/dist/version.js.map +1 -0
  101. package/hooks/README.md +54 -0
  102. package/hooks/md-policy.py +497 -0
  103. package/marketplace.json +13 -0
  104. package/package.json +66 -0
@@ -0,0 +1,368 @@
1
+ import { stat, readFile } from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { config } from "../config.js";
4
+ import { supabase, getKeepAliveStatus, FROZEN_CACHE_PATH } from "../supabase.js";
5
+ import { currentProjectId } from "../project.js";
6
+ import { getCompactorStatus } from "../trajectory/daemon.js";
7
+ import { getSleepLearnerStatus } from "../sleep/daemon.js";
8
+ import { getCurriculumStatus } from "../curriculum/daemon.js";
9
+ import { getTelemetryPrunerStatus } from "../telemetry/pruner.js";
10
+ import { VERSION } from "../version.js";
11
+ // Per-daemon health derivation thresholds. Names use the user-mandated
12
+ // `_DEFAULT` suffix; reads are once-at-module-load with safe fallback.
13
+ const envNum = (k, def) => {
14
+ const raw = process.env[k];
15
+ if (raw === undefined)
16
+ return def;
17
+ const n = Number(raw);
18
+ return Number.isFinite(n) ? n : def;
19
+ };
20
+ const OBS_ERR_RATE_DEGRADED = envNum("OBS_ERR_RATE_DEGRADED_DEFAULT", 0.2);
21
+ const OBS_ERR_RATE_DOWN = envNum("OBS_ERR_RATE_DOWN_DEFAULT", 0.5);
22
+ const OBS_STALENESS_MULTIPLIER = envNum("OBS_STALENESS_MULTIPLIER_DEFAULT", 2.0);
23
+ // Cold-boot grace window: daemons without `run_ended` events within this many
24
+ // milliseconds of MCP server start report `pending` rather than `down`. This
25
+ // prevents the FTUX from showing a false `overall: down` on a healthy boot.
26
+ const GRACE_MS = 15 * 60 * 1000;
27
+ // Worst-of severity. `pending` sits BELOW `degraded` so a cold-boot daemon
28
+ // can never poison `overall` past `degraded`.
29
+ const SEVERITY = {
30
+ healthy: 0,
31
+ ok: 0,
32
+ pending: 0.5,
33
+ degraded: 1,
34
+ down: 2,
35
+ unhealthy: 2,
36
+ };
37
+ /**
38
+ * Worst-of rollup across an arbitrary set of statuses using {@link SEVERITY}.
39
+ * Used to combine supabase/ollama check statuses with per-daemon derivations
40
+ * into a single top-level `overall` for the health report. Pure / no side effects.
41
+ */
42
+ export function rollupOverall(statuses) {
43
+ return statuses.reduce((a, b) => ((SEVERITY[b] ?? 0) > (SEVERITY[a] ?? 0) ? b : a), "healthy");
44
+ }
45
+ export function deriveDaemonStatus(input) {
46
+ const { enabled, events: rows, uptimeSec, intervalMs = 0, lastRunAtIso = null, graceMs = GRACE_MS, now = Date.now(), } = input;
47
+ // `enabled=false` short-circuit MUST come first — a disabled daemon
48
+ // is out of scope for liveness and cannot be "down" or "pending".
49
+ if (!enabled) {
50
+ return {
51
+ status: "healthy",
52
+ reason: "daemon disabled (out of scope)",
53
+ error_rate_1h: 0,
54
+ staleness_ms: null,
55
+ last_run_ended_at: null,
56
+ };
57
+ }
58
+ const mostRecentRunEnded = rows.find((r) => r.event_type === "run_ended")?.created_at ?? null;
59
+ const effectiveLast = lastRunAtIso ?? mostRecentRunEnded;
60
+ if (effectiveLast === null) {
61
+ // Cold-boot grace: within the grace window, no `run_ended` events yet is
62
+ // expected (the daemon may simply not have ticked once). Past the window,
63
+ // this becomes a real `down` signal as before.
64
+ const uptimeMs = uptimeSec * 1000;
65
+ if (uptimeMs < graceMs) {
66
+ return {
67
+ status: "pending",
68
+ reason: `within ${Math.round(graceMs / 60_000)}min grace window (uptime=${Math.round(uptimeMs / 1000)}s); awaiting first run_ended`,
69
+ error_rate_1h: 0,
70
+ staleness_ms: null,
71
+ last_run_ended_at: null,
72
+ };
73
+ }
74
+ return {
75
+ status: "down",
76
+ reason: "no run_ended events on record",
77
+ error_rate_1h: 0,
78
+ staleness_ms: null,
79
+ last_run_ended_at: null,
80
+ };
81
+ }
82
+ const stalenessMs = Math.max(0, now - Date.parse(effectiveLast));
83
+ const staleThreshold = intervalMs * OBS_STALENESS_MULTIPLIER;
84
+ if (stalenessMs > staleThreshold) {
85
+ return {
86
+ status: "down",
87
+ reason: `stale (${stalenessMs}ms since last run; threshold=${staleThreshold}ms = interval_ms*${OBS_STALENESS_MULTIPLIER})`,
88
+ error_rate_1h: 0,
89
+ staleness_ms: stalenessMs,
90
+ last_run_ended_at: effectiveLast,
91
+ };
92
+ }
93
+ let runs = 0;
94
+ let errors = 0;
95
+ for (const r of rows) {
96
+ if (r.event_type === "run_ended")
97
+ runs++;
98
+ else if (r.event_type === "run_errored")
99
+ errors++;
100
+ }
101
+ const denom = runs + errors;
102
+ const errRate = denom === 0 ? 0 : errors / denom;
103
+ if (errRate > OBS_ERR_RATE_DOWN) {
104
+ return {
105
+ status: "down",
106
+ reason: `error_rate_1h=${errRate.toFixed(3)} > ${OBS_ERR_RATE_DOWN}`,
107
+ error_rate_1h: errRate,
108
+ staleness_ms: stalenessMs,
109
+ last_run_ended_at: effectiveLast,
110
+ };
111
+ }
112
+ if (errRate > OBS_ERR_RATE_DEGRADED) {
113
+ return {
114
+ status: "degraded",
115
+ reason: `error_rate_1h=${errRate.toFixed(3)} > ${OBS_ERR_RATE_DEGRADED}`,
116
+ error_rate_1h: errRate,
117
+ staleness_ms: stalenessMs,
118
+ last_run_ended_at: effectiveLast,
119
+ };
120
+ }
121
+ return {
122
+ status: "healthy",
123
+ reason: "within thresholds",
124
+ error_rate_1h: errRate,
125
+ staleness_ms: stalenessMs,
126
+ last_run_ended_at: effectiveLast,
127
+ };
128
+ }
129
+ // Sovereign Orchestrator defaults (mirrored from delegateTask/buildWorkerPrompt).
130
+ // Version is sourced from package.json via src/version.ts so health reports
131
+ // can never drift from the actual server version.
132
+ const ORCHESTRATOR_VERSION = VERSION;
133
+ const SELF_HEAL_DEFAULT = true;
134
+ const MAX_HEALING_ATTEMPTS_DEFAULT = 3;
135
+ /**
136
+ * Models Smart Claude Memory relies on at runtime. The check is prefix-based because
137
+ * Ollama names models with a ":tag" suffix (e.g. "moondream:latest").
138
+ */
139
+ const REQUIRED_MODELS = ["moondream", "nomic-embed-text"];
140
+ async function detectAdvisoryHookMode() {
141
+ try {
142
+ // hooks/md-policy.py lives two levels up from dist/tools/ at runtime, or
143
+ // two levels up from src/tools/ at source time — resolve relative to cwd.
144
+ const hookPath = path.resolve(process.cwd(), "hooks", "md-policy.py");
145
+ const text = await readFile(hookPath, "utf8");
146
+ // Locate the check_orchestrator_advisory function body.
147
+ const fnMatch = text.match(/def check_orchestrator_advisory[\s\S]*?(?=\ndef |\Z)/);
148
+ if (!fnMatch)
149
+ return "unknown";
150
+ const body = fnMatch[0];
151
+ if (/"decision"\s*:\s*"block"/.test(body))
152
+ return "hard-block";
153
+ if (/"decision"\s*:\s*"allow"/.test(body))
154
+ return "advisory";
155
+ return "unknown";
156
+ }
157
+ catch {
158
+ return "unknown";
159
+ }
160
+ }
161
+ function buildOrchestratorSnapshot(advisoryHook) {
162
+ return {
163
+ version: ORCHESTRATOR_VERSION,
164
+ // TODO(v1.2.0): drop the legacy CLAUDE_MEMORY_* fallback after the Smart Claude Memory rebrand has settled.
165
+ mode_active: (process.env.SMART_CLAUDE_MEMORY_ORCHESTRATOR_MODE ??
166
+ process.env.CLAUDE_MEMORY_ORCHESTRATOR_MODE) === "1",
167
+ self_heal_default: SELF_HEAL_DEFAULT,
168
+ max_healing_attempts_default: MAX_HEALING_ATTEMPTS_DEFAULT,
169
+ advisory_hook: advisoryHook,
170
+ line_limit: Number(process.env.SMART_CLAUDE_MEMORY_LINE_LIMIT ?? process.env.CLAUDE_MEMORY_LINE_LIMIT ?? 750),
171
+ };
172
+ }
173
+ async function readPolicyCache() {
174
+ const snapshot = {
175
+ cache_path: FROZEN_CACHE_PATH,
176
+ cache_present: false,
177
+ cache_updated_at: null,
178
+ total_projects: 0,
179
+ total_patterns: 0,
180
+ active: false,
181
+ note: "",
182
+ };
183
+ try {
184
+ await stat(FROZEN_CACHE_PATH);
185
+ snapshot.cache_present = true;
186
+ const json = JSON.parse(await readFile(FROZEN_CACHE_PATH, "utf8"));
187
+ snapshot.cache_updated_at = json.updated_at ?? null;
188
+ const projects = json.projects ?? {};
189
+ snapshot.total_projects = Object.keys(projects).length;
190
+ snapshot.total_patterns = Object.values(projects).reduce((n, arr) => n + (Array.isArray(arr) ? arr.length : 0), 0);
191
+ snapshot.active = snapshot.total_patterns > 0;
192
+ snapshot.note = snapshot.active
193
+ ? `Policy enforcement is ACTIVE — ${snapshot.total_patterns} frozen pattern(s) across ${snapshot.total_projects} project(s). Hook will block Write on matches.`
194
+ : "Policy cache present but empty — no frozen patterns; all Writes pass through the frozen check.";
195
+ }
196
+ catch {
197
+ snapshot.note =
198
+ "Policy cache not yet written. First server start with Supabase connectivity will create it.";
199
+ }
200
+ return snapshot;
201
+ }
202
+ async function checkSupabase() {
203
+ const t0 = Date.now();
204
+ try {
205
+ const { count, error } = await supabase
206
+ .from("memory_chunks")
207
+ .select("*", { count: "exact", head: true });
208
+ if (error)
209
+ throw new Error(error.message);
210
+ return {
211
+ status: "ok",
212
+ detail: `memory_chunks reachable (${count ?? 0} rows total across all projects)`,
213
+ latency_ms: Date.now() - t0,
214
+ };
215
+ }
216
+ catch (e) {
217
+ return {
218
+ status: "down",
219
+ detail: `${e.message}`,
220
+ latency_ms: Date.now() - t0,
221
+ };
222
+ }
223
+ }
224
+ async function checkOllama() {
225
+ const t0 = Date.now();
226
+ try {
227
+ const res = await fetch(`${config.OLLAMA_HOST}/api/tags`, {
228
+ signal: AbortSignal.timeout(5000),
229
+ });
230
+ if (!res.ok)
231
+ throw new Error(`HTTP ${res.status}`);
232
+ const json = (await res.json());
233
+ const present = (json.models ?? []).map((m) => m.name);
234
+ const missing = REQUIRED_MODELS.filter((req) => !present.some((p) => p === req || p.startsWith(`${req}:`)));
235
+ const status = missing.length === 0 ? "ok" : "degraded";
236
+ const detail = missing.length === 0
237
+ ? `reachable; required models present (${REQUIRED_MODELS.join(", ")})`
238
+ : `reachable; missing models: ${missing.join(", ")}. Run 'ollama pull <model>'.`;
239
+ return {
240
+ check: { status, detail, latency_ms: Date.now() - t0 },
241
+ present,
242
+ missing: [...missing],
243
+ };
244
+ }
245
+ catch (e) {
246
+ return {
247
+ check: { status: "down", detail: e.message, latency_ms: Date.now() - t0 },
248
+ present: [],
249
+ missing: [...REQUIRED_MODELS],
250
+ };
251
+ }
252
+ }
253
+ export async function checkSystemHealth() {
254
+ const [supabaseCheck, ollamaResult, policy, advisoryHook] = await Promise.all([
255
+ checkSupabase(),
256
+ checkOllama(),
257
+ readPolicyCache(),
258
+ detectAdvisoryHookMode(),
259
+ ]);
260
+ const checks = { supabase: supabaseCheck, ollama: ollamaResult.check };
261
+ let overall = Object.values(checks).some((c) => c.status === "down")
262
+ ? "down"
263
+ : Object.values(checks).every((c) => c.status === "ok")
264
+ ? "healthy"
265
+ : "degraded";
266
+ // Query 1h of daemon telemetry in a single round-trip; group by daemon in JS.
267
+ // A query failure must NOT crash the health check — derive with empty rows
268
+ // so each derived block still respects enabled / last_run_at fallbacks.
269
+ const oneHourAgoIso = new Date(Date.now() - 3600_000).toISOString();
270
+ const byDaemon = {
271
+ sleep_learner: [],
272
+ curriculum_scanner: [],
273
+ trajectory_compactor: [],
274
+ telemetry_pruner: [],
275
+ };
276
+ try {
277
+ const { data: telemetryRows, error: telemetryErr } = await supabase
278
+ .from("daemon_telemetry")
279
+ .select("daemon, event_type, created_at")
280
+ .eq("project_id", currentProjectId)
281
+ .gte("created_at", oneHourAgoIso)
282
+ .order("created_at", { ascending: false })
283
+ .limit(1000);
284
+ if (telemetryErr) {
285
+ console.error(`[health] telemetry query failed: ${telemetryErr.message}`);
286
+ }
287
+ else {
288
+ for (const r of (telemetryRows ?? [])) {
289
+ if (r.daemon in byDaemon) {
290
+ byDaemon[r.daemon].push({
291
+ event_type: r.event_type,
292
+ created_at: r.created_at,
293
+ });
294
+ }
295
+ }
296
+ }
297
+ }
298
+ catch (e) {
299
+ console.error(`[health] telemetry query threw: ${e.message}`);
300
+ }
301
+ const sleepSnap = getSleepLearnerStatus();
302
+ const currSnap = getCurriculumStatus();
303
+ const trajSnap = getCompactorStatus();
304
+ const prunerSnap = getTelemetryPrunerStatus();
305
+ const uptimeSec = process.uptime();
306
+ const sleepDerived = deriveDaemonStatus({
307
+ enabled: sleepSnap.enabled,
308
+ events: byDaemon.sleep_learner,
309
+ uptimeSec,
310
+ intervalMs: sleepSnap.interval_ms,
311
+ lastRunAtIso: sleepSnap.last_run_at ?? null,
312
+ });
313
+ const currDerived = deriveDaemonStatus({
314
+ enabled: currSnap.enabled,
315
+ events: byDaemon.curriculum_scanner,
316
+ uptimeSec,
317
+ intervalMs: currSnap.interval_ms,
318
+ lastRunAtIso: currSnap.last_run_at ?? null,
319
+ });
320
+ const trajDerived = deriveDaemonStatus({
321
+ enabled: trajSnap.enabled,
322
+ events: byDaemon.trajectory_compactor,
323
+ uptimeSec,
324
+ intervalMs: trajSnap.interval_ms,
325
+ lastRunAtIso: trajSnap.last_run_at ?? null,
326
+ });
327
+ const prunerDerived = deriveDaemonStatus({
328
+ enabled: prunerSnap.enabled,
329
+ events: byDaemon.telemetry_pruner,
330
+ uptimeSec,
331
+ intervalMs: prunerSnap.interval_ms,
332
+ lastRunAtIso: prunerSnap.last_run_at ?? null,
333
+ });
334
+ // Worst-of rollup: daemon derivation can only WORSEN overall, never improve it.
335
+ // Preserves any degraded/down already set by supabase/ollama checks above.
336
+ overall = rollupOverall([
337
+ overall,
338
+ sleepDerived.status,
339
+ currDerived.status,
340
+ trajDerived.status,
341
+ prunerDerived.status,
342
+ ]);
343
+ const orchestrator = buildOrchestratorSnapshot(advisoryHook);
344
+ const summary = `Orchestrator: v${orchestrator.version} | ` +
345
+ `mode=${orchestrator.mode_active ? "active" : "inactive"} | ` +
346
+ `self_heal=${orchestrator.self_heal_default ? "on" : "off"} | ` +
347
+ `healing_attempts=${orchestrator.max_healing_attempts_default} | ` +
348
+ `hook=${orchestrator.advisory_hook}`;
349
+ return {
350
+ overall,
351
+ timestamp: new Date().toISOString(),
352
+ checks,
353
+ models: {
354
+ required: [...REQUIRED_MODELS],
355
+ present: ollamaResult.present,
356
+ missing: ollamaResult.missing,
357
+ },
358
+ keep_alive: getKeepAliveStatus(),
359
+ trajectory_compactor: { ...trajSnap, derived: trajDerived },
360
+ sleep_learner: { ...sleepSnap, derived: sleepDerived },
361
+ curriculum_scanner: { ...currSnap, derived: currDerived },
362
+ telemetry_pruner: { ...prunerSnap, derived: prunerDerived },
363
+ policy_enforcement: policy,
364
+ orchestrator,
365
+ summary,
366
+ };
367
+ }
368
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"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"}