audrey 0.17.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +129 -374
  2. package/dist/mcp-server/config.d.ts +20 -0
  3. package/dist/mcp-server/config.d.ts.map +1 -0
  4. package/dist/mcp-server/config.js +125 -0
  5. package/dist/mcp-server/config.js.map +1 -0
  6. package/dist/mcp-server/index.d.ts +100 -0
  7. package/dist/mcp-server/index.d.ts.map +1 -0
  8. package/dist/mcp-server/index.js +1113 -0
  9. package/dist/mcp-server/index.js.map +1 -0
  10. package/dist/src/adaptive.d.ts +7 -0
  11. package/dist/src/adaptive.d.ts.map +1 -0
  12. package/dist/src/adaptive.js +49 -0
  13. package/dist/src/adaptive.js.map +1 -0
  14. package/dist/src/affect.d.ts +19 -0
  15. package/dist/src/affect.d.ts.map +1 -0
  16. package/dist/src/affect.js +72 -0
  17. package/dist/src/affect.js.map +1 -0
  18. package/dist/src/audrey.d.ts +140 -0
  19. package/dist/src/audrey.d.ts.map +1 -0
  20. package/dist/src/audrey.js +564 -0
  21. package/dist/src/audrey.js.map +1 -0
  22. package/dist/src/capsule.d.ts +68 -0
  23. package/dist/src/capsule.d.ts.map +1 -0
  24. package/dist/src/capsule.js +311 -0
  25. package/dist/src/capsule.js.map +1 -0
  26. package/dist/src/causal.d.ts +28 -0
  27. package/dist/src/causal.d.ts.map +1 -0
  28. package/dist/src/causal.js +65 -0
  29. package/dist/src/causal.js.map +1 -0
  30. package/dist/src/confidence.d.ts +12 -0
  31. package/dist/src/confidence.d.ts.map +1 -0
  32. package/dist/src/confidence.js +63 -0
  33. package/dist/src/confidence.js.map +1 -0
  34. package/dist/src/consolidate.d.ts +8 -0
  35. package/dist/src/consolidate.d.ts.map +1 -0
  36. package/dist/src/consolidate.js +218 -0
  37. package/dist/src/consolidate.js.map +1 -0
  38. package/dist/src/context.d.ts +3 -0
  39. package/dist/src/context.d.ts.map +1 -0
  40. package/dist/src/context.js +19 -0
  41. package/dist/src/context.js.map +1 -0
  42. package/dist/src/db.d.ts +12 -0
  43. package/dist/src/db.d.ts.map +1 -0
  44. package/dist/src/db.js +380 -0
  45. package/dist/src/db.js.map +1 -0
  46. package/dist/src/decay.d.ts +7 -0
  47. package/dist/src/decay.d.ts.map +1 -0
  48. package/dist/src/decay.js +68 -0
  49. package/dist/src/decay.js.map +1 -0
  50. package/dist/src/embedding.d.ts +57 -0
  51. package/dist/src/embedding.d.ts.map +1 -0
  52. package/dist/src/embedding.js +254 -0
  53. package/dist/src/embedding.js.map +1 -0
  54. package/dist/src/encode.d.ts +15 -0
  55. package/dist/src/encode.d.ts.map +1 -0
  56. package/dist/src/encode.js +36 -0
  57. package/dist/src/encode.js.map +1 -0
  58. package/dist/src/events.d.ts +69 -0
  59. package/dist/src/events.d.ts.map +1 -0
  60. package/dist/src/events.js +149 -0
  61. package/dist/src/events.js.map +1 -0
  62. package/dist/src/export.d.ts +3 -0
  63. package/dist/src/export.d.ts.map +1 -0
  64. package/dist/src/export.js +46 -0
  65. package/dist/src/export.js.map +1 -0
  66. package/dist/src/forget.d.ts +11 -0
  67. package/dist/src/forget.d.ts.map +1 -0
  68. package/dist/src/forget.js +105 -0
  69. package/dist/src/forget.js.map +1 -0
  70. package/dist/src/fts.d.ts +34 -0
  71. package/dist/src/fts.d.ts.map +1 -0
  72. package/dist/src/fts.js +117 -0
  73. package/dist/src/fts.js.map +1 -0
  74. package/dist/src/hybrid-recall.d.ts +37 -0
  75. package/dist/src/hybrid-recall.d.ts.map +1 -0
  76. package/dist/src/hybrid-recall.js +213 -0
  77. package/dist/src/hybrid-recall.js.map +1 -0
  78. package/dist/src/import.d.ts +4 -0
  79. package/dist/src/import.d.ts.map +1 -0
  80. package/dist/src/import.js +127 -0
  81. package/dist/src/import.js.map +1 -0
  82. package/dist/src/index.d.ts +22 -0
  83. package/dist/src/index.d.ts.map +1 -0
  84. package/{src → dist/src}/index.js +5 -13
  85. package/dist/src/index.js.map +1 -0
  86. package/dist/src/interference.d.ts +13 -0
  87. package/dist/src/interference.d.ts.map +1 -0
  88. package/dist/src/interference.js +45 -0
  89. package/dist/src/interference.js.map +1 -0
  90. package/dist/src/introspect.d.ts +4 -0
  91. package/dist/src/introspect.d.ts.map +1 -0
  92. package/dist/src/introspect.js +40 -0
  93. package/dist/src/introspect.js.map +1 -0
  94. package/dist/src/llm.d.ts +38 -0
  95. package/dist/src/llm.d.ts.map +1 -0
  96. package/dist/src/llm.js +167 -0
  97. package/dist/src/llm.js.map +1 -0
  98. package/dist/src/migrate.d.ts +6 -0
  99. package/dist/src/migrate.d.ts.map +1 -0
  100. package/dist/src/migrate.js +51 -0
  101. package/dist/src/migrate.js.map +1 -0
  102. package/dist/src/promote.d.ts +40 -0
  103. package/dist/src/promote.d.ts.map +1 -0
  104. package/dist/src/promote.js +200 -0
  105. package/dist/src/promote.js.map +1 -0
  106. package/dist/src/prompts.d.ts +16 -0
  107. package/dist/src/prompts.d.ts.map +1 -0
  108. package/{src → dist/src}/prompts.js +172 -203
  109. package/dist/src/prompts.js.map +1 -0
  110. package/dist/src/recall.d.ts +9 -0
  111. package/dist/src/recall.d.ts.map +1 -0
  112. package/dist/src/recall.js +432 -0
  113. package/dist/src/recall.js.map +1 -0
  114. package/dist/src/redact.d.ts +27 -0
  115. package/dist/src/redact.d.ts.map +1 -0
  116. package/dist/src/redact.js +228 -0
  117. package/dist/src/redact.js.map +1 -0
  118. package/dist/src/rollback.d.ts +8 -0
  119. package/dist/src/rollback.d.ts.map +1 -0
  120. package/dist/src/rollback.js +33 -0
  121. package/dist/src/rollback.js.map +1 -0
  122. package/dist/src/routes.d.ts +7 -0
  123. package/dist/src/routes.d.ts.map +1 -0
  124. package/dist/src/routes.js +226 -0
  125. package/dist/src/routes.js.map +1 -0
  126. package/dist/src/rules-compiler.d.ts +20 -0
  127. package/dist/src/rules-compiler.d.ts.map +1 -0
  128. package/dist/src/rules-compiler.js +143 -0
  129. package/dist/src/rules-compiler.js.map +1 -0
  130. package/dist/src/server.d.ts +12 -0
  131. package/dist/src/server.d.ts.map +1 -0
  132. package/dist/src/server.js +22 -0
  133. package/dist/src/server.js.map +1 -0
  134. package/dist/src/tool-trace.d.ts +37 -0
  135. package/dist/src/tool-trace.d.ts.map +1 -0
  136. package/dist/src/tool-trace.js +142 -0
  137. package/dist/src/tool-trace.js.map +1 -0
  138. package/dist/src/types.d.ts +446 -0
  139. package/dist/src/types.d.ts.map +1 -0
  140. package/dist/src/types.js +6 -0
  141. package/dist/src/types.js.map +1 -0
  142. package/dist/src/ulid.d.ts +3 -0
  143. package/dist/src/ulid.d.ts.map +1 -0
  144. package/dist/src/ulid.js +11 -0
  145. package/dist/src/ulid.js.map +1 -0
  146. package/dist/src/utils.d.ts +10 -0
  147. package/dist/src/utils.d.ts.map +1 -0
  148. package/dist/src/utils.js +41 -0
  149. package/dist/src/utils.js.map +1 -0
  150. package/dist/src/validate.d.ts +22 -0
  151. package/dist/src/validate.d.ts.map +1 -0
  152. package/dist/src/validate.js +109 -0
  153. package/dist/src/validate.js.map +1 -0
  154. package/docs/production-readiness.md +28 -0
  155. package/examples/fintech-ops-demo.js +1 -1
  156. package/examples/healthcare-ops-demo.js +1 -1
  157. package/examples/stripe-demo.js +1 -1
  158. package/package.json +34 -13
  159. package/benchmarks/baselines.js +0 -169
  160. package/benchmarks/cases.js +0 -421
  161. package/benchmarks/reference-results.js +0 -70
  162. package/benchmarks/report.js +0 -255
  163. package/benchmarks/run.js +0 -514
  164. package/mcp-server/config.js +0 -133
  165. package/mcp-server/index.js +0 -1265
  166. package/mcp-server/serve.js +0 -482
  167. package/src/adaptive.js +0 -53
  168. package/src/affect.js +0 -64
  169. package/src/audrey.js +0 -642
  170. package/src/causal.js +0 -95
  171. package/src/confidence.js +0 -120
  172. package/src/consolidate.js +0 -281
  173. package/src/context.js +0 -15
  174. package/src/db.js +0 -391
  175. package/src/decay.js +0 -84
  176. package/src/embedding.js +0 -260
  177. package/src/encode.js +0 -69
  178. package/src/export.js +0 -67
  179. package/src/forget.js +0 -111
  180. package/src/fts.js +0 -134
  181. package/src/import.js +0 -273
  182. package/src/interference.js +0 -51
  183. package/src/introspect.js +0 -48
  184. package/src/llm.js +0 -249
  185. package/src/migrate.js +0 -58
  186. package/src/recall.js +0 -573
  187. package/src/rollback.js +0 -42
  188. package/src/ulid.js +0 -18
  189. package/src/utils.js +0 -63
  190. package/src/validate.js +0 -172
  191. package/types/index.d.ts +0 -434
