agentic-flow 2.0.7 → 2.0.9
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/.claude/settings.json +133 -9
- package/.claude/skills/agentic-flow-quickstart/skill.md +69 -0
- package/.claude/skills/hooks-automation/skill.md +155 -0
- package/.claude/skills/memory-patterns/skill.md +110 -0
- package/.claude/skills/sparc-methodology/skill.md +137 -0
- package/.claude/skills/swarm-coordination/skill.md +94 -0
- package/.claude/skills/worker-benchmarks/skill.md +135 -0
- package/.claude/skills/worker-integration/skill.md +154 -0
- package/.claude/statusline.mjs +109 -0
- package/.claude/statusline.sh +71 -0
- package/README.md +1797 -624
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentdb/index.d.ts +2 -0
- package/dist/agentdb/index.d.ts.map +1 -1
- package/dist/agentdb/index.js +5 -0
- package/dist/agentdb/index.js.map +1 -1
- package/dist/agentdb/prerequisites.d.ts +25 -0
- package/dist/agentdb/prerequisites.d.ts.map +1 -0
- package/dist/agentdb/prerequisites.js +180 -0
- package/dist/agentdb/prerequisites.js.map +1 -0
- package/dist/benchmarks/embeddings-benchmark.d.ts +38 -0
- package/dist/benchmarks/embeddings-benchmark.d.ts.map +1 -0
- package/dist/benchmarks/embeddings-benchmark.js +282 -0
- package/dist/benchmarks/embeddings-benchmark.js.map +1 -0
- package/dist/billing/mcp/tools.js +1 -0
- package/dist/billing/mcp/tools.js.map +1 -1
- package/dist/cli/commands/embeddings.d.ts +12 -0
- package/dist/cli/commands/embeddings.d.ts.map +1 -0
- package/dist/cli/commands/embeddings.js +386 -0
- package/dist/cli/commands/embeddings.js.map +1 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -1
- package/dist/cli/commands/hooks.js +79 -4
- package/dist/cli/commands/hooks.js.map +1 -1
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +514 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/workers.d.ts +9 -0
- package/dist/cli/commands/workers.d.ts.map +1 -0
- package/dist/cli/commands/workers.js +991 -0
- package/dist/cli/commands/workers.js.map +1 -0
- package/dist/cli/config-wizard.d.ts.map +1 -1
- package/dist/cli/config-wizard.js +47 -25
- package/dist/cli/config-wizard.js.map +1 -1
- package/dist/cli-proxy.js +89 -1
- package/dist/cli-proxy.js.map +1 -1
- package/dist/core/agentdb-fast.js +3 -3
- package/dist/core/agentdb-fast.js.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.js +37 -11
- package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
- package/dist/core/agentdb-wrapper.d.ts +3 -2
- package/dist/core/agentdb-wrapper.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper.js +15 -1
- package/dist/core/agentdb-wrapper.js.map +1 -1
- package/dist/core/attention-native.d.ts +4 -0
- package/dist/core/attention-native.d.ts.map +1 -1
- package/dist/core/attention-native.js +14 -2
- package/dist/core/attention-native.js.map +1 -1
- package/dist/core/gnn-wrapper.d.ts.map +1 -1
- package/dist/core/gnn-wrapper.js +14 -0
- package/dist/core/gnn-wrapper.js.map +1 -1
- package/dist/embeddings/index.d.ts +17 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +17 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/neural-substrate.d.ts +206 -0
- package/dist/embeddings/neural-substrate.d.ts.map +1 -0
- package/dist/embeddings/neural-substrate.js +629 -0
- package/dist/embeddings/neural-substrate.js.map +1 -0
- package/dist/embeddings/optimized-embedder.d.ts +103 -0
- package/dist/embeddings/optimized-embedder.d.ts.map +1 -0
- package/dist/embeddings/optimized-embedder.js +730 -0
- package/dist/embeddings/optimized-embedder.js.map +1 -0
- package/dist/examples/embedding-geometry.d.ts +105 -0
- package/dist/examples/embedding-geometry.d.ts.map +1 -0
- package/dist/examples/embedding-geometry.js +528 -0
- package/dist/examples/embedding-geometry.js.map +1 -0
- package/dist/federation/SecurityManager.d.ts +11 -2
- package/dist/federation/SecurityManager.d.ts.map +1 -1
- package/dist/federation/SecurityManager.js +50 -17
- package/dist/federation/SecurityManager.js.map +1 -1
- package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
- package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
- package/dist/hooks/swarm-learning-optimizer.js +5 -5
- package/dist/hooks/swarm-learning-optimizer.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +89 -51
- package/dist/index.js.map +1 -1
- package/dist/intelligence/IntelligenceStore.d.ts +35 -26
- package/dist/intelligence/IntelligenceStore.d.ts.map +1 -1
- package/dist/intelligence/IntelligenceStore.js +308 -123
- package/dist/intelligence/IntelligenceStore.js.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.d.ts +26 -1
- package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.js +49 -10
- package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
- package/dist/intelligence/agent-booster-enhanced.d.ts +1 -0
- package/dist/intelligence/agent-booster-enhanced.d.ts.map +1 -1
- package/dist/intelligence/agent-booster-enhanced.js +24 -3
- package/dist/intelligence/agent-booster-enhanced.js.map +1 -1
- package/dist/intelligence/index.d.ts +29 -3
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/index.js +13 -3
- package/dist/intelligence/index.js.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.js +162 -115
- package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +5 -5
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/init.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/init.js +36 -7
- package/dist/mcp/fastmcp/tools/swarm/init.js.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/spawn.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/spawn.js +47 -8
- package/dist/mcp/fastmcp/tools/swarm/spawn.js.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts +15 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.js +79 -63
- package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
- package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
- package/dist/mcp/tools/sona-tools.js +6 -0
- package/dist/mcp/tools/sona-tools.js.map +1 -1
- package/dist/memory/SharedMemoryPool.d.ts +103 -0
- package/dist/memory/SharedMemoryPool.d.ts.map +1 -0
- package/dist/memory/SharedMemoryPool.js +263 -0
- package/dist/memory/SharedMemoryPool.js.map +1 -0
- package/dist/optimizations/agent-booster-migration.d.ts +2 -1
- package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
- package/dist/optimizations/agent-booster-migration.js +69 -45
- package/dist/optimizations/agent-booster-migration.js.map +1 -1
- package/dist/orchestration/index.d.ts +11 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +10 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/memory-plane-types.d.ts +23 -0
- package/dist/orchestration/memory-plane-types.d.ts.map +1 -0
- package/dist/orchestration/memory-plane-types.js +5 -0
- package/dist/orchestration/memory-plane-types.js.map +1 -0
- package/dist/orchestration/memory-plane.d.ts +41 -0
- package/dist/orchestration/memory-plane.d.ts.map +1 -0
- package/dist/orchestration/memory-plane.js +84 -0
- package/dist/orchestration/memory-plane.js.map +1 -0
- package/dist/orchestration/orchestration-client.d.ts +104 -0
- package/dist/orchestration/orchestration-client.d.ts.map +1 -0
- package/dist/orchestration/orchestration-client.js +94 -0
- package/dist/orchestration/orchestration-client.js.map +1 -0
- package/dist/orchestration/orchestration-runtime.d.ts +26 -0
- package/dist/orchestration/orchestration-runtime.d.ts.map +1 -0
- package/dist/orchestration/orchestration-runtime.js +78 -0
- package/dist/orchestration/orchestration-runtime.js.map +1 -0
- package/dist/orchestration/orchestration-types.d.ts +124 -0
- package/dist/orchestration/orchestration-types.d.ts.map +1 -0
- package/dist/orchestration/orchestration-types.js +7 -0
- package/dist/orchestration/orchestration-types.js.map +1 -0
- package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
- package/dist/proxy/anthropic-to-requesty.js.map +1 -1
- package/dist/proxy/quic-proxy.d.ts +0 -1
- package/dist/proxy/quic-proxy.d.ts.map +1 -1
- package/dist/proxy/quic-proxy.js +2 -2
- package/dist/proxy/quic-proxy.js.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.js +1 -1
- package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
- package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
- package/dist/reasoningbank/HybridBackend.js +2 -5
- package/dist/reasoningbank/HybridBackend.js.map +1 -1
- package/dist/reasoningbank/backend-selector.d.ts +11 -1
- package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
- package/dist/reasoningbank/backend-selector.js +45 -5
- package/dist/reasoningbank/backend-selector.js.map +1 -1
- package/dist/reasoningbank/core/consolidate.d.ts.map +1 -1
- package/dist/reasoningbank/core/consolidate.js +113 -45
- package/dist/reasoningbank/core/consolidate.js.map +1 -1
- package/dist/reasoningbank/index-new.d.ts +1 -6
- package/dist/reasoningbank/index-new.d.ts.map +1 -1
- package/dist/reasoningbank/index-new.js +1 -6
- package/dist/reasoningbank/index-new.js.map +1 -1
- package/dist/reasoningbank/index.d.ts +6 -0
- package/dist/reasoningbank/index.d.ts.map +1 -1
- package/dist/reasoningbank/index.js +6 -13
- package/dist/reasoningbank/index.js.map +1 -1
- package/dist/reasoningbank/utils/embeddings.d.ts +1 -0
- package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
- package/dist/reasoningbank/utils/embeddings.js +53 -26
- package/dist/reasoningbank/utils/embeddings.js.map +1 -1
- package/dist/router/index.d.ts +2 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +1 -0
- package/dist/router/index.js.map +1 -1
- package/dist/router/providers/ollama.d.ts +20 -0
- package/dist/router/providers/ollama.d.ts.map +1 -0
- package/dist/router/providers/ollama.js +242 -0
- package/dist/router/providers/ollama.js.map +1 -0
- package/dist/router/providers/onnx-local-optimized.d.ts +2 -0
- package/dist/router/providers/onnx-local-optimized.d.ts.map +1 -1
- package/dist/router/providers/onnx-local-optimized.js +10 -0
- package/dist/router/providers/onnx-local-optimized.js.map +1 -1
- package/dist/router/providers/onnx-local.d.ts +1 -0
- package/dist/router/providers/onnx-local.d.ts.map +1 -1
- package/dist/router/providers/onnx-local.js +22 -5
- package/dist/router/providers/onnx-local.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +39 -23
- package/dist/router/router.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -1
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +3 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/sona-agent-training.d.ts +1 -0
- package/dist/services/sona-agent-training.d.ts.map +1 -1
- package/dist/services/sona-agent-training.js.map +1 -1
- package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
- package/dist/services/sona-agentdb-integration.js +9 -6
- package/dist/services/sona-agentdb-integration.js.map +1 -1
- package/dist/services/sona-service.d.ts.map +1 -1
- package/dist/services/sona-service.js +6 -5
- package/dist/services/sona-service.js.map +1 -1
- package/dist/utils/cli.d.ts +1 -1
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +21 -0
- package/dist/utils/cli.js.map +1 -1
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/model-cache.d.ts +61 -0
- package/dist/utils/model-cache.d.ts.map +1 -0
- package/dist/utils/model-cache.js +176 -0
- package/dist/utils/model-cache.js.map +1 -0
- package/dist/utils/suppress-warnings.d.ts +19 -0
- package/dist/utils/suppress-warnings.d.ts.map +1 -0
- package/dist/utils/suppress-warnings.js +59 -0
- package/dist/utils/suppress-warnings.js.map +1 -0
- package/dist/workers/consolidated-phases.d.ts +40 -0
- package/dist/workers/consolidated-phases.d.ts.map +1 -0
- package/dist/workers/consolidated-phases.js +497 -0
- package/dist/workers/consolidated-phases.js.map +1 -0
- package/dist/workers/custom-worker-config.d.ts +133 -0
- package/dist/workers/custom-worker-config.d.ts.map +1 -0
- package/dist/workers/custom-worker-config.js +215 -0
- package/dist/workers/custom-worker-config.js.map +1 -0
- package/dist/workers/custom-worker-factory.d.ts +89 -0
- package/dist/workers/custom-worker-factory.d.ts.map +1 -0
- package/dist/workers/custom-worker-factory.js +404 -0
- package/dist/workers/custom-worker-factory.js.map +1 -0
- package/dist/workers/dispatch-service.d.ts +123 -0
- package/dist/workers/dispatch-service.d.ts.map +1 -0
- package/dist/workers/dispatch-service.js +1024 -0
- package/dist/workers/dispatch-service.js.map +1 -0
- package/dist/workers/hooks-integration.d.ts +79 -0
- package/dist/workers/hooks-integration.d.ts.map +1 -0
- package/dist/workers/hooks-integration.js +286 -0
- package/dist/workers/hooks-integration.js.map +1 -0
- package/dist/workers/index.d.ts +42 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +52 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/mcp-tools.d.ts +56 -0
- package/dist/workers/mcp-tools.d.ts.map +1 -0
- package/dist/workers/mcp-tools.js +359 -0
- package/dist/workers/mcp-tools.js.map +1 -0
- package/dist/workers/phase-executors.d.ts +22 -0
- package/dist/workers/phase-executors.d.ts.map +1 -0
- package/dist/workers/phase-executors.js +445 -0
- package/dist/workers/phase-executors.js.map +1 -0
- package/dist/workers/resource-governor.d.ts +75 -0
- package/dist/workers/resource-governor.d.ts.map +1 -0
- package/dist/workers/resource-governor.js +187 -0
- package/dist/workers/resource-governor.js.map +1 -0
- package/dist/workers/ruvector-integration.d.ts +163 -0
- package/dist/workers/ruvector-integration.d.ts.map +1 -0
- package/dist/workers/ruvector-integration.js +543 -0
- package/dist/workers/ruvector-integration.js.map +1 -0
- package/dist/workers/ruvector-native-integration.d.ts +91 -0
- package/dist/workers/ruvector-native-integration.d.ts.map +1 -0
- package/dist/workers/ruvector-native-integration.js +254 -0
- package/dist/workers/ruvector-native-integration.js.map +1 -0
- package/dist/workers/trigger-detector.d.ts +68 -0
- package/dist/workers/trigger-detector.d.ts.map +1 -0
- package/dist/workers/trigger-detector.js +281 -0
- package/dist/workers/trigger-detector.js.map +1 -0
- package/dist/workers/types.d.ts +145 -0
- package/dist/workers/types.d.ts.map +1 -0
- package/dist/workers/types.js +6 -0
- package/dist/workers/types.js.map +1 -0
- package/dist/workers/worker-agent-integration.d.ts +140 -0
- package/dist/workers/worker-agent-integration.d.ts.map +1 -0
- package/dist/workers/worker-agent-integration.js +471 -0
- package/dist/workers/worker-agent-integration.js.map +1 -0
- package/dist/workers/worker-benchmarks.d.ts +88 -0
- package/dist/workers/worker-benchmarks.d.ts.map +1 -0
- package/dist/workers/worker-benchmarks.js +452 -0
- package/dist/workers/worker-benchmarks.js.map +1 -0
- package/dist/workers/worker-registry.d.ts +85 -0
- package/dist/workers/worker-registry.d.ts.map +1 -0
- package/dist/workers/worker-registry.js +547 -0
- package/dist/workers/worker-registry.js.map +1 -0
- package/docs/embeddings/EMBEDDING_GEOMETRY.md +935 -0
- package/package.json +27 -9
- package/scripts/postinstall.js +45 -4
- package/wasm/reasoningbank/reasoningbank_wasm.js +1 -1
- package/wasm/reasoningbank/reasoningbank_wasm_bg.js +54 -54
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm.d.ts +4 -3
- package/.claude/agents/test-neural.md +0 -14
- /package/.claude/agents/analysis/{code-review/analyze-code-quality.md → analyze-code-quality.md} +0 -0
- /package/.claude/agents/architecture/{system-design/arch-system-design.md → arch-system-design.md} +0 -0
- /package/.claude/agents/data/{ml/data-ml-model.md → data-ml-model.md} +0 -0
- /package/.claude/agents/development/{backend/dev-backend-api.md → dev-backend-api.md} +0 -0
- /package/.claude/agents/devops/{ci-cd/ops-cicd-github.md → ops-cicd-github.md} +0 -0
- /package/.claude/agents/documentation/{api-docs/docs-api-openapi.md → docs-api-openapi.md} +0 -0
- /package/.claude/agents/specialized/{mobile/spec-mobile-react-native.md → spec-mobile-react-native.md} +0 -0
- /package/.claude/agents/testing/{validation/production-validator.md → production-validator.md} +0 -0
- /package/.claude/agents/testing/{unit/tdd-london-swarm.md → tdd-london-swarm.md} +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SharedMemoryPool — singleton resource pool that backs HybridReasoningBank
|
|
3
|
+
* and AdvancedMemorySystem.
|
|
4
|
+
*
|
|
5
|
+
* Centralises a single SQLite database handle (better-sqlite3) and a single
|
|
6
|
+
* `EmbeddingService` instance so multiple memory consumers share the same
|
|
7
|
+
* underlying tables / embedding cache without conflicting writes.
|
|
8
|
+
*
|
|
9
|
+
* The pool is constructed lazily on first `getInstance()` call. All heavy
|
|
10
|
+
* resources (sqlite handle, embedder pipeline) are created on demand inside
|
|
11
|
+
* `ensureInitialized()` so simply importing this module is side-effect free.
|
|
12
|
+
*
|
|
13
|
+
* Used by:
|
|
14
|
+
* - reasoningbank/HybridBackend.ts (HybridReasoningBank)
|
|
15
|
+
* - reasoningbank/AdvancedMemory.ts (AdvancedMemorySystem)
|
|
16
|
+
*
|
|
17
|
+
* Fixes issue #102 — this file was previously imported but missing on disk,
|
|
18
|
+
* which broke `import 'agentic-flow'` at the top level.
|
|
19
|
+
*/
|
|
20
|
+
import { EmbeddingService } from 'agentdb';
|
|
21
|
+
type DatabaseHandle = any;
|
|
22
|
+
type EmbedderHandle = EmbeddingService;
|
|
23
|
+
export interface SharedMemoryPoolOptions {
|
|
24
|
+
/** SQLite database path. Defaults to `~/.agentic-flow/reasoningbank.db`. */
|
|
25
|
+
dbPath?: string;
|
|
26
|
+
/** Embedding model id. Defaults to `Xenova/all-MiniLM-L6-v2`. */
|
|
27
|
+
embeddingModel?: string;
|
|
28
|
+
/** Embedding vector dimension. Defaults to 384 (MiniLM-L6). */
|
|
29
|
+
embeddingDimension?: number;
|
|
30
|
+
/** Embedding provider. Defaults to `'transformers'`. */
|
|
31
|
+
embeddingProvider?: 'transformers' | 'openai' | 'local';
|
|
32
|
+
}
|
|
33
|
+
export interface SharedMemoryPoolStats {
|
|
34
|
+
initialized: boolean;
|
|
35
|
+
dbPath: string;
|
|
36
|
+
embeddingModel: string;
|
|
37
|
+
embeddingDimension: number;
|
|
38
|
+
cache: {
|
|
39
|
+
entries: number;
|
|
40
|
+
hits: number;
|
|
41
|
+
misses: number;
|
|
42
|
+
evictions: number;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export declare class SharedMemoryPool {
|
|
46
|
+
private static _instance;
|
|
47
|
+
private readonly options;
|
|
48
|
+
private db;
|
|
49
|
+
private embedder;
|
|
50
|
+
private initPromise;
|
|
51
|
+
private cache;
|
|
52
|
+
private cacheStats;
|
|
53
|
+
private constructor();
|
|
54
|
+
/**
|
|
55
|
+
* Singleton accessor. The first caller wins for option overrides; later
|
|
56
|
+
* callers always get the existing pool. To reconfigure, call `reset()`.
|
|
57
|
+
*/
|
|
58
|
+
static getInstance(options?: SharedMemoryPoolOptions): SharedMemoryPool;
|
|
59
|
+
/** Tear down the singleton — primarily for tests. */
|
|
60
|
+
static reset(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Idempotently ensure the database and embedder are ready. Subsequent calls
|
|
63
|
+
* return the same in-flight promise so concurrent consumers share init.
|
|
64
|
+
*/
|
|
65
|
+
ensureInitialized(): Promise<void>;
|
|
66
|
+
private initialize;
|
|
67
|
+
/** Apply the minimum schema that ReflexionMemory / SkillLibrary require. */
|
|
68
|
+
private applySchema;
|
|
69
|
+
/**
|
|
70
|
+
* Synchronous accessor for the database handle. Throws if init hasn't run —
|
|
71
|
+
* call `ensureInitialized()` first. Provided for compatibility with
|
|
72
|
+
* controllers that take a `Database` instance in their constructor.
|
|
73
|
+
*/
|
|
74
|
+
getDatabase(): DatabaseHandle;
|
|
75
|
+
/**
|
|
76
|
+
* Synchronous accessor for the embedder. Throws if init hasn't run.
|
|
77
|
+
*/
|
|
78
|
+
getEmbedder(): EmbedderHandle;
|
|
79
|
+
/**
|
|
80
|
+
* Cache a query result with a TTL (milliseconds). Keys are arbitrary
|
|
81
|
+
* strings; consumers (HybridReasoningBank) typically encode the query
|
|
82
|
+
* shape into the key.
|
|
83
|
+
*/
|
|
84
|
+
cacheQuery<T>(key: string, value: T, ttlMs: number): void;
|
|
85
|
+
/**
|
|
86
|
+
* Read a cached query result. Returns the cached value if present and not
|
|
87
|
+
* expired; lazily evicts expired entries on lookup.
|
|
88
|
+
*
|
|
89
|
+
* The default `T` is `any` for ergonomic interop with the existing
|
|
90
|
+
* HybridReasoningBank call sites that expect a loose return type.
|
|
91
|
+
* Pass an explicit type parameter (`getCachedQuery<MyShape>(...)`) when
|
|
92
|
+
* you want stricter typing.
|
|
93
|
+
*/
|
|
94
|
+
getCachedQuery<T = any>(key: string): T | undefined;
|
|
95
|
+
/** Drop all cached query results. */
|
|
96
|
+
invalidateCache(): void;
|
|
97
|
+
/** Diagnostic stats for telemetry / health endpoints. */
|
|
98
|
+
getStats(): SharedMemoryPoolStats;
|
|
99
|
+
/** Close the underlying database handle and clear cached state. */
|
|
100
|
+
close(): void;
|
|
101
|
+
}
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=SharedMemoryPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharedMemoryPool.d.ts","sourceRoot":"","sources":["../../src/memory/SharedMemoryPool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,KAAK,cAAc,GAAG,GAAG,CAAC;AAC1B,KAAK,cAAc,GAAG,gBAAgB,CAAC;AAEvC,MAAM,WAAW,uBAAuB;IACtC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;CACzD;AAcD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAiC;IAEzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAA8B;IAIjD,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,UAAU,CAAwC;IAE1D,OAAO;IAIP;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,gBAAgB;IAOvE,qDAAqD;IACrD,MAAM,CAAC,KAAK,IAAI,IAAI;IAOpB;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;YAQ1B,UAAU;IAsBxB,4EAA4E;IAC5E,OAAO,CAAC,WAAW;IAoEnB;;;;OAIG;IACH,WAAW,IAAI,cAAc;IAS7B;;OAEG;IACH,WAAW,IAAI,cAAc;IAS7B;;;;OAIG;IACH,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQzD;;;;;;;;OAQG;IAEH,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAgBnD,qCAAqC;IACrC,eAAe,IAAI,IAAI;IAKvB,yDAAyD;IACzD,QAAQ,IAAI,qBAAqB;IAejC,mEAAmE;IACnE,KAAK,IAAI,IAAI;CAYd"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SharedMemoryPool — singleton resource pool that backs HybridReasoningBank
|
|
3
|
+
* and AdvancedMemorySystem.
|
|
4
|
+
*
|
|
5
|
+
* Centralises a single SQLite database handle (better-sqlite3) and a single
|
|
6
|
+
* `EmbeddingService` instance so multiple memory consumers share the same
|
|
7
|
+
* underlying tables / embedding cache without conflicting writes.
|
|
8
|
+
*
|
|
9
|
+
* The pool is constructed lazily on first `getInstance()` call. All heavy
|
|
10
|
+
* resources (sqlite handle, embedder pipeline) are created on demand inside
|
|
11
|
+
* `ensureInitialized()` so simply importing this module is side-effect free.
|
|
12
|
+
*
|
|
13
|
+
* Used by:
|
|
14
|
+
* - reasoningbank/HybridBackend.ts (HybridReasoningBank)
|
|
15
|
+
* - reasoningbank/AdvancedMemory.ts (AdvancedMemorySystem)
|
|
16
|
+
*
|
|
17
|
+
* Fixes issue #102 — this file was previously imported but missing on disk,
|
|
18
|
+
* which broke `import 'agentic-flow'` at the top level.
|
|
19
|
+
*/
|
|
20
|
+
import { mkdirSync } from 'node:fs';
|
|
21
|
+
import { dirname, join } from 'node:path';
|
|
22
|
+
import { homedir } from 'node:os';
|
|
23
|
+
import { EmbeddingService } from 'agentdb';
|
|
24
|
+
const DEFAULT_OPTIONS = {
|
|
25
|
+
dbPath: join(homedir(), '.agentic-flow', 'reasoningbank.db'),
|
|
26
|
+
embeddingModel: 'Xenova/all-MiniLM-L6-v2',
|
|
27
|
+
embeddingDimension: 384,
|
|
28
|
+
embeddingProvider: 'transformers',
|
|
29
|
+
};
|
|
30
|
+
export class SharedMemoryPool {
|
|
31
|
+
static _instance = null;
|
|
32
|
+
options;
|
|
33
|
+
db = null;
|
|
34
|
+
embedder = null;
|
|
35
|
+
initPromise = null;
|
|
36
|
+
// Lightweight in-process query cache used by HybridReasoningBank to avoid
|
|
37
|
+
// re-running the same retrieval across consumers in one session.
|
|
38
|
+
cache = new Map();
|
|
39
|
+
cacheStats = { hits: 0, misses: 0, evictions: 0 };
|
|
40
|
+
constructor(options = {}) {
|
|
41
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Singleton accessor. The first caller wins for option overrides; later
|
|
45
|
+
* callers always get the existing pool. To reconfigure, call `reset()`.
|
|
46
|
+
*/
|
|
47
|
+
static getInstance(options) {
|
|
48
|
+
if (!SharedMemoryPool._instance) {
|
|
49
|
+
SharedMemoryPool._instance = new SharedMemoryPool(options);
|
|
50
|
+
}
|
|
51
|
+
return SharedMemoryPool._instance;
|
|
52
|
+
}
|
|
53
|
+
/** Tear down the singleton — primarily for tests. */
|
|
54
|
+
static reset() {
|
|
55
|
+
if (SharedMemoryPool._instance) {
|
|
56
|
+
SharedMemoryPool._instance.close();
|
|
57
|
+
}
|
|
58
|
+
SharedMemoryPool._instance = null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Idempotently ensure the database and embedder are ready. Subsequent calls
|
|
62
|
+
* return the same in-flight promise so concurrent consumers share init.
|
|
63
|
+
*/
|
|
64
|
+
async ensureInitialized() {
|
|
65
|
+
if (this.db && this.embedder)
|
|
66
|
+
return;
|
|
67
|
+
if (!this.initPromise) {
|
|
68
|
+
this.initPromise = this.initialize();
|
|
69
|
+
}
|
|
70
|
+
return this.initPromise;
|
|
71
|
+
}
|
|
72
|
+
async initialize() {
|
|
73
|
+
// Dynamic import keeps node:fs, better-sqlite3, and the embedding pipeline
|
|
74
|
+
// out of the import graph for callers that never use them.
|
|
75
|
+
const Database = await loadBetterSqlite3();
|
|
76
|
+
mkdirSync(dirname(this.options.dbPath), { recursive: true });
|
|
77
|
+
this.db = new Database(this.options.dbPath);
|
|
78
|
+
// Reasonable defaults for an embedded reasoning database.
|
|
79
|
+
this.db.pragma('journal_mode = WAL');
|
|
80
|
+
this.db.pragma('foreign_keys = ON');
|
|
81
|
+
this.db.pragma('synchronous = NORMAL');
|
|
82
|
+
this.applySchema(this.db);
|
|
83
|
+
this.embedder = new EmbeddingService({
|
|
84
|
+
model: this.options.embeddingModel,
|
|
85
|
+
dimension: this.options.embeddingDimension,
|
|
86
|
+
provider: this.options.embeddingProvider,
|
|
87
|
+
});
|
|
88
|
+
await this.embedder.initialize();
|
|
89
|
+
}
|
|
90
|
+
/** Apply the minimum schema that ReflexionMemory / SkillLibrary require. */
|
|
91
|
+
applySchema(db) {
|
|
92
|
+
db.exec(`
|
|
93
|
+
CREATE TABLE IF NOT EXISTS episodes (
|
|
94
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
95
|
+
ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
|
|
96
|
+
session_id TEXT NOT NULL,
|
|
97
|
+
task TEXT NOT NULL,
|
|
98
|
+
input TEXT,
|
|
99
|
+
output TEXT,
|
|
100
|
+
critique TEXT,
|
|
101
|
+
reward REAL NOT NULL,
|
|
102
|
+
success INTEGER NOT NULL,
|
|
103
|
+
latency_ms INTEGER,
|
|
104
|
+
tokens_used INTEGER,
|
|
105
|
+
tags TEXT,
|
|
106
|
+
metadata TEXT
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
CREATE TABLE IF NOT EXISTS episode_embeddings (
|
|
110
|
+
episode_id INTEGER PRIMARY KEY,
|
|
111
|
+
embedding BLOB NOT NULL,
|
|
112
|
+
FOREIGN KEY (episode_id) REFERENCES episodes(id) ON DELETE CASCADE
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
CREATE INDEX IF NOT EXISTS idx_episodes_task ON episodes(task);
|
|
116
|
+
CREATE INDEX IF NOT EXISTS idx_episodes_ts ON episodes(ts);
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_episodes_success ON episodes(success);
|
|
118
|
+
|
|
119
|
+
CREATE TABLE IF NOT EXISTS skills (
|
|
120
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
121
|
+
ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
|
|
122
|
+
name TEXT NOT NULL,
|
|
123
|
+
description TEXT,
|
|
124
|
+
precondition TEXT,
|
|
125
|
+
action TEXT,
|
|
126
|
+
outcome TEXT,
|
|
127
|
+
success_rate REAL,
|
|
128
|
+
uses INTEGER DEFAULT 0,
|
|
129
|
+
tags TEXT,
|
|
130
|
+
metadata TEXT,
|
|
131
|
+
UNIQUE(name)
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
CREATE TABLE IF NOT EXISTS skill_embeddings (
|
|
135
|
+
skill_id INTEGER PRIMARY KEY,
|
|
136
|
+
embedding BLOB NOT NULL,
|
|
137
|
+
FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
CREATE TABLE IF NOT EXISTS causal_edges (
|
|
141
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
142
|
+
ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
|
|
143
|
+
from_memory_id INTEGER NOT NULL,
|
|
144
|
+
from_memory_type TEXT NOT NULL,
|
|
145
|
+
to_memory_id INTEGER NOT NULL,
|
|
146
|
+
to_memory_type TEXT NOT NULL,
|
|
147
|
+
similarity REAL,
|
|
148
|
+
uplift REAL,
|
|
149
|
+
confidence REAL,
|
|
150
|
+
sample_size INTEGER,
|
|
151
|
+
metadata TEXT
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
CREATE INDEX IF NOT EXISTS idx_causal_from ON causal_edges(from_memory_id, from_memory_type);
|
|
155
|
+
CREATE INDEX IF NOT EXISTS idx_causal_to ON causal_edges(to_memory_id, to_memory_type);
|
|
156
|
+
`);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Synchronous accessor for the database handle. Throws if init hasn't run —
|
|
160
|
+
* call `ensureInitialized()` first. Provided for compatibility with
|
|
161
|
+
* controllers that take a `Database` instance in their constructor.
|
|
162
|
+
*/
|
|
163
|
+
getDatabase() {
|
|
164
|
+
if (!this.db) {
|
|
165
|
+
throw new Error('SharedMemoryPool: database not initialised. Call ensureInitialized() first.');
|
|
166
|
+
}
|
|
167
|
+
return this.db;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Synchronous accessor for the embedder. Throws if init hasn't run.
|
|
171
|
+
*/
|
|
172
|
+
getEmbedder() {
|
|
173
|
+
if (!this.embedder) {
|
|
174
|
+
throw new Error('SharedMemoryPool: embedder not initialised. Call ensureInitialized() first.');
|
|
175
|
+
}
|
|
176
|
+
return this.embedder;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Cache a query result with a TTL (milliseconds). Keys are arbitrary
|
|
180
|
+
* strings; consumers (HybridReasoningBank) typically encode the query
|
|
181
|
+
* shape into the key.
|
|
182
|
+
*/
|
|
183
|
+
cacheQuery(key, value, ttlMs) {
|
|
184
|
+
if (!key || ttlMs <= 0)
|
|
185
|
+
return;
|
|
186
|
+
this.cache.set(key, {
|
|
187
|
+
value: value,
|
|
188
|
+
expiresAt: Date.now() + ttlMs,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Read a cached query result. Returns the cached value if present and not
|
|
193
|
+
* expired; lazily evicts expired entries on lookup.
|
|
194
|
+
*
|
|
195
|
+
* The default `T` is `any` for ergonomic interop with the existing
|
|
196
|
+
* HybridReasoningBank call sites that expect a loose return type.
|
|
197
|
+
* Pass an explicit type parameter (`getCachedQuery<MyShape>(...)`) when
|
|
198
|
+
* you want stricter typing.
|
|
199
|
+
*/
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
201
|
+
getCachedQuery(key) {
|
|
202
|
+
const entry = this.cache.get(key);
|
|
203
|
+
if (!entry) {
|
|
204
|
+
this.cacheStats.misses++;
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
if (entry.expiresAt < Date.now()) {
|
|
208
|
+
this.cache.delete(key);
|
|
209
|
+
this.cacheStats.evictions++;
|
|
210
|
+
this.cacheStats.misses++;
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
this.cacheStats.hits++;
|
|
214
|
+
return entry.value;
|
|
215
|
+
}
|
|
216
|
+
/** Drop all cached query results. */
|
|
217
|
+
invalidateCache() {
|
|
218
|
+
this.cacheStats.evictions += this.cache.size;
|
|
219
|
+
this.cache.clear();
|
|
220
|
+
}
|
|
221
|
+
/** Diagnostic stats for telemetry / health endpoints. */
|
|
222
|
+
getStats() {
|
|
223
|
+
return {
|
|
224
|
+
initialized: this.db !== null && this.embedder !== null,
|
|
225
|
+
dbPath: this.options.dbPath,
|
|
226
|
+
embeddingModel: this.options.embeddingModel,
|
|
227
|
+
embeddingDimension: this.options.embeddingDimension,
|
|
228
|
+
cache: {
|
|
229
|
+
entries: this.cache.size,
|
|
230
|
+
hits: this.cacheStats.hits,
|
|
231
|
+
misses: this.cacheStats.misses,
|
|
232
|
+
evictions: this.cacheStats.evictions,
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/** Close the underlying database handle and clear cached state. */
|
|
237
|
+
close() {
|
|
238
|
+
try {
|
|
239
|
+
this.db?.close?.();
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
/* swallow — closing twice is benign */
|
|
243
|
+
}
|
|
244
|
+
this.db = null;
|
|
245
|
+
this.embedder = null;
|
|
246
|
+
this.initPromise = null;
|
|
247
|
+
this.cache.clear();
|
|
248
|
+
this.cacheStats = { hits: 0, misses: 0, evictions: 0 };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
async function loadBetterSqlite3() {
|
|
252
|
+
// better-sqlite3 is a heavy native module; load it lazily so the rest of the
|
|
253
|
+
// package can be imported even when this optional dep is unavailable.
|
|
254
|
+
try {
|
|
255
|
+
const mod = await import('better-sqlite3');
|
|
256
|
+
return mod.default ?? mod;
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
throw new Error(`SharedMemoryPool requires 'better-sqlite3' but it could not be loaded: ${err?.message || err}. ` +
|
|
260
|
+
`Install it with: npm install better-sqlite3`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=SharedMemoryPool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharedMemoryPool.js","sourceRoot":"","sources":["../../src/memory/SharedMemoryPool.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SharedMemoryPool — singleton resource pool that backs HybridReasoningBank\n * and AdvancedMemorySystem.\n *\n * Centralises a single SQLite database handle (better-sqlite3) and a single\n * `EmbeddingService` instance so multiple memory consumers share the same\n * underlying tables / embedding cache without conflicting writes.\n *\n * The pool is constructed lazily on first `getInstance()` call. All heavy\n * resources (sqlite handle, embedder pipeline) are created on demand inside\n * `ensureInitialized()` so simply importing this module is side-effect free.\n *\n * Used by:\n * - reasoningbank/HybridBackend.ts (HybridReasoningBank)\n * - reasoningbank/AdvancedMemory.ts (AdvancedMemorySystem)\n *\n * Fixes issue #102 — this file was previously imported but missing on disk,\n * which broke `import 'agentic-flow'` at the top level.\n */\n\nimport { mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { EmbeddingService } from 'agentdb';\n\ntype DatabaseHandle = any;\ntype EmbedderHandle = EmbeddingService;\n\nexport interface SharedMemoryPoolOptions {\n /** SQLite database path. Defaults to `~/.agentic-flow/reasoningbank.db`. */\n dbPath?: string;\n /** Embedding model id. Defaults to `Xenova/all-MiniLM-L6-v2`. */\n embeddingModel?: string;\n /** Embedding vector dimension. Defaults to 384 (MiniLM-L6). */\n embeddingDimension?: number;\n /** Embedding provider. Defaults to `'transformers'`. */\n embeddingProvider?: 'transformers' | 'openai' | 'local';\n}\n\nconst DEFAULT_OPTIONS: Required<SharedMemoryPoolOptions> = {\n dbPath: join(homedir(), '.agentic-flow', 'reasoningbank.db'),\n embeddingModel: 'Xenova/all-MiniLM-L6-v2',\n embeddingDimension: 384,\n embeddingProvider: 'transformers',\n};\n\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n}\n\nexport interface SharedMemoryPoolStats {\n initialized: boolean;\n dbPath: string;\n embeddingModel: string;\n embeddingDimension: number;\n cache: {\n entries: number;\n hits: number;\n misses: number;\n evictions: number;\n };\n}\n\nexport class SharedMemoryPool {\n private static _instance: SharedMemoryPool | null = null;\n\n private readonly options: Required<SharedMemoryPoolOptions>;\n private db: DatabaseHandle | null = null;\n private embedder: EmbedderHandle | null = null;\n private initPromise: Promise<void> | null = null;\n\n // Lightweight in-process query cache used by HybridReasoningBank to avoid\n // re-running the same retrieval across consumers in one session.\n private cache = new Map<string, CacheEntry<unknown>>();\n private cacheStats = { hits: 0, misses: 0, evictions: 0 };\n\n private constructor(options: SharedMemoryPoolOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Singleton accessor. The first caller wins for option overrides; later\n * callers always get the existing pool. To reconfigure, call `reset()`.\n */\n static getInstance(options?: SharedMemoryPoolOptions): SharedMemoryPool {\n if (!SharedMemoryPool._instance) {\n SharedMemoryPool._instance = new SharedMemoryPool(options);\n }\n return SharedMemoryPool._instance;\n }\n\n /** Tear down the singleton — primarily for tests. */\n static reset(): void {\n if (SharedMemoryPool._instance) {\n SharedMemoryPool._instance.close();\n }\n SharedMemoryPool._instance = null;\n }\n\n /**\n * Idempotently ensure the database and embedder are ready. Subsequent calls\n * return the same in-flight promise so concurrent consumers share init.\n */\n async ensureInitialized(): Promise<void> {\n if (this.db && this.embedder) return;\n if (!this.initPromise) {\n this.initPromise = this.initialize();\n }\n return this.initPromise;\n }\n\n private async initialize(): Promise<void> {\n // Dynamic import keeps node:fs, better-sqlite3, and the embedding pipeline\n // out of the import graph for callers that never use them.\n const Database = await loadBetterSqlite3();\n\n mkdirSync(dirname(this.options.dbPath), { recursive: true });\n this.db = new Database(this.options.dbPath);\n // Reasonable defaults for an embedded reasoning database.\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.db.pragma('synchronous = NORMAL');\n\n this.applySchema(this.db);\n\n this.embedder = new EmbeddingService({\n model: this.options.embeddingModel,\n dimension: this.options.embeddingDimension,\n provider: this.options.embeddingProvider,\n });\n await this.embedder.initialize();\n }\n\n /** Apply the minimum schema that ReflexionMemory / SkillLibrary require. */\n private applySchema(db: DatabaseHandle): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS episodes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n session_id TEXT NOT NULL,\n task TEXT NOT NULL,\n input TEXT,\n output TEXT,\n critique TEXT,\n reward REAL NOT NULL,\n success INTEGER NOT NULL,\n latency_ms INTEGER,\n tokens_used INTEGER,\n tags TEXT,\n metadata TEXT\n );\n\n CREATE TABLE IF NOT EXISTS episode_embeddings (\n episode_id INTEGER PRIMARY KEY,\n embedding BLOB NOT NULL,\n FOREIGN KEY (episode_id) REFERENCES episodes(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_episodes_task ON episodes(task);\n CREATE INDEX IF NOT EXISTS idx_episodes_ts ON episodes(ts);\n CREATE INDEX IF NOT EXISTS idx_episodes_success ON episodes(success);\n\n CREATE TABLE IF NOT EXISTS skills (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n name TEXT NOT NULL,\n description TEXT,\n precondition TEXT,\n action TEXT,\n outcome TEXT,\n success_rate REAL,\n uses INTEGER DEFAULT 0,\n tags TEXT,\n metadata TEXT,\n UNIQUE(name)\n );\n\n CREATE TABLE IF NOT EXISTS skill_embeddings (\n skill_id INTEGER PRIMARY KEY,\n embedding BLOB NOT NULL,\n FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS causal_edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n from_memory_id INTEGER NOT NULL,\n from_memory_type TEXT NOT NULL,\n to_memory_id INTEGER NOT NULL,\n to_memory_type TEXT NOT NULL,\n similarity REAL,\n uplift REAL,\n confidence REAL,\n sample_size INTEGER,\n metadata TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_causal_from ON causal_edges(from_memory_id, from_memory_type);\n CREATE INDEX IF NOT EXISTS idx_causal_to ON causal_edges(to_memory_id, to_memory_type);\n `);\n }\n\n /**\n * Synchronous accessor for the database handle. Throws if init hasn't run —\n * call `ensureInitialized()` first. Provided for compatibility with\n * controllers that take a `Database` instance in their constructor.\n */\n getDatabase(): DatabaseHandle {\n if (!this.db) {\n throw new Error(\n 'SharedMemoryPool: database not initialised. Call ensureInitialized() first.'\n );\n }\n return this.db;\n }\n\n /**\n * Synchronous accessor for the embedder. Throws if init hasn't run.\n */\n getEmbedder(): EmbedderHandle {\n if (!this.embedder) {\n throw new Error(\n 'SharedMemoryPool: embedder not initialised. Call ensureInitialized() first.'\n );\n }\n return this.embedder;\n }\n\n /**\n * Cache a query result with a TTL (milliseconds). Keys are arbitrary\n * strings; consumers (HybridReasoningBank) typically encode the query\n * shape into the key.\n */\n cacheQuery<T>(key: string, value: T, ttlMs: number): void {\n if (!key || ttlMs <= 0) return;\n this.cache.set(key, {\n value: value as unknown,\n expiresAt: Date.now() + ttlMs,\n });\n }\n\n /**\n * Read a cached query result. Returns the cached value if present and not\n * expired; lazily evicts expired entries on lookup.\n *\n * The default `T` is `any` for ergonomic interop with the existing\n * HybridReasoningBank call sites that expect a loose return type.\n * Pass an explicit type parameter (`getCachedQuery<MyShape>(...)`) when\n * you want stricter typing.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCachedQuery<T = any>(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) {\n this.cacheStats.misses++;\n return undefined;\n }\n if (entry.expiresAt < Date.now()) {\n this.cache.delete(key);\n this.cacheStats.evictions++;\n this.cacheStats.misses++;\n return undefined;\n }\n this.cacheStats.hits++;\n return entry.value as T;\n }\n\n /** Drop all cached query results. */\n invalidateCache(): void {\n this.cacheStats.evictions += this.cache.size;\n this.cache.clear();\n }\n\n /** Diagnostic stats for telemetry / health endpoints. */\n getStats(): SharedMemoryPoolStats {\n return {\n initialized: this.db !== null && this.embedder !== null,\n dbPath: this.options.dbPath,\n embeddingModel: this.options.embeddingModel,\n embeddingDimension: this.options.embeddingDimension,\n cache: {\n entries: this.cache.size,\n hits: this.cacheStats.hits,\n misses: this.cacheStats.misses,\n evictions: this.cacheStats.evictions,\n },\n };\n }\n\n /** Close the underlying database handle and clear cached state. */\n close(): void {\n try {\n this.db?.close?.();\n } catch {\n /* swallow — closing twice is benign */\n }\n this.db = null;\n this.embedder = null;\n this.initPromise = null;\n this.cache.clear();\n this.cacheStats = { hits: 0, misses: 0, evictions: 0 };\n }\n}\n\nasync function loadBetterSqlite3(): Promise<any> {\n // better-sqlite3 is a heavy native module; load it lazily so the rest of the\n // package can be imported even when this optional dep is unavailable.\n try {\n const mod: any = await import('better-sqlite3');\n return mod.default ?? mod;\n } catch (err: any) {\n throw new Error(\n `SharedMemoryPool requires 'better-sqlite3' but it could not be loaded: ${err?.message || err}. ` +\n `Install it with: npm install better-sqlite3`\n );\n }\n}\n"]}
|
|
@@ -38,9 +38,9 @@ interface EditResult {
|
|
|
38
38
|
export declare class AgentBoosterMigration {
|
|
39
39
|
private config;
|
|
40
40
|
private boosterEngine;
|
|
41
|
+
private boosterEnginePromise;
|
|
41
42
|
private stats;
|
|
42
43
|
constructor(config?: Partial<AgentBoosterConfig>);
|
|
43
|
-
private ensureEngine;
|
|
44
44
|
/**
|
|
45
45
|
* Perform code edit using Agent Booster
|
|
46
46
|
*/
|
|
@@ -52,6 +52,7 @@ export declare class AgentBoosterMigration {
|
|
|
52
52
|
/**
|
|
53
53
|
* Edit using Agent Booster (352x faster)
|
|
54
54
|
*/
|
|
55
|
+
private getBoosterEngine;
|
|
55
56
|
private editWithAgentBooster;
|
|
56
57
|
/**
|
|
57
58
|
* Traditional code edit (slow - 352ms average)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-booster-migration.d.ts","sourceRoot":"","sources":["../../src/optimizations/agent-booster-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"agent-booster-migration.d.ts","sourceRoot":"","sources":["../../src/optimizations/agent-booster-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmCH,UAAU,kBAAkB;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE;QACX,mBAAmB,EAAE,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,UAAU,QAAQ;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,eAAe,GAAG,aAAa,GAAG,UAAU,CAAC;IACrD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,oBAAoB,CAA4C;IACxE,OAAO,CAAC,KAAK,CAMX;gBAEU,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IA6CpD;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAcnD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;YACW,gBAAgB;YAahB,oBAAoB;IA8ClC;;OAEG;YACW,eAAe;IAyB7B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,QAAQ;;;;oBAtNM,MAAM;sBACJ,MAAM;0BACF,MAAM;wBACR,MAAM;qBACT,MAAM;;IAsOrB;;OAEG;IACH,cAAc,IAAI,MAAM;IAqCxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOzD;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAChD,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,uBAAuB,EAAE,MAAM,CAAC;KACjC,CAAC;CAWH;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,uBAA8B,CAAC;AAEjE;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAOrB;AAED;;GAEG;AACH,wBAAsB,YAAY,kBAuDjC"}
|
|
@@ -9,19 +9,19 @@
|
|
|
9
9
|
* Impact: All code editing operations
|
|
10
10
|
*/
|
|
11
11
|
import { writeFileSync } from 'fs';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return null;
|
|
12
|
+
let _AgentBoosterCtor = null;
|
|
13
|
+
async function loadAgentBoosterCtor() {
|
|
14
|
+
if (_AgentBoosterCtor)
|
|
15
|
+
return _AgentBoosterCtor;
|
|
16
|
+
const mod = await import('agent-booster').catch((err) => {
|
|
17
|
+
throw new Error(`Optional package 'agent-booster' is not installed: ${err?.message || err}. ` +
|
|
18
|
+
`Run: npm install agent-booster`);
|
|
19
|
+
});
|
|
20
|
+
_AgentBoosterCtor = mod.AgentBooster ?? mod.default?.AgentBooster ?? mod.default;
|
|
21
|
+
if (!_AgentBoosterCtor) {
|
|
22
|
+
throw new Error("'agent-booster' loaded but does not export AgentBooster");
|
|
24
23
|
}
|
|
24
|
+
return _AgentBoosterCtor;
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* Agent Booster Migration Class
|
|
@@ -29,6 +29,7 @@ async function getAgentBoosterEngine() {
|
|
|
29
29
|
export class AgentBoosterMigration {
|
|
30
30
|
config;
|
|
31
31
|
boosterEngine = null;
|
|
32
|
+
boosterEnginePromise = null;
|
|
32
33
|
stats;
|
|
33
34
|
constructor(config = {}) {
|
|
34
35
|
this.config = {
|
|
@@ -37,36 +38,42 @@ export class AgentBoosterMigration {
|
|
|
37
38
|
fallback: true,
|
|
38
39
|
maxFileSize: 10 * 1024 * 1024, // 10MB
|
|
39
40
|
supportedLanguages: [
|
|
40
|
-
'typescript',
|
|
41
|
-
'
|
|
42
|
-
'
|
|
41
|
+
'typescript',
|
|
42
|
+
'javascript',
|
|
43
|
+
'python',
|
|
44
|
+
'java',
|
|
45
|
+
'cpp',
|
|
46
|
+
'c',
|
|
47
|
+
'rust',
|
|
48
|
+
'go',
|
|
49
|
+
'ruby',
|
|
50
|
+
'php',
|
|
51
|
+
'swift',
|
|
52
|
+
'kotlin',
|
|
53
|
+
'scala',
|
|
54
|
+
'haskell',
|
|
55
|
+
'elixir',
|
|
56
|
+
'clojure',
|
|
57
|
+
'r',
|
|
58
|
+
'julia',
|
|
59
|
+
'dart',
|
|
43
60
|
],
|
|
44
61
|
performance: {
|
|
45
62
|
targetSpeedupFactor: 352,
|
|
46
|
-
maxLatencyMs: 1
|
|
63
|
+
maxLatencyMs: 1,
|
|
47
64
|
},
|
|
48
|
-
...config
|
|
65
|
+
...config,
|
|
49
66
|
};
|
|
67
|
+
// Defer Agent Booster engine initialization until first use so the
|
|
68
|
+
// optional dependency can be loaded lazily.
|
|
50
69
|
this.stats = {
|
|
51
70
|
totalEdits: 0,
|
|
52
71
|
boosterEdits: 0,
|
|
53
72
|
traditionalEdits: 0,
|
|
54
73
|
totalSavingsMs: 0,
|
|
55
|
-
costSavings: 0
|
|
74
|
+
costSavings: 0,
|
|
56
75
|
};
|
|
57
76
|
}
|
|
58
|
-
async ensureEngine() {
|
|
59
|
-
if (this.boosterEngine)
|
|
60
|
-
return true;
|
|
61
|
-
const Engine = await getAgentBoosterEngine();
|
|
62
|
-
if (!Engine)
|
|
63
|
-
return false;
|
|
64
|
-
this.boosterEngine = new Engine({
|
|
65
|
-
confidenceThreshold: 0.5,
|
|
66
|
-
maxChunks: 100
|
|
67
|
-
});
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
77
|
/**
|
|
71
78
|
* Perform code edit using Agent Booster
|
|
72
79
|
*/
|
|
@@ -104,14 +111,31 @@ export class AgentBoosterMigration {
|
|
|
104
111
|
/**
|
|
105
112
|
* Edit using Agent Booster (352x faster)
|
|
106
113
|
*/
|
|
114
|
+
async getBoosterEngine() {
|
|
115
|
+
if (this.boosterEngine)
|
|
116
|
+
return this.boosterEngine;
|
|
117
|
+
if (!this.boosterEnginePromise) {
|
|
118
|
+
this.boosterEnginePromise = (async () => {
|
|
119
|
+
const Ctor = await loadAgentBoosterCtor();
|
|
120
|
+
const engine = new Ctor({ confidenceThreshold: 0.5, maxChunks: 100 });
|
|
121
|
+
this.boosterEngine = engine;
|
|
122
|
+
return engine;
|
|
123
|
+
})();
|
|
124
|
+
}
|
|
125
|
+
return this.boosterEnginePromise;
|
|
126
|
+
}
|
|
107
127
|
async editWithAgentBooster(edit, startTime) {
|
|
108
128
|
try {
|
|
109
129
|
const bytesProcessed = Buffer.byteLength(edit.newContent, 'utf8');
|
|
110
|
-
// Call REAL Agent Booster WASM engine
|
|
111
|
-
const
|
|
130
|
+
// Call REAL Agent Booster WASM engine - use any for flexible signature
|
|
131
|
+
const engine = await this.getBoosterEngine();
|
|
132
|
+
const result = await engine.apply({
|
|
112
133
|
code: edit.oldContent,
|
|
113
134
|
edit: edit.newContent,
|
|
114
|
-
language: edit.language
|
|
135
|
+
language: edit.language,
|
|
136
|
+
target_filepath: edit.filePath || '',
|
|
137
|
+
instructions: edit.newContent,
|
|
138
|
+
code_edit: edit.newContent,
|
|
115
139
|
});
|
|
116
140
|
// Write the edit if successful
|
|
117
141
|
if (result.success && edit.filePath) {
|
|
@@ -122,14 +146,14 @@ export class AgentBoosterMigration {
|
|
|
122
146
|
const speedupFactor = traditionalTime / executionTimeMs;
|
|
123
147
|
// Update stats
|
|
124
148
|
this.stats.boosterEdits++;
|
|
125
|
-
this.stats.totalSavingsMs +=
|
|
149
|
+
this.stats.totalSavingsMs += traditionalTime - executionTimeMs;
|
|
126
150
|
this.stats.costSavings += this.calculateCostSavings(traditionalTime, executionTimeMs);
|
|
127
151
|
return {
|
|
128
152
|
success: result.success,
|
|
129
153
|
executionTimeMs,
|
|
130
154
|
speedupFactor,
|
|
131
155
|
method: 'agent-booster',
|
|
132
|
-
bytesProcessed
|
|
156
|
+
bytesProcessed,
|
|
133
157
|
};
|
|
134
158
|
}
|
|
135
159
|
catch (error) {
|
|
@@ -160,7 +184,7 @@ export class AgentBoosterMigration {
|
|
|
160
184
|
executionTimeMs,
|
|
161
185
|
speedupFactor: 1,
|
|
162
186
|
method: 'traditional',
|
|
163
|
-
bytesProcessed
|
|
187
|
+
bytesProcessed,
|
|
164
188
|
};
|
|
165
189
|
}
|
|
166
190
|
/**
|
|
@@ -204,7 +228,7 @@ export class AgentBoosterMigration {
|
|
|
204
228
|
...this.stats,
|
|
205
229
|
avgSpeedupFactor,
|
|
206
230
|
monthlySavings: monthlySavings.toFixed(2),
|
|
207
|
-
boosterAdoptionRate: ((this.stats.boosterEdits / this.stats.totalEdits) * 100).toFixed(1) + '%'
|
|
231
|
+
boosterAdoptionRate: ((this.stats.boosterEdits / this.stats.totalEdits) * 100).toFixed(1) + '%',
|
|
208
232
|
};
|
|
209
233
|
}
|
|
210
234
|
/**
|
|
@@ -249,14 +273,14 @@ export class AgentBoosterMigration {
|
|
|
249
273
|
* Sleep helper
|
|
250
274
|
*/
|
|
251
275
|
sleep(ms) {
|
|
252
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
276
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
253
277
|
}
|
|
254
278
|
/**
|
|
255
279
|
* Batch edit multiple files
|
|
256
280
|
*/
|
|
257
281
|
async batchEdit(edits) {
|
|
258
282
|
// Process edits in parallel for maximum performance
|
|
259
|
-
const results = await Promise.all(edits.map(edit => this.editCode(edit)));
|
|
283
|
+
const results = await Promise.all(edits.map((edit) => this.editCode(edit)));
|
|
260
284
|
return results;
|
|
261
285
|
}
|
|
262
286
|
/**
|
|
@@ -269,7 +293,7 @@ export class AgentBoosterMigration {
|
|
|
269
293
|
return {
|
|
270
294
|
filesProcessed: 1000,
|
|
271
295
|
totalSpeedup: 352,
|
|
272
|
-
estimatedMonthlySavings: 240
|
|
296
|
+
estimatedMonthlySavings: 240,
|
|
273
297
|
};
|
|
274
298
|
}
|
|
275
299
|
}
|
|
@@ -285,7 +309,7 @@ export async function editCode(filePath, oldContent, newContent, language) {
|
|
|
285
309
|
filePath,
|
|
286
310
|
oldContent,
|
|
287
311
|
newContent,
|
|
288
|
-
language
|
|
312
|
+
language,
|
|
289
313
|
});
|
|
290
314
|
}
|
|
291
315
|
/**
|
|
@@ -306,20 +330,20 @@ export async function exampleUsage() {
|
|
|
306
330
|
filePath: '/tmp/file1.ts',
|
|
307
331
|
oldContent: 'old1',
|
|
308
332
|
newContent: 'new1',
|
|
309
|
-
language: 'typescript'
|
|
333
|
+
language: 'typescript',
|
|
310
334
|
},
|
|
311
335
|
{
|
|
312
336
|
filePath: '/tmp/file2.js',
|
|
313
337
|
oldContent: 'old2',
|
|
314
338
|
newContent: 'new2',
|
|
315
|
-
language: 'javascript'
|
|
339
|
+
language: 'javascript',
|
|
316
340
|
},
|
|
317
341
|
{
|
|
318
342
|
filePath: '/tmp/file3.py',
|
|
319
343
|
oldContent: 'old3',
|
|
320
344
|
newContent: 'new3',
|
|
321
|
-
language: 'python'
|
|
322
|
-
}
|
|
345
|
+
language: 'python',
|
|
346
|
+
},
|
|
323
347
|
];
|
|
324
348
|
const batchResults = await agentBoosterMigration.batchEdit(batchEdits);
|
|
325
349
|
console.log(`Batch Edit Results: ${batchResults.length} files processed`);
|