agentdb 1.0.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 +38 -0
- package/LICENSE-APACHE +190 -0
- package/LICENSE-MIT +21 -0
- package/README.md +953 -0
- package/bin/agentdb.js +485 -0
- package/bin/plugin-cli-wrapper.mjs +21 -0
- package/dist/cache/query-cache.d.ts +105 -0
- package/dist/cache/query-cache.d.ts.map +1 -0
- package/dist/cache/query-cache.js +224 -0
- package/dist/cache/query-cache.js.map +1 -0
- package/dist/cache/query-cache.mjs +219 -0
- package/dist/cli/cache/query-cache.d.ts +104 -0
- package/dist/cli/cache/query-cache.js +244 -0
- package/dist/cli/cli/db-commands.d.ts +48 -0
- package/dist/cli/cli/db-commands.js +613 -0
- package/dist/cli/commands.d.ts +7 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +113 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/commands.mjs +104 -0
- package/dist/cli/core/backend-interface.d.ts +70 -0
- package/dist/cli/core/backend-interface.js +15 -0
- package/dist/cli/core/native-backend.d.ts +140 -0
- package/dist/cli/core/native-backend.js +432 -0
- package/dist/cli/core/vector-db.d.ts +126 -0
- package/dist/cli/core/vector-db.js +338 -0
- package/dist/cli/core/wasm-backend.d.ts +95 -0
- package/dist/cli/core/wasm-backend.js +418 -0
- package/dist/cli/db-commands.d.ts +49 -0
- package/dist/cli/db-commands.d.ts.map +1 -0
- package/dist/cli/db-commands.js +533 -0
- package/dist/cli/db-commands.js.map +1 -0
- package/dist/cli/db-commands.mjs +522 -0
- package/dist/cli/generator.d.ts +11 -0
- package/dist/cli/generator.d.ts.map +1 -0
- package/dist/cli/generator.js +567 -0
- package/dist/cli/generator.js.map +1 -0
- package/dist/cli/generator.mjs +527 -0
- package/dist/cli/help.d.ts +18 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +676 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/help.mjs +667 -0
- package/dist/cli/index/hnsw.d.ts +164 -0
- package/dist/cli/index/hnsw.js +558 -0
- package/dist/cli/plugin-cli.d.ts +7 -0
- package/dist/cli/plugin-cli.d.ts.map +1 -0
- package/dist/cli/plugin-cli.js +295 -0
- package/dist/cli/plugin-cli.js.map +1 -0
- package/dist/cli/plugin-cli.mjs +289 -0
- package/dist/cli/quantization/product-quantization.d.ts +108 -0
- package/dist/cli/quantization/product-quantization.js +350 -0
- package/dist/cli/query/query-builder.d.ts +322 -0
- package/dist/cli/query/query-builder.js +600 -0
- package/dist/cli/templates.d.ts +14 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +182 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/cli/templates.mjs +176 -0
- package/dist/cli/types/index.d.ts +116 -0
- package/dist/cli/types/index.js +5 -0
- package/dist/cli/types.d.ts +91 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +6 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/types.mjs +4 -0
- package/dist/cli/wizard/index.d.ts +6 -0
- package/dist/cli/wizard/index.d.ts.map +1 -0
- package/dist/cli/wizard/index.js +138 -0
- package/dist/cli/wizard/index.js.map +1 -0
- package/dist/cli/wizard/index.mjs +131 -0
- package/dist/cli/wizard/prompts.d.ts +11 -0
- package/dist/cli/wizard/prompts.d.ts.map +1 -0
- package/dist/cli/wizard/prompts.js +482 -0
- package/dist/cli/wizard/prompts.js.map +1 -0
- package/dist/cli/wizard/prompts.mjs +470 -0
- package/dist/cli/wizard/validator.d.ts +13 -0
- package/dist/cli/wizard/validator.d.ts.map +1 -0
- package/dist/cli/wizard/validator.js +234 -0
- package/dist/cli/wizard/validator.js.map +1 -0
- package/dist/cli/wizard/validator.mjs +224 -0
- package/dist/core/backend-interface.d.ts +71 -0
- package/dist/core/backend-interface.d.ts.map +1 -0
- package/dist/core/backend-interface.js +16 -0
- package/dist/core/backend-interface.js.map +1 -0
- package/dist/core/backend-interface.mjs +12 -0
- package/dist/core/native-backend.d.ts +141 -0
- package/dist/core/native-backend.d.ts.map +1 -0
- package/dist/core/native-backend.js +457 -0
- package/dist/core/native-backend.js.map +1 -0
- package/dist/core/native-backend.mjs +449 -0
- package/dist/core/vector-db.d.ts +127 -0
- package/dist/core/vector-db.d.ts.map +1 -0
- package/dist/core/vector-db.js +266 -0
- package/dist/core/vector-db.js.map +1 -0
- package/dist/core/vector-db.mjs +261 -0
- package/dist/core/wasm-backend.d.ts +96 -0
- package/dist/core/wasm-backend.d.ts.map +1 -0
- package/dist/core/wasm-backend.js +393 -0
- package/dist/core/wasm-backend.js.map +1 -0
- package/dist/core/wasm-backend.mjs +385 -0
- package/dist/index/hnsw-optimized.d.ts +75 -0
- package/dist/index/hnsw-optimized.d.ts.map +1 -0
- package/dist/index/hnsw-optimized.js +412 -0
- package/dist/index/hnsw-optimized.js.map +1 -0
- package/dist/index/hnsw-optimized.mjs +407 -0
- package/dist/index/hnsw.d.ts +165 -0
- package/dist/index/hnsw.d.ts.map +1 -0
- package/dist/index/hnsw.js +521 -0
- package/dist/index/hnsw.js.map +1 -0
- package/dist/index/hnsw.mjs +516 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +63 -0
- package/dist/mcp-server.d.ts +27 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +789 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-server.mjs +784 -0
- package/dist/plugins/base-plugin.d.ts +114 -0
- package/dist/plugins/base-plugin.d.ts.map +1 -0
- package/dist/plugins/base-plugin.js +313 -0
- package/dist/plugins/base-plugin.js.map +1 -0
- package/dist/plugins/base-plugin.mjs +275 -0
- package/dist/plugins/implementations/active-learning.d.ts +135 -0
- package/dist/plugins/implementations/active-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/active-learning.js +372 -0
- package/dist/plugins/implementations/active-learning.js.map +1 -0
- package/dist/plugins/implementations/active-learning.mjs +367 -0
- package/dist/plugins/implementations/actor-critic.d.ts +64 -0
- package/dist/plugins/implementations/actor-critic.d.ts.map +1 -0
- package/dist/plugins/implementations/actor-critic.js +363 -0
- package/dist/plugins/implementations/actor-critic.js.map +1 -0
- package/dist/plugins/implementations/actor-critic.mjs +358 -0
- package/dist/plugins/implementations/adversarial-training.d.ts +133 -0
- package/dist/plugins/implementations/adversarial-training.d.ts.map +1 -0
- package/dist/plugins/implementations/adversarial-training.js +409 -0
- package/dist/plugins/implementations/adversarial-training.js.map +1 -0
- package/dist/plugins/implementations/adversarial-training.mjs +404 -0
- package/dist/plugins/implementations/curriculum-learning.d.ts +132 -0
- package/dist/plugins/implementations/curriculum-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/curriculum-learning.js +354 -0
- package/dist/plugins/implementations/curriculum-learning.js.map +1 -0
- package/dist/plugins/implementations/curriculum-learning.mjs +349 -0
- package/dist/plugins/implementations/decision-transformer.d.ts +77 -0
- package/dist/plugins/implementations/decision-transformer.d.ts.map +1 -0
- package/dist/plugins/implementations/decision-transformer.js +422 -0
- package/dist/plugins/implementations/decision-transformer.js.map +1 -0
- package/dist/plugins/implementations/decision-transformer.mjs +417 -0
- package/dist/plugins/implementations/federated-learning.d.ts +126 -0
- package/dist/plugins/implementations/federated-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/federated-learning.js +436 -0
- package/dist/plugins/implementations/federated-learning.js.map +1 -0
- package/dist/plugins/implementations/federated-learning.mjs +431 -0
- package/dist/plugins/implementations/index.d.ts +30 -0
- package/dist/plugins/implementations/index.d.ts.map +1 -0
- package/dist/plugins/implementations/index.js +45 -0
- package/dist/plugins/implementations/index.js.map +1 -0
- package/dist/plugins/implementations/index.mjs +31 -0
- package/dist/plugins/implementations/multi-task-learning.d.ts +115 -0
- package/dist/plugins/implementations/multi-task-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/multi-task-learning.js +369 -0
- package/dist/plugins/implementations/multi-task-learning.js.map +1 -0
- package/dist/plugins/implementations/multi-task-learning.mjs +364 -0
- package/dist/plugins/implementations/neural-architecture-search.d.ts +148 -0
- package/dist/plugins/implementations/neural-architecture-search.d.ts.map +1 -0
- package/dist/plugins/implementations/neural-architecture-search.js +379 -0
- package/dist/plugins/implementations/neural-architecture-search.js.map +1 -0
- package/dist/plugins/implementations/neural-architecture-search.mjs +374 -0
- package/dist/plugins/implementations/q-learning.d.ts +98 -0
- package/dist/plugins/implementations/q-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/q-learning.js +435 -0
- package/dist/plugins/implementations/q-learning.js.map +1 -0
- package/dist/plugins/implementations/q-learning.mjs +430 -0
- package/dist/plugins/implementations/sarsa.d.ts +103 -0
- package/dist/plugins/implementations/sarsa.d.ts.map +1 -0
- package/dist/plugins/implementations/sarsa.js +347 -0
- package/dist/plugins/implementations/sarsa.js.map +1 -0
- package/dist/plugins/implementations/sarsa.mjs +342 -0
- package/dist/plugins/index.d.ts +107 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +179 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/index.mjs +168 -0
- package/dist/plugins/interface.d.ts +439 -0
- package/dist/plugins/interface.d.ts.map +1 -0
- package/dist/plugins/interface.js +12 -0
- package/dist/plugins/interface.js.map +1 -0
- package/dist/plugins/interface.mjs +10 -0
- package/dist/plugins/learning-plugin.interface.d.ts +257 -0
- package/dist/plugins/learning-plugin.interface.d.ts.map +1 -0
- package/dist/plugins/learning-plugin.interface.js +7 -0
- package/dist/plugins/learning-plugin.interface.js.map +1 -0
- package/dist/plugins/learning-plugin.interface.mjs +5 -0
- package/dist/plugins/plugin-exports.d.ts +71 -0
- package/dist/plugins/plugin-exports.d.ts.map +1 -0
- package/dist/plugins/plugin-exports.js +78 -0
- package/dist/plugins/plugin-exports.js.map +1 -0
- package/dist/plugins/plugin-exports.mjs +69 -0
- package/dist/plugins/registry.d.ts +206 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +365 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/registry.mjs +356 -0
- package/dist/plugins/validator.d.ts +63 -0
- package/dist/plugins/validator.d.ts.map +1 -0
- package/dist/plugins/validator.js +464 -0
- package/dist/plugins/validator.js.map +1 -0
- package/dist/plugins/validator.mjs +458 -0
- package/dist/quantization/binary-quantization.d.ts +104 -0
- package/dist/quantization/binary-quantization.d.ts.map +1 -0
- package/dist/quantization/binary-quantization.js +246 -0
- package/dist/quantization/binary-quantization.js.map +1 -0
- package/dist/quantization/binary-quantization.mjs +240 -0
- package/dist/quantization/optimized-pq.d.ts +138 -0
- package/dist/quantization/optimized-pq.d.ts.map +1 -0
- package/dist/quantization/optimized-pq.js +320 -0
- package/dist/quantization/optimized-pq.js.map +1 -0
- package/dist/quantization/optimized-pq.mjs +313 -0
- package/dist/quantization/product-quantization.d.ts +109 -0
- package/dist/quantization/product-quantization.d.ts.map +1 -0
- package/dist/quantization/product-quantization.js +287 -0
- package/dist/quantization/product-quantization.js.map +1 -0
- package/dist/quantization/product-quantization.mjs +282 -0
- package/dist/quantization/scalar-quantization.d.ts +100 -0
- package/dist/quantization/scalar-quantization.d.ts.map +1 -0
- package/dist/quantization/scalar-quantization.js +324 -0
- package/dist/quantization/scalar-quantization.js.map +1 -0
- package/dist/quantization/scalar-quantization.mjs +319 -0
- package/dist/query/index.d.ts +6 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +9 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/index.mjs +4 -0
- package/dist/query/query-builder.d.ts +323 -0
- package/dist/query/query-builder.d.ts.map +1 -0
- package/dist/query/query-builder.js +524 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-builder.mjs +519 -0
- package/dist/reasoning/context-synthesizer.d.ts +57 -0
- package/dist/reasoning/context-synthesizer.d.ts.map +1 -0
- package/dist/reasoning/context-synthesizer.js +224 -0
- package/dist/reasoning/context-synthesizer.js.map +1 -0
- package/dist/reasoning/context-synthesizer.mjs +219 -0
- package/dist/reasoning/experience-curator.d.ts +66 -0
- package/dist/reasoning/experience-curator.d.ts.map +1 -0
- package/dist/reasoning/experience-curator.js +288 -0
- package/dist/reasoning/experience-curator.js.map +1 -0
- package/dist/reasoning/experience-curator.mjs +283 -0
- package/dist/reasoning/memory-optimizer.d.ts +69 -0
- package/dist/reasoning/memory-optimizer.d.ts.map +1 -0
- package/dist/reasoning/memory-optimizer.js +331 -0
- package/dist/reasoning/memory-optimizer.js.map +1 -0
- package/dist/reasoning/memory-optimizer.mjs +326 -0
- package/dist/reasoning/pattern-matcher.d.ts +59 -0
- package/dist/reasoning/pattern-matcher.d.ts.map +1 -0
- package/dist/reasoning/pattern-matcher.js +229 -0
- package/dist/reasoning/pattern-matcher.js.map +1 -0
- package/dist/reasoning/pattern-matcher.mjs +224 -0
- package/dist/reasoningbank/adapter/agentdb-adapter.d.ts +118 -0
- package/dist/reasoningbank/adapter/agentdb-adapter.d.ts.map +1 -0
- package/dist/reasoningbank/adapter/agentdb-adapter.js +477 -0
- package/dist/reasoningbank/adapter/agentdb-adapter.js.map +1 -0
- package/dist/reasoningbank/adapter/types.d.ts +113 -0
- package/dist/reasoningbank/adapter/types.d.ts.map +1 -0
- package/dist/reasoningbank/adapter/types.js +9 -0
- package/dist/reasoningbank/adapter/types.js.map +1 -0
- package/dist/reasoningbank/cli/commands.d.ts +16 -0
- package/dist/reasoningbank/cli/commands.d.ts.map +1 -0
- package/dist/reasoningbank/cli/commands.js +272 -0
- package/dist/reasoningbank/cli/commands.js.map +1 -0
- package/dist/reasoningbank/mcp/agentdb-tools.d.ts +319 -0
- package/dist/reasoningbank/mcp/agentdb-tools.d.ts.map +1 -0
- package/dist/reasoningbank/mcp/agentdb-tools.js +301 -0
- package/dist/reasoningbank/mcp/agentdb-tools.js.map +1 -0
- package/dist/reasoningbank/migration/migrate.d.ts +25 -0
- package/dist/reasoningbank/migration/migrate.d.ts.map +1 -0
- package/dist/reasoningbank/migration/migrate.js +178 -0
- package/dist/reasoningbank/migration/migrate.js.map +1 -0
- package/dist/reasoningbank/reasoning/context-synthesizer.d.ts +37 -0
- package/dist/reasoningbank/reasoning/context-synthesizer.d.ts.map +1 -0
- package/dist/reasoningbank/reasoning/context-synthesizer.js +114 -0
- package/dist/reasoningbank/reasoning/context-synthesizer.js.map +1 -0
- package/dist/reasoningbank/reasoning/experience-curator.d.ts +39 -0
- package/dist/reasoningbank/reasoning/experience-curator.d.ts.map +1 -0
- package/dist/reasoningbank/reasoning/experience-curator.js +98 -0
- package/dist/reasoningbank/reasoning/experience-curator.js.map +1 -0
- package/dist/reasoningbank/reasoning/memory-optimizer.d.ts +44 -0
- package/dist/reasoningbank/reasoning/memory-optimizer.d.ts.map +1 -0
- package/dist/reasoningbank/reasoning/memory-optimizer.js +184 -0
- package/dist/reasoningbank/reasoning/memory-optimizer.js.map +1 -0
- package/dist/reasoningbank/reasoning/pattern-matcher.d.ts +40 -0
- package/dist/reasoningbank/reasoning/pattern-matcher.d.ts.map +1 -0
- package/dist/reasoningbank/reasoning/pattern-matcher.js +87 -0
- package/dist/reasoningbank/reasoning/pattern-matcher.js.map +1 -0
- package/dist/reasoningbank/sync/quic-sync.d.ts +77 -0
- package/dist/reasoningbank/sync/quic-sync.d.ts.map +1 -0
- package/dist/reasoningbank/sync/quic-sync.js +165 -0
- package/dist/reasoningbank/sync/quic-sync.js.map +1 -0
- package/dist/sync/conflict.d.ts +78 -0
- package/dist/sync/conflict.d.ts.map +1 -0
- package/dist/sync/conflict.js +202 -0
- package/dist/sync/conflict.js.map +1 -0
- package/dist/sync/conflict.mjs +196 -0
- package/dist/sync/coordinator.d.ts +111 -0
- package/dist/sync/coordinator.d.ts.map +1 -0
- package/dist/sync/coordinator.js +256 -0
- package/dist/sync/coordinator.js.map +1 -0
- package/dist/sync/coordinator.mjs +250 -0
- package/dist/sync/delta.d.ts +81 -0
- package/dist/sync/delta.d.ts.map +1 -0
- package/dist/sync/delta.js +245 -0
- package/dist/sync/delta.js.map +1 -0
- package/dist/sync/delta.mjs +238 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +22 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/index.mjs +9 -0
- package/dist/sync/quic-sync.d.ts +81 -0
- package/dist/sync/quic-sync.d.ts.map +1 -0
- package/dist/sync/quic-sync.js +329 -0
- package/dist/sync/quic-sync.js.map +1 -0
- package/dist/sync/quic-sync.mjs +323 -0
- package/dist/sync/types.d.ts +168 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +8 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/types.mjs +6 -0
- package/dist/types/index.d.ts +117 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +4 -0
- package/dist/wasm-loader.d.ts +32 -0
- package/dist/wasm-loader.d.ts.map +1 -0
- package/dist/wasm-loader.js +75 -0
- package/dist/wasm-loader.js.map +1 -0
- package/dist/wasm-loader.mjs +64 -0
- package/examples/adaptive-learning.ts +284 -0
- package/examples/browser/README.md +732 -0
- package/examples/browser/adaptive-recommendations/index.html +427 -0
- package/examples/browser/collaborative-filtering/index.html +310 -0
- package/examples/browser/continual-learning/index.html +736 -0
- package/examples/browser/experience-replay/index.html +616 -0
- package/examples/browser/index.html +369 -0
- package/examples/browser/meta-learning/index.html +789 -0
- package/examples/browser/neuro-symbolic/index.html +692 -0
- package/examples/browser/pattern-learning/index.html +620 -0
- package/examples/browser/quantum-inspired/index.html +728 -0
- package/examples/browser/rag/index.html +624 -0
- package/examples/browser/swarm-intelligence/index.html +811 -0
- package/examples/browser-basic.html +170 -0
- package/examples/hnsw-example.ts +148 -0
- package/examples/node-basic.js +70 -0
- package/examples/quic-sync-example.ts +310 -0
- package/examples/quick-start.js +68 -0
- package/examples/wasm-example.ts +222 -0
- package/package.json +118 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ExperienceCurator - Store and retrieve successful task execution experiences
|
|
4
|
+
*
|
|
5
|
+
* Curates high-quality experiences for learning and adaptation.
|
|
6
|
+
* Scores experiences based on quality metrics and retrieves relevant ones.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ExperienceCurator = void 0;
|
|
10
|
+
class ExperienceCurator {
|
|
11
|
+
constructor(db) {
|
|
12
|
+
this.experienceTable = 'reasoning_experiences';
|
|
13
|
+
this.db = db;
|
|
14
|
+
this.initializeExperienceStorage();
|
|
15
|
+
}
|
|
16
|
+
initializeExperienceStorage() {
|
|
17
|
+
const rawDb = this.db.getDatabase();
|
|
18
|
+
rawDb.exec(`
|
|
19
|
+
CREATE TABLE IF NOT EXISTS ${this.experienceTable} (
|
|
20
|
+
id TEXT PRIMARY KEY,
|
|
21
|
+
task_description TEXT NOT NULL,
|
|
22
|
+
success INTEGER NOT NULL,
|
|
23
|
+
duration REAL NOT NULL,
|
|
24
|
+
approach TEXT NOT NULL,
|
|
25
|
+
outcome TEXT NOT NULL,
|
|
26
|
+
quality REAL NOT NULL,
|
|
27
|
+
domain TEXT NOT NULL,
|
|
28
|
+
agent_type TEXT,
|
|
29
|
+
error_type TEXT,
|
|
30
|
+
tokens_used INTEGER,
|
|
31
|
+
iteration_count INTEGER DEFAULT 1,
|
|
32
|
+
metadata TEXT,
|
|
33
|
+
timestamp INTEGER NOT NULL
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_exp_success ON ${this.experienceTable}(success);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_exp_quality ON ${this.experienceTable}(quality);
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_exp_domain ON ${this.experienceTable}(domain);
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_exp_timestamp ON ${this.experienceTable}(timestamp);
|
|
40
|
+
`);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Store a task execution experience
|
|
44
|
+
*/
|
|
45
|
+
async storeExperience(experience) {
|
|
46
|
+
const id = this.generateExperienceId();
|
|
47
|
+
const timestamp = Date.now();
|
|
48
|
+
// Calculate quality score if not provided
|
|
49
|
+
const quality = experience.quality || this.calculateQualityScore(experience);
|
|
50
|
+
// Store vector embedding for similarity matching
|
|
51
|
+
this.db.insert({
|
|
52
|
+
id: `exp_${id}`,
|
|
53
|
+
embedding: experience.taskEmbedding,
|
|
54
|
+
metadata: {
|
|
55
|
+
type: 'experience',
|
|
56
|
+
experienceId: id,
|
|
57
|
+
success: experience.success,
|
|
58
|
+
quality,
|
|
59
|
+
domain: experience.metadata.domain
|
|
60
|
+
},
|
|
61
|
+
timestamp
|
|
62
|
+
});
|
|
63
|
+
// Store experience metadata
|
|
64
|
+
const rawDb = this.db.getDatabase();
|
|
65
|
+
const stmt = rawDb.prepare(`
|
|
66
|
+
INSERT INTO ${this.experienceTable}
|
|
67
|
+
(id, task_description, success, duration, approach, outcome, quality,
|
|
68
|
+
domain, agent_type, error_type, tokens_used, iteration_count, metadata, timestamp)
|
|
69
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
70
|
+
`);
|
|
71
|
+
stmt.run(id, experience.taskDescription, experience.success ? 1 : 0, experience.duration, experience.approach, experience.outcome, quality, experience.metadata.domain, experience.metadata.agentType || null, experience.metadata.errorType || null, experience.metadata.tokensUsed || null, experience.metadata.iterationCount || 1, JSON.stringify(experience.metadata), timestamp);
|
|
72
|
+
return id;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Calculate quality score for an experience
|
|
76
|
+
* Factors: success, duration, token efficiency, iteration count
|
|
77
|
+
*/
|
|
78
|
+
calculateQualityScore(experience) {
|
|
79
|
+
let score = 0;
|
|
80
|
+
// Success factor (60% weight)
|
|
81
|
+
if (experience.success) {
|
|
82
|
+
score += 0.6;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Failed experiences can still be valuable for learning
|
|
86
|
+
score += 0.1;
|
|
87
|
+
}
|
|
88
|
+
// Duration factor (20% weight) - faster is better
|
|
89
|
+
const durationScore = Math.max(0, 1 - (experience.duration / 60000)); // Normalize to 1 minute
|
|
90
|
+
score += durationScore * 0.2;
|
|
91
|
+
// Token efficiency factor (10% weight)
|
|
92
|
+
if (experience.metadata.tokensUsed) {
|
|
93
|
+
const tokenScore = Math.max(0, 1 - (experience.metadata.tokensUsed / 10000)); // Normalize to 10k tokens
|
|
94
|
+
score += tokenScore * 0.1;
|
|
95
|
+
}
|
|
96
|
+
// Iteration efficiency factor (10% weight)
|
|
97
|
+
if (experience.metadata.iterationCount) {
|
|
98
|
+
const iterationScore = Math.max(0, 1 - (experience.metadata.iterationCount / 5)); // Normalize to 5 iterations
|
|
99
|
+
score += iterationScore * 0.1;
|
|
100
|
+
}
|
|
101
|
+
return Math.min(1, score);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Query experiences similar to a task
|
|
105
|
+
*
|
|
106
|
+
* @param taskEmbedding - Vector embedding of current task
|
|
107
|
+
* @param k - Number of experiences to return
|
|
108
|
+
* @param filters - Optional filters
|
|
109
|
+
* @returns Array of relevant experiences sorted by relevance
|
|
110
|
+
*/
|
|
111
|
+
async queryExperiences(taskEmbedding, k = 10, filters) {
|
|
112
|
+
const startTime = Date.now();
|
|
113
|
+
// Search for similar experience embeddings
|
|
114
|
+
const threshold = filters?.minQuality || 0.5;
|
|
115
|
+
const results = this.db.search(taskEmbedding, k * 2, 'cosine', threshold);
|
|
116
|
+
// Filter to experience vectors only
|
|
117
|
+
const expResults = results.filter(r => r.metadata?.type === 'experience');
|
|
118
|
+
// Get full experience metadata
|
|
119
|
+
const rawDb = this.db.getDatabase();
|
|
120
|
+
const experiences = [];
|
|
121
|
+
for (const result of expResults) {
|
|
122
|
+
const metadata = result.metadata || {};
|
|
123
|
+
const expId = metadata.experienceId;
|
|
124
|
+
let sql = `SELECT * FROM ${this.experienceTable} WHERE id = ?`;
|
|
125
|
+
const params = [expId];
|
|
126
|
+
if (filters?.successOnly) {
|
|
127
|
+
sql += ' AND success = 1';
|
|
128
|
+
}
|
|
129
|
+
if (filters?.domain) {
|
|
130
|
+
sql += ' AND domain = ?';
|
|
131
|
+
params.push(filters.domain);
|
|
132
|
+
}
|
|
133
|
+
if (filters?.minQuality) {
|
|
134
|
+
sql += ' AND quality >= ?';
|
|
135
|
+
params.push(filters.minQuality);
|
|
136
|
+
}
|
|
137
|
+
if (filters?.maxAge) {
|
|
138
|
+
const cutoffTime = Date.now() - filters.maxAge;
|
|
139
|
+
sql += ' AND timestamp >= ?';
|
|
140
|
+
params.push(cutoffTime);
|
|
141
|
+
}
|
|
142
|
+
const stmt = rawDb.prepare(sql);
|
|
143
|
+
const row = stmt.get(...params);
|
|
144
|
+
if (row) {
|
|
145
|
+
const metadata = JSON.parse(row.metadata);
|
|
146
|
+
experiences.push({
|
|
147
|
+
id: row.id,
|
|
148
|
+
taskEmbedding: result.embedding,
|
|
149
|
+
taskDescription: row.task_description,
|
|
150
|
+
success: row.success === 1,
|
|
151
|
+
duration: row.duration,
|
|
152
|
+
approach: row.approach,
|
|
153
|
+
outcome: row.outcome,
|
|
154
|
+
quality: row.quality,
|
|
155
|
+
metadata: {
|
|
156
|
+
...metadata,
|
|
157
|
+
domain: row.domain,
|
|
158
|
+
agentType: row.agent_type,
|
|
159
|
+
errorType: row.error_type,
|
|
160
|
+
tokensUsed: row.tokens_used,
|
|
161
|
+
iterationCount: row.iteration_count
|
|
162
|
+
},
|
|
163
|
+
timestamp: row.timestamp,
|
|
164
|
+
relevance: result.score
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
if (experiences.length >= k)
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
const duration = Date.now() - startTime;
|
|
171
|
+
console.log(`[ExperienceCurator] Found ${experiences.length} experiences in ${duration}ms`);
|
|
172
|
+
return experiences;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get best experiences for a domain
|
|
176
|
+
*/
|
|
177
|
+
async getBestExperiences(domain, limit = 10) {
|
|
178
|
+
const rawDb = this.db.getDatabase();
|
|
179
|
+
const stmt = rawDb.prepare(`
|
|
180
|
+
SELECT * FROM ${this.experienceTable}
|
|
181
|
+
WHERE domain = ? AND success = 1
|
|
182
|
+
ORDER BY quality DESC, timestamp DESC
|
|
183
|
+
LIMIT ?
|
|
184
|
+
`);
|
|
185
|
+
const rows = stmt.all(domain, limit);
|
|
186
|
+
return rows.map(row => {
|
|
187
|
+
const vector = this.db.get(`exp_${row.id}`);
|
|
188
|
+
const metadata = JSON.parse(row.metadata);
|
|
189
|
+
return {
|
|
190
|
+
id: row.id,
|
|
191
|
+
taskEmbedding: vector?.embedding || [],
|
|
192
|
+
taskDescription: row.task_description,
|
|
193
|
+
success: row.success === 1,
|
|
194
|
+
duration: row.duration,
|
|
195
|
+
approach: row.approach,
|
|
196
|
+
outcome: row.outcome,
|
|
197
|
+
quality: row.quality,
|
|
198
|
+
metadata: {
|
|
199
|
+
...metadata,
|
|
200
|
+
domain: row.domain,
|
|
201
|
+
agentType: row.agent_type,
|
|
202
|
+
errorType: row.error_type,
|
|
203
|
+
tokensUsed: row.tokens_used,
|
|
204
|
+
iterationCount: row.iteration_count
|
|
205
|
+
},
|
|
206
|
+
timestamp: row.timestamp
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get learning statistics
|
|
212
|
+
*/
|
|
213
|
+
getStats() {
|
|
214
|
+
const rawDb = this.db.getDatabase();
|
|
215
|
+
// Total experiences
|
|
216
|
+
const countStmt = rawDb.prepare(`SELECT COUNT(*) as count FROM ${this.experienceTable}`);
|
|
217
|
+
const totalExperiences = countStmt.get().count;
|
|
218
|
+
// Success rate
|
|
219
|
+
const successStmt = rawDb.prepare(`
|
|
220
|
+
SELECT AVG(success) as rate FROM ${this.experienceTable}
|
|
221
|
+
`);
|
|
222
|
+
const successRate = successStmt.get().rate || 0;
|
|
223
|
+
// Average quality
|
|
224
|
+
const qualityStmt = rawDb.prepare(`
|
|
225
|
+
SELECT AVG(quality) as avg FROM ${this.experienceTable}
|
|
226
|
+
`);
|
|
227
|
+
const avgQuality = qualityStmt.get().avg || 0;
|
|
228
|
+
// Average duration
|
|
229
|
+
const durationStmt = rawDb.prepare(`
|
|
230
|
+
SELECT AVG(duration) as avg FROM ${this.experienceTable}
|
|
231
|
+
`);
|
|
232
|
+
const avgDuration = durationStmt.get().avg || 0;
|
|
233
|
+
// Domain breakdown
|
|
234
|
+
const domainStmt = rawDb.prepare(`
|
|
235
|
+
SELECT domain, COUNT(*) as count, AVG(success) as success_rate
|
|
236
|
+
FROM ${this.experienceTable}
|
|
237
|
+
GROUP BY domain
|
|
238
|
+
`);
|
|
239
|
+
const domainRows = domainStmt.all();
|
|
240
|
+
const domainBreakdown = new Map(domainRows.map(row => [
|
|
241
|
+
row.domain,
|
|
242
|
+
{ count: row.count, successRate: row.success_rate }
|
|
243
|
+
]));
|
|
244
|
+
return {
|
|
245
|
+
totalExperiences,
|
|
246
|
+
successRate,
|
|
247
|
+
avgQuality,
|
|
248
|
+
avgDuration,
|
|
249
|
+
domainBreakdown
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Prune low-quality old experiences
|
|
254
|
+
*/
|
|
255
|
+
async pruneExperiences(options) {
|
|
256
|
+
const rawDb = this.db.getDatabase();
|
|
257
|
+
const { minQuality = 0.3, maxAge = 30 * 24 * 60 * 60 * 1000, keepMinimum = 100 } = options;
|
|
258
|
+
// Get count of experiences
|
|
259
|
+
const countStmt = rawDb.prepare(`SELECT COUNT(*) as count FROM ${this.experienceTable}`);
|
|
260
|
+
const totalCount = countStmt.get().count;
|
|
261
|
+
if (totalCount <= keepMinimum) {
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
// Delete low-quality old experiences
|
|
265
|
+
const cutoffTime = Date.now() - maxAge;
|
|
266
|
+
const deleteStmt = rawDb.prepare(`
|
|
267
|
+
DELETE FROM ${this.experienceTable}
|
|
268
|
+
WHERE quality < ? AND timestamp < ?
|
|
269
|
+
AND id NOT IN (
|
|
270
|
+
SELECT id FROM ${this.experienceTable}
|
|
271
|
+
ORDER BY quality DESC, timestamp DESC
|
|
272
|
+
LIMIT ?
|
|
273
|
+
)
|
|
274
|
+
`);
|
|
275
|
+
const result = deleteStmt.run(minQuality, cutoffTime, keepMinimum);
|
|
276
|
+
// Clean up orphaned vectors
|
|
277
|
+
const expIds = rawDb.prepare(`SELECT id FROM ${this.experienceTable}`).all()
|
|
278
|
+
.map(row => `exp_${row.id}`);
|
|
279
|
+
// Note: In a production system, you'd want to clean up orphaned vectors
|
|
280
|
+
// For now, we'll leave them as they don't significantly impact performance
|
|
281
|
+
return result.changes;
|
|
282
|
+
}
|
|
283
|
+
generateExperienceId() {
|
|
284
|
+
return `exp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
exports.ExperienceCurator = ExperienceCurator;
|
|
288
|
+
//# sourceMappingURL=experience-curator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experience-curator.js","sourceRoot":"","sources":["../../src/reasoning/experience-curator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExperienceCurator - Store and retrieve successful task execution experiences
|
|
3
|
+
*
|
|
4
|
+
* Curates high-quality experiences for learning and adaptation.
|
|
5
|
+
* Scores experiences based on quality metrics and retrieves relevant ones.
|
|
6
|
+
*/
|
|
7
|
+
export class ExperienceCurator {
|
|
8
|
+
constructor(db) {
|
|
9
|
+
this.experienceTable = 'reasoning_experiences';
|
|
10
|
+
this.db = db;
|
|
11
|
+
this.initializeExperienceStorage();
|
|
12
|
+
}
|
|
13
|
+
initializeExperienceStorage() {
|
|
14
|
+
const rawDb = this.db.getDatabase();
|
|
15
|
+
rawDb.exec(`
|
|
16
|
+
CREATE TABLE IF NOT EXISTS ${this.experienceTable} (
|
|
17
|
+
id TEXT PRIMARY KEY,
|
|
18
|
+
task_description TEXT NOT NULL,
|
|
19
|
+
success INTEGER NOT NULL,
|
|
20
|
+
duration REAL NOT NULL,
|
|
21
|
+
approach TEXT NOT NULL,
|
|
22
|
+
outcome TEXT NOT NULL,
|
|
23
|
+
quality REAL NOT NULL,
|
|
24
|
+
domain TEXT NOT NULL,
|
|
25
|
+
agent_type TEXT,
|
|
26
|
+
error_type TEXT,
|
|
27
|
+
tokens_used INTEGER,
|
|
28
|
+
iteration_count INTEGER DEFAULT 1,
|
|
29
|
+
metadata TEXT,
|
|
30
|
+
timestamp INTEGER NOT NULL
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_exp_success ON ${this.experienceTable}(success);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_exp_quality ON ${this.experienceTable}(quality);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_exp_domain ON ${this.experienceTable}(domain);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_exp_timestamp ON ${this.experienceTable}(timestamp);
|
|
37
|
+
`);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Store a task execution experience
|
|
41
|
+
*/
|
|
42
|
+
async storeExperience(experience) {
|
|
43
|
+
const id = this.generateExperienceId();
|
|
44
|
+
const timestamp = Date.now();
|
|
45
|
+
// Calculate quality score if not provided
|
|
46
|
+
const quality = experience.quality || this.calculateQualityScore(experience);
|
|
47
|
+
// Store vector embedding for similarity matching
|
|
48
|
+
this.db.insert({
|
|
49
|
+
id: `exp_${id}`,
|
|
50
|
+
embedding: experience.taskEmbedding,
|
|
51
|
+
metadata: {
|
|
52
|
+
type: 'experience',
|
|
53
|
+
experienceId: id,
|
|
54
|
+
success: experience.success,
|
|
55
|
+
quality,
|
|
56
|
+
domain: experience.metadata.domain
|
|
57
|
+
},
|
|
58
|
+
timestamp
|
|
59
|
+
});
|
|
60
|
+
// Store experience metadata
|
|
61
|
+
const rawDb = this.db.getDatabase();
|
|
62
|
+
const stmt = rawDb.prepare(`
|
|
63
|
+
INSERT INTO ${this.experienceTable}
|
|
64
|
+
(id, task_description, success, duration, approach, outcome, quality,
|
|
65
|
+
domain, agent_type, error_type, tokens_used, iteration_count, metadata, timestamp)
|
|
66
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
67
|
+
`);
|
|
68
|
+
stmt.run(id, experience.taskDescription, experience.success ? 1 : 0, experience.duration, experience.approach, experience.outcome, quality, experience.metadata.domain, experience.metadata.agentType || null, experience.metadata.errorType || null, experience.metadata.tokensUsed || null, experience.metadata.iterationCount || 1, JSON.stringify(experience.metadata), timestamp);
|
|
69
|
+
return id;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Calculate quality score for an experience
|
|
73
|
+
* Factors: success, duration, token efficiency, iteration count
|
|
74
|
+
*/
|
|
75
|
+
calculateQualityScore(experience) {
|
|
76
|
+
let score = 0;
|
|
77
|
+
// Success factor (60% weight)
|
|
78
|
+
if (experience.success) {
|
|
79
|
+
score += 0.6;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Failed experiences can still be valuable for learning
|
|
83
|
+
score += 0.1;
|
|
84
|
+
}
|
|
85
|
+
// Duration factor (20% weight) - faster is better
|
|
86
|
+
const durationScore = Math.max(0, 1 - (experience.duration / 60000)); // Normalize to 1 minute
|
|
87
|
+
score += durationScore * 0.2;
|
|
88
|
+
// Token efficiency factor (10% weight)
|
|
89
|
+
if (experience.metadata.tokensUsed) {
|
|
90
|
+
const tokenScore = Math.max(0, 1 - (experience.metadata.tokensUsed / 10000)); // Normalize to 10k tokens
|
|
91
|
+
score += tokenScore * 0.1;
|
|
92
|
+
}
|
|
93
|
+
// Iteration efficiency factor (10% weight)
|
|
94
|
+
if (experience.metadata.iterationCount) {
|
|
95
|
+
const iterationScore = Math.max(0, 1 - (experience.metadata.iterationCount / 5)); // Normalize to 5 iterations
|
|
96
|
+
score += iterationScore * 0.1;
|
|
97
|
+
}
|
|
98
|
+
return Math.min(1, score);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Query experiences similar to a task
|
|
102
|
+
*
|
|
103
|
+
* @param taskEmbedding - Vector embedding of current task
|
|
104
|
+
* @param k - Number of experiences to return
|
|
105
|
+
* @param filters - Optional filters
|
|
106
|
+
* @returns Array of relevant experiences sorted by relevance
|
|
107
|
+
*/
|
|
108
|
+
async queryExperiences(taskEmbedding, k = 10, filters) {
|
|
109
|
+
const startTime = Date.now();
|
|
110
|
+
// Search for similar experience embeddings
|
|
111
|
+
const threshold = filters?.minQuality || 0.5;
|
|
112
|
+
const results = this.db.search(taskEmbedding, k * 2, 'cosine', threshold);
|
|
113
|
+
// Filter to experience vectors only
|
|
114
|
+
const expResults = results.filter(r => r.metadata?.type === 'experience');
|
|
115
|
+
// Get full experience metadata
|
|
116
|
+
const rawDb = this.db.getDatabase();
|
|
117
|
+
const experiences = [];
|
|
118
|
+
for (const result of expResults) {
|
|
119
|
+
const metadata = result.metadata || {};
|
|
120
|
+
const expId = metadata.experienceId;
|
|
121
|
+
let sql = `SELECT * FROM ${this.experienceTable} WHERE id = ?`;
|
|
122
|
+
const params = [expId];
|
|
123
|
+
if (filters?.successOnly) {
|
|
124
|
+
sql += ' AND success = 1';
|
|
125
|
+
}
|
|
126
|
+
if (filters?.domain) {
|
|
127
|
+
sql += ' AND domain = ?';
|
|
128
|
+
params.push(filters.domain);
|
|
129
|
+
}
|
|
130
|
+
if (filters?.minQuality) {
|
|
131
|
+
sql += ' AND quality >= ?';
|
|
132
|
+
params.push(filters.minQuality);
|
|
133
|
+
}
|
|
134
|
+
if (filters?.maxAge) {
|
|
135
|
+
const cutoffTime = Date.now() - filters.maxAge;
|
|
136
|
+
sql += ' AND timestamp >= ?';
|
|
137
|
+
params.push(cutoffTime);
|
|
138
|
+
}
|
|
139
|
+
const stmt = rawDb.prepare(sql);
|
|
140
|
+
const row = stmt.get(...params);
|
|
141
|
+
if (row) {
|
|
142
|
+
const metadata = JSON.parse(row.metadata);
|
|
143
|
+
experiences.push({
|
|
144
|
+
id: row.id,
|
|
145
|
+
taskEmbedding: result.embedding,
|
|
146
|
+
taskDescription: row.task_description,
|
|
147
|
+
success: row.success === 1,
|
|
148
|
+
duration: row.duration,
|
|
149
|
+
approach: row.approach,
|
|
150
|
+
outcome: row.outcome,
|
|
151
|
+
quality: row.quality,
|
|
152
|
+
metadata: {
|
|
153
|
+
...metadata,
|
|
154
|
+
domain: row.domain,
|
|
155
|
+
agentType: row.agent_type,
|
|
156
|
+
errorType: row.error_type,
|
|
157
|
+
tokensUsed: row.tokens_used,
|
|
158
|
+
iterationCount: row.iteration_count
|
|
159
|
+
},
|
|
160
|
+
timestamp: row.timestamp,
|
|
161
|
+
relevance: result.score
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
if (experiences.length >= k)
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
const duration = Date.now() - startTime;
|
|
168
|
+
console.log(`[ExperienceCurator] Found ${experiences.length} experiences in ${duration}ms`);
|
|
169
|
+
return experiences;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get best experiences for a domain
|
|
173
|
+
*/
|
|
174
|
+
async getBestExperiences(domain, limit = 10) {
|
|
175
|
+
const rawDb = this.db.getDatabase();
|
|
176
|
+
const stmt = rawDb.prepare(`
|
|
177
|
+
SELECT * FROM ${this.experienceTable}
|
|
178
|
+
WHERE domain = ? AND success = 1
|
|
179
|
+
ORDER BY quality DESC, timestamp DESC
|
|
180
|
+
LIMIT ?
|
|
181
|
+
`);
|
|
182
|
+
const rows = stmt.all(domain, limit);
|
|
183
|
+
return rows.map(row => {
|
|
184
|
+
const vector = this.db.get(`exp_${row.id}`);
|
|
185
|
+
const metadata = JSON.parse(row.metadata);
|
|
186
|
+
return {
|
|
187
|
+
id: row.id,
|
|
188
|
+
taskEmbedding: vector?.embedding || [],
|
|
189
|
+
taskDescription: row.task_description,
|
|
190
|
+
success: row.success === 1,
|
|
191
|
+
duration: row.duration,
|
|
192
|
+
approach: row.approach,
|
|
193
|
+
outcome: row.outcome,
|
|
194
|
+
quality: row.quality,
|
|
195
|
+
metadata: {
|
|
196
|
+
...metadata,
|
|
197
|
+
domain: row.domain,
|
|
198
|
+
agentType: row.agent_type,
|
|
199
|
+
errorType: row.error_type,
|
|
200
|
+
tokensUsed: row.tokens_used,
|
|
201
|
+
iterationCount: row.iteration_count
|
|
202
|
+
},
|
|
203
|
+
timestamp: row.timestamp
|
|
204
|
+
};
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get learning statistics
|
|
209
|
+
*/
|
|
210
|
+
getStats() {
|
|
211
|
+
const rawDb = this.db.getDatabase();
|
|
212
|
+
// Total experiences
|
|
213
|
+
const countStmt = rawDb.prepare(`SELECT COUNT(*) as count FROM ${this.experienceTable}`);
|
|
214
|
+
const totalExperiences = countStmt.get().count;
|
|
215
|
+
// Success rate
|
|
216
|
+
const successStmt = rawDb.prepare(`
|
|
217
|
+
SELECT AVG(success) as rate FROM ${this.experienceTable}
|
|
218
|
+
`);
|
|
219
|
+
const successRate = successStmt.get().rate || 0;
|
|
220
|
+
// Average quality
|
|
221
|
+
const qualityStmt = rawDb.prepare(`
|
|
222
|
+
SELECT AVG(quality) as avg FROM ${this.experienceTable}
|
|
223
|
+
`);
|
|
224
|
+
const avgQuality = qualityStmt.get().avg || 0;
|
|
225
|
+
// Average duration
|
|
226
|
+
const durationStmt = rawDb.prepare(`
|
|
227
|
+
SELECT AVG(duration) as avg FROM ${this.experienceTable}
|
|
228
|
+
`);
|
|
229
|
+
const avgDuration = durationStmt.get().avg || 0;
|
|
230
|
+
// Domain breakdown
|
|
231
|
+
const domainStmt = rawDb.prepare(`
|
|
232
|
+
SELECT domain, COUNT(*) as count, AVG(success) as success_rate
|
|
233
|
+
FROM ${this.experienceTable}
|
|
234
|
+
GROUP BY domain
|
|
235
|
+
`);
|
|
236
|
+
const domainRows = domainStmt.all();
|
|
237
|
+
const domainBreakdown = new Map(domainRows.map(row => [
|
|
238
|
+
row.domain,
|
|
239
|
+
{ count: row.count, successRate: row.success_rate }
|
|
240
|
+
]));
|
|
241
|
+
return {
|
|
242
|
+
totalExperiences,
|
|
243
|
+
successRate,
|
|
244
|
+
avgQuality,
|
|
245
|
+
avgDuration,
|
|
246
|
+
domainBreakdown
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Prune low-quality old experiences
|
|
251
|
+
*/
|
|
252
|
+
async pruneExperiences(options) {
|
|
253
|
+
const rawDb = this.db.getDatabase();
|
|
254
|
+
const { minQuality = 0.3, maxAge = 30 * 24 * 60 * 60 * 1000, keepMinimum = 100 } = options;
|
|
255
|
+
// Get count of experiences
|
|
256
|
+
const countStmt = rawDb.prepare(`SELECT COUNT(*) as count FROM ${this.experienceTable}`);
|
|
257
|
+
const totalCount = countStmt.get().count;
|
|
258
|
+
if (totalCount <= keepMinimum) {
|
|
259
|
+
return 0;
|
|
260
|
+
}
|
|
261
|
+
// Delete low-quality old experiences
|
|
262
|
+
const cutoffTime = Date.now() - maxAge;
|
|
263
|
+
const deleteStmt = rawDb.prepare(`
|
|
264
|
+
DELETE FROM ${this.experienceTable}
|
|
265
|
+
WHERE quality < ? AND timestamp < ?
|
|
266
|
+
AND id NOT IN (
|
|
267
|
+
SELECT id FROM ${this.experienceTable}
|
|
268
|
+
ORDER BY quality DESC, timestamp DESC
|
|
269
|
+
LIMIT ?
|
|
270
|
+
)
|
|
271
|
+
`);
|
|
272
|
+
const result = deleteStmt.run(minQuality, cutoffTime, keepMinimum);
|
|
273
|
+
// Clean up orphaned vectors
|
|
274
|
+
const expIds = rawDb.prepare(`SELECT id FROM ${this.experienceTable}`).all()
|
|
275
|
+
.map(row => `exp_${row.id}`);
|
|
276
|
+
// Note: In a production system, you'd want to clean up orphaned vectors
|
|
277
|
+
// For now, we'll leave them as they don't significantly impact performance
|
|
278
|
+
return result.changes;
|
|
279
|
+
}
|
|
280
|
+
generateExperienceId() {
|
|
281
|
+
return `exp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MemoryOptimizer - Collapse and compress old memories for efficiency
|
|
3
|
+
*
|
|
4
|
+
* Implements memory consolidation strategies:
|
|
5
|
+
* - Graph-based summarization (similar memories clustered)
|
|
6
|
+
* - Hierarchical compression (temporal aggregation)
|
|
7
|
+
* - Quality-based pruning (remove low-value memories)
|
|
8
|
+
*/
|
|
9
|
+
import { SQLiteVectorDB } from '../core/vector-db';
|
|
10
|
+
import { MemoryNode, CollapseStrategy } from '../types';
|
|
11
|
+
export declare class MemoryOptimizer {
|
|
12
|
+
private db;
|
|
13
|
+
private memoryNodesTable;
|
|
14
|
+
constructor(db: SQLiteVectorDB);
|
|
15
|
+
private initializeMemoryNodes;
|
|
16
|
+
/**
|
|
17
|
+
* Collapse old memories into compressed summary nodes
|
|
18
|
+
*
|
|
19
|
+
* @param maxAge - Maximum age in milliseconds for memories to collapse
|
|
20
|
+
* @param strategy - Collapse strategy to use
|
|
21
|
+
* @returns Number of memories collapsed
|
|
22
|
+
*/
|
|
23
|
+
collapseMemories(maxAge?: number, // 7 days
|
|
24
|
+
strategy?: CollapseStrategy): Promise<number>;
|
|
25
|
+
/**
|
|
26
|
+
* Graph-based collapse: cluster similar memories
|
|
27
|
+
*/
|
|
28
|
+
private graphBasedCollapse;
|
|
29
|
+
/**
|
|
30
|
+
* Hierarchical collapse: aggregate by time periods
|
|
31
|
+
*/
|
|
32
|
+
private hierarchicalCollapse;
|
|
33
|
+
/**
|
|
34
|
+
* Temporal collapse: merge sequential memories
|
|
35
|
+
*/
|
|
36
|
+
private temporalCollapse;
|
|
37
|
+
/**
|
|
38
|
+
* Cluster vectors based on similarity threshold
|
|
39
|
+
*/
|
|
40
|
+
private clusterVectors;
|
|
41
|
+
/**
|
|
42
|
+
* Create a memory node from a cluster of vectors
|
|
43
|
+
*/
|
|
44
|
+
private createMemoryNode;
|
|
45
|
+
/**
|
|
46
|
+
* Store memory node
|
|
47
|
+
*/
|
|
48
|
+
private storeMemoryNode;
|
|
49
|
+
/**
|
|
50
|
+
* Query collapsed memory nodes
|
|
51
|
+
*/
|
|
52
|
+
queryNodes(queryEmbedding: number[], k?: number): Promise<MemoryNode[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Get vectors older than cutoff time
|
|
55
|
+
*/
|
|
56
|
+
private getOldVectors;
|
|
57
|
+
private deserializeEmbedding;
|
|
58
|
+
/**
|
|
59
|
+
* Get memory optimization statistics
|
|
60
|
+
*/
|
|
61
|
+
getStats(): {
|
|
62
|
+
totalNodes: number;
|
|
63
|
+
totalCollapsed: number;
|
|
64
|
+
avgQuality: number;
|
|
65
|
+
memoryReduction: number;
|
|
66
|
+
};
|
|
67
|
+
private generateNodeId;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=memory-optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-optimizer.d.ts","sourceRoot":"","sources":["../../src/reasoning/memory-optimizer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAExD,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,gBAAgB,CAAkB;gBAE9B,EAAE,EAAE,cAAc;IAK9B,OAAO,CAAC,qBAAqB;IAqB7B;;;;;;OAMG;IACG,gBAAgB,CACpB,MAAM,GAAE,MAAgC,EAAE,SAAS;IACnD,QAAQ,GAAE,gBAIT,GACA,OAAO,CAAC,MAAM,CAAC;IAkClB;;OAEG;YACW,kBAAkB;IAwBhC;;OAEG;YACW,oBAAoB;IAoClC;;OAEG;YACW,gBAAgB;IA4C9B;;OAEG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwCxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmCvB;;OAEG;IACG,UAAU,CACd,cAAc,EAAE,MAAM,EAAE,EACxB,CAAC,GAAE,MAAU,GACZ,OAAO,CAAC,UAAU,EAAE,CAAC;IAkCxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;IACH,QAAQ,IAAI;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;KACzB;IAwBD,OAAO,CAAC,cAAc;CAGvB"}
|