@@ -0,0 +1,109 @@
1
+ import { generateId } from './ulid.js';
2
+ import { safeJsonParse } from './utils.js';
3
+ import { buildContradictionDetectionPrompt } from './prompts.js';
4
+ const REINFORCEMENT_THRESHOLD = 0.85;
5
+ const CONTRADICTION_THRESHOLD = 0.60;
6
+ export async function validateMemory(db, embeddingProvider, episode, options = {}) {
7
+ const { threshold = REINFORCEMENT_THRESHOLD, contradictionThreshold = CONTRADICTION_THRESHOLD, llmProvider, } = options;
8
+ const episodeVector = await embeddingProvider.embed(episode.content);
9
+ const episodeBuffer = embeddingProvider.vectorToBuffer(episodeVector);
10
+ const nearestSemantic = db.prepare(`
11
+ SELECT s.*, (1.0 - v.distance) AS similarity
12
+ FROM vec_semantics v
13
+ JOIN semantics s ON s.id = v.id
14
+ WHERE v.embedding MATCH ?
15
+ AND k = 1
16
+ AND (v.state = 'active' OR v.state = 'context_dependent')
17
+ `).get(episodeBuffer);
18
+ let bestMatch = null;
19
+ let bestSimilarity = 0;
20
+ if (nearestSemantic) {
21
+ bestMatch = nearestSemantic;
22
+ bestSimilarity = nearestSemantic.similarity;
23
+ }
24
+ if (bestMatch && bestSimilarity >= threshold) {
25
+ const evidenceIds = safeJsonParse(bestMatch.evidence_episode_ids, []);
26
+ if (!evidenceIds.includes(episode.id)) {
27
+ evidenceIds.push(episode.id);
28
+ }
29
+ const diversity = computeSourceDiversity(db, evidenceIds, episode);
30
+ const now = new Date().toISOString();
31
+ db.prepare(`
32
+ UPDATE semantics SET
33
+ supporting_count = supporting_count + 1,
34
+ evidence_episode_ids = ?,
35
+ evidence_count = ?,
36
+ source_type_diversity = ?,
37
+ last_reinforced_at = ?
38
+ WHERE id = ?
39
+ `).run(JSON.stringify(evidenceIds), evidenceIds.length, diversity, now, bestMatch.id);
40
+ return {
41
+ action: 'reinforced',
42
+ semanticId: bestMatch.id,
43
+ similarity: bestSimilarity,
44
+ };
45
+ }
46
+ if (bestMatch && bestSimilarity >= contradictionThreshold && llmProvider) {
47
+ const messages = buildContradictionDetectionPrompt(episode.content, bestMatch.content);
48
+ const verdict = await llmProvider.json(messages);
49
+ if (verdict.contradicts) {
50
+ const resolution = verdict.resolution === 'context_dependent'
51
+ ? { type: 'context_dependent', conditions: verdict.conditions, explanation: verdict.explanation }
52
+ : verdict.resolution
53
+ ? { type: verdict.resolution, explanation: verdict.explanation }
54
+ : null;
55
+ const contradictionId = createContradiction(db, bestMatch.id, 'semantic', episode.id, 'episodic', resolution);
56
+ if (verdict.resolution === 'new_wins') {
57
+ db.prepare("UPDATE semantics SET state = 'disputed' WHERE id = ?").run(bestMatch.id);
58
+ }
59
+ else if (verdict.resolution === 'context_dependent' && verdict.conditions) {
60
+ db.prepare("UPDATE semantics SET state = 'context_dependent', conditions = ? WHERE id = ?")
61
+ .run(JSON.stringify(verdict.conditions), bestMatch.id);
62
+ }
63
+ return {
64
+ action: 'contradiction',
65
+ contradictionId,
66
+ semanticId: bestMatch.id,
67
+ similarity: bestSimilarity,
68
+ resolution: verdict.resolution || null,
69
+ };
70
+ }
71
+ }
72
+ return { action: 'none' };
73
+ }
74
+ function computeSourceDiversity(db, evidenceIds, currentEpisode) {
75
+ const sourceTypes = new Set();
76
+ sourceTypes.add(currentEpisode.source);
77
+ if (evidenceIds.length > 0) {
78
+ const placeholders = evidenceIds.map(() => '?').join(',');
79
+ const rows = db.prepare(`SELECT DISTINCT source FROM episodes WHERE id IN (${placeholders})`).all(...evidenceIds);
80
+ for (const row of rows) {
81
+ sourceTypes.add(row.source);
82
+ }
83
+ }
84
+ return sourceTypes.size;
85
+ }
86
+ export function createContradiction(db, claimAId, claimAType, claimBId, claimBType, resolution) {
87
+ const id = generateId();
88
+ const now = new Date().toISOString();
89
+ const state = resolution ? 'resolved' : 'open';
90
+ const resolvedAt = resolution ? now : null;
91
+ const resolutionJson = resolution ? JSON.stringify(resolution) : null;
92
+ db.prepare(`
93
+ INSERT INTO contradictions (id, claim_a_id, claim_a_type, claim_b_id, claim_b_type,
94
+ state, resolution, resolved_at, created_at)
95
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
96
+ `).run(id, claimAId, claimAType, claimBId, claimBType, state, resolutionJson, resolvedAt, now);
97
+ return id;
98
+ }
99
+ export function reopenContradiction(db, contradictionId, newEvidenceId) {
100
+ const now = new Date().toISOString();
101
+ db.prepare(`
102
+ UPDATE contradictions SET
103
+ state = 'reopened',
104
+ reopen_evidence_id = ?,
105
+ reopened_at = ?
106
+ WHERE id = ?
107
+ `).run(newEvidenceId, now, contradictionId);
108
+ }
109
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@
2
2
 
