@edihasaj/recall 0.5.2
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/LICENSE +21 -0
- package/README.md +409 -0
- package/dist/chunk-4CV4JOE5.js +27 -0
- package/dist/chunk-4CV4JOE5.js.map +1 -0
- package/dist/chunk-A5UIRZU6.js +469 -0
- package/dist/chunk-A5UIRZU6.js.map +1 -0
- package/dist/chunk-AYHFPCGY.js +964 -0
- package/dist/chunk-AYHFPCGY.js.map +1 -0
- package/dist/chunk-DNFKAHS6.js +204 -0
- package/dist/chunk-DNFKAHS6.js.map +1 -0
- package/dist/chunk-GC5XMBG4.js +551 -0
- package/dist/chunk-GC5XMBG4.js.map +1 -0
- package/dist/chunk-IILLSHLM.js +3021 -0
- package/dist/chunk-IILLSHLM.js.map +1 -0
- package/dist/chunk-LVQW6WHK.js +146 -0
- package/dist/chunk-LVQW6WHK.js.map +1 -0
- package/dist/chunk-LZ6PMQRX.js +955 -0
- package/dist/chunk-LZ6PMQRX.js.map +1 -0
- package/dist/chunk-PC43MBX5.js +2960 -0
- package/dist/chunk-PC43MBX5.js.map +1 -0
- package/dist/chunk-VEPXEHRZ.js +1763 -0
- package/dist/chunk-VEPXEHRZ.js.map +1 -0
- package/dist/cleanup-TVOX2S2S.js +28 -0
- package/dist/cleanup-TVOX2S2S.js.map +1 -0
- package/dist/cli.js +3425 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon.js +1298 -0
- package/dist/daemon.js.map +1 -0
- package/dist/dispatcher-UGMU6THT.js +15 -0
- package/dist/dispatcher-UGMU6THT.js.map +1 -0
- package/dist/keychain-5QG52ANO.js +22 -0
- package/dist/keychain-5QG52ANO.js.map +1 -0
- package/dist/mcp.js +21 -0
- package/dist/mcp.js.map +1 -0
- package/dist/quality-Z7LPMMBC.js +17 -0
- package/dist/quality-Z7LPMMBC.js.map +1 -0
- package/dist/sync-server.js +225 -0
- package/dist/sync-server.js.map +1 -0
- package/dist/tasks-UOLSPXJQ.js +61 -0
- package/dist/tasks-UOLSPXJQ.js.map +1 -0
- package/dist/usage-CY3V72YN.js +101 -0
- package/dist/usage-CY3V72YN.js.map +1 -0
- package/drizzle/0000_initial_create.sql +240 -0
- package/drizzle/0001_rich_liz_osborn.sql +21 -0
- package/drizzle/0002_unknown_spot.sql +18 -0
- package/drizzle/0003_red_wendigo.sql +19 -0
- package/drizzle/0004_early_carlie_cooper.sql +1 -0
- package/drizzle/0005_simple_emma_frost.sql +96 -0
- package/drizzle/0006_keen_mongoose.sql +2 -0
- package/drizzle/0007_flawless_maximus.sql +15 -0
- package/drizzle/meta/0000_snapshot.json +1630 -0
- package/drizzle/meta/0001_snapshot.json +1773 -0
- package/drizzle/meta/0002_snapshot.json +1891 -0
- package/drizzle/meta/0003_snapshot.json +2014 -0
- package/drizzle/meta/0004_snapshot.json +2022 -0
- package/drizzle/meta/0005_snapshot.json +2064 -0
- package/drizzle/meta/0006_snapshot.json +2078 -0
- package/drizzle/meta/0007_snapshot.json +2183 -0
- package/drizzle/meta/_journal.json +62 -0
- package/package.json +64 -0
- package/scripts/recall-claude +7 -0
- package/scripts/recall-codex +7 -0
- package/scripts/recall-session +71 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import {
|
|
2
|
+
feedbackEvents,
|
|
3
|
+
historyInjections,
|
|
4
|
+
memories,
|
|
5
|
+
memoryInjections,
|
|
6
|
+
qualitySnapshots
|
|
7
|
+
} from "./chunk-A5UIRZU6.js";
|
|
8
|
+
|
|
9
|
+
// src/maintenance/quality.ts
|
|
10
|
+
import { and, desc, eq, gte, sql } from "drizzle-orm";
|
|
11
|
+
import { randomUUID } from "crypto";
|
|
12
|
+
function computeQualityReport(db, opts = {}) {
|
|
13
|
+
const now = /* @__PURE__ */ new Date();
|
|
14
|
+
const start = opts.sinceIso ?? new Date(now.getTime() - 14 * 864e5).toISOString();
|
|
15
|
+
const end = now.toISOString();
|
|
16
|
+
const injectionRows = db.select({
|
|
17
|
+
outcome: memoryInjections.outcome,
|
|
18
|
+
count: sql`count(*)`.as("count")
|
|
19
|
+
}).from(memoryInjections).where(gte(memoryInjections.injected_at, start)).groupBy(memoryInjections.outcome).all();
|
|
20
|
+
const injectionsByOutcome = {};
|
|
21
|
+
let injectionsTotal = 0;
|
|
22
|
+
let injectionsResolved = 0;
|
|
23
|
+
for (const row of injectionRows) {
|
|
24
|
+
injectionsTotal += row.count;
|
|
25
|
+
const key = row.outcome ?? "unresolved";
|
|
26
|
+
injectionsByOutcome[key] = row.count;
|
|
27
|
+
if (row.outcome) injectionsResolved += row.count;
|
|
28
|
+
}
|
|
29
|
+
const followed = injectionsByOutcome.followed ?? 0;
|
|
30
|
+
const followedRate = injectionsResolved > 0 ? followed / injectionsResolved : null;
|
|
31
|
+
const feedbackRows = db.select({
|
|
32
|
+
outcome: feedbackEvents.outcome,
|
|
33
|
+
count: sql`count(*)`.as("count")
|
|
34
|
+
}).from(feedbackEvents).where(and(gte(feedbackEvents.timestamp, start))).groupBy(feedbackEvents.outcome).all();
|
|
35
|
+
const feedbackByOutcome = {};
|
|
36
|
+
let feedbackTotal = 0;
|
|
37
|
+
for (const row of feedbackRows) {
|
|
38
|
+
feedbackTotal += row.count;
|
|
39
|
+
feedbackByOutcome[row.outcome] = row.count;
|
|
40
|
+
}
|
|
41
|
+
const historyRow = db.select({
|
|
42
|
+
total: sql`count(*)`.as("total"),
|
|
43
|
+
unique_snippets: sql`count(distinct ${historyInjections.snippet_id})`.as("unique_snippets")
|
|
44
|
+
}).from(historyInjections).where(gte(historyInjections.injected_at, start)).get();
|
|
45
|
+
return {
|
|
46
|
+
window_start: start,
|
|
47
|
+
window_end: end,
|
|
48
|
+
injections: {
|
|
49
|
+
total: injectionsTotal,
|
|
50
|
+
resolved: injectionsResolved,
|
|
51
|
+
unresolved: injectionsTotal - injectionsResolved,
|
|
52
|
+
by_outcome: injectionsByOutcome,
|
|
53
|
+
followed_rate_resolved: followedRate
|
|
54
|
+
},
|
|
55
|
+
feedback_events: {
|
|
56
|
+
total: feedbackTotal,
|
|
57
|
+
by_outcome: feedbackByOutcome
|
|
58
|
+
},
|
|
59
|
+
history_injections: {
|
|
60
|
+
total: Number(historyRow?.total ?? 0),
|
|
61
|
+
unique_snippets: Number(historyRow?.unique_snippets ?? 0)
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function recordQualitySnapshot(db, report, notes) {
|
|
66
|
+
const counts = report.injections.by_outcome;
|
|
67
|
+
const ruleRow = db.select({ n: sql`count(*)` }).from(memories).where(and(eq(memories.status, "active"), eq(memories.type, "rule"))).get();
|
|
68
|
+
const cmdRow = db.select({ n: sql`count(*)` }).from(memories).where(and(eq(memories.status, "active"), eq(memories.type, "command"))).get();
|
|
69
|
+
const candRow = db.select({ n: sql`count(*)` }).from(memories).where(and(eq(memories.status, "candidate"), eq(memories.source, "user_correction"))).get();
|
|
70
|
+
const row = {
|
|
71
|
+
id: randomUUID(),
|
|
72
|
+
taken_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
73
|
+
window_start: report.window_start,
|
|
74
|
+
window_end: report.window_end,
|
|
75
|
+
injections_total: report.injections.total,
|
|
76
|
+
injections_resolved: report.injections.resolved,
|
|
77
|
+
injections_followed: counts.followed ?? 0,
|
|
78
|
+
injections_overridden: counts.overridden ?? 0,
|
|
79
|
+
injections_contradicted: counts.contradicted ?? 0,
|
|
80
|
+
injections_ignored: counts.ignored ?? 0,
|
|
81
|
+
followed_rate_resolved: report.injections.followed_rate_resolved,
|
|
82
|
+
active_rule_count: ruleRow?.n ?? 0,
|
|
83
|
+
active_command_count: cmdRow?.n ?? 0,
|
|
84
|
+
candidate_correction_count: candRow?.n ?? 0,
|
|
85
|
+
history_injections_total: report.history_injections.total,
|
|
86
|
+
history_snippets_injected: report.history_injections.unique_snippets,
|
|
87
|
+
notes: notes ?? null
|
|
88
|
+
};
|
|
89
|
+
db.insert(qualitySnapshots).values(row).run();
|
|
90
|
+
return row;
|
|
91
|
+
}
|
|
92
|
+
function listQualitySnapshots(db, limit = 20) {
|
|
93
|
+
return db.select().from(qualitySnapshots).orderBy(desc(qualitySnapshots.taken_at)).limit(limit).all();
|
|
94
|
+
}
|
|
95
|
+
function diffQualitySnapshots(prev, curr) {
|
|
96
|
+
const prevRate = prev.followed_rate_resolved ?? 0;
|
|
97
|
+
const currRate = curr.followed_rate_resolved ?? 0;
|
|
98
|
+
return {
|
|
99
|
+
days_apart: (new Date(curr.taken_at).getTime() - new Date(prev.taken_at).getTime()) / 864e5,
|
|
100
|
+
followed_rate_delta_pp: (currRate - prevRate) * 100,
|
|
101
|
+
resolved_delta: curr.injections_resolved - prev.injections_resolved,
|
|
102
|
+
followed_delta: curr.injections_followed - prev.injections_followed,
|
|
103
|
+
contradicted_delta: curr.injections_contradicted - prev.injections_contradicted,
|
|
104
|
+
active_rule_delta: curr.active_rule_count - prev.active_rule_count,
|
|
105
|
+
candidate_delta: curr.candidate_correction_count - prev.candidate_correction_count,
|
|
106
|
+
history_injections_delta: curr.history_injections_total - prev.history_injections_total,
|
|
107
|
+
history_snippets_delta: curr.history_snippets_injected - prev.history_snippets_injected
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function formatQualityReport(r) {
|
|
111
|
+
const lines = [];
|
|
112
|
+
lines.push(`Quality window: ${r.window_start.slice(0, 10)} \u2192 ${r.window_end.slice(0, 10)}`);
|
|
113
|
+
lines.push("");
|
|
114
|
+
lines.push("Injections:");
|
|
115
|
+
lines.push(` total: ${r.injections.total}`);
|
|
116
|
+
lines.push(` resolved: ${r.injections.resolved}`);
|
|
117
|
+
lines.push(` unresolved: ${r.injections.unresolved}`);
|
|
118
|
+
for (const [k, v] of Object.entries(r.injections.by_outcome)) {
|
|
119
|
+
lines.push(` ${k.padEnd(12)} ${v}`);
|
|
120
|
+
}
|
|
121
|
+
if (r.injections.followed_rate_resolved != null) {
|
|
122
|
+
lines.push(` followed rate (of resolved): ${(r.injections.followed_rate_resolved * 100).toFixed(1)}%`);
|
|
123
|
+
} else {
|
|
124
|
+
lines.push(` followed rate (of resolved): n/a (no resolved injections in window)`);
|
|
125
|
+
}
|
|
126
|
+
lines.push("");
|
|
127
|
+
lines.push("Feedback events:");
|
|
128
|
+
lines.push(` total: ${r.feedback_events.total}`);
|
|
129
|
+
for (const [k, v] of Object.entries(r.feedback_events.by_outcome)) {
|
|
130
|
+
lines.push(` ${k.padEnd(12)} ${v}`);
|
|
131
|
+
}
|
|
132
|
+
lines.push("");
|
|
133
|
+
lines.push("History injections:");
|
|
134
|
+
lines.push(` total: ${r.history_injections.total}`);
|
|
135
|
+
lines.push(` snippets: ${r.history_injections.unique_snippets}`);
|
|
136
|
+
return lines.join("\n");
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export {
|
|
140
|
+
computeQualityReport,
|
|
141
|
+
recordQualitySnapshot,
|
|
142
|
+
listQualitySnapshots,
|
|
143
|
+
diffQualitySnapshots,
|
|
144
|
+
formatQualityReport
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=chunk-LVQW6WHK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/maintenance/quality.ts"],"sourcesContent":["import { and, desc, eq, gte, sql } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { feedbackEvents, historyInjections, memories, memoryInjections, qualitySnapshots } from \"../db/schema.js\";\n\nexport interface QualityReport {\n window_start: string;\n window_end: string;\n injections: {\n total: number;\n resolved: number;\n unresolved: number;\n by_outcome: Record<string, number>;\n followed_rate_resolved: number | null;\n };\n feedback_events: {\n total: number;\n by_outcome: Record<string, number>;\n };\n history_injections: {\n total: number;\n unique_snippets: number;\n };\n}\n\nexport function computeQualityReport(\n db: RecallDb,\n opts: { sinceIso?: string } = {},\n): QualityReport {\n const now = new Date();\n const start = opts.sinceIso ?? new Date(now.getTime() - 14 * 86_400_000).toISOString();\n const end = now.toISOString();\n\n const injectionRows = db.select({\n outcome: memoryInjections.outcome,\n count: sql<number>`count(*)`.as(\"count\"),\n })\n .from(memoryInjections)\n .where(gte(memoryInjections.injected_at, start))\n .groupBy(memoryInjections.outcome)\n .all();\n\n const injectionsByOutcome: Record<string, number> = {};\n let injectionsTotal = 0;\n let injectionsResolved = 0;\n for (const row of injectionRows) {\n injectionsTotal += row.count;\n const key = row.outcome ?? \"unresolved\";\n injectionsByOutcome[key] = row.count;\n if (row.outcome) injectionsResolved += row.count;\n }\n const followed = injectionsByOutcome.followed ?? 0;\n const followedRate = injectionsResolved > 0 ? followed / injectionsResolved : null;\n\n const feedbackRows = db.select({\n outcome: feedbackEvents.outcome,\n count: sql<number>`count(*)`.as(\"count\"),\n })\n .from(feedbackEvents)\n .where(and(gte(feedbackEvents.timestamp, start)))\n .groupBy(feedbackEvents.outcome)\n .all();\n\n const feedbackByOutcome: Record<string, number> = {};\n let feedbackTotal = 0;\n for (const row of feedbackRows) {\n feedbackTotal += row.count;\n feedbackByOutcome[row.outcome] = row.count;\n }\n\n const historyRow = db.select({\n total: sql<number>`count(*)`.as(\"total\"),\n unique_snippets: sql<number>`count(distinct ${historyInjections.snippet_id})`.as(\"unique_snippets\"),\n })\n .from(historyInjections)\n .where(gte(historyInjections.injected_at, start))\n .get();\n\n return {\n window_start: start,\n window_end: end,\n injections: {\n total: injectionsTotal,\n resolved: injectionsResolved,\n unresolved: injectionsTotal - injectionsResolved,\n by_outcome: injectionsByOutcome,\n followed_rate_resolved: followedRate,\n },\n feedback_events: {\n total: feedbackTotal,\n by_outcome: feedbackByOutcome,\n },\n history_injections: {\n total: Number(historyRow?.total ?? 0),\n unique_snippets: Number(historyRow?.unique_snippets ?? 0),\n },\n };\n}\n\nexport interface QualitySnapshotRow {\n id: string;\n taken_at: string;\n window_start: string;\n window_end: string;\n injections_total: number;\n injections_resolved: number;\n injections_followed: number;\n injections_overridden: number;\n injections_contradicted: number;\n injections_ignored: number;\n followed_rate_resolved: number | null;\n active_rule_count: number;\n active_command_count: number;\n candidate_correction_count: number;\n history_injections_total: number;\n history_snippets_injected: number;\n notes: string | null;\n}\n\nexport function recordQualitySnapshot(\n db: RecallDb,\n report: QualityReport,\n notes?: string,\n): QualitySnapshotRow {\n const counts = report.injections.by_outcome;\n const ruleRow = db.select({ n: sql<number>`count(*)` }).from(memories)\n .where(and(eq(memories.status, \"active\"), eq(memories.type, \"rule\"))).get();\n const cmdRow = db.select({ n: sql<number>`count(*)` }).from(memories)\n .where(and(eq(memories.status, \"active\"), eq(memories.type, \"command\"))).get();\n const candRow = db.select({ n: sql<number>`count(*)` }).from(memories)\n .where(and(eq(memories.status, \"candidate\"), eq(memories.source, \"user_correction\"))).get();\n\n const row: QualitySnapshotRow = {\n id: randomUUID(),\n taken_at: new Date().toISOString(),\n window_start: report.window_start,\n window_end: report.window_end,\n injections_total: report.injections.total,\n injections_resolved: report.injections.resolved,\n injections_followed: counts.followed ?? 0,\n injections_overridden: counts.overridden ?? 0,\n injections_contradicted: counts.contradicted ?? 0,\n injections_ignored: counts.ignored ?? 0,\n followed_rate_resolved: report.injections.followed_rate_resolved,\n active_rule_count: ruleRow?.n ?? 0,\n active_command_count: cmdRow?.n ?? 0,\n candidate_correction_count: candRow?.n ?? 0,\n history_injections_total: report.history_injections.total,\n history_snippets_injected: report.history_injections.unique_snippets,\n notes: notes ?? null,\n };\n\n db.insert(qualitySnapshots).values(row).run();\n return row;\n}\n\nexport function listQualitySnapshots(db: RecallDb, limit = 20): QualitySnapshotRow[] {\n return db.select().from(qualitySnapshots)\n .orderBy(desc(qualitySnapshots.taken_at))\n .limit(limit)\n .all();\n}\n\nexport function diffQualitySnapshots(prev: QualitySnapshotRow, curr: QualitySnapshotRow) {\n const prevRate = prev.followed_rate_resolved ?? 0;\n const currRate = curr.followed_rate_resolved ?? 0;\n return {\n days_apart: (new Date(curr.taken_at).getTime() - new Date(prev.taken_at).getTime()) / 86_400_000,\n followed_rate_delta_pp: (currRate - prevRate) * 100,\n resolved_delta: curr.injections_resolved - prev.injections_resolved,\n followed_delta: curr.injections_followed - prev.injections_followed,\n contradicted_delta: curr.injections_contradicted - prev.injections_contradicted,\n active_rule_delta: curr.active_rule_count - prev.active_rule_count,\n candidate_delta: curr.candidate_correction_count - prev.candidate_correction_count,\n history_injections_delta: curr.history_injections_total - prev.history_injections_total,\n history_snippets_delta: curr.history_snippets_injected - prev.history_snippets_injected,\n };\n}\n\nexport function formatQualityReport(r: QualityReport): string {\n const lines: string[] = [];\n lines.push(`Quality window: ${r.window_start.slice(0, 10)} → ${r.window_end.slice(0, 10)}`);\n lines.push(\"\");\n lines.push(\"Injections:\");\n lines.push(` total: ${r.injections.total}`);\n lines.push(` resolved: ${r.injections.resolved}`);\n lines.push(` unresolved: ${r.injections.unresolved}`);\n for (const [k, v] of Object.entries(r.injections.by_outcome)) {\n lines.push(` ${k.padEnd(12)} ${v}`);\n }\n if (r.injections.followed_rate_resolved != null) {\n lines.push(` followed rate (of resolved): ${(r.injections.followed_rate_resolved * 100).toFixed(1)}%`);\n } else {\n lines.push(` followed rate (of resolved): n/a (no resolved injections in window)`);\n }\n lines.push(\"\");\n lines.push(\"Feedback events:\");\n lines.push(` total: ${r.feedback_events.total}`);\n for (const [k, v] of Object.entries(r.feedback_events.by_outcome)) {\n lines.push(` ${k.padEnd(12)} ${v}`);\n }\n lines.push(\"\");\n lines.push(\"History injections:\");\n lines.push(` total: ${r.history_injections.total}`);\n lines.push(` snippets: ${r.history_injections.unique_snippets}`);\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|