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.
- package/README.md +129 -374
- package/dist/mcp-server/config.d.ts +20 -0
- package/dist/mcp-server/config.d.ts.map +1 -0
- package/dist/mcp-server/config.js +125 -0
- package/dist/mcp-server/config.js.map +1 -0
- package/dist/mcp-server/index.d.ts +100 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +1113 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/src/adaptive.d.ts +7 -0
- package/dist/src/adaptive.d.ts.map +1 -0
- package/dist/src/adaptive.js +49 -0
- package/dist/src/adaptive.js.map +1 -0
- package/dist/src/affect.d.ts +19 -0
- package/dist/src/affect.d.ts.map +1 -0
- package/dist/src/affect.js +72 -0
- package/dist/src/affect.js.map +1 -0
- package/dist/src/audrey.d.ts +140 -0
- package/dist/src/audrey.d.ts.map +1 -0
- package/dist/src/audrey.js +564 -0
- package/dist/src/audrey.js.map +1 -0
- package/dist/src/capsule.d.ts +68 -0
- package/dist/src/capsule.d.ts.map +1 -0
- package/dist/src/capsule.js +311 -0
- package/dist/src/capsule.js.map +1 -0
- package/dist/src/causal.d.ts +28 -0
- package/dist/src/causal.d.ts.map +1 -0
- package/dist/src/causal.js +65 -0
- package/dist/src/causal.js.map +1 -0
- package/dist/src/confidence.d.ts +12 -0
- package/dist/src/confidence.d.ts.map +1 -0
- package/dist/src/confidence.js +63 -0
- package/dist/src/confidence.js.map +1 -0
- package/dist/src/consolidate.d.ts +8 -0
- package/dist/src/consolidate.d.ts.map +1 -0
- package/dist/src/consolidate.js +218 -0
- package/dist/src/consolidate.js.map +1 -0
- package/dist/src/context.d.ts +3 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +19 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/db.d.ts +12 -0
- package/dist/src/db.d.ts.map +1 -0
- package/dist/src/db.js +380 -0
- package/dist/src/db.js.map +1 -0
- package/dist/src/decay.d.ts +7 -0
- package/dist/src/decay.d.ts.map +1 -0
- package/dist/src/decay.js +68 -0
- package/dist/src/decay.js.map +1 -0
- package/dist/src/embedding.d.ts +57 -0
- package/dist/src/embedding.d.ts.map +1 -0
- package/dist/src/embedding.js +254 -0
- package/dist/src/embedding.js.map +1 -0
- package/dist/src/encode.d.ts +15 -0
- package/dist/src/encode.d.ts.map +1 -0
- package/dist/src/encode.js +36 -0
- package/dist/src/encode.js.map +1 -0
- package/dist/src/events.d.ts +69 -0
- package/dist/src/events.d.ts.map +1 -0
- package/dist/src/events.js +149 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/export.d.ts +3 -0
- package/dist/src/export.d.ts.map +1 -0
- package/dist/src/export.js +46 -0
- package/dist/src/export.js.map +1 -0
- package/dist/src/forget.d.ts +11 -0
- package/dist/src/forget.d.ts.map +1 -0
- package/dist/src/forget.js +105 -0
- package/dist/src/forget.js.map +1 -0
- package/dist/src/fts.d.ts +34 -0
- package/dist/src/fts.d.ts.map +1 -0
- package/dist/src/fts.js +117 -0
- package/dist/src/fts.js.map +1 -0
- package/dist/src/hybrid-recall.d.ts +37 -0
- package/dist/src/hybrid-recall.d.ts.map +1 -0
- package/dist/src/hybrid-recall.js +213 -0
- package/dist/src/hybrid-recall.js.map +1 -0
- package/dist/src/import.d.ts +4 -0
- package/dist/src/import.d.ts.map +1 -0
- package/dist/src/import.js +127 -0
- package/dist/src/import.js.map +1 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.d.ts.map +1 -0
- package/{src → dist/src}/index.js +5 -13
- package/dist/src/index.js.map +1 -0
- package/dist/src/interference.d.ts +13 -0
- package/dist/src/interference.d.ts.map +1 -0
- package/dist/src/interference.js +45 -0
- package/dist/src/interference.js.map +1 -0
- package/dist/src/introspect.d.ts +4 -0
- package/dist/src/introspect.d.ts.map +1 -0
- package/dist/src/introspect.js +40 -0
- package/dist/src/introspect.js.map +1 -0
- package/dist/src/llm.d.ts +38 -0
- package/dist/src/llm.d.ts.map +1 -0
- package/dist/src/llm.js +167 -0
- package/dist/src/llm.js.map +1 -0
- package/dist/src/migrate.d.ts +6 -0
- package/dist/src/migrate.d.ts.map +1 -0
- package/dist/src/migrate.js +51 -0
- package/dist/src/migrate.js.map +1 -0
- package/dist/src/promote.d.ts +40 -0
- package/dist/src/promote.d.ts.map +1 -0
- package/dist/src/promote.js +200 -0
- package/dist/src/promote.js.map +1 -0
- package/dist/src/prompts.d.ts +16 -0
- package/dist/src/prompts.d.ts.map +1 -0
- package/{src → dist/src}/prompts.js +172 -203
- package/dist/src/prompts.js.map +1 -0
- package/dist/src/recall.d.ts +9 -0
- package/dist/src/recall.d.ts.map +1 -0
- package/dist/src/recall.js +432 -0
- package/dist/src/recall.js.map +1 -0
- package/dist/src/redact.d.ts +27 -0
- package/dist/src/redact.d.ts.map +1 -0
- package/dist/src/redact.js +228 -0
- package/dist/src/redact.js.map +1 -0
- package/dist/src/rollback.d.ts +8 -0
- package/dist/src/rollback.d.ts.map +1 -0
- package/dist/src/rollback.js +33 -0
- package/dist/src/rollback.js.map +1 -0
- package/dist/src/routes.d.ts +7 -0
- package/dist/src/routes.d.ts.map +1 -0
- package/dist/src/routes.js +226 -0
- package/dist/src/routes.js.map +1 -0
- package/dist/src/rules-compiler.d.ts +20 -0
- package/dist/src/rules-compiler.d.ts.map +1 -0
- package/dist/src/rules-compiler.js +143 -0
- package/dist/src/rules-compiler.js.map +1 -0
- package/dist/src/server.d.ts +12 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +22 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/tool-trace.d.ts +37 -0
- package/dist/src/tool-trace.d.ts.map +1 -0
- package/dist/src/tool-trace.js +142 -0
- package/dist/src/tool-trace.js.map +1 -0
- package/dist/src/types.d.ts +446 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/ulid.d.ts +3 -0
- package/dist/src/ulid.d.ts.map +1 -0
- package/dist/src/ulid.js +11 -0
- package/dist/src/ulid.js.map +1 -0
- package/dist/src/utils.d.ts +10 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +41 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/validate.d.ts +22 -0
- package/dist/src/validate.d.ts.map +1 -0
- package/dist/src/validate.js +109 -0
- package/dist/src/validate.js.map +1 -0
- package/docs/production-readiness.md +28 -0
- package/examples/fintech-ops-demo.js +1 -1
- package/examples/healthcare-ops-demo.js +1 -1
- package/examples/stripe-demo.js +1 -1
- package/package.json +34 -13
- package/benchmarks/baselines.js +0 -169
- package/benchmarks/cases.js +0 -421
- package/benchmarks/reference-results.js +0 -70
- package/benchmarks/report.js +0 -255
- package/benchmarks/run.js +0 -514
- package/mcp-server/config.js +0 -133
- package/mcp-server/index.js +0 -1265
- package/mcp-server/serve.js +0 -482
- package/src/adaptive.js +0 -53
- package/src/affect.js +0 -64
- package/src/audrey.js +0 -642
- package/src/causal.js +0 -95
- package/src/confidence.js +0 -120
- package/src/consolidate.js +0 -281
- package/src/context.js +0 -15
- package/src/db.js +0 -391
- package/src/decay.js +0 -84
- package/src/embedding.js +0 -260
- package/src/encode.js +0 -69
- package/src/export.js +0 -67
- package/src/forget.js +0 -111
- package/src/fts.js +0 -134
- package/src/import.js +0 -273
- package/src/interference.js +0 -51
- package/src/introspect.js +0 -48
- package/src/llm.js +0 -249
- package/src/migrate.js +0 -58
- package/src/recall.js +0 -573
- package/src/rollback.js +0 -42
- package/src/ulid.js +0 -18
- package/src/utils.js +0 -63
- package/src/validate.js +0 -172
- 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 @@
|
|
|
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"}
|
package/dist/src/fts.js
ADDED
|
@@ -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"}
|