audrey 0.17.0 → 0.20.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 (191) hide show
  1. package/README.md +129 -374
  2. package/dist/mcp-server/config.d.ts +20 -0
  3. package/dist/mcp-server/config.d.ts.map +1 -0
  4. package/dist/mcp-server/config.js +125 -0
  5. package/dist/mcp-server/config.js.map +1 -0
  6. package/dist/mcp-server/index.d.ts +100 -0
  7. package/dist/mcp-server/index.d.ts.map +1 -0
  8. package/dist/mcp-server/index.js +1113 -0
  9. package/dist/mcp-server/index.js.map +1 -0
  10. package/dist/src/adaptive.d.ts +7 -0
  11. package/dist/src/adaptive.d.ts.map +1 -0
  12. package/dist/src/adaptive.js +49 -0
  13. package/dist/src/adaptive.js.map +1 -0
  14. package/dist/src/affect.d.ts +19 -0
  15. package/dist/src/affect.d.ts.map +1 -0
  16. package/dist/src/affect.js +72 -0
  17. package/dist/src/affect.js.map +1 -0
  18. package/dist/src/audrey.d.ts +140 -0
  19. package/dist/src/audrey.d.ts.map +1 -0
  20. package/dist/src/audrey.js +564 -0
  21. package/dist/src/audrey.js.map +1 -0
  22. package/dist/src/capsule.d.ts +68 -0
  23. package/dist/src/capsule.d.ts.map +1 -0
  24. package/dist/src/capsule.js +311 -0
  25. package/dist/src/capsule.js.map +1 -0
  26. package/dist/src/causal.d.ts +28 -0
  27. package/dist/src/causal.d.ts.map +1 -0
  28. package/dist/src/causal.js +65 -0
  29. package/dist/src/causal.js.map +1 -0
  30. package/dist/src/confidence.d.ts +12 -0
  31. package/dist/src/confidence.d.ts.map +1 -0
  32. package/dist/src/confidence.js +63 -0
  33. package/dist/src/confidence.js.map +1 -0
  34. package/dist/src/consolidate.d.ts +8 -0
  35. package/dist/src/consolidate.d.ts.map +1 -0
  36. package/dist/src/consolidate.js +218 -0
  37. package/dist/src/consolidate.js.map +1 -0
  38. package/dist/src/context.d.ts +3 -0
  39. package/dist/src/context.d.ts.map +1 -0
  40. package/dist/src/context.js +19 -0
  41. package/dist/src/context.js.map +1 -0
  42. package/dist/src/db.d.ts +12 -0
  43. package/dist/src/db.d.ts.map +1 -0
  44. package/dist/src/db.js +380 -0
  45. package/dist/src/db.js.map +1 -0
  46. package/dist/src/decay.d.ts +7 -0
  47. package/dist/src/decay.d.ts.map +1 -0
  48. package/dist/src/decay.js +68 -0
  49. package/dist/src/decay.js.map +1 -0
  50. package/dist/src/embedding.d.ts +57 -0
  51. package/dist/src/embedding.d.ts.map +1 -0
  52. package/dist/src/embedding.js +254 -0
  53. package/dist/src/embedding.js.map +1 -0
  54. package/dist/src/encode.d.ts +15 -0
  55. package/dist/src/encode.d.ts.map +1 -0
  56. package/dist/src/encode.js +36 -0
  57. package/dist/src/encode.js.map +1 -0
  58. package/dist/src/events.d.ts +69 -0
  59. package/dist/src/events.d.ts.map +1 -0
  60. package/dist/src/events.js +149 -0
  61. package/dist/src/events.js.map +1 -0
  62. package/dist/src/export.d.ts +3 -0
  63. package/dist/src/export.d.ts.map +1 -0
  64. package/dist/src/export.js +46 -0
  65. package/dist/src/export.js.map +1 -0
  66. package/dist/src/forget.d.ts +11 -0
  67. package/dist/src/forget.d.ts.map +1 -0
  68. package/dist/src/forget.js +105 -0
  69. package/dist/src/forget.js.map +1 -0
  70. package/dist/src/fts.d.ts +34 -0
  71. package/dist/src/fts.d.ts.map +1 -0
  72. package/dist/src/fts.js +117 -0
  73. package/dist/src/fts.js.map +1 -0
  74. package/dist/src/hybrid-recall.d.ts +37 -0
  75. package/dist/src/hybrid-recall.d.ts.map +1 -0
  76. package/dist/src/hybrid-recall.js +213 -0
  77. package/dist/src/hybrid-recall.js.map +1 -0
  78. package/dist/src/import.d.ts +4 -0
  79. package/dist/src/import.d.ts.map +1 -0
  80. package/dist/src/import.js +127 -0
  81. package/dist/src/import.js.map +1 -0
  82. package/dist/src/index.d.ts +22 -0
  83. package/dist/src/index.d.ts.map +1 -0
  84. package/{src → dist/src}/index.js +5 -13
  85. package/dist/src/index.js.map +1 -0
  86. package/dist/src/interference.d.ts +13 -0
  87. package/dist/src/interference.d.ts.map +1 -0
  88. package/dist/src/interference.js +45 -0
  89. package/dist/src/interference.js.map +1 -0
  90. package/dist/src/introspect.d.ts +4 -0
  91. package/dist/src/introspect.d.ts.map +1 -0
  92. package/dist/src/introspect.js +40 -0
  93. package/dist/src/introspect.js.map +1 -0
  94. package/dist/src/llm.d.ts +38 -0
  95. package/dist/src/llm.d.ts.map +1 -0
  96. package/dist/src/llm.js +167 -0
  97. package/dist/src/llm.js.map +1 -0
  98. package/dist/src/migrate.d.ts +6 -0
  99. package/dist/src/migrate.d.ts.map +1 -0
  100. package/dist/src/migrate.js +51 -0
  101. package/dist/src/migrate.js.map +1 -0
  102. package/dist/src/promote.d.ts +40 -0
  103. package/dist/src/promote.d.ts.map +1 -0
  104. package/dist/src/promote.js +200 -0
  105. package/dist/src/promote.js.map +1 -0
  106. package/dist/src/prompts.d.ts +16 -0
  107. package/dist/src/prompts.d.ts.map +1 -0
  108. package/{src → dist/src}/prompts.js +172 -203
  109. package/dist/src/prompts.js.map +1 -0
  110. package/dist/src/recall.d.ts +9 -0
  111. package/dist/src/recall.d.ts.map +1 -0
  112. package/dist/src/recall.js +432 -0
  113. package/dist/src/recall.js.map +1 -0
  114. package/dist/src/redact.d.ts +27 -0
  115. package/dist/src/redact.d.ts.map +1 -0
  116. package/dist/src/redact.js +228 -0
  117. package/dist/src/redact.js.map +1 -0
  118. package/dist/src/rollback.d.ts +8 -0
  119. package/dist/src/rollback.d.ts.map +1 -0
  120. package/dist/src/rollback.js +33 -0
  121. package/dist/src/rollback.js.map +1 -0
  122. package/dist/src/routes.d.ts +7 -0
  123. package/dist/src/routes.d.ts.map +1 -0
  124. package/dist/src/routes.js +226 -0
  125. package/dist/src/routes.js.map +1 -0
  126. package/dist/src/rules-compiler.d.ts +20 -0
  127. package/dist/src/rules-compiler.d.ts.map +1 -0
  128. package/dist/src/rules-compiler.js +143 -0
  129. package/dist/src/rules-compiler.js.map +1 -0
  130. package/dist/src/server.d.ts +12 -0
  131. package/dist/src/server.d.ts.map +1 -0
  132. package/dist/src/server.js +22 -0
  133. package/dist/src/server.js.map +1 -0
  134. package/dist/src/tool-trace.d.ts +37 -0
  135. package/dist/src/tool-trace.d.ts.map +1 -0
  136. package/dist/src/tool-trace.js +142 -0
  137. package/dist/src/tool-trace.js.map +1 -0
  138. package/dist/src/types.d.ts +446 -0
  139. package/dist/src/types.d.ts.map +1 -0
  140. package/dist/src/types.js +6 -0
  141. package/dist/src/types.js.map +1 -0
  142. package/dist/src/ulid.d.ts +3 -0
  143. package/dist/src/ulid.d.ts.map +1 -0
  144. package/dist/src/ulid.js +11 -0
  145. package/dist/src/ulid.js.map +1 -0
  146. package/dist/src/utils.d.ts +10 -0
  147. package/dist/src/utils.d.ts.map +1 -0
  148. package/dist/src/utils.js +41 -0
  149. package/dist/src/utils.js.map +1 -0
  150. package/dist/src/validate.d.ts +22 -0
  151. package/dist/src/validate.d.ts.map +1 -0
  152. package/dist/src/validate.js +109 -0
  153. package/dist/src/validate.js.map +1 -0
  154. package/docs/production-readiness.md +28 -0
  155. package/examples/fintech-ops-demo.js +1 -1
  156. package/examples/healthcare-ops-demo.js +1 -1
  157. package/examples/stripe-demo.js +1 -1
  158. package/package.json +34 -13
  159. package/benchmarks/baselines.js +0 -169
  160. package/benchmarks/cases.js +0 -421
  161. package/benchmarks/reference-results.js +0 -70
  162. package/benchmarks/report.js +0 -255
  163. package/benchmarks/run.js +0 -514
  164. package/mcp-server/config.js +0 -133
  165. package/mcp-server/index.js +0 -1265
  166. package/mcp-server/serve.js +0 -482
  167. package/src/adaptive.js +0 -53
  168. package/src/affect.js +0 -64
  169. package/src/audrey.js +0 -642
  170. package/src/causal.js +0 -95
  171. package/src/confidence.js +0 -120
  172. package/src/consolidate.js +0 -281
  173. package/src/context.js +0 -15
  174. package/src/db.js +0 -391
  175. package/src/decay.js +0 -84
  176. package/src/embedding.js +0 -260
  177. package/src/encode.js +0 -69
  178. package/src/export.js +0 -67
  179. package/src/forget.js +0 -111
  180. package/src/fts.js +0 -134
  181. package/src/import.js +0 -273
  182. package/src/interference.js +0 -51
  183. package/src/introspect.js +0 -48
  184. package/src/llm.js +0 -249
  185. package/src/migrate.js +0 -58
  186. package/src/recall.js +0 -573
  187. package/src/rollback.js +0 -42
  188. package/src/ulid.js +0 -18
  189. package/src/utils.js +0 -63
  190. package/src/validate.js +0 -172
  191. package/types/index.d.ts +0 -434
