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,285 @@
1
+ // Sleep Learning — cluster miner (Agentic OS 2026 / Mission 3 / SCM-S19-D1).
2
+ // Pure function: reads trajectory_summaries INNER JOIN archive_backlog WHERE
3
+ // status='success', clusters by (a) 3-gram content hash AND (b) cosine ≥ 0.85
4
+ // over summary_embedding centroids, emits CandidateStub[]. NO writes.
5
+ //
6
+ // Returning shape conforms to scripts/012_sleep_learning.sql's
7
+ // upsert_skill_candidate RPC: pattern_hash is the dedupe key, source_*_ids
8
+ // arrays are provenance, frequency / success_count are bumped on re-mining.
9
+ import { createHash } from "node:crypto";
10
+ import { supabase } from "../supabase.js";
11
+ const THREE_GRAM_TOKEN_RE = /[a-z0-9]+/g;
12
+ // ─── helpers ──────────────────────────────────────────────────────────────
13
+ /**
14
+ * Tokenize → lowercase 3-grams → SHA1(top-K joined). Deterministic; gives a
15
+ * stable shingle-fingerprint we can use as a coarse cluster key BEFORE
16
+ * cosine refinement. Empty input falls back to a hash of "".
17
+ */
18
+ function trigramHash(text) {
19
+ const tokens = text.toLowerCase().match(THREE_GRAM_TOKEN_RE) ?? [];
20
+ const grams = [];
21
+ for (let i = 0; i + 2 < tokens.length; i++) {
22
+ grams.push(`${tokens[i]} ${tokens[i + 1]} ${tokens[i + 2]}`);
23
+ }
24
+ // Sort + unique so word-order variance within a sentence collapses.
25
+ const sorted = Array.from(new Set(grams)).sort();
26
+ // Cap at first 64 trigrams — keeps the key short-text-stable but resists
27
+ // collisions from long divergent tails.
28
+ const head = sorted.slice(0, 64).join("|");
29
+ return createHash("sha1").update(head).digest("hex");
30
+ }
31
+ function cosine(a, b) {
32
+ if (a.length !== b.length || a.length === 0)
33
+ return 0;
34
+ let dot = 0;
35
+ let na = 0;
36
+ let nb = 0;
37
+ for (let i = 0; i < a.length; i++) {
38
+ dot += a[i] * b[i];
39
+ na += a[i] * a[i];
40
+ nb += b[i] * b[i];
41
+ }
42
+ if (na === 0 || nb === 0)
43
+ return 0;
44
+ return dot / (Math.sqrt(na) * Math.sqrt(nb));
45
+ }
46
+ function meanVector(vectors) {
47
+ const present = vectors.filter((v) => Array.isArray(v) && v.length > 0);
48
+ if (present.length === 0)
49
+ return null;
50
+ const dim = present[0].length;
51
+ const out = new Array(dim).fill(0);
52
+ for (const v of present) {
53
+ if (v.length !== dim)
54
+ continue;
55
+ for (let i = 0; i < dim; i++)
56
+ out[i] += v[i];
57
+ }
58
+ for (let i = 0; i < dim; i++)
59
+ out[i] /= present.length;
60
+ return out;
61
+ }
62
+ // ─── data fetch ───────────────────────────────────────────────────────────
63
+ async function fetchSummariesForProject(projectId, limit) {
64
+ const { data, error } = await supabase
65
+ .from("trajectory_summaries")
66
+ .select("id, project_id, summary, summary_embedding, source_chunk_id")
67
+ .eq("project_id", projectId)
68
+ .order("id", { ascending: false })
69
+ .limit(limit);
70
+ if (error) {
71
+ throw new Error(`mineClusters: trajectory_summaries scan failed: ${error.message}`);
72
+ }
73
+ const rows = (data ?? []);
74
+ return rows.filter((r) => typeof r.summary === "string" && r.summary.length > 0);
75
+ }
76
+ /**
77
+ * Build a Map<source_chunk_id, archive_backlog.id> for the project where
78
+ * archive_backlog.status='success'. Empty when the archive_backlog table
79
+ * doesn't track chunk_id (older deployments) — that's fine, provenance is
80
+ * advisory.
81
+ */
82
+ async function fetchSuccessArchiveByChunk(projectId) {
83
+ const out = new Map();
84
+ const { data, error } = await supabase
85
+ .from("archive_backlog")
86
+ .select("id, chunk_id")
87
+ .eq("project_id", projectId)
88
+ .eq("status", "done");
89
+ if (error) {
90
+ // Older deployments may lack the chunk_id column. Don't fail the daemon
91
+ // tick — mining still works, source_backlog_ids stays empty for those.
92
+ return out;
93
+ }
94
+ for (const row of (data ?? [])) {
95
+ if (typeof row.chunk_id === "number")
96
+ out.set(row.chunk_id, row.id);
97
+ }
98
+ return out;
99
+ }
100
+ /**
101
+ * Returns a Map<source_chunk_id, { rollback_count, last_rollback }> over
102
+ * the supplied chunk ids. Pure read — no writes. Tolerant of missing
103
+ * table: a query error (e.g. workflow_checkpoints not deployed yet) is
104
+ * swallowed and an empty Map is returned, so legacy deploys keep mining.
105
+ */
106
+ export async function fetchRollbackSignalsByChunk(projectId, chunkIds) {
107
+ const out = new Map();
108
+ if (!projectId || typeof projectId !== "string")
109
+ return out;
110
+ const ids = Array.from(new Set(chunkIds.filter((n) => typeof n === "number" && Number.isFinite(n))));
111
+ if (ids.length === 0)
112
+ return out;
113
+ // PostgREST's IN-form via .in() — equivalent to ANY($2) at the SQL layer,
114
+ // but stays inside the supabase-js builder so we don't need a custom RPC.
115
+ // Note: we group in TS (no GROUP BY across .in()) — N here is bounded by
116
+ // the per-tick batch (default 10, max 50), so O(N) aggregation is fine.
117
+ const { data, error } = await supabase
118
+ .from("workflow_checkpoints")
119
+ .select("source_chunk_id, status, created_at")
120
+ .eq("project_id", projectId)
121
+ .eq("status", "rolledback")
122
+ .in("source_chunk_id", ids);
123
+ if (error) {
124
+ // workflow_checkpoints not deployed yet (M4 migration 014 not applied)
125
+ // → return empty signal map. Mining proceeds without rollback penalty.
126
+ return out;
127
+ }
128
+ for (const row of (data ?? [])) {
129
+ const sid = row.source_chunk_id;
130
+ if (typeof sid !== "number")
131
+ continue;
132
+ const cur = out.get(sid);
133
+ if (cur) {
134
+ cur.rollback_count += 1;
135
+ if (typeof row.created_at === "string" &&
136
+ (cur.last_rollback === null || row.created_at > cur.last_rollback)) {
137
+ cur.last_rollback = row.created_at;
138
+ }
139
+ }
140
+ else {
141
+ out.set(sid, {
142
+ rollback_count: 1,
143
+ last_rollback: typeof row.created_at === "string" ? row.created_at : null,
144
+ });
145
+ }
146
+ }
147
+ return out;
148
+ }
149
+ /**
150
+ * Two-pass cluster:
151
+ * Pass 1 (coarse): group summaries by 3-gram hash. Same hash → certain cluster.
152
+ * Pass 2 (refine): for each pair of single-row coarse-buckets, merge if
153
+ * cosine(centroid_a, centroid_b) ≥ 0.85. Small-N (≤ batch=10 default)
154
+ * so O(n²) is fine here.
155
+ *
156
+ * This is a strict superset of a "pure 3-gram clustering" path: identical-
157
+ * text re-runs always co-cluster (Pass 1), while semantically-equivalent
158
+ * paraphrases that differ in surface tokens are pulled together by Pass 2.
159
+ */
160
+ function clusterSummaries(rows) {
161
+ const buckets = new Map();
162
+ for (const r of rows) {
163
+ const h = trigramHash(r.summary);
164
+ const arr = buckets.get(h);
165
+ if (arr)
166
+ arr.push(r);
167
+ else
168
+ buckets.set(h, [r]);
169
+ }
170
+ const clusters = [];
171
+ for (const [hash, summaries] of buckets)
172
+ clusters.push({ hash, summaries });
173
+ // Pass 2: cosine merge over centroids. We only attempt merges on clusters
174
+ // that still have embeddings — null-vector buckets stay where they are.
175
+ const COSINE_THRESHOLD = 0.85;
176
+ let mergedAny = true;
177
+ while (mergedAny) {
178
+ mergedAny = false;
179
+ outer: for (let i = 0; i < clusters.length; i++) {
180
+ const ci = clusters[i];
181
+ const vi = meanVector(ci.summaries.map((s) => s.summary_embedding ?? []).filter((v) => v.length > 0));
182
+ if (!vi)
183
+ continue;
184
+ for (let j = i + 1; j < clusters.length; j++) {
185
+ const cj = clusters[j];
186
+ const vj = meanVector(cj.summaries.map((s) => s.summary_embedding ?? []).filter((v) => v.length > 0));
187
+ if (!vj)
188
+ continue;
189
+ if (cosine(vi, vj) >= COSINE_THRESHOLD) {
190
+ // Merge j into i. Keep the lexicographically-smaller hash so the
191
+ // cluster identity is deterministic across runs.
192
+ const newHash = ci.hash < cj.hash ? ci.hash : cj.hash;
193
+ ci.hash = newHash;
194
+ ci.summaries.push(...cj.summaries);
195
+ clusters.splice(j, 1);
196
+ mergedAny = true;
197
+ break outer;
198
+ }
199
+ }
200
+ }
201
+ }
202
+ return clusters;
203
+ }
204
+ // ─── public API ───────────────────────────────────────────────────────────
205
+ export async function mineClusters(opts) {
206
+ const batch = opts.batch ?? 50;
207
+ const minFreq = opts.minFreq ?? 3;
208
+ if (!opts.projectId || typeof opts.projectId !== "string") {
209
+ throw new Error("mineClusters: projectId is required");
210
+ }
211
+ const summaries = await fetchSummariesForProject(opts.projectId, batch);
212
+ if (summaries.length === 0)
213
+ return [];
214
+ const archiveByChunk = await fetchSuccessArchiveByChunk(opts.projectId);
215
+ // INNER JOIN semantics: keep only summaries whose source_chunk_id maps to
216
+ // a successful archive_backlog row. Pure mining surface — failed/in-flight
217
+ // tasks must NEVER seed a candidate skill.
218
+ const successful = summaries.filter((s) => archiveByChunk.has(s.source_chunk_id));
219
+ if (successful.length === 0)
220
+ return [];
221
+ const clusters = clusterSummaries(successful);
222
+ // M4 / Phase B: load rollback signals for every source_chunk_id that
223
+ // participates in any cluster ≥ minFreq. We scan ONCE per tick (single
224
+ // round-trip over .in()) so the per-cluster overhead is O(1). When the
225
+ // workflow_checkpoints table is not yet deployed (legacy boot path),
226
+ // fetchRollbackSignalsByChunk returns an empty Map and mining is
227
+ // byte-identical to the pre-M4 behavior.
228
+ const candidateChunkIds = [];
229
+ for (const c of clusters) {
230
+ if (c.summaries.length < minFreq)
231
+ continue;
232
+ for (const s of c.summaries)
233
+ candidateChunkIds.push(s.source_chunk_id);
234
+ }
235
+ const rollbackByChunk = await fetchRollbackSignalsByChunk(opts.projectId, candidateChunkIds);
236
+ const stubs = [];
237
+ for (const c of clusters) {
238
+ if (c.summaries.length < minFreq)
239
+ continue;
240
+ const summaryIds = Array.from(new Set(c.summaries.map((s) => s.id))).sort((a, b) => a - b);
241
+ const backlogIds = Array.from(new Set(c.summaries
242
+ .map((s) => archiveByChunk.get(s.source_chunk_id))
243
+ .filter((v) => typeof v === "number"))).sort((a, b) => a - b);
244
+ const centroid = meanVector(c.summaries
245
+ .map((s) => s.summary_embedding ?? [])
246
+ .filter((v) => v.length > 0));
247
+ // Representative summary: the longest one in the cluster (heuristic —
248
+ // tends to be the most information-rich variant for the LLM proposer).
249
+ const representative = c.summaries
250
+ .slice()
251
+ .sort((a, b) => b.summary.length - a.summary.length)[0].summary;
252
+ // Sum rollback votes across every chunk that fed this cluster.
253
+ // Floor at 0 so success_count never goes negative — that would crash
254
+ // the upsert_skill_candidate CHECK constraint (success_count ≥ 0).
255
+ let clusterRollbackCount = 0;
256
+ for (const s of c.summaries) {
257
+ const sig = rollbackByChunk.get(s.source_chunk_id);
258
+ if (sig)
259
+ clusterRollbackCount += sig.rollback_count;
260
+ }
261
+ const baseSuccessCount = c.summaries.length;
262
+ const adjustedSuccessCount = Math.max(0, baseSuccessCount - clusterRollbackCount);
263
+ if (clusterRollbackCount > 0) {
264
+ console.log(`[M3] applied ${clusterRollbackCount} rollback signals to cluster hash=${c.hash} (success_count ${baseSuccessCount} -> ${adjustedSuccessCount})`);
265
+ }
266
+ stubs.push({
267
+ project_id: opts.projectId,
268
+ pattern_hash: c.hash,
269
+ source_summary_ids: summaryIds,
270
+ source_backlog_ids: backlogIds,
271
+ frequency: c.summaries.length,
272
+ // INNER JOIN guarantees every contributing summary maps to a success
273
+ // archive row, so the pre-M4 floor is c.summaries.length. M4 rollback
274
+ // signals decrement this floor by clusterRollbackCount (≥ 0).
275
+ success_count: adjustedSuccessCount,
276
+ candidate_embedding: centroid,
277
+ representative_summary: representative,
278
+ cluster_summaries: c.summaries.map((s) => s.summary),
279
+ });
280
+ }
281
+ // Stable order so re-running with the same data emits the same sequence.
282
+ stubs.sort((a, b) => b.frequency - a.frequency || a.pattern_hash.localeCompare(b.pattern_hash));
283
+ return stubs;
284
+ }
285
+ //# sourceMappingURL=miner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miner.js","sourceRoot":"","sources":["../../src/sleep/miner.ts"],"names":[],"mappings":"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"}