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,432 @@
1
+ import { computeConfidence, DEFAULT_HALF_LIVES, salienceModifier, sourceReliability } from './confidence.js';
2
+ import { interferenceModifier } from './interference.js';
3
+ import { contextMatchRatio, contextModifier } from './context.js';
4
+ import { moodCongruenceModifier, affectSimilarity } from './affect.js';
5
+ import { daysBetween, safeJsonParse } from './utils.js';
6
+ import { ftsIdsByType, fuseResults } from './hybrid-recall.js';
7
+ const STOPWORDS = new Set([
8
+ 'a', 'an', 'and', 'are', 'at', 'be', 'by', 'did', 'do', 'does', 'for', 'from', 'had', 'has', 'have',
9
+ 'how', 'i', 'in', 'is', 'it', 'me', 'my', 'now', 'of', 'on', 'or', 'our', 's', 'sam', 'she', 'that',
10
+ 'the', 'their', 'them', 'there', 'they', 'this', 'to', 'was', 'we', 'were', 'what', 'when', 'where',
11
+ 'which', 'who', 'why', 'with', 'would', 'you', 'your',
12
+ ]);
13
+ const IDENTIFIER_TERMS = new Set(['account', 'api', 'credential', 'id', 'identifier', 'key', 'number', 'password', 'secret', 'ssn', 'token']);
14
+ function tokenize(text) {
15
+ return String(text || '')
16
+ .toLowerCase()
17
+ .replace(/[^a-z0-9]+/g, ' ')
18
+ .trim()
19
+ .split(/\s+/)
20
+ .filter(Boolean);
21
+ }
22
+ function significantTokens(text) {
23
+ return tokenize(text).filter(token => !STOPWORDS.has(token));
24
+ }
25
+ function lexicalCoverage(query, content) {
26
+ const queryTokens = significantTokens(query);
27
+ if (queryTokens.length === 0)
28
+ return 1;
29
+ const contentTokens = new Set(significantTokens(content));
30
+ let matched = 0;
31
+ for (const token of queryTokens) {
32
+ if (contentTokens.has(token))
33
+ matched++;
34
+ }
35
+ return matched / queryTokens.length;
36
+ }
37
+ function hasIdentifierIntent(query) {
38
+ const normalized = String(query || '').toLowerCase();
39
+ const asksForValue = /\b(find|give|lookup|show|tell|what|which)\b/.test(normalized);
40
+ const mentionsIdentifier = /\b(account number|api key|credential|id|identifier|key|number|passport number|password|secret|ssn|token)\b/.test(normalized);
41
+ return asksForValue && mentionsIdentifier;
42
+ }
43
+ function hasIdentifierEvidence(content) {
44
+ const tokens = significantTokens(content);
45
+ if (tokens.some(token => IDENTIFIER_TERMS.has(token))) {
46
+ return true;
47
+ }
48
+ return /(?:\b\d{4,}\b|sk-[a-z0-9_-]+)/i.test(content);
49
+ }
50
+ function adjustedScore(query, entry) {
51
+ const coverage = lexicalCoverage(query, entry.content);
52
+ let score = entry.score;
53
+ if (hasIdentifierIntent(query) && !hasIdentifierEvidence(entry.content)) {
54
+ score *= 0.02;
55
+ }
56
+ return { score, coverage };
57
+ }
58
+ function overlapRatio(contentA, contentB) {
59
+ const tokensA = significantTokens(contentA);
60
+ const tokensB = significantTokens(contentB);
61
+ if (tokensA.length === 0 || tokensB.length === 0)
62
+ return 0;
63
+ const setB = new Set(tokensB);
64
+ let matched = 0;
65
+ for (const token of tokensA) {
66
+ if (setB.has(token))
67
+ matched++;
68
+ }
69
+ return matched / Math.min(tokensA.length, tokensB.length);
70
+ }
71
+ function reliabilityForRecallSource(source) {
72
+ if (source === 'consolidation') {
73
+ return sourceReliability('tool-result');
74
+ }
75
+ return sourceReliability(source);
76
+ }
77
+ function shouldSuppressDuplicate(existing, candidate) {
78
+ const overlap = overlapRatio(existing.content, candidate.content);
79
+ if (overlap < 0.5)
80
+ return false;
81
+ if (existing.type !== candidate.type)
82
+ return false;
83
+ const existingReliability = reliabilityForRecallSource(existing.source);
84
+ const candidateReliability = reliabilityForRecallSource(candidate.source);
85
+ if (existingReliability < candidateReliability)
86
+ return false;
87
+ if (existingReliability - candidateReliability < 0.2)
88
+ return false;
89
+ return existing.score >= candidate.score * 0.95;
90
+ }
91
+ function applyResultGuards(query, results, limit) {
92
+ const identifierIntent = hasIdentifierIntent(query);
93
+ const rescored = results
94
+ .map(entry => {
95
+ const { score, coverage } = adjustedScore(query, entry);
96
+ return { ...entry, score, lexicalCoverage: coverage };
97
+ })
98
+ .filter(entry => !identifierIntent || entry.score > 0.05)
99
+ .sort((a, b) => b.score - a.score);
100
+ const accepted = [];
101
+ for (const candidate of rescored) {
102
+ if (accepted.some(existing => shouldSuppressDuplicate(existing, candidate))) {
103
+ continue;
104
+ }
105
+ accepted.push(candidate);
106
+ if (accepted.length >= limit)
107
+ break;
108
+ }
109
+ return accepted;
110
+ }
111
+ function computeEpisodicConfidence(ep, now, confidenceConfig = {}) {
112
+ const ageDays = daysBetween(ep.created_at, now);
113
+ const halfLives = confidenceConfig.halfLives || DEFAULT_HALF_LIVES;
114
+ let confidence = computeConfidence({
115
+ sourceType: ep.source,
116
+ supportingCount: 1,
117
+ contradictingCount: 0,
118
+ ageDays,
119
+ halfLifeDays: halfLives.episodic ?? DEFAULT_HALF_LIVES.episodic,
120
+ retrievalCount: 0,
121
+ daysSinceRetrieval: ageDays,
122
+ weights: confidenceConfig.weights,
123
+ customSourceReliability: confidenceConfig.sourceReliability,
124
+ });
125
+ confidence *= salienceModifier(ep.salience);
126
+ return Math.max(0, Math.min(1, confidence));
127
+ }
128
+ function computeSemanticConfidence(sem, now, confidenceConfig = {}) {
129
+ const ageDays = daysBetween(sem.created_at, now);
130
+ const daysSinceRetrieval = sem.last_reinforced_at
131
+ ? daysBetween(sem.last_reinforced_at, now)
132
+ : ageDays;
133
+ const halfLives = confidenceConfig.halfLives || DEFAULT_HALF_LIVES;
134
+ let confidence = computeConfidence({
135
+ sourceType: 'tool-result',
136
+ supportingCount: sem.supporting_count || 0,
137
+ contradictingCount: sem.contradicting_count || 0,
138
+ ageDays,
139
+ halfLifeDays: halfLives.semantic ?? DEFAULT_HALF_LIVES.semantic,
140
+ retrievalCount: sem.retrieval_count || 0,
141
+ daysSinceRetrieval,
142
+ weights: confidenceConfig.weights,
143
+ customSourceReliability: confidenceConfig.sourceReliability,
144
+ });
145
+ confidence *= interferenceModifier(sem.interference_count || 0, confidenceConfig.interferenceWeight);
146
+ confidence *= salienceModifier(sem.salience);
147
+ return Math.max(0, Math.min(1, confidence));
148
+ }
149
+ function computeProceduralConfidence(proc, now, confidenceConfig = {}) {
150
+ const ageDays = daysBetween(proc.created_at, now);
151
+ const daysSinceRetrieval = proc.last_reinforced_at
152
+ ? daysBetween(proc.last_reinforced_at, now)
153
+ : ageDays;
154
+ const halfLives = confidenceConfig.halfLives || DEFAULT_HALF_LIVES;
155
+ let confidence = computeConfidence({
156
+ sourceType: 'tool-result',
157
+ supportingCount: proc.success_count || 0,
158
+ contradictingCount: proc.failure_count || 0,
159
+ ageDays,
160
+ halfLifeDays: halfLives.procedural ?? DEFAULT_HALF_LIVES.procedural,
161
+ retrievalCount: proc.retrieval_count || 0,
162
+ daysSinceRetrieval,
163
+ weights: confidenceConfig.weights,
164
+ customSourceReliability: confidenceConfig.sourceReliability,
165
+ });
166
+ confidence *= interferenceModifier(proc.interference_count || 0, confidenceConfig.interferenceWeight);
167
+ confidence *= salienceModifier(proc.salience);
168
+ return Math.max(0, Math.min(1, confidence));
169
+ }
170
+ function buildEpisodicEntry(ep, confidence, score, includeProvenance, contextMatch, moodCongruence) {
171
+ const entry = {
172
+ id: ep.id,
173
+ content: ep.content,
174
+ type: 'episodic',
175
+ confidence,
176
+ score,
177
+ source: ep.source,
178
+ createdAt: ep.created_at,
179
+ };
180
+ if (contextMatch !== undefined) {
181
+ entry.contextMatch = contextMatch;
182
+ }
183
+ if (moodCongruence !== undefined) {
184
+ entry.moodCongruence = moodCongruence;
185
+ }
186
+ if (includeProvenance) {
187
+ entry.provenance = {
188
+ source: ep.source,
189
+ sourceReliability: ep.source_reliability,
190
+ createdAt: ep.created_at,
191
+ supersedes: ep.supersedes || null,
192
+ };
193
+ }
194
+ return entry;
195
+ }
196
+ function buildSemanticEntry(sem, confidence, score, includeProvenance) {
197
+ const entry = {
198
+ id: sem.id,
199
+ content: sem.content,
200
+ type: 'semantic',
201
+ confidence,
202
+ score,
203
+ source: 'consolidation',
204
+ state: sem.state,
205
+ createdAt: sem.created_at,
206
+ };
207
+ if (includeProvenance) {
208
+ entry.provenance = {
209
+ evidenceEpisodeIds: safeJsonParse(sem.evidence_episode_ids, []),
210
+ evidenceCount: sem.evidence_count || 0,
211
+ supportingCount: sem.supporting_count || 0,
212
+ contradictingCount: sem.contradicting_count || 0,
213
+ consolidationCheckpoint: sem.consolidation_checkpoint || null,
214
+ };
215
+ }
216
+ return entry;
217
+ }
218
+ function buildProceduralEntry(proc, confidence, score, includeProvenance) {
219
+ const entry = {
220
+ id: proc.id,
221
+ content: proc.content,
222
+ type: 'procedural',
223
+ confidence,
224
+ score,
225
+ source: 'consolidation',
226
+ state: proc.state,
227
+ createdAt: proc.created_at,
228
+ };
229
+ if (includeProvenance) {
230
+ entry.provenance = {
231
+ evidenceEpisodeIds: safeJsonParse(proc.evidence_episode_ids, []),
232
+ successCount: proc.success_count || 0,
233
+ failureCount: proc.failure_count || 0,
234
+ triggerConditions: proc.trigger_conditions || null,
235
+ };
236
+ }
237
+ return entry;
238
+ }
239
+ function stateClause(includeDormant) {
240
+ return includeDormant
241
+ ? "AND (v.state = 'active' OR v.state = 'context_dependent' OR v.state = 'dormant')"
242
+ : "AND (v.state = 'active' OR v.state = 'context_dependent')";
243
+ }
244
+ function matchesDateFilters(createdAt, filters) {
245
+ if (filters.after && createdAt <= filters.after)
246
+ return false;
247
+ if (filters.before && createdAt >= filters.before)
248
+ return false;
249
+ return true;
250
+ }
251
+ function safeKForTable(db, table, candidateK) {
252
+ const rowCount = db.prepare(`SELECT COUNT(*) AS c FROM ${table}`).get().c;
253
+ return rowCount > 0 ? Math.min(candidateK, rowCount) : 0;
254
+ }
255
+ function knnEpisodic(db, queryBuffer, candidateK, now, minConfidence, includeProvenance, confidenceConfig, filters = {}, includePrivate = false) {
256
+ const safeK = safeKForTable(db, 'vec_episodes', candidateK);
257
+ if (safeK === 0)
258
+ return [];
259
+ const privateClause = includePrivate ? '' : 'AND e."private" = 0';
260
+ const rows = db.prepare(`
261
+ SELECT e.*, (1.0 - v.distance) AS similarity
262
+ FROM vec_episodes v
263
+ JOIN episodes e ON e.id = v.id
264
+ WHERE v.embedding MATCH ?
265
+ AND k = ?
266
+ AND e.superseded_by IS NULL
267
+ ${privateClause}
268
+ `).all(queryBuffer, safeK);
269
+ const results = [];
270
+ for (const row of rows) {
271
+ if (!matchesDateFilters(row.created_at, filters))
272
+ continue;
273
+ if (filters.tags?.length) {
274
+ const rowTags = safeJsonParse(row.tags, []);
275
+ if (!filters.tags.some(t => rowTags.includes(t)))
276
+ continue;
277
+ }
278
+ if (filters.sources?.length && !filters.sources.includes(row.source))
279
+ continue;
280
+ let confidence = computeEpisodicConfidence(row, now, confidenceConfig);
281
+ let ctxMatch;
282
+ if (confidenceConfig?.retrievalContext) {
283
+ const encodingCtx = safeJsonParse(row.context, {});
284
+ ctxMatch = contextMatchRatio(encodingCtx, confidenceConfig.retrievalContext);
285
+ confidence *= contextModifier(encodingCtx, confidenceConfig.retrievalContext, confidenceConfig.contextWeight);
286
+ confidence = Math.max(0, Math.min(1, confidence));
287
+ }
288
+ let moodMatch;
289
+ if (confidenceConfig?.retrievalMood) {
290
+ const encodingAffect = safeJsonParse(row.affect, {});
291
+ moodMatch = affectSimilarity(encodingAffect, confidenceConfig.retrievalMood);
292
+ confidence *= moodCongruenceModifier(encodingAffect, confidenceConfig.retrievalMood, confidenceConfig.affectWeight);
293
+ confidence = Math.max(0, Math.min(1, confidence));
294
+ }
295
+ if (confidence < minConfidence)
296
+ continue;
297
+ const score = row.similarity * confidence;
298
+ results.push(buildEpisodicEntry(row, confidence, score, includeProvenance, ctxMatch, moodMatch));
299
+ }
300
+ return results;
301
+ }
302
+ function knnSemantic(db, queryBuffer, candidateK, now, minConfidence, includeProvenance, includeDormant, confidenceConfig, filters = {}) {
303
+ const safeK = safeKForTable(db, 'vec_semantics', candidateK);
304
+ if (safeK === 0)
305
+ return { results: [], matchedIds: [] };
306
+ const rows = db.prepare(`
307
+ SELECT s.*, (1.0 - v.distance) AS similarity
308
+ FROM vec_semantics v
309
+ JOIN semantics s ON s.id = v.id
310
+ WHERE v.embedding MATCH ?
311
+ AND k = ?
312
+ ${stateClause(includeDormant)}
313
+ `).all(queryBuffer, safeK);
314
+ const results = [];
315
+ const matchedIds = [];
316
+ for (const row of rows) {
317
+ if (!matchesDateFilters(row.created_at, filters))
318
+ continue;
319
+ const confidence = computeSemanticConfidence(row, now, confidenceConfig);
320
+ if (confidence < minConfidence)
321
+ continue;
322
+ const score = row.similarity * confidence;
323
+ matchedIds.push(row.id);
324
+ results.push(buildSemanticEntry(row, confidence, score, includeProvenance));
325
+ }
326
+ return { results, matchedIds };
327
+ }
328
+ function knnProcedural(db, queryBuffer, candidateK, now, minConfidence, includeProvenance, includeDormant, confidenceConfig, filters = {}) {
329
+ const safeK = safeKForTable(db, 'vec_procedures', candidateK);
330
+ if (safeK === 0)
331
+ return { results: [], matchedIds: [] };
332
+ const rows = db.prepare(`
333
+ SELECT p.*, (1.0 - v.distance) AS similarity
334
+ FROM vec_procedures v
335
+ JOIN procedures p ON p.id = v.id
336
+ WHERE v.embedding MATCH ?
337
+ AND k = ?
338
+ ${stateClause(includeDormant)}
339
+ `).all(queryBuffer, safeK);
340
+ const results = [];
341
+ const matchedIds = [];
342
+ for (const row of rows) {
343
+ if (!matchesDateFilters(row.created_at, filters))
344
+ continue;
345
+ const confidence = computeProceduralConfidence(row, now, confidenceConfig);
346
+ if (confidence < minConfidence)
347
+ continue;
348
+ const score = row.similarity * confidence;
349
+ matchedIds.push(row.id);
350
+ results.push(buildProceduralEntry(row, confidence, score, includeProvenance));
351
+ }
352
+ return { results, matchedIds };
353
+ }
354
+ export async function* recallStream(db, embeddingProvider, query, options = {}) {
355
+ const { minConfidence = 0, types, limit = 10, includeProvenance = false, includeDormant = false, confidenceConfig, tags, sources, after, before, includePrivate = false, retrieval = 'hybrid', } = options;
356
+ const searchTypes = types || ['episodic', 'semantic', 'procedural'];
357
+ const now = new Date();
358
+ const hasFilters = tags?.length || sources?.length || after || before;
359
+ const candidateK = hasFilters ? limit * 5 : limit * 3;
360
+ const filters = { tags, sources, after, before };
361
+ const allResults = [];
362
+ // Vector pass — skipped entirely in 'keyword' mode. Still runs in 'hybrid'
363
+ // (default) and 'vector' modes so the underlying similarity + confidence
364
+ // scoring fires as before.
365
+ if (retrieval !== 'keyword') {
366
+ const queryVector = await embeddingProvider.embed(query);
367
+ const queryBuffer = embeddingProvider.vectorToBuffer(queryVector);
368
+ if (searchTypes.includes('episodic')) {
369
+ try {
370
+ const episodic = knnEpisodic(db, queryBuffer, candidateK, now, minConfidence, includeProvenance, confidenceConfig || {}, filters, includePrivate);
371
+ allResults.push(...episodic);
372
+ }
373
+ catch {
374
+ // A broken episodic index should not block semantic/procedural recall.
375
+ }
376
+ }
377
+ if (searchTypes.includes('semantic')) {
378
+ try {
379
+ const { results: semResults, matchedIds: semIds } = knnSemantic(db, queryBuffer, candidateK, now, minConfidence, includeProvenance, includeDormant, confidenceConfig || {}, filters);
380
+ allResults.push(...semResults);
381
+ if (semIds.length > 0) {
382
+ const nowISO = now.toISOString();
383
+ const placeholders = semIds.map(() => '?').join(',');
384
+ db.prepare(`UPDATE semantics SET retrieval_count = retrieval_count + 1, last_reinforced_at = ? WHERE id IN (${placeholders})`).run(nowISO, ...semIds);
385
+ }
386
+ }
387
+ catch {
388
+ // A broken semantic index should not block other memory types.
389
+ }
390
+ }
391
+ if (searchTypes.includes('procedural')) {
392
+ try {
393
+ const { results: procResults, matchedIds: procIds } = knnProcedural(db, queryBuffer, candidateK, now, minConfidence, includeProvenance, includeDormant, confidenceConfig || {}, filters);
394
+ allResults.push(...procResults);
395
+ if (procIds.length > 0) {
396
+ const nowISO = now.toISOString();
397
+ const placeholders = procIds.map(() => '?').join(',');
398
+ db.prepare(`UPDATE procedures SET retrieval_count = retrieval_count + 1, last_reinforced_at = ? WHERE id IN (${placeholders})`).run(nowISO, ...procIds);
399
+ }
400
+ }
401
+ catch {
402
+ // A broken procedural index should not block other memory types.
403
+ }
404
+ }
405
+ }
406
+ let resultsToGuard = allResults;
407
+ if (retrieval !== 'vector') {
408
+ const ftsIds = ftsIdsByType(db, query, searchTypes, candidateK);
409
+ const fused = fuseResults(db, {
410
+ vectorResults: allResults,
411
+ ftsIds,
412
+ mode: retrieval,
413
+ includePrivate,
414
+ includeDormant,
415
+ minConfidence,
416
+ filters,
417
+ });
418
+ resultsToGuard = fused;
419
+ }
420
+ const top = applyResultGuards(query, resultsToGuard, limit);
421
+ for (const entry of top) {
422
+ yield entry;
423
+ }
424
+ }
425
+ export async function recall(db, embeddingProvider, query, options = {}) {
426
+ const results = [];
427
+ for await (const entry of recallStream(db, embeddingProvider, query, options)) {
428
+ results.push(entry);
429
+ }
430
+ return results;
431
+ }
432
+ //# sourceMappingURL=recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Redaction for secrets, credentials, and personally identifying data.
3
+ *
4
+ * Audrey never ingests raw shell output, tool input, or files. Anything that
5
+ * reaches a memory_events row must first be filtered through redact().
6
+ *
7
+ * Rules are intentionally conservative: false positives are far cheaper than
8
+ * leaking a real credential into long-lived memory.
9
+ */
10
+ export type RedactionClass = 'aws_access_key' | 'openai_api_key' | 'anthropic_api_key' | 'github_token' | 'stripe_live_key' | 'stripe_test_key' | 'google_api_key' | 'slack_token' | 'generic_bearer' | 'private_key_block' | 'jwt' | 'url_credentials' | 'password_assignment' | 'credit_card_number' | 'cvv' | 'us_ssn' | 'signed_url_signature' | 'session_cookie';
11
+ export interface RedactionHit {
12
+ class: RedactionClass;
13
+ count: number;
14
+ }
15
+ export interface RedactionResult {
16
+ text: string;
17
+ redactions: RedactionHit[];
18
+ state: 'clean' | 'redacted';
19
+ }
20
+ export declare function redact(input: string): RedactionResult;
21
+ export declare function redactJson(value: unknown): {
22
+ value: unknown;
23
+ redactions: RedactionHit[];
24
+ state: 'clean' | 'redacted';
25
+ };
26
+ export declare function summarizeRedactions(hits: RedactionHit[]): string;
27
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,gBAAgB,GAChB,aAAa,GACb,gBAAgB,GAChB,mBAAmB,GACnB,KAAK,GACL,iBAAiB,GACjB,qBAAqB,GACrB,oBAAoB,GACpB,KAAK,GACL,QAAQ,GACR,sBAAsB,GACtB,gBAAgB,CAAC;AAQrB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;CAC7B;AA8ID,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CA4BrD;AAQD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAA;CAAE,CA0CtH;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,CAGhE"}