@@ -0,0 +1,149 @@
1
+ /**
2
+ * memory_events CRUD. Thin wrapper — business logic (hashing, redaction,
3
+ * summarization) lives in tool-trace.ts.
4
+ */
5
+ import { generateId } from './ulid.js';
6
+ function toJson(value) {
7
+ if (value == null)
8
+ return null;
9
+ return JSON.stringify(value);
10
+ }
11
+ export function insertEvent(db, input) {
12
+ const id = input.id ?? generateId();
13
+ const createdAt = input.createdAt ?? new Date().toISOString();
14
+ const redactionState = input.redactionState ?? 'unreviewed';
15
+ const fileFingerprints = input.fileFingerprints && input.fileFingerprints.length > 0
16
+ ? JSON.stringify(input.fileFingerprints)
17
+ : null;
18
+ const metadata = toJson(input.metadata ?? null);
19
+ db.prepare(`
20
+ INSERT INTO memory_events (
21
+ id, session_id, event_type, source, actor_agent, tool_name,
22
+ input_hash, output_hash, outcome, error_summary, cwd,
23
+ file_fingerprints, redaction_state, metadata, created_at
24
+ ) VALUES (
25
+ @id, @sessionId, @eventType, @source, @actorAgent, @toolName,
26
+ @inputHash, @outputHash, @outcome, @errorSummary, @cwd,
27
+ @fileFingerprints, @redactionState, @metadata, @createdAt
28
+ )
29
+ `).run({
30
+ id,
31
+ sessionId: input.sessionId ?? null,
32
+ eventType: input.eventType,
33
+ source: input.source,
34
+ actorAgent: input.actorAgent ?? null,
35
+ toolName: input.toolName ?? null,
36
+ inputHash: input.inputHash ?? null,
37
+ outputHash: input.outputHash ?? null,
38
+ outcome: input.outcome ?? null,
39
+ errorSummary: input.errorSummary ?? null,
40
+ cwd: input.cwd ?? null,
41
+ fileFingerprints,
42
+ redactionState,
43
+ metadata,
44
+ createdAt,
45
+ });
46
+ return {
47
+ id,
48
+ session_id: input.sessionId ?? null,
49
+ event_type: input.eventType,
50
+ source: input.source,
51
+ actor_agent: input.actorAgent ?? null,
52
+ tool_name: input.toolName ?? null,
53
+ input_hash: input.inputHash ?? null,
54
+ output_hash: input.outputHash ?? null,
55
+ outcome: input.outcome ?? null,
56
+ error_summary: input.errorSummary ?? null,
57
+ cwd: input.cwd ?? null,
58
+ file_fingerprints: fileFingerprints,
59
+ redaction_state: redactionState,
60
+ metadata,
61
+ created_at: createdAt,
62
+ };
63
+ }
64
+ export function listEvents(db, query = {}) {
65
+ const conditions = [];
66
+ const params = {};
67
+ if (query.sessionId) {
68
+ conditions.push('session_id = @sessionId');
69
+ params.sessionId = query.sessionId;
70
+ }
71
+ if (query.toolName) {
72
+ conditions.push('tool_name = @toolName');
73
+ params.toolName = query.toolName;
74
+ }
75
+ if (query.eventType) {
76
+ conditions.push('event_type = @eventType');
77
+ params.eventType = query.eventType;
78
+ }
79
+ if (query.outcome) {
80
+ conditions.push('outcome = @outcome');
81
+ params.outcome = query.outcome;
82
+ }
83
+ if (query.since) {
84
+ conditions.push('created_at >= @since');
85
+ params.since = query.since;
86
+ }
87
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
88
+ const limit = Math.max(1, Math.min(query.limit ?? 100, 1000));
89
+ return db.prepare(`SELECT * FROM memory_events ${where} ORDER BY created_at DESC LIMIT ${limit}`).all(params);
90
+ }
91
+ export function countEvents(db, query = {}) {
92
+ const conditions = [];
93
+ const params = {};
94
+ if (query.sessionId) {
95
+ conditions.push('session_id = @sessionId');
96
+ params.sessionId = query.sessionId;
97
+ }
98
+ if (query.toolName) {
99
+ conditions.push('tool_name = @toolName');
100
+ params.toolName = query.toolName;
101
+ }
102
+ if (query.eventType) {
103
+ conditions.push('event_type = @eventType');
104
+ params.eventType = query.eventType;
105
+ }
106
+ if (query.outcome) {
107
+ conditions.push('outcome = @outcome');
108
+ params.outcome = query.outcome;
109
+ }
110
+ if (query.since) {
111
+ conditions.push('created_at >= @since');
112
+ params.since = query.since;
113
+ }
114
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
115
+ const row = db.prepare(`SELECT COUNT(*) AS c FROM memory_events ${where}`).get(params);
116
+ return row.c;
117
+ }
118
+ /**
119
+ * Tools that have failed recently, most recent first. Feeds PreToolUse
120
+ * preflight warnings: "this command failed last time — here's what fixed it."
121
+ */
122
+ export function recentFailures(db, options = {}) {
123
+ const since = options.since ?? new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
124
+ const limit = Math.max(1, Math.min(options.limit ?? 20, 200));
125
+ return db.prepare(`
126
+ SELECT tool_name,
127
+ COUNT(*) AS failure_count,
128
+ MAX(created_at) AS last_failed_at,
129
+ (
130
+ SELECT error_summary FROM memory_events e2
131
+ WHERE e2.tool_name = e1.tool_name
132
+ AND e2.outcome = 'failed'
133
+ AND e2.created_at >= @since
134
+ ORDER BY e2.created_at DESC LIMIT 1
135
+ ) AS last_error_summary
136
+ FROM memory_events e1
137
+ WHERE outcome = 'failed'
138
+ AND tool_name IS NOT NULL
139
+ AND created_at >= @since
140
+ GROUP BY tool_name
141
+ ORDER BY last_failed_at DESC
142
+ LIMIT ${limit}
143
+ `).all({ since });
144
+ }
145
+ export function deleteEventsBefore(db, cutoffIso) {
146
+ const result = db.prepare('DELETE FROM memory_events WHERE created_at < ?').run(cutoffIso);
147
+ return Number(result.changes);
148
+ }
149
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import Database from 'better-sqlite3';
2
+ export declare function exportMemories(db: Database.Database): object;
3
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AA2GtC,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CA0D5D"}
@@ -0,0 +1,46 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { join, dirname } from 'node:path';
4
+ import { safeJsonParse } from './utils.js';
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ const pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
7
+ export function exportMemories(db) {
8
+ const episodes = db.prepare('SELECT id, content, source, source_reliability, salience, context, affect, tags, causal_trigger, causal_consequence, created_at, embedding_model, embedding_version, supersedes, superseded_by, consolidated, "private" FROM episodes').all().map(ep => ({
9
+ ...ep,
10
+ tags: safeJsonParse(ep.tags, null),
11
+ context: safeJsonParse(ep.context, null),
12
+ affect: safeJsonParse(ep.affect, null),
13
+ }));
14
+ const semantics = db.prepare('SELECT id, content, state, conditions, evidence_episode_ids, evidence_count, supporting_count, contradicting_count, source_type_diversity, consolidation_checkpoint, embedding_model, embedding_version, consolidation_model, consolidation_prompt_hash, created_at, last_reinforced_at, retrieval_count, challenge_count, interference_count, salience FROM semantics').all().map(sem => ({
15
+ ...sem,
16
+ evidence_episode_ids: safeJsonParse(sem.evidence_episode_ids, []),
17
+ }));
18
+ const procedures = db.prepare('SELECT id, content, state, trigger_conditions, evidence_episode_ids, success_count, failure_count, embedding_model, embedding_version, created_at, last_reinforced_at, retrieval_count, interference_count, salience FROM procedures').all().map(proc => ({
19
+ ...proc,
20
+ evidence_episode_ids: safeJsonParse(proc.evidence_episode_ids, []),
21
+ }));
22
+ const causalLinks = db.prepare('SELECT * FROM causal_links').all();
23
+ const contradictions = db.prepare('SELECT id, claim_a_id, claim_a_type, claim_b_id, claim_b_type, state, resolution, resolved_at, reopened_at, reopen_evidence_id, created_at FROM contradictions').all();
24
+ const consolidationRuns = db.prepare('SELECT id, checkpoint_cursor, input_episode_ids, output_memory_ids, confidence_deltas, consolidation_model, consolidation_prompt_hash, started_at, completed_at, status FROM consolidation_runs').all().map(run => ({
25
+ ...run,
26
+ confidence_deltas: safeJsonParse(run.confidence_deltas, null),
27
+ input_episode_ids: safeJsonParse(run.input_episode_ids, []),
28
+ output_memory_ids: safeJsonParse(run.output_memory_ids, []),
29
+ }));
30
+ const consolidationMetrics = db.prepare('SELECT id, run_id, min_cluster_size, similarity_threshold, episodes_evaluated, clusters_found, principles_extracted, created_at FROM consolidation_metrics').all();
31
+ const configRows = db.prepare('SELECT key, value FROM audrey_config').all();
32
+ const config = Object.fromEntries(configRows.map(r => [r.key, r.value]));
33
+ return {
34
+ version: pkg.version,
35
+ exportedAt: new Date().toISOString(),
36
+ episodes,
37
+ semantics,
38
+ procedures,
39
+ causalLinks,
40
+ contradictions,
41
+ consolidationRuns,
42
+ consolidationMetrics,
43
+ config,
44
+ };
45
+ }
46
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import Database from 'better-sqlite3';
2
+ import type { EmbeddingProvider, ForgetResult, PurgeResult } from './types.js';
3
+ export declare function forgetMemory(db: Database.Database, id: string, { purge }?: {
4
+ purge?: boolean;
5
+ }): ForgetResult;
6
+ export declare function purgeMemories(db: Database.Database): PurgeResult;
7
+ export declare function forgetByQuery(db: Database.Database, embeddingProvider: EmbeddingProvider, query: string, { minSimilarity, purge }?: {
8
+ minSimilarity?: number;
9
+ purge?: boolean;
10
+ }): Promise<ForgetResult | null>;
11
+ //# sourceMappingURL=forget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forget.d.ts","sourceRoot":"","sources":["../../src/forget.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAc,WAAW,EAAE,MAAM,YAAY,CAAC;AAa3F,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,EACV,EAAE,KAAa,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,YAAY,CAyCd;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAoChE;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,iBAAiB,EAAE,iBAAiB,EACpC,KAAK,EAAE,MAAM,EACb,EAAE,aAAmB,EAAE,KAAa,EAAE,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GACvF,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAmC9B"}
@@ -0,0 +1,105 @@
1
+ import { deleteFTSEpisode, deleteFTSSemantic, deleteFTSProcedure } from './fts.js';
2
+ export function forgetMemory(db, id, { purge = false } = {}) {
3
+ const episode = db.prepare('SELECT id FROM episodes WHERE id = ?').get(id);
4
+ if (episode) {
5
+ if (purge) {
6
+ db.prepare('DELETE FROM vec_episodes WHERE id = ?').run(id);
7
+ db.prepare('DELETE FROM episodes WHERE id = ?').run(id);
8
+ }
9
+ else {
10
+ db.prepare("UPDATE episodes SET superseded_by = 'forgotten' WHERE id = ?").run(id);
11
+ db.prepare('DELETE FROM vec_episodes WHERE id = ?').run(id);
12
+ }
13
+ deleteFTSEpisode(db, id);
14
+ return { id, type: 'episodic', purged: purge };
15
+ }
16
+ const semantic = db.prepare('SELECT id FROM semantics WHERE id = ?').get(id);
17
+ if (semantic) {
18
+ if (purge) {
19
+ db.prepare('DELETE FROM vec_semantics WHERE id = ?').run(id);
20
+ db.prepare('DELETE FROM semantics WHERE id = ?').run(id);
21
+ }
22
+ else {
23
+ db.prepare("UPDATE semantics SET state = 'superseded' WHERE id = ?").run(id);
24
+ db.prepare('DELETE FROM vec_semantics WHERE id = ?').run(id);
25
+ }
26
+ deleteFTSSemantic(db, id);
27
+ return { id, type: 'semantic', purged: purge };
28
+ }
29
+ const procedure = db.prepare('SELECT id FROM procedures WHERE id = ?').get(id);
30
+ if (procedure) {
31
+ if (purge) {
32
+ db.prepare('DELETE FROM vec_procedures WHERE id = ?').run(id);
33
+ db.prepare('DELETE FROM procedures WHERE id = ?').run(id);
34
+ }
35
+ else {
36
+ db.prepare("UPDATE procedures SET state = 'superseded' WHERE id = ?").run(id);
37
+ db.prepare('DELETE FROM vec_procedures WHERE id = ?').run(id);
38
+ }
39
+ deleteFTSProcedure(db, id);
40
+ return { id, type: 'procedural', purged: purge };
41
+ }
42
+ throw new Error(`Memory not found: ${id}`);
43
+ }
44
+ export function purgeMemories(db) {
45
+ const deadEpisodes = db.prepare('SELECT id FROM episodes WHERE superseded_by IS NOT NULL').all();
46
+ const deadSemantics = db.prepare("SELECT id FROM semantics WHERE state IN ('superseded', 'dormant', 'rolled_back')").all();
47
+ const deadProcedures = db.prepare("SELECT id FROM procedures WHERE state IN ('superseded', 'dormant', 'rolled_back')").all();
48
+ const purgeAll = db.transaction(() => {
49
+ for (const row of deadEpisodes) {
50
+ db.prepare('DELETE FROM vec_episodes WHERE id = ?').run(row.id);
51
+ db.prepare('DELETE FROM episodes WHERE id = ?').run(row.id);
52
+ deleteFTSEpisode(db, row.id);
53
+ }
54
+ for (const row of deadSemantics) {
55
+ db.prepare('DELETE FROM vec_semantics WHERE id = ?').run(row.id);
56
+ db.prepare('DELETE FROM semantics WHERE id = ?').run(row.id);
57
+ deleteFTSSemantic(db, row.id);
58
+ }
59
+ for (const row of deadProcedures) {
60
+ db.prepare('DELETE FROM vec_procedures WHERE id = ?').run(row.id);
61
+ db.prepare('DELETE FROM procedures WHERE id = ?').run(row.id);
62
+ deleteFTSProcedure(db, row.id);
63
+ }
64
+ });
65
+ purgeAll();
66
+ return {
67
+ episodes: deadEpisodes.length,
68
+ semantics: deadSemantics.length,
69
+ procedures: deadProcedures.length,
70
+ };
71
+ }
72
+ export async function forgetByQuery(db, embeddingProvider, query, { minSimilarity = 0.9, purge = false } = {}) {
73
+ const queryVector = await embeddingProvider.embed(query);
74
+ const queryBuffer = embeddingProvider.vectorToBuffer(queryVector);
75
+ const candidates = [];
76
+ const epMatch = db.prepare(`
77
+ SELECT e.id, (1.0 - v.distance) AS similarity, 'episodic' AS type
78
+ FROM vec_episodes v JOIN episodes e ON e.id = v.id
79
+ WHERE v.embedding MATCH ? AND k = 1 AND e.superseded_by IS NULL
80
+ `).get(queryBuffer);
81
+ if (epMatch)
82
+ candidates.push(epMatch);
83
+ const semMatch = db.prepare(`
84
+ SELECT s.id, (1.0 - v.distance) AS similarity, 'semantic' AS type
85
+ FROM vec_semantics v JOIN semantics s ON s.id = v.id
86
+ WHERE v.embedding MATCH ? AND k = 1 AND (v.state = 'active' OR v.state = 'context_dependent')
87
+ `).get(queryBuffer);
88
+ if (semMatch)
89
+ candidates.push(semMatch);
90
+ const procMatch = db.prepare(`
91
+ SELECT p.id, (1.0 - v.distance) AS similarity, 'procedural' AS type
92
+ FROM vec_procedures v JOIN procedures p ON p.id = v.id
93
+ WHERE v.embedding MATCH ? AND k = 1 AND (v.state = 'active' OR v.state = 'context_dependent')
94
+ `).get(queryBuffer);
95
+ if (procMatch)
96
+ candidates.push(procMatch);
97
+ if (candidates.length === 0)
98
+ return null;
99
+ candidates.sort((a, b) => b.similarity - a.similarity);
100
+ const best = candidates[0];
101
+ if (best.similarity < minSimilarity)
102
+ return null;
103
+ return forgetMemory(db, best.id, { purge });
104
+ }
105
+ //# sourceMappingURL=forget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forget.js","sourceRoot":"","sources":["../../src/forget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * FTS5 full-text search for Audrey memories.
3
+ * Creates virtual tables alongside vec0 tables for hybrid retrieval.
4
+ */
5
+ import Database from 'better-sqlite3';
6
+ export interface FTSMatch {
7
+ id: string;
8
+ content: string;
9
+ agent: string;
10
+ rank: number;
11
+ }
12
+ export declare function createFTSTables(db: Database.Database): void;
13
+ export declare function hasFTSTables(db: Database.Database): boolean;
14
+ export declare function insertFTSEpisode(db: Database.Database, id: string, content: string, tags?: string | string[] | null): void;
15
+ export declare function insertFTSSemantic(db: Database.Database, id: string, content: string): void;
16
+ export declare function insertFTSProcedure(db: Database.Database, id: string, content: string): void;
17
+ export declare function deleteFTSEpisode(db: Database.Database, id: string): void;
18
+ export declare function deleteFTSSemantic(db: Database.Database, id: string): void;
19
+ export declare function deleteFTSProcedure(db: Database.Database, id: string): void;
20
+ /**
21
+ * Search episodes via FTS5 BM25.
22
+ */
23
+ export declare function searchFTSEpisodes(db: Database.Database, query: string, limit?: number, agentFilter?: string | null): FTSMatch[];
24
+ export declare function searchFTSSemantics(db: Database.Database, query: string, limit?: number, agentFilter?: string | null): FTSMatch[];
25
+ export declare function searchFTSProcedures(db: Database.Database, query: string, limit?: number, agentFilter?: string | null): FTSMatch[];
26
+ /**
27
+ * Backfill FTS tables from existing data.
28
+ */
29
+ export declare function backfillFTS(db: Database.Database): void;
30
+ /**
31
+ * Sanitize FTS5 query — escape special characters.
32
+ */
33
+ export declare function sanitizeFTSQuery(query: string): string;
34
+ //# sourceMappingURL=fts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../src/fts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAS3D;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAK3D;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAC9B,IAAI,CAKN;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1F;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3F;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAExE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAE1E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,EAClB,WAAW,GAAE,MAAM,GAAG,IAAW,GAChC,QAAQ,EAAE,CAaZ;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,EAClB,WAAW,GAAE,MAAM,GAAG,IAAW,GAChC,QAAQ,EAAE,CAaZ;AAED,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,EAClB,WAAW,GAAE,MAAM,GAAG,IAAW,GAChC,QAAQ,EAAE,CAaZ;AAaD;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAoBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQtD"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * FTS5 full-text search for Audrey memories.
3
+ * Creates virtual tables alongside vec0 tables for hybrid retrieval.
4
+ */
5
+ export function createFTSTables(db) {
6
+ db.exec(`
7
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts_episodes
8
+ USING fts5(id UNINDEXED, content, tags, tokenize='porter unicode61');
9
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts_semantics
10
+ USING fts5(id UNINDEXED, content, tokenize='porter unicode61');
11
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts_procedures
12
+ USING fts5(id UNINDEXED, content, tokenize='porter unicode61');
13
+ `);
14
+ }
15
+ export function hasFTSTables(db) {
16
+ const row = db.prepare("SELECT COUNT(*) AS c FROM sqlite_master WHERE type='table' AND name='fts_episodes'").get();
17
+ return row.c > 0;
18
+ }
19
+ export function insertFTSEpisode(db, id, content, tags) {
20
+ const tagsText = tags ? (Array.isArray(tags) ? tags.join(' ') : tags) : '';
21
+ db.prepare('INSERT OR REPLACE INTO fts_episodes(id, content, tags) VALUES (?, ?, ?)').run(id, content, tagsText);
22
+ }
23
+ export function insertFTSSemantic(db, id, content) {
24
+ db.prepare('INSERT OR REPLACE INTO fts_semantics(id, content) VALUES (?, ?)').run(id, content);
25
+ }
26
+ export function insertFTSProcedure(db, id, content) {
27
+ db.prepare('INSERT OR REPLACE INTO fts_procedures(id, content) VALUES (?, ?)').run(id, content);
28
+ }
29
+ export function deleteFTSEpisode(db, id) {
30
+ db.prepare('DELETE FROM fts_episodes WHERE id = ?').run(id);
31
+ }
32
+ export function deleteFTSSemantic(db, id) {
33
+ db.prepare('DELETE FROM fts_semantics WHERE id = ?').run(id);
34
+ }
35
+ export function deleteFTSProcedure(db, id) {
36
+ db.prepare('DELETE FROM fts_procedures WHERE id = ?').run(id);
37
+ }
38
+ /**
39
+ * Search episodes via FTS5 BM25.
40
+ */
41
+ export function searchFTSEpisodes(db, query, limit = 30, agentFilter = null) {
42
+ const agentClause = agentFilter ? 'AND e.agent = ?' : '';
43
+ const params = agentFilter ? [query, agentFilter, limit] : [query, limit];
44
+ return db.prepare(`
45
+ SELECT f.id, f.content, e.agent, bm25(fts_episodes) AS rank
46
+ FROM fts_episodes f
47
+ JOIN episodes e ON e.id = f.id
48
+ WHERE fts_episodes MATCH ?
49
+ AND e.superseded_by IS NULL
50
+ ${agentClause}
51
+ ORDER BY rank
52
+ LIMIT ?
53
+ `).all(...params);
54
+ }
55
+ export function searchFTSSemantics(db, query, limit = 30, agentFilter = null) {
56
+ const agentClause = agentFilter ? 'AND s.agent = ?' : '';
57
+ const params = agentFilter ? [query, agentFilter, limit] : [query, limit];
58
+ return db.prepare(`
59
+ SELECT f.id, f.content, s.agent, bm25(fts_semantics) AS rank
60
+ FROM fts_semantics f
61
+ JOIN semantics s ON s.id = f.id
62
+ WHERE fts_semantics MATCH ?
63
+ AND s.state = 'active'
64
+ ${agentClause}
65
+ ORDER BY rank
66
+ LIMIT ?
67
+ `).all(...params);
68
+ }
69
+ export function searchFTSProcedures(db, query, limit = 30, agentFilter = null) {
70
+ const agentClause = agentFilter ? 'AND p.agent = ?' : '';
71
+ const params = agentFilter ? [query, agentFilter, limit] : [query, limit];
72
+ return db.prepare(`
73
+ SELECT f.id, f.content, p.agent, bm25(fts_procedures) AS rank
74
+ FROM fts_procedures f
75
+ JOIN procedures p ON p.id = f.id
76
+ WHERE fts_procedures MATCH ?
77
+ AND p.state = 'active'
78
+ ${agentClause}
79
+ ORDER BY rank
80
+ LIMIT ?
81
+ `).all(...params);
82
+ }
83
+ /**
84
+ * Backfill FTS tables from existing data.
85
+ */
86
+ export function backfillFTS(db) {
87
+ const episodes = db.prepare('SELECT id, content, tags FROM episodes').all();
88
+ const insert = db.prepare('INSERT OR IGNORE INTO fts_episodes(id, content, tags) VALUES (?, ?, ?)');
89
+ for (const ep of episodes) {
90
+ const parsed = ep.tags ? (typeof ep.tags === 'string' ? JSON.parse(ep.tags) : ep.tags) : [];
91
+ const tagsText = Array.isArray(parsed) ? parsed.join(' ') : '';
92
+ insert.run(ep.id, ep.content, tagsText);
93
+ }
94
+ const semantics = db.prepare('SELECT id, content FROM semantics').all();
95
+ const insertSem = db.prepare('INSERT OR IGNORE INTO fts_semantics(id, content) VALUES (?, ?)');
96
+ for (const sem of semantics) {
97
+ insertSem.run(sem.id, sem.content);
98
+ }
99
+ const procedures = db.prepare('SELECT id, content FROM procedures').all();
100
+ const insertProc = db.prepare('INSERT OR IGNORE INTO fts_procedures(id, content) VALUES (?, ?)');
101
+ for (const proc of procedures) {
102
+ insertProc.run(proc.id, proc.content);
103
+ }
104
+ }
105
+ /**
106
+ * Sanitize FTS5 query — escape special characters.
107
+ */
108
+ export function sanitizeFTSQuery(query) {
109
+ return query
110
+ .replace(/[*"(){}[\]^~\:]/g, ' ')
111
+ .replace(/\bAND\b|\bOR\b|\bNOT\b|\bNEAR\b/gi, ' ')
112
+ .trim()
113
+ .split(/\s+/)
114
+ .filter(Boolean)
115
+ .join(' ');
116
+ }
117
+ //# sourceMappingURL=fts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts.js","sourceRoot":"","sources":["../../src/fts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Hybrid retrieval: vector KNN + FTS5 BM25, fused via Reciprocal Rank Fusion.
3
+ *
4
+ * RRF is the simplest fusion that tends to hold up in practice:
5
+ * score(d) = sum_i 1 / (k + rank_i(d))
6
+ * where each `i` is a retriever (vector, FTS) and `k` is a smoothing constant
7
+ * (60 is the classic default). Documents that show up in only one retriever
8
+ * still contribute; documents in both get additive boosts without either
9
+ * retriever dominating.
10
+ *
11
+ * This module does NOT re-implement confidence scoring — vector candidates
12
+ * arrive already scored; FTS-only candidates get an enrichment pass that
13
+ * loads the underlying row and computes a reduced "base confidence" from
14
+ * source reliability / support ratio. That's intentionally simpler than the
15
+ * full KNN confidence pipeline for v1; the demo gets what it needs and the
16
+ * capsule's categorization layer does the heavy interpretive lifting.
17
+ */
18
+ import Database from 'better-sqlite3';
19
+ import type { MemoryType, RecallResult, RetrievalMode } from './types.js';
20
+ export declare function ftsIdsByType(db: Database.Database, query: string, types: MemoryType[], limit: number): Map<MemoryType, string[]>;
21
+ export interface FuseFilters {
22
+ tags?: string[];
23
+ sources?: string[];
24
+ after?: string;
25
+ before?: string;
26
+ }
27
+ export interface FuseInput {
28
+ vectorResults: RecallResult[];
29
+ ftsIds: Map<MemoryType, string[]>;
30
+ mode: RetrievalMode;
31
+ includePrivate?: boolean;
32
+ includeDormant?: boolean;
33
+ minConfidence?: number;
34
+ filters?: FuseFilters;
35
+ }
36
+ export declare function fuseResults(db: Database.Database, input: FuseInput): RecallResult[];
37
+ //# sourceMappingURL=hybrid-recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-recall.d.ts","sourceRoot":"","sources":["../../src/hybrid-recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA4C1E,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,EAAE,EACnB,KAAK,EAAE,MAAM,GACZ,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAqB3B;AAwED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyBD,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,IAAI,EAAE,aAAa,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,YAAY,EAAE,CA+DnF"}