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,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
|
+
```
|
package/examples/stripe-demo.js
CHANGED
|
@@ -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.
|
|
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": "
|
|
6
|
+
"main": "dist/src/index.js",
|
|
7
|
+
"types": "dist/src/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
|
-
".":
|
|
10
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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": ">=
|
|
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
|
}
|
package/benchmarks/baselines.js
DELETED
|
@@ -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
|
-
}
|