audrey 0.14.0 → 0.16.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/LICENSE +21 -21
- package/README.md +808 -681
- package/mcp-server/config.js +76 -76
- package/mcp-server/index.js +728 -437
- package/package.json +76 -77
- package/src/adaptive.js +53 -53
- package/src/affect.js +64 -64
- package/src/audrey.js +604 -570
- package/src/causal.js +95 -95
- package/src/confidence.js +120 -120
- package/src/consolidate.js +265 -242
- package/src/context.js +15 -15
- package/src/db.js +37 -0
- package/src/decay.js +84 -84
- package/src/embedding.js +256 -256
- package/src/export.js +67 -61
- package/src/forget.js +111 -111
- package/src/import.js +245 -123
- package/src/index.js +27 -20
- package/src/interference.js +51 -51
- package/src/introspect.js +48 -48
- package/src/llm.js +246 -240
- package/src/migrate.js +58 -58
- package/src/prompts.js +223 -223
- package/src/recall.js +352 -329
- package/src/rollback.js +42 -42
- package/src/ulid.js +18 -18
- package/src/utils.js +38 -38
- package/src/validate.js +172 -172
package/src/forget.js
CHANGED
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
export function forgetMemory(db, id, { purge = false } = {}) {
|
|
2
|
-
const episode = db.prepare('SELECT id FROM episodes WHERE id = ?').get(id);
|
|
3
|
-
if (episode) {
|
|
4
|
-
if (purge) {
|
|
5
|
-
db.prepare('DELETE FROM vec_episodes WHERE id = ?').run(id);
|
|
6
|
-
db.prepare('DELETE FROM episodes WHERE id = ?').run(id);
|
|
7
|
-
} else {
|
|
8
|
-
db.prepare("UPDATE episodes SET superseded_by = 'forgotten' WHERE id = ?").run(id);
|
|
9
|
-
db.prepare('DELETE FROM vec_episodes WHERE id = ?').run(id);
|
|
10
|
-
}
|
|
11
|
-
return { id, type: 'episodic', purged: purge };
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const semantic = db.prepare('SELECT id FROM semantics WHERE id = ?').get(id);
|
|
15
|
-
if (semantic) {
|
|
16
|
-
if (purge) {
|
|
17
|
-
db.prepare('DELETE FROM vec_semantics WHERE id = ?').run(id);
|
|
18
|
-
db.prepare('DELETE FROM semantics WHERE id = ?').run(id);
|
|
19
|
-
} else {
|
|
20
|
-
db.prepare("UPDATE semantics SET state = 'superseded' WHERE id = ?").run(id);
|
|
21
|
-
db.prepare('DELETE FROM vec_semantics WHERE id = ?').run(id);
|
|
22
|
-
}
|
|
23
|
-
return { id, type: 'semantic', purged: purge };
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const procedure = db.prepare('SELECT id FROM procedures WHERE id = ?').get(id);
|
|
27
|
-
if (procedure) {
|
|
28
|
-
if (purge) {
|
|
29
|
-
db.prepare('DELETE FROM vec_procedures WHERE id = ?').run(id);
|
|
30
|
-
db.prepare('DELETE FROM procedures WHERE id = ?').run(id);
|
|
31
|
-
} else {
|
|
32
|
-
db.prepare("UPDATE procedures SET state = 'superseded' WHERE id = ?").run(id);
|
|
33
|
-
db.prepare('DELETE FROM vec_procedures WHERE id = ?').run(id);
|
|
34
|
-
}
|
|
35
|
-
return { id, type: 'procedural', purged: purge };
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
throw new Error(`Memory not found: ${id}`);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function purgeMemories(db) {
|
|
42
|
-
const deadEpisodes = db.prepare(
|
|
43
|
-
'SELECT id FROM episodes WHERE superseded_by IS NOT NULL'
|
|
44
|
-
).all();
|
|
45
|
-
const deadSemantics = db.prepare(
|
|
46
|
-
"SELECT id FROM semantics WHERE state IN ('superseded', 'dormant', 'rolled_back')"
|
|
47
|
-
).all();
|
|
48
|
-
const deadProcedures = db.prepare(
|
|
49
|
-
"SELECT id FROM procedures WHERE state IN ('superseded', 'dormant', 'rolled_back')"
|
|
50
|
-
).all();
|
|
51
|
-
|
|
52
|
-
const purgeAll = db.transaction(() => {
|
|
53
|
-
for (const row of deadEpisodes) {
|
|
54
|
-
db.prepare('DELETE FROM vec_episodes WHERE id = ?').run(row.id);
|
|
55
|
-
db.prepare('DELETE FROM episodes WHERE id = ?').run(row.id);
|
|
56
|
-
}
|
|
57
|
-
for (const row of deadSemantics) {
|
|
58
|
-
db.prepare('DELETE FROM vec_semantics WHERE id = ?').run(row.id);
|
|
59
|
-
db.prepare('DELETE FROM semantics WHERE id = ?').run(row.id);
|
|
60
|
-
}
|
|
61
|
-
for (const row of deadProcedures) {
|
|
62
|
-
db.prepare('DELETE FROM vec_procedures WHERE id = ?').run(row.id);
|
|
63
|
-
db.prepare('DELETE FROM procedures WHERE id = ?').run(row.id);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
purgeAll();
|
|
68
|
-
|
|
69
|
-
return {
|
|
70
|
-
episodes: deadEpisodes.length,
|
|
71
|
-
semantics: deadSemantics.length,
|
|
72
|
-
procedures: deadProcedures.length,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export async function forgetByQuery(db, embeddingProvider, query, { minSimilarity = 0.9, purge = false } = {}) {
|
|
77
|
-
const queryVector = await embeddingProvider.embed(query);
|
|
78
|
-
const queryBuffer = embeddingProvider.vectorToBuffer(queryVector);
|
|
79
|
-
|
|
80
|
-
const candidates = [];
|
|
81
|
-
|
|
82
|
-
const epMatch = db.prepare(`
|
|
83
|
-
SELECT e.id, (1.0 - v.distance) AS similarity, 'episodic' AS type
|
|
84
|
-
FROM vec_episodes v JOIN episodes e ON e.id = v.id
|
|
85
|
-
WHERE v.embedding MATCH ? AND k = 1 AND e.superseded_by IS NULL
|
|
86
|
-
`).get(queryBuffer);
|
|
87
|
-
if (epMatch) candidates.push(epMatch);
|
|
88
|
-
|
|
89
|
-
const semMatch = db.prepare(`
|
|
90
|
-
SELECT s.id, (1.0 - v.distance) AS similarity, 'semantic' AS type
|
|
91
|
-
FROM vec_semantics v JOIN semantics s ON s.id = v.id
|
|
92
|
-
WHERE v.embedding MATCH ? AND k = 1 AND (v.state = 'active' OR v.state = 'context_dependent')
|
|
93
|
-
`).get(queryBuffer);
|
|
94
|
-
if (semMatch) candidates.push(semMatch);
|
|
95
|
-
|
|
96
|
-
const procMatch = db.prepare(`
|
|
97
|
-
SELECT p.id, (1.0 - v.distance) AS similarity, 'procedural' AS type
|
|
98
|
-
FROM vec_procedures v JOIN procedures p ON p.id = v.id
|
|
99
|
-
WHERE v.embedding MATCH ? AND k = 1 AND (v.state = 'active' OR v.state = 'context_dependent')
|
|
100
|
-
`).get(queryBuffer);
|
|
101
|
-
if (procMatch) candidates.push(procMatch);
|
|
102
|
-
|
|
103
|
-
if (candidates.length === 0) return null;
|
|
104
|
-
|
|
105
|
-
candidates.sort((a, b) => b.similarity - a.similarity);
|
|
106
|
-
const best = candidates[0];
|
|
107
|
-
|
|
108
|
-
if (best.similarity < minSimilarity) return null;
|
|
109
|
-
|
|
110
|
-
return forgetMemory(db, best.id, { purge });
|
|
111
|
-
}
|
|
1
|
+
export function forgetMemory(db, id, { purge = false } = {}) {
|
|
2
|
+
const episode = db.prepare('SELECT id FROM episodes WHERE id = ?').get(id);
|
|
3
|
+
if (episode) {
|
|
4
|
+
if (purge) {
|
|
5
|
+
db.prepare('DELETE FROM vec_episodes WHERE id = ?').run(id);
|
|
6
|
+
db.prepare('DELETE FROM episodes WHERE id = ?').run(id);
|
|
7
|
+
} else {
|
|
8
|
+
db.prepare("UPDATE episodes SET superseded_by = 'forgotten' WHERE id = ?").run(id);
|
|
9
|
+
db.prepare('DELETE FROM vec_episodes WHERE id = ?').run(id);
|
|
10
|
+
}
|
|
11
|
+
return { id, type: 'episodic', purged: purge };
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const semantic = db.prepare('SELECT id FROM semantics WHERE id = ?').get(id);
|
|
15
|
+
if (semantic) {
|
|
16
|
+
if (purge) {
|
|
17
|
+
db.prepare('DELETE FROM vec_semantics WHERE id = ?').run(id);
|
|
18
|
+
db.prepare('DELETE FROM semantics WHERE id = ?').run(id);
|
|
19
|
+
} else {
|
|
20
|
+
db.prepare("UPDATE semantics SET state = 'superseded' WHERE id = ?").run(id);
|
|
21
|
+
db.prepare('DELETE FROM vec_semantics WHERE id = ?').run(id);
|
|
22
|
+
}
|
|
23
|
+
return { id, type: 'semantic', purged: purge };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const procedure = db.prepare('SELECT id FROM procedures WHERE id = ?').get(id);
|
|
27
|
+
if (procedure) {
|
|
28
|
+
if (purge) {
|
|
29
|
+
db.prepare('DELETE FROM vec_procedures WHERE id = ?').run(id);
|
|
30
|
+
db.prepare('DELETE FROM procedures WHERE id = ?').run(id);
|
|
31
|
+
} else {
|
|
32
|
+
db.prepare("UPDATE procedures SET state = 'superseded' WHERE id = ?").run(id);
|
|
33
|
+
db.prepare('DELETE FROM vec_procedures WHERE id = ?').run(id);
|
|
34
|
+
}
|
|
35
|
+
return { id, type: 'procedural', purged: purge };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
throw new Error(`Memory not found: ${id}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function purgeMemories(db) {
|
|
42
|
+
const deadEpisodes = db.prepare(
|
|
43
|
+
'SELECT id FROM episodes WHERE superseded_by IS NOT NULL'
|
|
44
|
+
).all();
|
|
45
|
+
const deadSemantics = db.prepare(
|
|
46
|
+
"SELECT id FROM semantics WHERE state IN ('superseded', 'dormant', 'rolled_back')"
|
|
47
|
+
).all();
|
|
48
|
+
const deadProcedures = db.prepare(
|
|
49
|
+
"SELECT id FROM procedures WHERE state IN ('superseded', 'dormant', 'rolled_back')"
|
|
50
|
+
).all();
|
|
51
|
+
|
|
52
|
+
const purgeAll = db.transaction(() => {
|
|
53
|
+
for (const row of deadEpisodes) {
|
|
54
|
+
db.prepare('DELETE FROM vec_episodes WHERE id = ?').run(row.id);
|
|
55
|
+
db.prepare('DELETE FROM episodes WHERE id = ?').run(row.id);
|
|
56
|
+
}
|
|
57
|
+
for (const row of deadSemantics) {
|
|
58
|
+
db.prepare('DELETE FROM vec_semantics WHERE id = ?').run(row.id);
|
|
59
|
+
db.prepare('DELETE FROM semantics WHERE id = ?').run(row.id);
|
|
60
|
+
}
|
|
61
|
+
for (const row of deadProcedures) {
|
|
62
|
+
db.prepare('DELETE FROM vec_procedures WHERE id = ?').run(row.id);
|
|
63
|
+
db.prepare('DELETE FROM procedures WHERE id = ?').run(row.id);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
purgeAll();
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
episodes: deadEpisodes.length,
|
|
71
|
+
semantics: deadSemantics.length,
|
|
72
|
+
procedures: deadProcedures.length,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function forgetByQuery(db, embeddingProvider, query, { minSimilarity = 0.9, purge = false } = {}) {
|
|
77
|
+
const queryVector = await embeddingProvider.embed(query);
|
|
78
|
+
const queryBuffer = embeddingProvider.vectorToBuffer(queryVector);
|
|
79
|
+
|
|
80
|
+
const candidates = [];
|
|
81
|
+
|
|
82
|
+
const epMatch = db.prepare(`
|
|
83
|
+
SELECT e.id, (1.0 - v.distance) AS similarity, 'episodic' AS type
|
|
84
|
+
FROM vec_episodes v JOIN episodes e ON e.id = v.id
|
|
85
|
+
WHERE v.embedding MATCH ? AND k = 1 AND e.superseded_by IS NULL
|
|
86
|
+
`).get(queryBuffer);
|
|
87
|
+
if (epMatch) candidates.push(epMatch);
|
|
88
|
+
|
|
89
|
+
const semMatch = db.prepare(`
|
|
90
|
+
SELECT s.id, (1.0 - v.distance) AS similarity, 'semantic' AS type
|
|
91
|
+
FROM vec_semantics v JOIN semantics s ON s.id = v.id
|
|
92
|
+
WHERE v.embedding MATCH ? AND k = 1 AND (v.state = 'active' OR v.state = 'context_dependent')
|
|
93
|
+
`).get(queryBuffer);
|
|
94
|
+
if (semMatch) candidates.push(semMatch);
|
|
95
|
+
|
|
96
|
+
const procMatch = db.prepare(`
|
|
97
|
+
SELECT p.id, (1.0 - v.distance) AS similarity, 'procedural' AS type
|
|
98
|
+
FROM vec_procedures v JOIN procedures p ON p.id = v.id
|
|
99
|
+
WHERE v.embedding MATCH ? AND k = 1 AND (v.state = 'active' OR v.state = 'context_dependent')
|
|
100
|
+
`).get(queryBuffer);
|
|
101
|
+
if (procMatch) candidates.push(procMatch);
|
|
102
|
+
|
|
103
|
+
if (candidates.length === 0) return null;
|
|
104
|
+
|
|
105
|
+
candidates.sort((a, b) => b.similarity - a.similarity);
|
|
106
|
+
const best = candidates[0];
|
|
107
|
+
|
|
108
|
+
if (best.similarity < minSimilarity) return null;
|
|
109
|
+
|
|
110
|
+
return forgetMemory(db, best.id, { purge });
|
|
111
|
+
}
|
package/src/import.js
CHANGED
|
@@ -1,123 +1,245 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
1
|
+
function jsonOrNull(value) {
|
|
2
|
+
return value == null ? null : JSON.stringify(value);
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
function isDatabaseEmpty(db) {
|
|
6
|
+
const tables = [
|
|
7
|
+
'episodes',
|
|
8
|
+
'semantics',
|
|
9
|
+
'procedures',
|
|
10
|
+
'causal_links',
|
|
11
|
+
'contradictions',
|
|
12
|
+
'consolidation_runs',
|
|
13
|
+
'consolidation_metrics',
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
return tables.every(table => db.prepare(`SELECT COUNT(*) AS c FROM ${table}`).get().c === 0);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function importMemories(db, embeddingProvider, snapshot) {
|
|
20
|
+
if (!isDatabaseEmpty(db)) {
|
|
21
|
+
throw new Error('Cannot import into a database that is not empty');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const episodes = snapshot.episodes || [];
|
|
25
|
+
const semantics = snapshot.semantics || [];
|
|
26
|
+
const procedures = snapshot.procedures || [];
|
|
27
|
+
const causalLinks = snapshot.causalLinks || [];
|
|
28
|
+
const contradictions = snapshot.contradictions || [];
|
|
29
|
+
const consolidationRuns = snapshot.consolidationRuns || [];
|
|
30
|
+
const consolidationMetrics = snapshot.consolidationMetrics || [];
|
|
31
|
+
|
|
32
|
+
const episodeVectors = episodes.length > 0
|
|
33
|
+
? await embeddingProvider.embedBatch(episodes.map(ep => ep.content))
|
|
34
|
+
: [];
|
|
35
|
+
const semanticVectors = semantics.length > 0
|
|
36
|
+
? await embeddingProvider.embedBatch(semantics.map(sem => sem.content))
|
|
37
|
+
: [];
|
|
38
|
+
const procedureVectors = procedures.length > 0
|
|
39
|
+
? await embeddingProvider.embedBatch(procedures.map(proc => proc.content))
|
|
40
|
+
: [];
|
|
41
|
+
|
|
42
|
+
const insertEpisode = db.prepare(`
|
|
43
|
+
INSERT INTO episodes (id, content, embedding, source, source_reliability, salience, context, affect, tags,
|
|
44
|
+
causal_trigger, causal_consequence, created_at, embedding_model, embedding_version,
|
|
45
|
+
supersedes, superseded_by, consolidated, "private")
|
|
46
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
47
|
+
`);
|
|
48
|
+
const insertVecEpisode = db.prepare(
|
|
49
|
+
'INSERT INTO vec_episodes(id, embedding, source, consolidated) VALUES (?, ?, ?, ?)'
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
const insertSemantic = db.prepare(`
|
|
53
|
+
INSERT INTO semantics (id, content, embedding, state, conditions, evidence_episode_ids,
|
|
54
|
+
evidence_count, supporting_count, contradicting_count, source_type_diversity,
|
|
55
|
+
consolidation_checkpoint, embedding_model, embedding_version, consolidation_model,
|
|
56
|
+
consolidation_prompt_hash, created_at, last_reinforced_at, retrieval_count, challenge_count,
|
|
57
|
+
interference_count, salience)
|
|
58
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
59
|
+
`);
|
|
60
|
+
const insertVecSemantic = db.prepare(
|
|
61
|
+
'INSERT INTO vec_semantics(id, embedding, state) VALUES (?, ?, ?)'
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const insertProcedure = db.prepare(`
|
|
65
|
+
INSERT INTO procedures (id, content, embedding, state, trigger_conditions, evidence_episode_ids,
|
|
66
|
+
success_count, failure_count, embedding_model, embedding_version, created_at, last_reinforced_at,
|
|
67
|
+
retrieval_count, interference_count, salience)
|
|
68
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
69
|
+
`);
|
|
70
|
+
const insertVecProcedure = db.prepare(
|
|
71
|
+
'INSERT INTO vec_procedures(id, embedding, state) VALUES (?, ?, ?)'
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const insertCausalLink = db.prepare(`
|
|
75
|
+
INSERT INTO causal_links (id, cause_id, effect_id, link_type, mechanism, confidence, evidence_count, created_at)
|
|
76
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
77
|
+
`);
|
|
78
|
+
|
|
79
|
+
const insertContradiction = db.prepare(`
|
|
80
|
+
INSERT INTO contradictions (id, claim_a_id, claim_a_type, claim_b_id, claim_b_type,
|
|
81
|
+
state, resolution, resolved_at, reopened_at, reopen_evidence_id, created_at)
|
|
82
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
83
|
+
`);
|
|
84
|
+
|
|
85
|
+
const insertConsolidationRun = db.prepare(`
|
|
86
|
+
INSERT INTO consolidation_runs (id, checkpoint_cursor, input_episode_ids, output_memory_ids,
|
|
87
|
+
confidence_deltas, consolidation_model, consolidation_prompt_hash, started_at, completed_at, status)
|
|
88
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
89
|
+
`);
|
|
90
|
+
|
|
91
|
+
const insertConsolidationMetric = db.prepare(`
|
|
92
|
+
INSERT INTO consolidation_metrics (id, run_id, min_cluster_size, similarity_threshold,
|
|
93
|
+
episodes_evaluated, clusters_found, principles_extracted, created_at)
|
|
94
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
95
|
+
`);
|
|
96
|
+
|
|
97
|
+
const upsertConfig = db.prepare(`
|
|
98
|
+
INSERT INTO audrey_config (key, value) VALUES (?, ?)
|
|
99
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value
|
|
100
|
+
`);
|
|
101
|
+
|
|
102
|
+
const writeImport = db.transaction(() => {
|
|
103
|
+
for (let i = 0; i < episodes.length; i++) {
|
|
104
|
+
const ep = episodes[i];
|
|
105
|
+
const embeddingBuffer = embeddingProvider.vectorToBuffer(episodeVectors[i]);
|
|
106
|
+
insertEpisode.run(
|
|
107
|
+
ep.id,
|
|
108
|
+
ep.content,
|
|
109
|
+
embeddingBuffer,
|
|
110
|
+
ep.source,
|
|
111
|
+
ep.source_reliability,
|
|
112
|
+
ep.salience ?? 0.5,
|
|
113
|
+
jsonOrNull(ep.context ?? {}),
|
|
114
|
+
jsonOrNull(ep.affect ?? {}),
|
|
115
|
+
jsonOrNull(ep.tags),
|
|
116
|
+
ep.causal_trigger ?? null,
|
|
117
|
+
ep.causal_consequence ?? null,
|
|
118
|
+
ep.created_at,
|
|
119
|
+
embeddingProvider.modelName,
|
|
120
|
+
embeddingProvider.modelVersion,
|
|
121
|
+
ep.supersedes ?? null,
|
|
122
|
+
ep.superseded_by ?? null,
|
|
123
|
+
ep.consolidated ?? 0,
|
|
124
|
+
ep.private ?? 0,
|
|
125
|
+
);
|
|
126
|
+
insertVecEpisode.run(ep.id, embeddingBuffer, ep.source, BigInt(ep.consolidated ?? 0));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
for (let i = 0; i < semantics.length; i++) {
|
|
130
|
+
const sem = semantics[i];
|
|
131
|
+
const embeddingBuffer = embeddingProvider.vectorToBuffer(semanticVectors[i]);
|
|
132
|
+
insertSemantic.run(
|
|
133
|
+
sem.id,
|
|
134
|
+
sem.content,
|
|
135
|
+
embeddingBuffer,
|
|
136
|
+
sem.state,
|
|
137
|
+
sem.conditions ?? null,
|
|
138
|
+
jsonOrNull(sem.evidence_episode_ids || []),
|
|
139
|
+
sem.evidence_count ?? 0,
|
|
140
|
+
sem.supporting_count ?? 0,
|
|
141
|
+
sem.contradicting_count ?? 0,
|
|
142
|
+
sem.source_type_diversity ?? 0,
|
|
143
|
+
sem.consolidation_checkpoint ?? null,
|
|
144
|
+
embeddingProvider.modelName,
|
|
145
|
+
embeddingProvider.modelVersion,
|
|
146
|
+
sem.consolidation_model ?? null,
|
|
147
|
+
sem.consolidation_prompt_hash ?? null,
|
|
148
|
+
sem.created_at,
|
|
149
|
+
sem.last_reinforced_at ?? null,
|
|
150
|
+
sem.retrieval_count ?? 0,
|
|
151
|
+
sem.challenge_count ?? 0,
|
|
152
|
+
sem.interference_count ?? 0,
|
|
153
|
+
sem.salience ?? 0.5,
|
|
154
|
+
);
|
|
155
|
+
insertVecSemantic.run(sem.id, embeddingBuffer, sem.state);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
for (let i = 0; i < procedures.length; i++) {
|
|
159
|
+
const proc = procedures[i];
|
|
160
|
+
const embeddingBuffer = embeddingProvider.vectorToBuffer(procedureVectors[i]);
|
|
161
|
+
insertProcedure.run(
|
|
162
|
+
proc.id,
|
|
163
|
+
proc.content,
|
|
164
|
+
embeddingBuffer,
|
|
165
|
+
proc.state,
|
|
166
|
+
proc.trigger_conditions ?? null,
|
|
167
|
+
jsonOrNull(proc.evidence_episode_ids || []),
|
|
168
|
+
proc.success_count ?? 0,
|
|
169
|
+
proc.failure_count ?? 0,
|
|
170
|
+
embeddingProvider.modelName,
|
|
171
|
+
embeddingProvider.modelVersion,
|
|
172
|
+
proc.created_at,
|
|
173
|
+
proc.last_reinforced_at ?? null,
|
|
174
|
+
proc.retrieval_count ?? 0,
|
|
175
|
+
proc.interference_count ?? 0,
|
|
176
|
+
proc.salience ?? 0.5,
|
|
177
|
+
);
|
|
178
|
+
insertVecProcedure.run(proc.id, embeddingBuffer, proc.state);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
for (const link of causalLinks) {
|
|
182
|
+
insertCausalLink.run(
|
|
183
|
+
link.id,
|
|
184
|
+
link.cause_id,
|
|
185
|
+
link.effect_id,
|
|
186
|
+
link.link_type ?? 'causal',
|
|
187
|
+
link.mechanism ?? null,
|
|
188
|
+
link.confidence ?? null,
|
|
189
|
+
link.evidence_count ?? 1,
|
|
190
|
+
link.created_at,
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
for (const contradiction of contradictions) {
|
|
195
|
+
insertContradiction.run(
|
|
196
|
+
contradiction.id,
|
|
197
|
+
contradiction.claim_a_id,
|
|
198
|
+
contradiction.claim_a_type,
|
|
199
|
+
contradiction.claim_b_id,
|
|
200
|
+
contradiction.claim_b_type,
|
|
201
|
+
contradiction.state,
|
|
202
|
+
contradiction.resolution ?? null,
|
|
203
|
+
contradiction.resolved_at ?? null,
|
|
204
|
+
contradiction.reopened_at ?? null,
|
|
205
|
+
contradiction.reopen_evidence_id ?? null,
|
|
206
|
+
contradiction.created_at,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
for (const run of consolidationRuns) {
|
|
211
|
+
insertConsolidationRun.run(
|
|
212
|
+
run.id,
|
|
213
|
+
run.checkpoint_cursor ?? null,
|
|
214
|
+
jsonOrNull(run.input_episode_ids || []),
|
|
215
|
+
jsonOrNull(run.output_memory_ids || []),
|
|
216
|
+
jsonOrNull(run.confidence_deltas),
|
|
217
|
+
run.consolidation_model ?? null,
|
|
218
|
+
run.consolidation_prompt_hash ?? null,
|
|
219
|
+
run.started_at ?? null,
|
|
220
|
+
run.completed_at ?? null,
|
|
221
|
+
run.status,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
for (const metric of consolidationMetrics) {
|
|
226
|
+
insertConsolidationMetric.run(
|
|
227
|
+
metric.id,
|
|
228
|
+
metric.run_id,
|
|
229
|
+
metric.min_cluster_size,
|
|
230
|
+
metric.similarity_threshold,
|
|
231
|
+
metric.episodes_evaluated,
|
|
232
|
+
metric.clusters_found,
|
|
233
|
+
metric.principles_extracted,
|
|
234
|
+
metric.created_at,
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
for (const [key, value] of Object.entries(snapshot.config || {})) {
|
|
239
|
+
if (key === 'dimensions') continue;
|
|
240
|
+
upsertConfig.run(key, String(value));
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
writeImport();
|
|
245
|
+
}
|
package/src/index.js
CHANGED
|
@@ -1,20 +1,27 @@
|
|
|
1
|
-
export { Audrey } from './audrey.js';
|
|
2
|
-
export { computeConfidence, sourceReliability, salienceModifier, DEFAULT_SOURCE_RELIABILITY, DEFAULT_WEIGHTS, DEFAULT_HALF_LIVES } from './confidence.js';
|
|
3
|
-
export {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
} from './
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
export {
|
|
1
|
+
export { Audrey } from './audrey.js';
|
|
2
|
+
export { computeConfidence, sourceReliability, salienceModifier, DEFAULT_SOURCE_RELIABILITY, DEFAULT_WEIGHTS, DEFAULT_HALF_LIVES } from './confidence.js';
|
|
3
|
+
export {
|
|
4
|
+
createEmbeddingProvider,
|
|
5
|
+
MockEmbeddingProvider,
|
|
6
|
+
LocalEmbeddingProvider,
|
|
7
|
+
OpenAIEmbeddingProvider,
|
|
8
|
+
GeminiEmbeddingProvider,
|
|
9
|
+
} from './embedding.js';
|
|
10
|
+
export { createLLMProvider, MockLLMProvider, AnthropicLLMProvider, OpenAILLMProvider } from './llm.js';
|
|
11
|
+
export { createDatabase, closeDatabase, readStoredDimensions } from './db.js';
|
|
12
|
+
export { recall, recallStream } from './recall.js';
|
|
13
|
+
export { addCausalLink, getCausalChain, articulateCausalLink } from './causal.js';
|
|
14
|
+
export {
|
|
15
|
+
buildPrincipleExtractionPrompt,
|
|
16
|
+
buildContradictionDetectionPrompt,
|
|
17
|
+
buildCausalArticulationPrompt,
|
|
18
|
+
buildContextResolutionPrompt,
|
|
19
|
+
} from './prompts.js';
|
|
20
|
+
export { exportMemories } from './export.js';
|
|
21
|
+
export { importMemories } from './import.js';
|
|
22
|
+
export { suggestConsolidationParams } from './adaptive.js';
|
|
23
|
+
export { reembedAll } from './migrate.js';
|
|
24
|
+
export { forgetMemory, forgetByQuery, purgeMemories } from './forget.js';
|
|
25
|
+
export { applyInterference, interferenceModifier } from './interference.js';
|
|
26
|
+
export { contextMatchRatio, contextModifier } from './context.js';
|
|
27
|
+
export { arousalSalienceBoost, affectSimilarity, moodCongruenceModifier, detectResonance } from './affect.js';
|