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.
- package/.claude-plugin/plugin.json +38 -0
- package/CHANGELOG.md +52 -0
- package/LICENSE +21 -0
- package/README.md +790 -0
- package/dist/chunker.js +33 -0
- package/dist/chunker.js.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/curriculum/daemon.js +190 -0
- package/dist/curriculum/daemon.js.map +1 -0
- package/dist/curriculum/scanner.js +237 -0
- package/dist/curriculum/scanner.js.map +1 -0
- package/dist/index.js +429 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/migrations.js +128 -0
- package/dist/lib/migrations.js.map +1 -0
- package/dist/ollama.js +59 -0
- package/dist/ollama.js.map +1 -0
- package/dist/project-detect.js +102 -0
- package/dist/project-detect.js.map +1 -0
- package/dist/project.js +26 -0
- package/dist/project.js.map +1 -0
- package/dist/sleep/daemon.js +215 -0
- package/dist/sleep/daemon.js.map +1 -0
- package/dist/sleep/miner.js +285 -0
- package/dist/sleep/miner.js.map +1 -0
- package/dist/supabase.js +405 -0
- package/dist/supabase.js.map +1 -0
- package/dist/telemetry/emit.js +19 -0
- package/dist/telemetry/emit.js.map +1 -0
- package/dist/telemetry/pruner.js +141 -0
- package/dist/telemetry/pruner.js.map +1 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/tools/backlog.js +599 -0
- package/dist/tools/backlog.js.map +1 -0
- package/dist/tools/batch-freeze-patterns.js +243 -0
- package/dist/tools/batch-freeze-patterns.js.map +1 -0
- package/dist/tools/bloat-audit.js +101 -0
- package/dist/tools/bloat-audit.js.map +1 -0
- package/dist/tools/checkpoint.js +259 -0
- package/dist/tools/checkpoint.js.map +1 -0
- package/dist/tools/compact.js +60 -0
- package/dist/tools/compact.js.map +1 -0
- package/dist/tools/conflict.js +102 -0
- package/dist/tools/conflict.js.map +1 -0
- package/dist/tools/curriculum.js +225 -0
- package/dist/tools/curriculum.js.map +1 -0
- package/dist/tools/frozen-cache.js +106 -0
- package/dist/tools/frozen-cache.js.map +1 -0
- package/dist/tools/health.js +368 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/hygiene.js +309 -0
- package/dist/tools/hygiene.js.map +1 -0
- package/dist/tools/image.js +107 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/list-global-patterns.js +101 -0
- package/dist/tools/list-global-patterns.js.map +1 -0
- package/dist/tools/orchestrator.js +113 -0
- package/dist/tools/orchestrator.js.map +1 -0
- package/dist/tools/policy.js +90 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/refactor.js +220 -0
- package/dist/tools/refactor.js.map +1 -0
- package/dist/tools/save.js +42 -0
- package/dist/tools/save.js.map +1 -0
- package/dist/tools/search.js +189 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/setup.js +868 -0
- package/dist/tools/setup.js.map +1 -0
- package/dist/tools/shared-schemas.js +24 -0
- package/dist/tools/shared-schemas.js.map +1 -0
- package/dist/tools/skills.js +174 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/sleep.js +239 -0
- package/dist/tools/sleep.js.map +1 -0
- package/dist/tools/sovereign-constitution.js +319 -0
- package/dist/tools/sovereign-constitution.js.map +1 -0
- package/dist/tools/summarize.js +55 -0
- package/dist/tools/summarize.js.map +1 -0
- package/dist/tools/sync.js +255 -0
- package/dist/tools/sync.js.map +1 -0
- package/dist/tools/system_dashboard.js +181 -0
- package/dist/tools/system_dashboard.js.map +1 -0
- package/dist/tools/update-rule.js +15 -0
- package/dist/tools/update-rule.js.map +1 -0
- package/dist/tools/verification.js +333 -0
- package/dist/tools/verification.js.map +1 -0
- package/dist/trajectory/daemon.js +270 -0
- package/dist/trajectory/daemon.js.map +1 -0
- package/dist/trajectory/stripper.js +124 -0
- package/dist/trajectory/stripper.js.map +1 -0
- package/dist/trajectory/summarizer.js +77 -0
- package/dist/trajectory/summarizer.js.map +1 -0
- package/dist/transactions/checkpoint.js +272 -0
- package/dist/transactions/checkpoint.js.map +1 -0
- package/dist/verification-gate.js +43 -0
- package/dist/verification-gate.js.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/hooks/README.md +54 -0
- package/hooks/md-policy.py +497 -0
- package/marketplace.json +13 -0
- 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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"}
|