audrey 0.16.1 → 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 (188) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +146 -724
  3. package/dist/mcp-server/config.d.ts +20 -0
  4. package/dist/mcp-server/config.d.ts.map +1 -0
  5. package/dist/mcp-server/config.js +125 -0
  6. package/dist/mcp-server/config.js.map +1 -0
  7. package/dist/mcp-server/index.d.ts +100 -0
  8. package/dist/mcp-server/index.d.ts.map +1 -0
  9. package/dist/mcp-server/index.js +1113 -0
  10. package/dist/mcp-server/index.js.map +1 -0
  11. package/dist/src/adaptive.d.ts +7 -0
  12. package/dist/src/adaptive.d.ts.map +1 -0
  13. package/dist/src/adaptive.js +49 -0
  14. package/dist/src/adaptive.js.map +1 -0
  15. package/dist/src/affect.d.ts +19 -0
  16. package/dist/src/affect.d.ts.map +1 -0
  17. package/dist/src/affect.js +72 -0
  18. package/dist/src/affect.js.map +1 -0
  19. package/dist/src/audrey.d.ts +140 -0
  20. package/dist/src/audrey.d.ts.map +1 -0
  21. package/dist/src/audrey.js +564 -0
  22. package/dist/src/audrey.js.map +1 -0
  23. package/dist/src/capsule.d.ts +68 -0
  24. package/dist/src/capsule.d.ts.map +1 -0
  25. package/dist/src/capsule.js +311 -0
  26. package/dist/src/capsule.js.map +1 -0
  27. package/dist/src/causal.d.ts +28 -0
  28. package/dist/src/causal.d.ts.map +1 -0
  29. package/dist/src/causal.js +65 -0
  30. package/dist/src/causal.js.map +1 -0
  31. package/dist/src/confidence.d.ts +12 -0
  32. package/dist/src/confidence.d.ts.map +1 -0
  33. package/dist/src/confidence.js +63 -0
  34. package/dist/src/confidence.js.map +1 -0
  35. package/dist/src/consolidate.d.ts +8 -0
  36. package/dist/src/consolidate.d.ts.map +1 -0
  37. package/dist/src/consolidate.js +218 -0
  38. package/dist/src/consolidate.js.map +1 -0
  39. package/dist/src/context.d.ts +3 -0
  40. package/dist/src/context.d.ts.map +1 -0
  41. package/dist/src/context.js +19 -0
  42. package/dist/src/context.js.map +1 -0
  43. package/dist/src/db.d.ts +12 -0
  44. package/dist/src/db.d.ts.map +1 -0
  45. package/dist/src/db.js +380 -0
  46. package/dist/src/db.js.map +1 -0
  47. package/dist/src/decay.d.ts +7 -0
  48. package/dist/src/decay.d.ts.map +1 -0
  49. package/dist/src/decay.js +68 -0
  50. package/dist/src/decay.js.map +1 -0
  51. package/dist/src/embedding.d.ts +57 -0
  52. package/dist/src/embedding.d.ts.map +1 -0
  53. package/dist/src/embedding.js +254 -0
  54. package/dist/src/embedding.js.map +1 -0
  55. package/dist/src/encode.d.ts +15 -0
  56. package/dist/src/encode.d.ts.map +1 -0
  57. package/dist/src/encode.js +36 -0
  58. package/dist/src/encode.js.map +1 -0
  59. package/dist/src/events.d.ts +69 -0
  60. package/dist/src/events.d.ts.map +1 -0
  61. package/dist/src/events.js +149 -0
  62. package/dist/src/events.js.map +1 -0
  63. package/dist/src/export.d.ts +3 -0
  64. package/dist/src/export.d.ts.map +1 -0
  65. package/dist/src/export.js +46 -0
  66. package/dist/src/export.js.map +1 -0
  67. package/dist/src/forget.d.ts +11 -0
  68. package/dist/src/forget.d.ts.map +1 -0
  69. package/dist/src/forget.js +105 -0
  70. package/dist/src/forget.js.map +1 -0
  71. package/dist/src/fts.d.ts +34 -0
  72. package/dist/src/fts.d.ts.map +1 -0
  73. package/dist/src/fts.js +117 -0
  74. package/dist/src/fts.js.map +1 -0
  75. package/dist/src/hybrid-recall.d.ts +37 -0
  76. package/dist/src/hybrid-recall.d.ts.map +1 -0
  77. package/dist/src/hybrid-recall.js +213 -0
  78. package/dist/src/hybrid-recall.js.map +1 -0
  79. package/dist/src/import.d.ts +4 -0
  80. package/dist/src/import.d.ts.map +1 -0
  81. package/dist/src/import.js +127 -0
  82. package/dist/src/import.js.map +1 -0
  83. package/dist/src/index.d.ts +22 -0
  84. package/dist/src/index.d.ts.map +1 -0
  85. package/{src → dist/src}/index.js +5 -13
  86. package/dist/src/index.js.map +1 -0
  87. package/dist/src/interference.d.ts +13 -0
  88. package/dist/src/interference.d.ts.map +1 -0
  89. package/dist/src/interference.js +45 -0
  90. package/dist/src/interference.js.map +1 -0
  91. package/dist/src/introspect.d.ts +4 -0
  92. package/dist/src/introspect.d.ts.map +1 -0
  93. package/dist/src/introspect.js +40 -0
  94. package/dist/src/introspect.js.map +1 -0
  95. package/dist/src/llm.d.ts +38 -0
  96. package/dist/src/llm.d.ts.map +1 -0
  97. package/dist/src/llm.js +167 -0
  98. package/dist/src/llm.js.map +1 -0
  99. package/dist/src/migrate.d.ts +6 -0
  100. package/dist/src/migrate.d.ts.map +1 -0
  101. package/dist/src/migrate.js +51 -0
  102. package/dist/src/migrate.js.map +1 -0
  103. package/dist/src/promote.d.ts +40 -0
  104. package/dist/src/promote.d.ts.map +1 -0
  105. package/dist/src/promote.js +200 -0
  106. package/dist/src/promote.js.map +1 -0
  107. package/dist/src/prompts.d.ts +16 -0
  108. package/dist/src/prompts.d.ts.map +1 -0
  109. package/{src → dist/src}/prompts.js +172 -203
  110. package/dist/src/prompts.js.map +1 -0
  111. package/dist/src/recall.d.ts +9 -0
  112. package/dist/src/recall.d.ts.map +1 -0
  113. package/dist/src/recall.js +432 -0
  114. package/dist/src/recall.js.map +1 -0
  115. package/dist/src/redact.d.ts +27 -0
  116. package/dist/src/redact.d.ts.map +1 -0
  117. package/dist/src/redact.js +228 -0
  118. package/dist/src/redact.js.map +1 -0
  119. package/dist/src/rollback.d.ts +8 -0
  120. package/dist/src/rollback.d.ts.map +1 -0
  121. package/dist/src/rollback.js +33 -0
  122. package/dist/src/rollback.js.map +1 -0
  123. package/dist/src/routes.d.ts +7 -0
  124. package/dist/src/routes.d.ts.map +1 -0
  125. package/dist/src/routes.js +226 -0
  126. package/dist/src/routes.js.map +1 -0
  127. package/dist/src/rules-compiler.d.ts +20 -0
  128. package/dist/src/rules-compiler.d.ts.map +1 -0
  129. package/dist/src/rules-compiler.js +143 -0
  130. package/dist/src/rules-compiler.js.map +1 -0
  131. package/dist/src/server.d.ts +12 -0
  132. package/dist/src/server.d.ts.map +1 -0
  133. package/dist/src/server.js +22 -0
  134. package/dist/src/server.js.map +1 -0
  135. package/dist/src/tool-trace.d.ts +37 -0
  136. package/dist/src/tool-trace.d.ts.map +1 -0
  137. package/dist/src/tool-trace.js +142 -0
  138. package/dist/src/tool-trace.js.map +1 -0
  139. package/dist/src/types.d.ts +446 -0
  140. package/dist/src/types.d.ts.map +1 -0
  141. package/dist/src/types.js +6 -0
  142. package/dist/src/types.js.map +1 -0
  143. package/dist/src/ulid.d.ts +3 -0
  144. package/dist/src/ulid.d.ts.map +1 -0
  145. package/dist/src/ulid.js +11 -0
  146. package/dist/src/ulid.js.map +1 -0
  147. package/dist/src/utils.d.ts +10 -0
  148. package/dist/src/utils.d.ts.map +1 -0
  149. package/dist/src/utils.js +41 -0
  150. package/dist/src/utils.js.map +1 -0
  151. package/dist/src/validate.d.ts +22 -0
  152. package/dist/src/validate.d.ts.map +1 -0
  153. package/dist/src/validate.js +109 -0
  154. package/dist/src/validate.js.map +1 -0
  155. package/docs/assets/benchmarks/local-benchmark.svg +45 -0
  156. package/docs/assets/benchmarks/operations-benchmark.svg +45 -0
  157. package/docs/assets/benchmarks/published-memory-standards.svg +50 -0
  158. package/docs/benchmarking.md +151 -0
  159. package/docs/production-readiness.md +124 -0
  160. package/examples/fintech-ops-demo.js +67 -0
  161. package/examples/healthcare-ops-demo.js +67 -0
  162. package/examples/stripe-demo.js +105 -0
  163. package/package.json +53 -13
  164. package/mcp-server/config.js +0 -80
  165. package/mcp-server/index.js +0 -729
  166. package/src/adaptive.js +0 -53
  167. package/src/affect.js +0 -64
  168. package/src/audrey.js +0 -604
  169. package/src/causal.js +0 -95
  170. package/src/confidence.js +0 -120
  171. package/src/consolidate.js +0 -265
  172. package/src/context.js +0 -15
  173. package/src/db.js +0 -370
  174. package/src/decay.js +0 -84
  175. package/src/embedding.js +0 -256
  176. package/src/encode.js +0 -63
  177. package/src/export.js +0 -67
  178. package/src/forget.js +0 -111
  179. package/src/import.js +0 -245
  180. package/src/interference.js +0 -51
  181. package/src/introspect.js +0 -48
  182. package/src/llm.js +0 -246
  183. package/src/migrate.js +0 -58
  184. package/src/recall.js +0 -352
  185. package/src/rollback.js +0 -42
  186. package/src/ulid.js +0 -18
  187. package/src/utils.js +0 -38
  188. package/src/validate.js +0 -172