3
3
  Audrey is ready to be the memory layer inside a production agent system, but it is not a complete regulated-platform package by itself. Treat it as stateful infrastructure: pin providers, isolate tenants, monitor health, and wrap it with the controls your environment requires.
4
4
 
5
+ First contact should now go through `npx audrey init sidecar-prod` for the sidecar path or `npx audrey init` for the default Claude Code path, then `npx audrey doctor` before exposing Audrey to real traffic.
6
+
5
7
  ## Best Vertical Fit
6
8
 
7
9
  ### 1. Financial Services Operations
@@ -94,3 +96,29 @@ Use Audrey as a local sidecar to the agent service:
94
96
  - Regulated-data filtering handled before `memory_encode`
95
97
 
96
98
  That keeps Audrey focused on memory integrity while the host system owns compliance, tenancy, and transport security.
99
+
100
+ ## Docker Deployment
101
+
102
+ Audrey now ships with a first-party container path for the REST API:
103
+
104
+ ```bash
105
+ npx audrey init sidecar-prod
106
+ docker compose up -d --build
107
+ ```
108
+
109
+ Operational notes:
110
+
111
+ - The container persists SQLite data in the named volume `audrey-data`.
112
+ - Set `AUDREY_API_KEY` before exposing the service beyond localhost.
113
+ - For CI or very fast smoke checks, prefer `AUDREY_EMBEDDING_PROVIDER=mock` and `AUDREY_LLM_PROVIDER=mock`.
114
+ - For stable local/offline container use, keep `AUDREY_EMBEDDING_PROVIDER=local` and `AUDREY_DEVICE=cpu`.
115
+ - If you map the service to a different host port, keep the container port at `3487`.
116
+
117
+ Suggested smoke check:
118
+
119
+ ```bash
120
+ AUDREY_API_KEY=secret docker compose up -d --build
121
+ curl -H "Authorization: Bearer secret" http://localhost:3487/health
122
+ curl -H "Authorization: Bearer secret" http://localhost:3487/status
123
+ docker compose logs --tail=100 audrey
124
+ ```
@@ -1,4 +1,4 @@
1
- import { Audrey } from '../src/index.js';
1
+ import { Audrey } from '../dist/src/index.js';
2
2
 
