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
package/dist/supabase.js
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { createClient } from "@supabase/supabase-js";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { config } from "./config.js";
|
|
4
|
+
import { slugify as slugifyProject } from "./project.js";
|
|
5
|
+
export const supabase = createClient(config.SUPABASE_URL, config.SUPABASE_SECRET_KEY, {
|
|
6
|
+
auth: { persistSession: false },
|
|
7
|
+
});
|
|
8
|
+
// ─── schema presence + keep-alive ────────────────────────────────────────
|
|
9
|
+
const REQUIRED_TABLES = [
|
|
10
|
+
"memory_chunks",
|
|
11
|
+
"cloud_backlog",
|
|
12
|
+
"archive_backlog",
|
|
13
|
+
"frozen_features",
|
|
14
|
+
];
|
|
15
|
+
const MIGRATION_COMMAND_SEQUENCE = "npm run schema && " +
|
|
16
|
+
"npm run schema -- 002_multi_project.sql && " +
|
|
17
|
+
"npm run schema -- 003_file_hash.sql && " +
|
|
18
|
+
"npm run schema -- 004_backlog_frozen.sql && " +
|
|
19
|
+
"npm run schema -- 005_archive_backlog.sql";
|
|
20
|
+
/**
|
|
21
|
+
* Checks that every required table is reachable via PostgREST. Missing tables
|
|
22
|
+
* surface as Postgres code 42P01. Never throws — the caller decides what to do
|
|
23
|
+
* when the schema is incomplete (we log+continue from index.ts).
|
|
24
|
+
*/
|
|
25
|
+
export async function ensureSchema() {
|
|
26
|
+
const missing = [];
|
|
27
|
+
const present = [];
|
|
28
|
+
for (const table of REQUIRED_TABLES) {
|
|
29
|
+
const { error } = await supabase.from(table).select("*", { count: "exact", head: true });
|
|
30
|
+
if (!error) {
|
|
31
|
+
present.push(table);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (error.code === "42P01" || /does not exist|could not find/i.test(error.message)) {
|
|
35
|
+
missing.push(table);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Some other error (auth, network). Report it as missing with context so
|
|
39
|
+
// the operator can see it, but don't classify as non-existent.
|
|
40
|
+
missing.push(`${table} (check failed: ${error.message})`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (missing.length === 0)
|
|
44
|
+
return { ok: true, missing: [], present };
|
|
45
|
+
return {
|
|
46
|
+
ok: false,
|
|
47
|
+
missing,
|
|
48
|
+
present,
|
|
49
|
+
message: `Critical Missing Schema — the following tables are unreachable or missing: ${missing.join(", ")}.`,
|
|
50
|
+
fix_command: MIGRATION_COMMAND_SEQUENCE,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const keepAlive = {
|
|
54
|
+
enabled: false,
|
|
55
|
+
intervalMs: 300_000,
|
|
56
|
+
lastPingAt: null,
|
|
57
|
+
lastPingLatencyMs: null,
|
|
58
|
+
lastPingOk: null,
|
|
59
|
+
timer: null,
|
|
60
|
+
};
|
|
61
|
+
async function ping() {
|
|
62
|
+
const t0 = Date.now();
|
|
63
|
+
try {
|
|
64
|
+
await supabase.from("memory_chunks").select("*", { count: "exact", head: true });
|
|
65
|
+
keepAlive.lastPingOk = true;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
keepAlive.lastPingOk = false;
|
|
69
|
+
}
|
|
70
|
+
keepAlive.lastPingAt = new Date().toISOString();
|
|
71
|
+
keepAlive.lastPingLatencyMs = Date.now() - t0;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Start a background HEAD ping against memory_chunks to keep the Supabase
|
|
75
|
+
* HTTPS pool warm. Without this, the first request after ~5 min idle pays
|
|
76
|
+
* 1–2 s of TLS/DNS reconnect cost. Idempotent; .unref()-ed so it never
|
|
77
|
+
* prevents process exit.
|
|
78
|
+
*/
|
|
79
|
+
export function startKeepAlive(intervalMs) {
|
|
80
|
+
if (keepAlive.timer)
|
|
81
|
+
return;
|
|
82
|
+
// TODO(v1.2.0): drop the legacy CLAUDE_MEMORY_KEEPALIVE_MS fallback after the Smart Claude Memory rebrand has settled.
|
|
83
|
+
const envOverride = process.env.SMART_CLAUDE_MEMORY_KEEPALIVE_MS ?? process.env.CLAUDE_MEMORY_KEEPALIVE_MS;
|
|
84
|
+
const resolved = intervalMs ?? (envOverride ? Number.parseInt(envOverride, 10) : 300_000);
|
|
85
|
+
keepAlive.intervalMs = Number.isFinite(resolved) && resolved > 0 ? resolved : 300_000;
|
|
86
|
+
keepAlive.enabled = true;
|
|
87
|
+
// Fire once immediately to warm the pool.
|
|
88
|
+
void ping();
|
|
89
|
+
keepAlive.timer = setInterval(() => void ping(), keepAlive.intervalMs);
|
|
90
|
+
keepAlive.timer.unref();
|
|
91
|
+
}
|
|
92
|
+
export function stopKeepAlive() {
|
|
93
|
+
if (keepAlive.timer)
|
|
94
|
+
clearInterval(keepAlive.timer);
|
|
95
|
+
keepAlive.timer = null;
|
|
96
|
+
keepAlive.enabled = false;
|
|
97
|
+
}
|
|
98
|
+
export function getKeepAliveStatus() {
|
|
99
|
+
return {
|
|
100
|
+
enabled: keepAlive.enabled,
|
|
101
|
+
interval_ms: keepAlive.intervalMs,
|
|
102
|
+
last_ping_at: keepAlive.lastPingAt,
|
|
103
|
+
last_ping_latency_ms: keepAlive.lastPingLatencyMs,
|
|
104
|
+
last_ping_ok: keepAlive.lastPingOk,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function md5(s) {
|
|
108
|
+
return createHash("md5").update(s).digest("hex");
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Returns a Map<file_origin, file_hash> for every file already indexed under projectId.
|
|
112
|
+
* Used by sync_local_memory to skip files whose content hasn't changed.
|
|
113
|
+
*/
|
|
114
|
+
export async function listFileHashes(projectId) {
|
|
115
|
+
const map = new Map();
|
|
116
|
+
const pageSize = 1000;
|
|
117
|
+
let from = 0;
|
|
118
|
+
while (true) {
|
|
119
|
+
const { data, error } = await supabase
|
|
120
|
+
.from("memory_chunks")
|
|
121
|
+
.select("file_origin, file_hash")
|
|
122
|
+
.eq("project_id", projectId)
|
|
123
|
+
.not("file_hash", "is", null)
|
|
124
|
+
.range(from, from + pageSize - 1);
|
|
125
|
+
if (error)
|
|
126
|
+
throw new Error(`listFileHashes failed: ${error.message}`);
|
|
127
|
+
if (!data || data.length === 0)
|
|
128
|
+
break;
|
|
129
|
+
for (const row of data) {
|
|
130
|
+
if (row.file_origin && row.file_hash && !map.has(row.file_origin)) {
|
|
131
|
+
map.set(row.file_origin, row.file_hash);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (data.length < pageSize)
|
|
135
|
+
break;
|
|
136
|
+
from += pageSize;
|
|
137
|
+
}
|
|
138
|
+
return map;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Remove every chunk belonging to a given (project, file). Used before re-embedding
|
|
142
|
+
* a changed file so stale chunk_indexes don't linger.
|
|
143
|
+
*/
|
|
144
|
+
export async function deleteChunksForFile(projectId, fileOrigin) {
|
|
145
|
+
const { error, count } = await supabase
|
|
146
|
+
.from("memory_chunks")
|
|
147
|
+
.delete({ count: "exact" })
|
|
148
|
+
.eq("project_id", projectId)
|
|
149
|
+
.eq("file_origin", fileOrigin);
|
|
150
|
+
if (error)
|
|
151
|
+
throw new Error(`deleteChunksForFile failed: ${error.message}`);
|
|
152
|
+
return count ?? 0;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Confirm a file is fully resident in Supabase before it's safe to delete locally.
|
|
156
|
+
* Returns the chunk count, or 0 if nothing matches (project_id, file_origin, file_hash).
|
|
157
|
+
*/
|
|
158
|
+
export async function verifyFileSynced(projectId, fileOrigin, fileHash) {
|
|
159
|
+
const { count, error } = await supabase
|
|
160
|
+
.from("memory_chunks")
|
|
161
|
+
.select("*", { count: "exact", head: true })
|
|
162
|
+
.eq("project_id", projectId)
|
|
163
|
+
.eq("file_origin", fileOrigin)
|
|
164
|
+
.eq("file_hash", fileHash);
|
|
165
|
+
if (error)
|
|
166
|
+
throw new Error(`verifyFileSynced failed: ${error.message}`);
|
|
167
|
+
return count ?? 0;
|
|
168
|
+
}
|
|
169
|
+
export async function upsertChunks(projectId, rows) {
|
|
170
|
+
if (rows.length === 0)
|
|
171
|
+
return { count: 0 };
|
|
172
|
+
const payload = rows.map((r) => ({
|
|
173
|
+
project_id: projectId,
|
|
174
|
+
content: r.content,
|
|
175
|
+
file_origin: r.file_origin,
|
|
176
|
+
chunk_index: r.chunk_index,
|
|
177
|
+
embedding: r.embedding,
|
|
178
|
+
content_hash: md5(r.content),
|
|
179
|
+
file_hash: r.file_hash,
|
|
180
|
+
metadata: r.metadata ?? {},
|
|
181
|
+
updated_at: new Date().toISOString(),
|
|
182
|
+
}));
|
|
183
|
+
const { error } = await supabase
|
|
184
|
+
.from("memory_chunks")
|
|
185
|
+
.upsert(payload, { onConflict: "project_id,file_origin,chunk_index" });
|
|
186
|
+
if (error)
|
|
187
|
+
throw new Error(`Supabase upsert failed: ${error.message}`);
|
|
188
|
+
return { count: rows.length };
|
|
189
|
+
}
|
|
190
|
+
export async function searchChunks(projectId, queryEmbedding, matchCount = 5, minSimilarity = 0.0, metadataFilter, includeGlobal = true) {
|
|
191
|
+
// Migration 008 adds a 6-arg signature: `p_include_global boolean default true`.
|
|
192
|
+
// When true (default), the SQL WHERE clause dual-scopes across the caller's
|
|
193
|
+
// project_id AND the reserved 'GLOBAL' bucket. The GIN(jsonb_path_ops) index
|
|
194
|
+
// on memory_chunks.metadata still narrows the candidate set BEFORE pgvector
|
|
195
|
+
// ranks — project_id (plus the opt-in 'GLOBAL' fan-out) remains the
|
|
196
|
+
// structural tenancy guard.
|
|
197
|
+
const payload = {
|
|
198
|
+
query_embedding: queryEmbedding,
|
|
199
|
+
p_project_id: projectId,
|
|
200
|
+
match_count: matchCount,
|
|
201
|
+
min_similarity: minSimilarity,
|
|
202
|
+
p_include_global: includeGlobal,
|
|
203
|
+
};
|
|
204
|
+
if (metadataFilter && Object.keys(metadataFilter).length > 0) {
|
|
205
|
+
payload.p_metadata_filter = metadataFilter;
|
|
206
|
+
}
|
|
207
|
+
const { data, error } = await supabase.rpc("match_memory_chunks", payload);
|
|
208
|
+
if (error)
|
|
209
|
+
throw new Error(`Supabase search failed: ${error.message}`);
|
|
210
|
+
return (data ?? []);
|
|
211
|
+
}
|
|
212
|
+
export async function addBacklog(projectId, title, opts = {}) {
|
|
213
|
+
const { data, error } = await supabase
|
|
214
|
+
.from("cloud_backlog")
|
|
215
|
+
.insert({
|
|
216
|
+
project_id: projectId,
|
|
217
|
+
title,
|
|
218
|
+
priority: opts.priority ?? 3,
|
|
219
|
+
notes: opts.notes ?? null,
|
|
220
|
+
metadata: opts.metadata ?? {},
|
|
221
|
+
})
|
|
222
|
+
.select()
|
|
223
|
+
.single();
|
|
224
|
+
if (error)
|
|
225
|
+
throw new Error(`addBacklog failed: ${error.message}`);
|
|
226
|
+
return data;
|
|
227
|
+
}
|
|
228
|
+
export async function listBacklog(projectId, opts = {}) {
|
|
229
|
+
let q = supabase.from("cloud_backlog").select("*").eq("project_id", projectId);
|
|
230
|
+
if (opts.status) {
|
|
231
|
+
const arr = Array.isArray(opts.status) ? opts.status : [opts.status];
|
|
232
|
+
q = q.in("status", arr);
|
|
233
|
+
}
|
|
234
|
+
const { data, error } = await q.order("priority", { ascending: true }).order("created_at", { ascending: true });
|
|
235
|
+
if (error)
|
|
236
|
+
throw new Error(`listBacklog failed: ${error.message}`);
|
|
237
|
+
return (data ?? []);
|
|
238
|
+
}
|
|
239
|
+
export async function updateBacklog(id, patch) {
|
|
240
|
+
const { data, error } = await supabase
|
|
241
|
+
.from("cloud_backlog")
|
|
242
|
+
.update({ ...patch, updated_at: new Date().toISOString() })
|
|
243
|
+
.eq("id", id)
|
|
244
|
+
.select()
|
|
245
|
+
.single();
|
|
246
|
+
if (error)
|
|
247
|
+
throw new Error(`updateBacklog failed: ${error.message}`);
|
|
248
|
+
return data;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Transactionally moves every `status='done'` row for a project from
|
|
252
|
+
* cloud_backlog into archive_backlog. The heavy lifting is the SQL function
|
|
253
|
+
* archive_done_backlog() — a CTE with DELETE ... RETURNING feeding INSERT
|
|
254
|
+
* runs as a single atomic statement. If the insert fails, the delete rolls
|
|
255
|
+
* back automatically; there is no window where rows can be lost or doubled.
|
|
256
|
+
*/
|
|
257
|
+
export async function archiveDoneBacklog(projectId) {
|
|
258
|
+
const { data, error } = await supabase.rpc("archive_done_backlog", {
|
|
259
|
+
p_project_id: projectId,
|
|
260
|
+
});
|
|
261
|
+
if (error)
|
|
262
|
+
throw new Error(`archiveDoneBacklog failed: ${error.message}`);
|
|
263
|
+
return data ?? 0;
|
|
264
|
+
}
|
|
265
|
+
export async function listArchive(projectId, opts = {}) {
|
|
266
|
+
let q = supabase
|
|
267
|
+
.from("archive_backlog")
|
|
268
|
+
.select("*")
|
|
269
|
+
.eq("project_id", projectId)
|
|
270
|
+
.order("archived_at", { ascending: false });
|
|
271
|
+
if (opts.limit)
|
|
272
|
+
q = q.limit(opts.limit);
|
|
273
|
+
const { data, error } = await q;
|
|
274
|
+
if (error)
|
|
275
|
+
throw new Error(`listArchive failed: ${error.message}`);
|
|
276
|
+
return (data ?? []);
|
|
277
|
+
}
|
|
278
|
+
// ─── frozen_features ──────────────────────────────────────────────────────
|
|
279
|
+
export async function listFrozenPatterns(projectId) {
|
|
280
|
+
const { data, error } = await supabase
|
|
281
|
+
.from("frozen_features")
|
|
282
|
+
.select("pattern")
|
|
283
|
+
.eq("project_id", projectId);
|
|
284
|
+
if (error)
|
|
285
|
+
throw new Error(`listFrozenPatterns failed: ${error.message}`);
|
|
286
|
+
return (data ?? []).map((r) => r.pattern);
|
|
287
|
+
}
|
|
288
|
+
export async function addFrozenPattern(projectId, pattern, reason) {
|
|
289
|
+
const { error } = await supabase
|
|
290
|
+
.from("frozen_features")
|
|
291
|
+
.upsert({ project_id: projectId, pattern, reason: reason ?? null }, {
|
|
292
|
+
onConflict: "project_id,pattern",
|
|
293
|
+
});
|
|
294
|
+
if (error)
|
|
295
|
+
throw new Error(`addFrozenPattern failed: ${error.message}`);
|
|
296
|
+
}
|
|
297
|
+
export async function removeFrozenPattern(projectId, pattern) {
|
|
298
|
+
const { count, error } = await supabase
|
|
299
|
+
.from("frozen_features")
|
|
300
|
+
.delete({ count: "exact" })
|
|
301
|
+
.eq("project_id", projectId)
|
|
302
|
+
.eq("pattern", pattern);
|
|
303
|
+
if (error)
|
|
304
|
+
throw new Error(`removeFrozenPattern failed: ${error.message}`);
|
|
305
|
+
return count ?? 0;
|
|
306
|
+
}
|
|
307
|
+
export async function listFrozenByProject() {
|
|
308
|
+
const { data, error } = await supabase
|
|
309
|
+
.from("frozen_features")
|
|
310
|
+
.select("project_id, pattern");
|
|
311
|
+
if (error)
|
|
312
|
+
throw new Error(`listFrozenByProject failed: ${error.message}`);
|
|
313
|
+
const out = {};
|
|
314
|
+
for (const row of data ?? []) {
|
|
315
|
+
const pid = row.project_id;
|
|
316
|
+
const pat = row.pattern;
|
|
317
|
+
(out[pid] ??= []).push(pat);
|
|
318
|
+
}
|
|
319
|
+
return out;
|
|
320
|
+
}
|
|
321
|
+
// ─── shared frozen-patterns cache for the PreToolUse hook ────────────────
|
|
322
|
+
//
|
|
323
|
+
// The md-policy.py hook runs as a fresh subprocess per tool call and cannot
|
|
324
|
+
// hit Supabase directly without paying 1-2s of network latency per Write/Edit.
|
|
325
|
+
// Instead, the MCP server writes a snapshot of `frozen_features` to this
|
|
326
|
+
// file on startup and after any mutation; the hook reads it in microseconds.
|
|
327
|
+
//
|
|
328
|
+
// v1.1.3 schema migration: per-project entries are now
|
|
329
|
+
// { pattern, source, added_at }
|
|
330
|
+
// instead of bare strings. The shared loader/writer in `tools/frozen-cache.ts`
|
|
331
|
+
// handles legacy strings transparently; this module only has to project the
|
|
332
|
+
// Supabase rows into that shape.
|
|
333
|
+
import { loadFrozenCache, writeFrozenCache, FROZEN_CACHE_PATH, } from "./tools/frozen-cache.js";
|
|
334
|
+
export { FROZEN_CACHE_PATH };
|
|
335
|
+
export async function writeFrozenPatternsCache() {
|
|
336
|
+
try {
|
|
337
|
+
const raw = await listFrozenByProject();
|
|
338
|
+
// Read the existing on-disk cache so we can preserve `source` and
|
|
339
|
+
// `added_at` for entries that were already there ("first writer wins").
|
|
340
|
+
// Anything new (i.e. present in Supabase but not yet on disk) gets
|
|
341
|
+
// freshly minted provenance with source="supabase".
|
|
342
|
+
const existing = await loadFrozenCache();
|
|
343
|
+
const existingByProject = new Map();
|
|
344
|
+
for (const [pid, entries] of Object.entries(existing.projects)) {
|
|
345
|
+
const m = new Map();
|
|
346
|
+
for (const e of entries)
|
|
347
|
+
m.set(e.pattern, e);
|
|
348
|
+
existingByProject.set(pid, m);
|
|
349
|
+
}
|
|
350
|
+
// Normalize keys to the slug form the hook uses when looking up the cache
|
|
351
|
+
// (slugify(basename(CLAUDE_MD_POLICY_WORKSPACE))). Without this, a
|
|
352
|
+
// caller that passes a non-slug project_id to freeze_file would silently
|
|
353
|
+
// fail to block because the hook's lookup key wouldn't match.
|
|
354
|
+
const projects = {};
|
|
355
|
+
const now = Date.now();
|
|
356
|
+
for (const [pid, patterns] of Object.entries(raw)) {
|
|
357
|
+
const key = slugifyProject(pid);
|
|
358
|
+
const bucket = (projects[key] ??= []);
|
|
359
|
+
const seen = new Set(bucket.map((e) => e.pattern));
|
|
360
|
+
const priorMap = existingByProject.get(key);
|
|
361
|
+
for (const pattern of patterns) {
|
|
362
|
+
if (seen.has(pattern))
|
|
363
|
+
continue;
|
|
364
|
+
const prior = priorMap?.get(pattern);
|
|
365
|
+
if (prior) {
|
|
366
|
+
bucket.push(prior);
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
bucket.push({ pattern, source: "supabase", added_at: now });
|
|
370
|
+
}
|
|
371
|
+
seen.add(pattern);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
const projectCount = Object.keys(projects).length;
|
|
375
|
+
const pattern_count = Object.values(projects).reduce((n, arr) => n + arr.length, 0);
|
|
376
|
+
const path = await writeFrozenCache({
|
|
377
|
+
updated_at: new Date().toISOString(),
|
|
378
|
+
projects,
|
|
379
|
+
});
|
|
380
|
+
return { ok: true, path, project_count: projectCount, pattern_count };
|
|
381
|
+
}
|
|
382
|
+
catch (e) {
|
|
383
|
+
return {
|
|
384
|
+
ok: false,
|
|
385
|
+
path: FROZEN_CACHE_PATH,
|
|
386
|
+
project_count: 0,
|
|
387
|
+
pattern_count: 0,
|
|
388
|
+
warning: `writeFrozenPatternsCache failed: ${e.message}`,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
export async function upsertRule(projectId, fileOrigin, chunkIndex, content, embedding, metadata = {}) {
|
|
393
|
+
const { data, error } = await supabase.rpc("upsert_memory_rule", {
|
|
394
|
+
p_project_id: projectId,
|
|
395
|
+
p_file_origin: fileOrigin,
|
|
396
|
+
p_chunk_index: chunkIndex,
|
|
397
|
+
p_content: content,
|
|
398
|
+
p_embedding: embedding,
|
|
399
|
+
p_metadata: metadata,
|
|
400
|
+
});
|
|
401
|
+
if (error)
|
|
402
|
+
throw new Error(`Supabase upsertRule failed: ${error.message}`);
|
|
403
|
+
return data;
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { supabase } from "../supabase.js";
|
|
2
|
+
import { currentProjectId } from "../project.js";
|
|
3
|
+
export async function emit(event) {
|
|
4
|
+
try {
|
|
5
|
+
const { error } = await supabase.from("daemon_telemetry").insert({
|
|
6
|
+
project_id: currentProjectId,
|
|
7
|
+
daemon: event.daemon,
|
|
8
|
+
event_type: event.event,
|
|
9
|
+
payload: event.payload ?? {},
|
|
10
|
+
});
|
|
11
|
+
if (error) {
|
|
12
|
+
console.error(`[telemetry] insert failed (${event.daemon}/${event.event}): ${error.message}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
console.error(`[telemetry] emit threw (${event.daemon}/${event.event}):`, e);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/telemetry/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,KAAkB;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;YAC/D,UAAU,EAAE,gBAAgB;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,KAAK;YACvB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;SAC7B,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CACX,8BAA8B,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,OAAO,EAAE,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Telemetry Retention Pruner Daemon (Backlog #124).
|
|
2
|
+
// Rolling DELETE: every TELEMETRY_PRUNER_INTERVAL_MS, removes rows from
|
|
3
|
+
// daemon_telemetry with created_at older than TELEMETRY_PRUNER_RETENTION_DAYS.
|
|
4
|
+
// Mirrors the trajectory daemon shape (src/trajectory/daemon.ts): module-level
|
|
5
|
+
// state, idempotent start/stop, .unref()'d interval, re-entrancy guard.
|
|
6
|
+
// Emits standard run_started / run_ended / run_errored telemetry — itself a
|
|
7
|
+
// daemon producer, so its own activity is observable via system_dashboard.
|
|
8
|
+
import { supabase } from "../supabase.js";
|
|
9
|
+
import { emit } from "./emit.js";
|
|
10
|
+
const DEFAULT_INTERVAL_MS = 21_600_000; // 6h — 4 ticks/day keeps the daemon
|
|
11
|
+
// inside the 1h health window.
|
|
12
|
+
const DEFAULT_RETENTION_DAYS = 30;
|
|
13
|
+
const state = {
|
|
14
|
+
enabled: false,
|
|
15
|
+
intervalMs: DEFAULT_INTERVAL_MS,
|
|
16
|
+
retentionDays: DEFAULT_RETENTION_DAYS,
|
|
17
|
+
lastRunAt: null,
|
|
18
|
+
lastRunDeleted: 0,
|
|
19
|
+
lastRunErrored: 0,
|
|
20
|
+
lastRunDurationMs: 0,
|
|
21
|
+
timer: null,
|
|
22
|
+
running: false,
|
|
23
|
+
};
|
|
24
|
+
function readIntEnv(name, fallback) {
|
|
25
|
+
const raw = process.env[name];
|
|
26
|
+
if (!raw)
|
|
27
|
+
return fallback;
|
|
28
|
+
const n = Number.parseInt(raw, 10);
|
|
29
|
+
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
30
|
+
}
|
|
31
|
+
function resolveConfig() {
|
|
32
|
+
return {
|
|
33
|
+
intervalMs: readIntEnv("TELEMETRY_PRUNER_INTERVAL_MS", DEFAULT_INTERVAL_MS),
|
|
34
|
+
retentionDays: readIntEnv("TELEMETRY_PRUNER_RETENTION_DAYS", DEFAULT_RETENTION_DAYS),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// One-shot prune. Exposed for smoke tests + manual invocation. Always returns
|
|
38
|
+
// a structured outcome — never throws, since callers (tick + smoke tests)
|
|
39
|
+
// must observe error counts deterministically.
|
|
40
|
+
export async function runPruneOnce(opts = {}) {
|
|
41
|
+
const t0 = Date.now();
|
|
42
|
+
const retentionDays = opts.retentionDays ?? state.retentionDays;
|
|
43
|
+
const cutoffIso = new Date(Date.now() - retentionDays * 86_400_000).toISOString();
|
|
44
|
+
try {
|
|
45
|
+
// Supabase .delete() with .lt() + { count: 'exact' } returns the row count
|
|
46
|
+
// PostgreSQL deleted. The predicate uses the only natural axis (created_at);
|
|
47
|
+
// we accept seqscan until volume warrants a dedicated index (see spec).
|
|
48
|
+
const { error, count } = await supabase
|
|
49
|
+
.from("daemon_telemetry")
|
|
50
|
+
.delete({ count: "exact" })
|
|
51
|
+
.lt("created_at", cutoffIso);
|
|
52
|
+
if (error) {
|
|
53
|
+
return { deleted: 0, errored: 1, duration_ms: Date.now() - t0 };
|
|
54
|
+
}
|
|
55
|
+
return { deleted: count ?? 0, errored: 0, duration_ms: Date.now() - t0 };
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return { deleted: 0, errored: 1, duration_ms: Date.now() - t0 };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Daemon tick — wrapped in try/finally so the loop NEVER throws.
|
|
62
|
+
async function tick() {
|
|
63
|
+
if (state.running)
|
|
64
|
+
return;
|
|
65
|
+
state.running = true;
|
|
66
|
+
const __tStart = Date.now();
|
|
67
|
+
void emit({ daemon: "telemetry_pruner", event: "run_started" });
|
|
68
|
+
try {
|
|
69
|
+
const result = await runPruneOnce({ retentionDays: state.retentionDays });
|
|
70
|
+
state.lastRunDeleted = result.deleted;
|
|
71
|
+
state.lastRunErrored = result.errored;
|
|
72
|
+
state.lastRunDurationMs = result.duration_ms;
|
|
73
|
+
state.lastRunAt = new Date().toISOString();
|
|
74
|
+
if (result.errored > 0) {
|
|
75
|
+
void emit({
|
|
76
|
+
daemon: "telemetry_pruner",
|
|
77
|
+
event: "run_errored",
|
|
78
|
+
payload: {
|
|
79
|
+
error_message: "delete query failed (see server stderr for details)",
|
|
80
|
+
duration_ms: Date.now() - __tStart,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
void emit({
|
|
86
|
+
daemon: "telemetry_pruner",
|
|
87
|
+
event: "run_ended",
|
|
88
|
+
payload: {
|
|
89
|
+
deleted: state.lastRunDeleted,
|
|
90
|
+
retention_days: state.retentionDays,
|
|
91
|
+
duration_ms: Date.now() - __tStart,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
state.lastRunErrored++;
|
|
98
|
+
state.lastRunAt = new Date().toISOString();
|
|
99
|
+
void emit({
|
|
100
|
+
daemon: "telemetry_pruner",
|
|
101
|
+
event: "run_errored",
|
|
102
|
+
payload: {
|
|
103
|
+
error_message: err instanceof Error ? err.message : String(err),
|
|
104
|
+
duration_ms: Date.now() - __tStart,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
state.running = false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Public alias for one-shot invocation (smoke tests, manual probes).
|
|
113
|
+
export const runTelemetryPrunerOnce = tick;
|
|
114
|
+
export function startTelemetryPruner() {
|
|
115
|
+
if (state.timer)
|
|
116
|
+
return;
|
|
117
|
+
const cfg = resolveConfig();
|
|
118
|
+
state.intervalMs = cfg.intervalMs;
|
|
119
|
+
state.retentionDays = cfg.retentionDays;
|
|
120
|
+
state.enabled = true;
|
|
121
|
+
state.timer = setInterval(() => void tick(), state.intervalMs);
|
|
122
|
+
state.timer.unref();
|
|
123
|
+
}
|
|
124
|
+
export function stopTelemetryPruner() {
|
|
125
|
+
if (state.timer)
|
|
126
|
+
clearInterval(state.timer);
|
|
127
|
+
state.timer = null;
|
|
128
|
+
state.enabled = false;
|
|
129
|
+
}
|
|
130
|
+
export function getTelemetryPrunerStatus() {
|
|
131
|
+
return {
|
|
132
|
+
enabled: state.enabled,
|
|
133
|
+
interval_ms: state.intervalMs,
|
|
134
|
+
retention_days: state.retentionDays,
|
|
135
|
+
last_run_at: state.lastRunAt,
|
|
136
|
+
last_run_deleted: state.lastRunDeleted,
|
|
137
|
+
last_run_errored: state.lastRunErrored,
|
|
138
|
+
last_run_duration_ms: state.lastRunDurationMs,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=pruner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pruner.js","sourceRoot":"","sources":["../../src/telemetry/pruner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/telemetry/types.ts"],"names":[],"mappings":""}
|