package/src/encode.js DELETED
@@ -1,63 +0,0 @@
1
- import { generateId } from './ulid.js';
2
- import { sourceReliability } from './confidence.js';
3
- import { arousalSalienceBoost } from './affect.js';
4
-
5
- /**
6
- * @param {import('better-sqlite3').Database} db
7
- * @param {import('./embedding.js').EmbeddingProvider} embeddingProvider
8
- * @param {{ content: string, source: string, salience?: number, causal?: { trigger?: string, consequence?: string }, tags?: string[], supersedes?: string, context?: object, affect?: object, arousalWeight?: number, private?: boolean }} params
9
- * @returns {Promise<string>}
10
- */
11
- export async function encodeEpisode(db, embeddingProvider, {
12
- content,
13
- source,
14
- salience = 0.5,
15
- causal,
16
- tags,
17
- supersedes,
18
- context = {},
19
- affect = {},
20
- arousalWeight = 0.3,
21
- private: isPrivate = false,
22
- }) {
23
- if (!content || typeof content !== 'string') throw new Error('content must be a non-empty string');
24
- if (salience < 0 || salience > 1) throw new Error('salience must be between 0 and 1');
25
- if (tags && !Array.isArray(tags)) throw new Error('tags must be an array');
26
-
27
- const reliability = sourceReliability(source);
28
- const vector = await embeddingProvider.embed(content);
29
- const embeddingBuffer = embeddingProvider.vectorToBuffer(vector);
30
- const id = generateId();
31
- const now = new Date().toISOString();
32
-
33
- const boost = arousalSalienceBoost(affect.arousal);
34
- const effectiveSalience = Math.min(1.0, salience + (boost * arousalWeight));
35
-
36
- const insertAndLink = db.transaction(() => {
37
- db.prepare(`
38
- INSERT INTO episodes (
39
- id, content, embedding, source, source_reliability, salience, context, affect,
40
- tags, causal_trigger, causal_consequence, created_at,
41
- embedding_model, embedding_version, supersedes, "private"
42
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
43
- `).run(
44
- id, content, embeddingBuffer, source, reliability, effectiveSalience,
45
- JSON.stringify(context),
46
- JSON.stringify(affect),
47
- tags ? JSON.stringify(tags) : null,
48
- causal?.trigger || null, causal?.consequence || null,
49
- now, embeddingProvider.modelName, embeddingProvider.modelVersion,
50
- supersedes || null,
51
- isPrivate ? 1 : 0,
52
- );
53
- db.prepare(
54
- 'INSERT INTO vec_episodes(id, embedding, source, consolidated) VALUES (?, ?, ?, ?)'
55
- ).run(id, embeddingBuffer, source, BigInt(0));
56
- if (supersedes) {
57
- db.prepare('UPDATE episodes SET superseded_by = ? WHERE id = ?').run(id, supersedes);
58
- }
59
- });
60
-
61
- insertAndLink();
62
- return id;
63
- }
package/src/export.js DELETED
@@ -1,67 +0,0 @@
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
-
6
- const __dirname = dirname(fileURLToPath(import.meta.url));
7
- const pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));
8
-
9
- export function exportMemories(db) {
10
- const episodes = db.prepare(
11
- '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'
12
- ).all().map(ep => ({
13
- ...ep,
14
- tags: safeJsonParse(ep.tags, null),
15
- context: safeJsonParse(ep.context, null),
16
- affect: safeJsonParse(ep.affect, null),
17
- }));
18
-
19
- const semantics = db.prepare(
20
- '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'
21
- ).all().map(sem => ({
22
- ...sem,
23
- evidence_episode_ids: safeJsonParse(sem.evidence_episode_ids, []),
24
- }));
25
-
26
- const procedures = db.prepare(
27
- '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'
28
- ).all().map(proc => ({
29
- ...proc,
30
- evidence_episode_ids: safeJsonParse(proc.evidence_episode_ids, []),
31
- }));
32
-
33
- const causalLinks = db.prepare('SELECT * FROM causal_links').all();
34
-
35
- const contradictions = db.prepare(
36
- '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'
37
- ).all();
38
-
39
- const consolidationRuns = db.prepare(
40
- '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'
41
- ).all().map(run => ({
42
- ...run,
43
- confidence_deltas: safeJsonParse(run.confidence_deltas, null),
44
- input_episode_ids: safeJsonParse(run.input_episode_ids, []),
45
- output_memory_ids: safeJsonParse(run.output_memory_ids, []),
46
- }));
47
-
48
- const consolidationMetrics = db.prepare(
49
- 'SELECT id, run_id, min_cluster_size, similarity_threshold, episodes_evaluated, clusters_found, principles_extracted, created_at FROM consolidation_metrics'
50
- ).all();
51
-
52
- const configRows = db.prepare('SELECT key, value FROM audrey_config').all();
53
- const config = Object.fromEntries(configRows.map(r => [r.key, r.value]));
54
-
55
- return {
56
- version: pkg.version,
57
- exportedAt: new Date().toISOString(),
58
- episodes,
59
- semantics,
60
- procedures,
61
- causalLinks,
62
- contradictions,
63
- consolidationRuns,
64
- consolidationMetrics,
65
- config,
66
- };
67
- }
package/src/forget.js DELETED
@@ -1,111 +0,0 @@
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 DELETED
@@ -1,245 +0,0 @@
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
- }
@@ -1,51 +0,0 @@
1
- export function interferenceModifier(interferenceCount, weight = 0.1) {
2
- return 1 / (1 + weight * interferenceCount);
3
- }
4
-
5
- export async function applyInterference(db, embeddingProvider, episodeId, { content }, config = {}) {
6
- const { enabled = true, k = 5, threshold = 0.6, weight = 0.1 } = config;
7
-
8
- if (!enabled) return [];
9
-
10
- const vector = await embeddingProvider.embed(content);
11
- const buffer = embeddingProvider.vectorToBuffer(vector);
12
-
13
- const semanticHits = db.prepare(`
14
- SELECT s.id, s.interference_count, (1.0 - v.distance) AS similarity
15
- FROM vec_semantics v
16
- JOIN semantics s ON s.id = v.id
17
- WHERE v.embedding MATCH ?
18
- AND k = ?
19
- AND (v.state = 'active' OR v.state = 'context_dependent')
20
- `).all(buffer, k);
21
-
22
- const proceduralHits = db.prepare(`
23
- SELECT p.id, p.interference_count, (1.0 - v.distance) AS similarity
24
- FROM vec_procedures v
25
- JOIN procedures p ON p.id = v.id
26
- WHERE v.embedding MATCH ?
27
- AND k = ?
28
- AND (v.state = 'active' OR v.state = 'context_dependent')
29
- `).all(buffer, k);
30
-
31
- const affected = [];
32
-
33
- const updateSemantic = db.prepare('UPDATE semantics SET interference_count = ? WHERE id = ?');
34
- const updateProcedural = db.prepare('UPDATE procedures SET interference_count = ? WHERE id = ?');
35
-
36
- for (const hit of semanticHits) {
37
- if (hit.similarity < threshold) continue;
38
- const newCount = hit.interference_count + 1;
39
- updateSemantic.run(newCount, hit.id);
40
- affected.push({ id: hit.id, type: 'semantic', newCount, similarity: hit.similarity });
41
- }
42
-
43
- for (const hit of proceduralHits) {
44
- if (hit.similarity < threshold) continue;
45
- const newCount = hit.interference_count + 1;
46
- updateProcedural.run(newCount, hit.id);
47
- affected.push({ id: hit.id, type: 'procedural', newCount, similarity: hit.similarity });
48
- }
49
-
50
- return affected;
51
- }
package/src/introspect.js DELETED
@@ -1,48 +0,0 @@
1
- import { safeJsonParse } from './utils.js';
2
-
3
- /**
4
- * @param {import('better-sqlite3').Database} db
5
- * @returns {{ episodic: number, semantic: number, procedural: number, causalLinks: number, dormant: number, contradictions: { open: number, resolved: number, context_dependent: number, reopened: number }, lastConsolidation: string|null, totalConsolidationRuns: number }}
6
- */
7
- export function introspect(db) {
8
- const counts = db.prepare(`
9
- SELECT
10
- (SELECT COUNT(*) FROM episodes) as episodic,
11
- (SELECT COUNT(*) FROM semantics WHERE state != 'rolled_back') as semantic,
12
- (SELECT COUNT(*) FROM procedures WHERE state != 'rolled_back') as procedural,
13
- (SELECT COUNT(*) FROM causal_links) as causal_links,
14
- (SELECT COUNT(*) FROM semantics WHERE state = 'dormant')
15
- + (SELECT COUNT(*) FROM procedures WHERE state = 'dormant') as dormant
16
- `).get();
17
-
18
- const contradictions = db.prepare(`
19
- SELECT
20
- SUM(CASE WHEN state = 'open' THEN 1 ELSE 0 END) as open,
21
- SUM(CASE WHEN state = 'resolved' THEN 1 ELSE 0 END) as resolved,
22
- SUM(CASE WHEN state = 'context_dependent' THEN 1 ELSE 0 END) as context_dependent,
23
- SUM(CASE WHEN state = 'reopened' THEN 1 ELSE 0 END) as reopened
24
- FROM contradictions
25
- `).get();
26
-
27
- const lastRun = db.prepare(`
28
- SELECT completed_at FROM consolidation_runs
29
- WHERE status = 'completed' ORDER BY completed_at DESC LIMIT 1
30
- `).get();
31
- const totalRuns = db.prepare('SELECT COUNT(*) as count FROM consolidation_runs').get().count;
32
-
33
- return {
34
- episodic: counts.episodic,
35
- semantic: counts.semantic,
36
- procedural: counts.procedural,
37
- causalLinks: counts.causal_links,
38
- dormant: counts.dormant,
39
- contradictions: {
40
- open: contradictions?.open || 0,
41
- resolved: contradictions?.resolved || 0,
42
- context_dependent: contradictions?.context_dependent || 0,
43
- reopened: contradictions?.reopened || 0,
44
- },
45
- lastConsolidation: lastRun?.completed_at || null,
46
- totalConsolidationRuns: totalRuns,
47
- };
48
- }