3
3
  async function demo() {
4
4
  console.log('=== Audrey Demo: Financial Services Operations ===\n');
@@ -1,4 +1,4 @@
1
- import { Audrey } from '../src/index.js';
1
+ import { Audrey } from '../dist/src/index.js';
2
2
 
3
3
  async function demo() {
4
4
  console.log('=== Audrey Demo: Healthcare Operations ===\n');
@@ -5,7 +5,7 @@
5
5
  // Run: node examples/stripe-demo.js
6
6
  // No external dependencies required (uses mock embeddings).
7
7
 
8
- import { Audrey } from '../src/index.js';
8
+ import { Audrey } from '../dist/src/index.js';
9
9
 
10
10
  async function demo() {
11
11
  console.log('=== Audrey Demo: Stripe Rate Limit Learning ===\n');
package/package.json CHANGED
@@ -1,33 +1,44 @@
1
1
  {
2
2
  "name": "audrey",
3
- "version": "0.17.0",
3
+ "version": "0.20.0",
4
4
  "description": "Biological memory architecture for AI agents - encode, consolidate, and recall memories with confidence decay, contradiction detection, and causal graphs",
5
5
  "type": "module",
6
- "main": "src/index.js",
7
- "types": "types/index.d.ts",
6
+ "main": "dist/src/index.js",
7
+ "types": "dist/src/index.d.ts",
8
8
  "exports": {
9
- ".": "./src/index.js",
10
- "./mcp": "./mcp-server/index.js"
9
+ ".": {
10
+ "types": "./dist/src/index.d.ts",
11
+ "default": "./dist/src/index.js"
12
+ },
13
+ "./mcp": {
14
+ "types": "./dist/mcp-server/index.d.ts",
15
+ "default": "./dist/mcp-server/index.js"
16
+ },
17
+ "./server": {
18
+ "types": "./dist/src/server.d.ts",
19
+ "default": "./dist/src/server.js"
20
+ }
11
21
  },
12
22
  "bin": {
13
- "audrey": "mcp-server/index.js",
14
- "audrey-mcp": "mcp-server/index.js"
23
+ "audrey": "dist/mcp-server/index.js",
24
+ "audrey-mcp": "dist/mcp-server/index.js"
15
25
  },
16
26
  "files": [
17
- "src/",
18
- "mcp-server/",
19
- "benchmarks/*.js",
27
+ "dist/",
20
28
  "docs/production-readiness.md",
21
29
  "docs/benchmarking.md",
22
30
  "docs/assets/benchmarks/",
23
31
  "examples/",
24
- "types/",
25
32
  "README.md",
26
33
  "LICENSE"
27
34
  ],
28
35
  "scripts": {
36
+ "build": "tsc",
37
+ "prebuild": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
38
+ "pretest": "npm run build",
29
39
  "test": "vitest run",
30
40
  "test:watch": "vitest",
41
+ "prepack": "npm run build",
31
42
  "pack:check": "npm pack --dry-run",
32
43
  "bench:memory": "node benchmarks/run.js",
33
44
  "bench:memory:retrieval": "node benchmarks/run.js --suite retrieval",
@@ -35,7 +46,12 @@
35
46
  "bench:memory:json": "node benchmarks/run.js --json",
36
47
  "bench:memory:check": "node benchmarks/run.js --check",
37
48
  "bench:memory:readme-assets": "node benchmarks/run.js --readme-assets-dir docs/assets/benchmarks",
38
- "serve": "node mcp-server/index.js serve"
49
+ "typecheck": "tsc --noEmit",
50
+ "serve": "node dist/mcp-server/index.js serve",
51
+ "docker:build": "docker build -t audrey:local .",
52
+ "docker:up": "docker compose up -d --build",
53
+ "docker:down": "docker compose down",
54
+ "docker:logs": "docker compose logs -f audrey"
39
55
  },
40
56
  "keywords": [
41
57
  "ai",
@@ -78,18 +94,23 @@
78
94
  },
79
95
  "author": "evilander",
80
96
  "engines": {
81
- "node": ">=18"
97
+ "node": ">=20"
82
98
  },
83
99
  "license": "MIT",
84
100
  "dependencies": {
101
+ "@hono/node-server": "^1.19.13",
85
102
  "@huggingface/transformers": "^3.8.1",
86
103
  "@modelcontextprotocol/sdk": "^1.26.0",
87
104
  "better-sqlite3": "^12.6.2",
105
+ "hono": "^4.12.12",
88
106
  "sqlite-vec": "^0.1.7-alpha.2",
89
107
  "ulid": "^3.0.2",
90
108
  "zod": "^4.3.6"
91
109
  },
92
110
  "devDependencies": {
111
+ "@types/better-sqlite3": "^7.6.13",
112
+ "@types/node": "^25.6.0",
113
+ "typescript": "^6.0.2",
93
114
  "vitest": "^4.0.18"
94
115
  }
95
116
  }
@@ -1,169 +0,0 @@
1
- import { createEmbeddingProvider } from '../src/embedding.js';
2
- import { cosineSimilarity } from '../src/utils.js';
3
-
4
- function normalize(text) {
5
- return String(text || '').toLowerCase();
6
- }
7
-
8
- function tokenize(text) {
9
- return normalize(text)
10
- .replace(/[^a-z0-9]+/g, ' ')
11
- .trim()
12
- .split(/\s+/)
13
- .filter(Boolean);
14
- }
15
-
16
- function keywordScore(queryTokens, content) {
17
- const contentTokens = new Set(tokenize(content));
18
- if (queryTokens.length === 0) return 0;
19
- let matches = 0;
20
- for (const token of queryTokens) {
21
- if (contentTokens.has(token)) matches++;
22
- }
23
- return matches / queryTokens.length;
24
- }
25
-
26
- function sortByScore(rows) {
27
- return rows
28
- .filter(row => Number.isFinite(row.score))
29
- .sort((a, b) => b.score - a.score || String(b.createdAt || '').localeCompare(String(a.createdAt || '')));
30
- }
31
-
32
- function flattenMemories(benchmarkCase, ids = []) {
33
- return benchmarkCase.memory.map((memory, index) => ({
34
- id: ids[index] || `memory-${index + 1}`,
35
- content: memory.content,
36
- source: memory.source,
37
- createdAt: memory.createdAt || new Date(Date.UTC(2026, 0, index + 1)).toISOString(),
38
- private: Boolean(memory.private),
39
- }));
40
- }
41
-
42
- function buildSyntheticCase(query, memories, options = {}) {
43
- return {
44
- query,
45
- memory: memories.map(memory => ({
46
- content: memory.content,
47
- source: memory.source,
48
- createdAt: memory.createdAt,
49
- private: memory.private,
50
- })),
51
- options,
52
- };
53
- }
54
-
55
- async function runBaselineRetrieval(system, syntheticCase, providerConfig, limit = 5) {
56
- switch (system) {
57
- case 'Vector Only':
58
- return runVectorOnlyBaseline(syntheticCase, providerConfig, limit);
59
- case 'Keyword + Recency':
60
- return runKeywordRecencyBaseline(syntheticCase, limit);
61
- case 'Recent Window':
62
- return runRecentWindowBaseline(syntheticCase, limit);
63
- default:
64
- throw new Error(`Unknown baseline system: ${system}`);
65
- }
66
- }
67
-
68
- function createOperationMemory(state, step) {
69
- const index = state.counter++;
70
- return {
71
- id: `memory-${index + 1}`,
72
- content: step.memory.content,
73
- source: step.memory.source,
74
- createdAt: step.memory.createdAt || new Date(Date.UTC(2026, 0, index + 1)).toISOString(),
75
- private: Boolean(step.memory.private),
76
- };
77
- }
78
-
79
- async function applyBaselineStep(system, state, step, providerConfig) {
80
- if (step.type === 'encode') {
81
- const memory = createOperationMemory(state, step);
82
- state.memories.push(memory);
83
- if (step.saveAs) {
84
- state.aliases.set(step.saveAs, memory.id);
85
- }
86
- return;
87
- }
88
-
89
- if (step.type === 'forgetByQuery') {
90
- const syntheticCase = buildSyntheticCase(step.query, state.memories, step.options);
91
- const [match] = await runBaselineRetrieval(system, syntheticCase, providerConfig, 1);
92
- if (match && Number.isFinite(match.score) && match.score > 0) {
93
- state.memories = state.memories.filter(memory => memory.id !== match.id);
94
- }
95
- return;
96
- }
97
-
98
- if (step.type === 'consolidate') {
99
- return;
100
- }
101
-
102
- throw new Error(`Unsupported baseline step: ${step.type}`);
103
- }
104
-
105
- export async function runBaselineScenario(system, benchmarkCase, providerConfig, limit = 5) {
106
- if (benchmarkCase.kind !== 'operations') {
107
- return runBaselineRetrieval(system, benchmarkCase, providerConfig, limit);
108
- }
109
-
110
- const state = {
111
- counter: 0,
112
- memories: [],
113
- aliases: new Map(),
114
- };
115
-
116
- for (const step of benchmarkCase.steps || []) {
117
- await applyBaselineStep(system, state, step, providerConfig);
118
- }
119
-
120
- return runBaselineRetrieval(
121
- system,
122
- buildSyntheticCase(benchmarkCase.query, state.memories, benchmarkCase.options),
123
- providerConfig,
124
- limit,
125
- );
126
- }
127
-
128
- export function runKeywordRecencyBaseline(benchmarkCase, limit = 5) {
129
- const queryTokens = tokenize(benchmarkCase.query);
130
- return sortByScore(flattenMemories(benchmarkCase).map(memory => ({
131
- ...memory,
132
- type: 'episodic',
133
- score: keywordScore(queryTokens, memory.content),
134
- }))).slice(0, limit);
135
- }
136
-
137
- export function runRecentWindowBaseline(benchmarkCase, limit = 3) {
138
- return flattenMemories(benchmarkCase)
139
- .sort((a, b) => String(b.createdAt).localeCompare(String(a.createdAt)))
140
- .slice(0, limit)
141
- .map((memory, index) => ({
142
- ...memory,
143
- type: 'episodic',
144
- score: 1 - index * 0.1,
145
- }));
146
- }
147
-
148
- export async function runVectorOnlyBaseline(benchmarkCase, providerConfig, limit = 5) {
149
- const provider = createEmbeddingProvider(providerConfig);
150
- if (typeof provider.ready === 'function') {
151
- await provider.ready();
152
- }
153
-
154
- const queryVector = await provider.embed(benchmarkCase.query);
155
- const queryBuffer = provider.vectorToBuffer(queryVector);
156
-
157
- const rows = [];
158
- for (const memory of flattenMemories(benchmarkCase)) {
159
- const vector = await provider.embed(memory.content);
160
- const score = cosineSimilarity(queryBuffer, provider.vectorToBuffer(vector), provider);
161
- rows.push({
162
- ...memory,
163
- type: 'episodic',
164
- score,
165
- });
166
- }
167
-
168
- return sortByScore(rows).slice(0, limit);
169
- }