moflo 4.8.21 → 4.8.22
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/agents/browser/browser-agent.yaml +182 -182
- package/.claude/agents/core/coder.md +265 -265
- package/.claude/agents/core/planner.md +167 -167
- package/.claude/agents/core/researcher.md +189 -189
- package/.claude/agents/core/reviewer.md +325 -325
- package/.claude/agents/core/tester.md +318 -318
- package/.claude/agents/database-specialist.yaml +21 -21
- package/.claude/agents/dual-mode/codex-coordinator.md +224 -224
- package/.claude/agents/dual-mode/codex-worker.md +211 -211
- package/.claude/agents/dual-mode/dual-orchestrator.md +291 -291
- package/.claude/agents/github/code-review-swarm.md +537 -537
- package/.claude/agents/github/github-modes.md +172 -172
- package/.claude/agents/github/issue-tracker.md +318 -318
- package/.claude/agents/github/multi-repo-swarm.md +552 -552
- package/.claude/agents/github/pr-manager.md +190 -190
- package/.claude/agents/github/project-board-sync.md +508 -508
- package/.claude/agents/github/release-manager.md +366 -366
- package/.claude/agents/github/release-swarm.md +582 -582
- package/.claude/agents/github/repo-architect.md +397 -397
- package/.claude/agents/github/swarm-issue.md +572 -572
- package/.claude/agents/github/swarm-pr.md +427 -427
- package/.claude/agents/github/sync-coordinator.md +451 -451
- package/.claude/agents/github/workflow-automation.md +634 -634
- package/.claude/agents/goal/code-goal-planner.md +445 -445
- package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +129 -129
- package/.claude/agents/hive-mind/queen-coordinator.md +202 -202
- package/.claude/agents/hive-mind/scout-explorer.md +241 -241
- package/.claude/agents/hive-mind/swarm-memory-manager.md +192 -192
- package/.claude/agents/hive-mind/worker-specialist.md +216 -216
- package/.claude/agents/index.yaml +17 -17
- package/.claude/agents/neural/safla-neural.md +73 -73
- package/.claude/agents/project-coordinator.yaml +15 -15
- package/.claude/agents/python-specialist.yaml +21 -21
- package/.claude/agents/reasoning/goal-planner.md +72 -72
- package/.claude/agents/security-auditor.yaml +20 -20
- package/.claude/agents/swarm/adaptive-coordinator.md +395 -395
- package/.claude/agents/swarm/hierarchical-coordinator.md +326 -326
- package/.claude/agents/swarm/mesh-coordinator.md +391 -391
- package/.claude/agents/templates/migration-plan.md +745 -745
- package/.claude/agents/typescript-specialist.yaml +21 -21
- package/.claude/checkpoints/1767754460.json +8 -8
- package/.claude/commands/agents/agent-spawning.md +28 -28
- package/.claude/commands/github/github-modes.md +146 -146
- package/.claude/commands/github/github-swarm.md +121 -121
- package/.claude/commands/github/issue-tracker.md +291 -291
- package/.claude/commands/github/pr-manager.md +169 -169
- package/.claude/commands/github/release-manager.md +337 -337
- package/.claude/commands/github/repo-architect.md +366 -366
- package/.claude/commands/github/sync-coordinator.md +300 -300
- package/.claude/commands/memory/neural.md +47 -47
- package/.claude/commands/sparc/analyzer.md +51 -51
- package/.claude/commands/sparc/architect.md +53 -53
- package/.claude/commands/sparc/ask.md +97 -97
- package/.claude/commands/sparc/batch-executor.md +54 -54
- package/.claude/commands/sparc/code.md +89 -89
- package/.claude/commands/sparc/coder.md +54 -54
- package/.claude/commands/sparc/debug.md +83 -83
- package/.claude/commands/sparc/debugger.md +54 -54
- package/.claude/commands/sparc/designer.md +53 -53
- package/.claude/commands/sparc/devops.md +109 -109
- package/.claude/commands/sparc/docs-writer.md +80 -80
- package/.claude/commands/sparc/documenter.md +54 -54
- package/.claude/commands/sparc/innovator.md +54 -54
- package/.claude/commands/sparc/integration.md +83 -83
- package/.claude/commands/sparc/mcp.md +117 -117
- package/.claude/commands/sparc/memory-manager.md +54 -54
- package/.claude/commands/sparc/optimizer.md +54 -54
- package/.claude/commands/sparc/orchestrator.md +131 -131
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -83
- package/.claude/commands/sparc/refinement-optimization-mode.md +83 -83
- package/.claude/commands/sparc/researcher.md +54 -54
- package/.claude/commands/sparc/reviewer.md +54 -54
- package/.claude/commands/sparc/security-review.md +80 -80
- package/.claude/commands/sparc/sparc-modes.md +174 -174
- package/.claude/commands/sparc/sparc.md +111 -111
- package/.claude/commands/sparc/spec-pseudocode.md +80 -80
- package/.claude/commands/sparc/supabase-admin.md +348 -348
- package/.claude/commands/sparc/swarm-coordinator.md +54 -54
- package/.claude/commands/sparc/tdd.md +54 -54
- package/.claude/commands/sparc/tester.md +54 -54
- package/.claude/commands/sparc/tutorial.md +79 -79
- package/.claude/commands/sparc/workflow-manager.md +54 -54
- package/.claude/commands/sparc.md +166 -166
- package/.claude/commands/swarm/analysis.md +95 -95
- package/.claude/commands/swarm/development.md +96 -96
- package/.claude/commands/swarm/examples.md +168 -168
- package/.claude/commands/swarm/maintenance.md +102 -102
- package/.claude/commands/swarm/optimization.md +117 -117
- package/.claude/commands/swarm/research.md +136 -136
- package/.claude/commands/swarm/testing.md +131 -131
- package/.claude/commands/workflows/development.md +77 -77
- package/.claude/commands/workflows/research.md +62 -62
- package/.claude/guidance/moflo-bootstrap.md +126 -126
- package/.claude/guidance/shipped/agent-bootstrap.md +126 -126
- package/.claude/guidance/shipped/guidance-memory-strategy.md +262 -262
- package/.claude/guidance/shipped/memory-strategy.md +204 -204
- package/.claude/guidance/shipped/moflo.md +668 -653
- package/.claude/guidance/shipped/task-swarm-integration.md +441 -441
- package/.claude/helpers/intelligence.cjs +207 -207
- package/.claude/helpers/statusline.cjs +851 -851
- package/.claude/settings.local.json +18 -0
- package/.claude/skills/fl/SKILL.md +583 -583
- package/.claude/skills/flo/SKILL.md +583 -583
- package/.claude/skills/github-code-review/SKILL.md +1140 -1140
- package/.claude/skills/github-multi-repo/SKILL.md +874 -874
- package/.claude/skills/github-project-management/SKILL.md +1277 -1277
- package/.claude/skills/github-release-management/SKILL.md +1081 -1081
- package/.claude/skills/github-workflow-automation/SKILL.md +1065 -1065
- package/.claude/skills/hive-mind-advanced/SKILL.md +712 -712
- package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
- package/.claude/skills/performance-analysis/SKILL.md +563 -563
- package/.claude/skills/sparc-methodology/SKILL.md +1115 -1115
- package/.claude/skills/swarm-advanced/SKILL.md +973 -973
- package/.claude/workflow-state.json +4 -4
- package/LICENSE +21 -21
- package/README.md +685 -685
- package/bin/cli.js +0 -0
- package/bin/gate-hook.mjs +50 -50
- package/bin/gate.cjs +138 -138
- package/bin/generate-code-map.mjs +775 -775
- package/bin/hook-handler.cjs +83 -83
- package/bin/hooks.mjs +656 -656
- package/bin/index-guidance.mjs +892 -892
- package/bin/index-tests.mjs +709 -709
- package/bin/lib/process-manager.mjs +243 -243
- package/bin/lib/registry-cleanup.cjs +41 -41
- package/bin/prompt-hook.mjs +72 -72
- package/bin/semantic-search.mjs +472 -472
- package/bin/session-start-launcher.mjs +238 -238
- package/bin/setup-project.mjs +250 -250
- package/package.json +123 -123
- package/src/@claude-flow/cli/README.md +452 -452
- package/src/@claude-flow/cli/bin/cli.js +180 -180
- package/src/@claude-flow/cli/bin/preinstall.cjs +2 -2
- package/src/@claude-flow/cli/dist/src/commands/completions.js +409 -409
- package/src/@claude-flow/cli/dist/src/commands/doctor.js +5 -1
- package/src/@claude-flow/cli/dist/src/commands/embeddings.js +25 -25
- package/src/@claude-flow/cli/dist/src/commands/github.js +61 -61
- package/src/@claude-flow/cli/dist/src/commands/hive-mind.js +90 -90
- package/src/@claude-flow/cli/dist/src/commands/hooks.js +9 -9
- package/src/@claude-flow/cli/dist/src/commands/ruvector/import.js +14 -14
- package/src/@claude-flow/cli/dist/src/commands/ruvector/setup.js +624 -624
- package/src/@claude-flow/cli/dist/src/config/moflo-config.d.ts +3 -0
- package/src/@claude-flow/cli/dist/src/config/moflo-config.js +101 -91
- package/src/@claude-flow/cli/dist/src/index.d.ts +5 -0
- package/src/@claude-flow/cli/dist/src/index.js +44 -0
- package/src/@claude-flow/cli/dist/src/init/claudemd-generator.d.ts +29 -29
- package/src/@claude-flow/cli/dist/src/init/claudemd-generator.js +43 -43
- package/src/@claude-flow/cli/dist/src/init/executor.js +453 -453
- package/src/@claude-flow/cli/dist/src/init/helpers-generator.js +482 -482
- package/src/@claude-flow/cli/dist/src/init/moflo-init.d.ts +30 -30
- package/src/@claude-flow/cli/dist/src/init/moflo-init.js +140 -140
- package/src/@claude-flow/cli/dist/src/init/statusline-generator.js +876 -876
- package/src/@claude-flow/cli/dist/src/memory/memory-initializer.js +371 -371
- package/src/@claude-flow/cli/dist/src/runtime/headless.js +28 -28
- package/src/@claude-flow/cli/dist/src/services/container-worker-pool.d.ts +197 -0
- package/src/@claude-flow/cli/dist/src/services/container-worker-pool.js +584 -0
- package/src/@claude-flow/cli/dist/src/services/daemon-lock.d.ts +14 -0
- package/src/@claude-flow/cli/dist/src/services/daemon-lock.js +1 -1
- package/src/@claude-flow/cli/dist/src/services/headless-worker-executor.js +84 -84
- package/src/@claude-flow/cli/package.json +1 -1
- package/src/@claude-flow/guidance/README.md +1195 -1195
- package/src/@claude-flow/guidance/package.json +198 -198
- package/src/@claude-flow/memory/README.md +587 -587
- package/src/@claude-flow/memory/dist/agent-memory-scope.test.js +4 -7
- package/src/@claude-flow/memory/dist/agentdb-backend.d.ts +2 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.js +28 -26
- package/src/@claude-flow/memory/dist/auto-memory-bridge.test.js +36 -39
- package/src/@claude-flow/memory/dist/benchmark.test.js +1 -1
- package/src/@claude-flow/memory/dist/controller-registry.test.js +43 -0
- package/src/@claude-flow/memory/dist/database-provider.d.ts +2 -2
- package/src/@claude-flow/memory/dist/database-provider.js +6 -3
- package/src/@claude-flow/memory/dist/database-provider.test.js +1 -3
- package/src/@claude-flow/memory/dist/hybrid-backend.d.ts +245 -0
- package/src/@claude-flow/memory/dist/hybrid-backend.js +569 -0
- package/src/@claude-flow/memory/dist/hybrid-backend.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/hybrid-backend.test.js +320 -0
- package/src/@claude-flow/memory/dist/index.d.ts +3 -0
- package/src/@claude-flow/memory/dist/index.js +3 -0
- package/src/@claude-flow/memory/dist/sqlite-backend.d.ts +121 -0
- package/src/@claude-flow/memory/dist/sqlite-backend.js +572 -0
- package/src/@claude-flow/memory/dist/sqljs-backend.d.ts +4 -3
- package/src/@claude-flow/memory/dist/sqljs-backend.js +31 -30
- package/src/@claude-flow/memory/package.json +44 -44
- package/src/@claude-flow/shared/README.md +323 -323
- package/src/@claude-flow/shared/dist/core/config/defaults.js +1 -1
- package/src/@claude-flow/shared/dist/core/config/loader.js +1 -1
- package/src/@claude-flow/shared/dist/core/config/schema.js +1 -1
- package/src/@claude-flow/shared/dist/events/event-store.js +34 -50
- package/src/@claude-flow/shared/dist/events/event-store.test.js +4 -8
- package/src/@claude-flow/shared/dist/hooks/executor.js +4 -7
- package/src/@claude-flow/shared/dist/hooks/safety/file-organization.js +1 -1
- package/src/@claude-flow/shared/dist/hooks/safety/git-commit.js +3 -3
- package/src/@claude-flow/shared/dist/hooks/verify-exports.test.js +6 -6
- package/src/@claude-flow/shared/dist/utils/secure-logger.js +1 -1
- package/src/README.md +493 -493
- package/src/@claude-flow/guidance/dist/adversarial.d.ts +0 -284
- package/src/@claude-flow/guidance/dist/adversarial.js +0 -572
- package/src/@claude-flow/guidance/dist/analyzer.d.ts +0 -530
- package/src/@claude-flow/guidance/dist/analyzer.js +0 -2518
- package/src/@claude-flow/guidance/dist/artifacts.d.ts +0 -283
- package/src/@claude-flow/guidance/dist/artifacts.js +0 -356
- package/src/@claude-flow/guidance/dist/authority.d.ts +0 -290
- package/src/@claude-flow/guidance/dist/authority.js +0 -558
- package/src/@claude-flow/guidance/dist/capabilities.d.ts +0 -209
- package/src/@claude-flow/guidance/dist/capabilities.js +0 -485
- package/src/@claude-flow/guidance/dist/coherence.d.ts +0 -233
- package/src/@claude-flow/guidance/dist/coherence.js +0 -372
- package/src/@claude-flow/guidance/dist/compiler.d.ts +0 -87
- package/src/@claude-flow/guidance/dist/compiler.js +0 -419
- package/src/@claude-flow/guidance/dist/conformance-kit.d.ts +0 -225
- package/src/@claude-flow/guidance/dist/conformance-kit.js +0 -629
- package/src/@claude-flow/guidance/dist/continue-gate.d.ts +0 -214
- package/src/@claude-flow/guidance/dist/continue-gate.js +0 -353
- package/src/@claude-flow/guidance/dist/crypto-utils.d.ts +0 -17
- package/src/@claude-flow/guidance/dist/crypto-utils.js +0 -24
- package/src/@claude-flow/guidance/dist/evolution.d.ts +0 -282
- package/src/@claude-flow/guidance/dist/evolution.js +0 -500
- package/src/@claude-flow/guidance/dist/gates.d.ts +0 -79
- package/src/@claude-flow/guidance/dist/gates.js +0 -302
- package/src/@claude-flow/guidance/dist/gateway.d.ts +0 -206
- package/src/@claude-flow/guidance/dist/gateway.js +0 -452
- package/src/@claude-flow/guidance/dist/generators.d.ts +0 -153
- package/src/@claude-flow/guidance/dist/generators.js +0 -682
- package/src/@claude-flow/guidance/dist/headless.d.ts +0 -177
- package/src/@claude-flow/guidance/dist/headless.js +0 -342
- package/src/@claude-flow/guidance/dist/hooks.d.ts +0 -109
- package/src/@claude-flow/guidance/dist/hooks.js +0 -347
- package/src/@claude-flow/guidance/dist/index.d.ts +0 -205
- package/src/@claude-flow/guidance/dist/index.js +0 -321
- package/src/@claude-flow/guidance/dist/ledger.d.ts +0 -162
- package/src/@claude-flow/guidance/dist/ledger.js +0 -375
- package/src/@claude-flow/guidance/dist/manifest-validator.d.ts +0 -289
- package/src/@claude-flow/guidance/dist/manifest-validator.js +0 -838
- package/src/@claude-flow/guidance/dist/memory-gate.d.ts +0 -222
- package/src/@claude-flow/guidance/dist/memory-gate.js +0 -382
- package/src/@claude-flow/guidance/dist/meta-governance.d.ts +0 -265
- package/src/@claude-flow/guidance/dist/meta-governance.js +0 -348
- package/src/@claude-flow/guidance/dist/optimizer.d.ts +0 -104
- package/src/@claude-flow/guidance/dist/optimizer.js +0 -329
- package/src/@claude-flow/guidance/dist/persistence.d.ts +0 -189
- package/src/@claude-flow/guidance/dist/persistence.js +0 -464
- package/src/@claude-flow/guidance/dist/proof.d.ts +0 -185
- package/src/@claude-flow/guidance/dist/proof.js +0 -238
- package/src/@claude-flow/guidance/dist/retriever.d.ts +0 -116
- package/src/@claude-flow/guidance/dist/retriever.js +0 -394
- package/src/@claude-flow/guidance/dist/ruvbot-integration.d.ts +0 -370
- package/src/@claude-flow/guidance/dist/ruvbot-integration.js +0 -738
- package/src/@claude-flow/guidance/dist/temporal.d.ts +0 -426
- package/src/@claude-flow/guidance/dist/temporal.js +0 -658
- package/src/@claude-flow/guidance/dist/trust.d.ts +0 -283
- package/src/@claude-flow/guidance/dist/trust.js +0 -473
- package/src/@claude-flow/guidance/dist/truth-anchors.d.ts +0 -276
- package/src/@claude-flow/guidance/dist/truth-anchors.js +0 -488
- package/src/@claude-flow/guidance/dist/types.d.ts +0 -378
- package/src/@claude-flow/guidance/dist/types.js +0 -10
- package/src/@claude-flow/guidance/dist/uncertainty.d.ts +0 -372
- package/src/@claude-flow/guidance/dist/uncertainty.js +0 -619
- package/src/@claude-flow/guidance/dist/wasm-kernel.d.ts +0 -48
- package/src/@claude-flow/guidance/dist/wasm-kernel.js +0 -158
|
@@ -93,21 +93,18 @@ describe('resolveAgentMemoryDir', () => {
|
|
|
93
93
|
process.env.USERPROFILE = originalUserProfile;
|
|
94
94
|
});
|
|
95
95
|
it('should resolve project scope to gitRoot/.claude/agent-memory/name/', () => {
|
|
96
|
-
// path.resolve() adds drive letter on Windows (e.g., C:\workspaces\...)
|
|
97
|
-
const projectRoot = path.resolve('/workspaces/my-project');
|
|
98
96
|
mockExistsSync.mockImplementation((p) => {
|
|
99
|
-
return String(p) === path.join(
|
|
97
|
+
return String(p) === path.join('/workspaces/my-project', '.git');
|
|
100
98
|
});
|
|
101
99
|
const result = resolveAgentMemoryDir('coder', 'project', '/workspaces/my-project/src');
|
|
102
|
-
expect(result).toBe(path.join(
|
|
100
|
+
expect(result).toBe(path.join('/workspaces/my-project', '.claude', 'agent-memory', 'coder'));
|
|
103
101
|
});
|
|
104
102
|
it('should resolve local scope to gitRoot/.claude/agent-memory-local/name/', () => {
|
|
105
|
-
const projectRoot = path.resolve('/workspaces/my-project');
|
|
106
103
|
mockExistsSync.mockImplementation((p) => {
|
|
107
|
-
return String(p) === path.join(
|
|
104
|
+
return String(p) === path.join('/workspaces/my-project', '.git');
|
|
108
105
|
});
|
|
109
106
|
const result = resolveAgentMemoryDir('researcher', 'local', '/workspaces/my-project/src');
|
|
110
|
-
expect(result).toBe(path.join(
|
|
107
|
+
expect(result).toBe(path.join('/workspaces/my-project', '.claude', 'agent-memory-local', 'researcher'));
|
|
111
108
|
});
|
|
112
109
|
it('should resolve user scope to ~/.claude/agent-memory/name/', () => {
|
|
113
110
|
process.env.HOME = '/home/testuser';
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* - HNSW vector search (150x-12,500x faster than brute-force)
|
|
6
6
|
* - Native or WASM backend support with graceful fallback
|
|
7
7
|
* - Optional dependency handling (works without hnswlib-node)
|
|
8
|
+
* - Seamless integration with HybridBackend
|
|
8
9
|
*
|
|
9
10
|
* @module v3/memory/agentdb-backend
|
|
10
11
|
*/
|
|
@@ -48,6 +49,7 @@ export interface AgentDBBackendConfig {
|
|
|
48
49
|
* - Automatic fallback: native hnswlib → ruvector → WASM
|
|
49
50
|
* - Graceful handling of optional native dependencies
|
|
50
51
|
* - Semantic search with filtering
|
|
52
|
+
* - Compatible with HybridBackend for combined SQLite+AgentDB queries
|
|
51
53
|
*/
|
|
52
54
|
export declare class AgentDBBackend extends EventEmitter implements IMemoryBackend {
|
|
53
55
|
private config;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* - HNSW vector search (150x-12,500x faster than brute-force)
|
|
6
6
|
* - Native or WASM backend support with graceful fallback
|
|
7
7
|
* - Optional dependency handling (works without hnswlib-node)
|
|
8
|
+
* - Seamless integration with HybridBackend
|
|
8
9
|
*
|
|
9
10
|
* @module v3/memory/agentdb-backend
|
|
10
11
|
*/
|
|
@@ -57,6 +58,7 @@ const DEFAULT_CONFIG = {
|
|
|
57
58
|
* - Automatic fallback: native hnswlib → ruvector → WASM
|
|
58
59
|
* - Graceful handling of optional native dependencies
|
|
59
60
|
* - Semantic search with filtering
|
|
61
|
+
* - Compatible with HybridBackend for combined SQLite+AgentDB queries
|
|
60
62
|
*/
|
|
61
63
|
export class AgentDBBackend extends EventEmitter {
|
|
62
64
|
config;
|
|
@@ -450,26 +452,26 @@ export class AgentDBBackend extends EventEmitter {
|
|
|
450
452
|
}
|
|
451
453
|
try {
|
|
452
454
|
// Create memory_entries table
|
|
453
|
-
await db.run(`
|
|
454
|
-
CREATE TABLE IF NOT EXISTS memory_entries (
|
|
455
|
-
id TEXT PRIMARY KEY,
|
|
456
|
-
key TEXT NOT NULL,
|
|
457
|
-
content TEXT NOT NULL,
|
|
458
|
-
embedding BLOB,
|
|
459
|
-
type TEXT NOT NULL,
|
|
460
|
-
namespace TEXT NOT NULL,
|
|
461
|
-
tags TEXT,
|
|
462
|
-
metadata TEXT,
|
|
463
|
-
owner_id TEXT,
|
|
464
|
-
access_level TEXT NOT NULL,
|
|
465
|
-
created_at INTEGER NOT NULL,
|
|
466
|
-
updated_at INTEGER NOT NULL,
|
|
467
|
-
expires_at INTEGER,
|
|
468
|
-
version INTEGER NOT NULL,
|
|
469
|
-
references TEXT,
|
|
470
|
-
access_count INTEGER DEFAULT 0,
|
|
471
|
-
last_accessed_at INTEGER
|
|
472
|
-
)
|
|
455
|
+
await db.run(`
|
|
456
|
+
CREATE TABLE IF NOT EXISTS memory_entries (
|
|
457
|
+
id TEXT PRIMARY KEY,
|
|
458
|
+
key TEXT NOT NULL,
|
|
459
|
+
content TEXT NOT NULL,
|
|
460
|
+
embedding BLOB,
|
|
461
|
+
type TEXT NOT NULL,
|
|
462
|
+
namespace TEXT NOT NULL,
|
|
463
|
+
tags TEXT,
|
|
464
|
+
metadata TEXT,
|
|
465
|
+
owner_id TEXT,
|
|
466
|
+
access_level TEXT NOT NULL,
|
|
467
|
+
created_at INTEGER NOT NULL,
|
|
468
|
+
updated_at INTEGER NOT NULL,
|
|
469
|
+
expires_at INTEGER,
|
|
470
|
+
version INTEGER NOT NULL,
|
|
471
|
+
references TEXT,
|
|
472
|
+
access_count INTEGER DEFAULT 0,
|
|
473
|
+
last_accessed_at INTEGER
|
|
474
|
+
)
|
|
473
475
|
`);
|
|
474
476
|
// Create indexes
|
|
475
477
|
await db.run('CREATE INDEX IF NOT EXISTS idx_namespace ON memory_entries(namespace)');
|
|
@@ -507,12 +509,12 @@ export class AgentDBBackend extends EventEmitter {
|
|
|
507
509
|
// Entry is already stored in-memory
|
|
508
510
|
return;
|
|
509
511
|
}
|
|
510
|
-
await db.run(`
|
|
511
|
-
INSERT OR REPLACE INTO memory_entries
|
|
512
|
-
(id, key, content, embedding, type, namespace, tags, metadata, owner_id,
|
|
513
|
-
access_level, created_at, updated_at, expires_at, version, references,
|
|
514
|
-
access_count, last_accessed_at)
|
|
515
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
512
|
+
await db.run(`
|
|
513
|
+
INSERT OR REPLACE INTO memory_entries
|
|
514
|
+
(id, key, content, embedding, type, namespace, tags, metadata, owner_id,
|
|
515
|
+
access_level, created_at, updated_at, expires_at, version, references,
|
|
516
|
+
access_count, last_accessed_at)
|
|
517
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
516
518
|
`, [
|
|
517
519
|
entry.id,
|
|
518
520
|
entry.key,
|
|
@@ -64,8 +64,7 @@ function createTestInsight(overrides = {}) {
|
|
|
64
64
|
describe('resolveAutoMemoryDir', () => {
|
|
65
65
|
it('should derive path from working directory', () => {
|
|
66
66
|
const result = resolveAutoMemoryDir('/workspaces/my-project');
|
|
67
|
-
|
|
68
|
-
expect(result).toMatch(/\.claude[/\\]projects[/\\]/);
|
|
67
|
+
expect(result).toContain('.claude/projects/');
|
|
69
68
|
expect(result).toContain('memory');
|
|
70
69
|
expect(result).not.toContain('//');
|
|
71
70
|
});
|
|
@@ -80,33 +79,31 @@ describe('resolveAutoMemoryDir', () => {
|
|
|
80
79
|
});
|
|
81
80
|
});
|
|
82
81
|
describe('findGitRoot', () => {
|
|
83
|
-
// Use the actual repo root (works on any platform)
|
|
84
|
-
const repoRoot = path.resolve(__dirname, '..', '..', '..', '..');
|
|
85
82
|
it('should find git root for a directory inside a repo', () => {
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
// We know /workspaces/claude-flow is a git repo
|
|
84
|
+
const root = findGitRoot('/workspaces/claude-flow/v3/@claude-flow/memory');
|
|
85
|
+
expect(root).toBe('/workspaces/claude-flow');
|
|
88
86
|
});
|
|
89
87
|
it('should return the directory itself if it is the git root', () => {
|
|
90
|
-
const root = findGitRoot(
|
|
91
|
-
expect(root).toBe(
|
|
88
|
+
const root = findGitRoot('/workspaces/claude-flow');
|
|
89
|
+
expect(root).toBe('/workspaces/claude-flow');
|
|
92
90
|
});
|
|
93
|
-
it('should return null for
|
|
94
|
-
//
|
|
95
|
-
const
|
|
96
|
-
const result = findGitRoot(testDir);
|
|
91
|
+
it('should return null for root filesystem', () => {
|
|
92
|
+
// /proc is almost certainly not in a git repo
|
|
93
|
+
const result = findGitRoot('/proc');
|
|
97
94
|
expect(result).toBeNull();
|
|
98
95
|
});
|
|
99
96
|
});
|
|
100
97
|
describe('parseMarkdownEntries', () => {
|
|
101
98
|
it('should parse markdown with ## headings into entries', () => {
|
|
102
|
-
const content = `# Main Title
|
|
103
|
-
|
|
104
|
-
## Section One
|
|
105
|
-
Content of section one.
|
|
106
|
-
More content here.
|
|
107
|
-
|
|
108
|
-
## Section Two
|
|
109
|
-
Content of section two.
|
|
99
|
+
const content = `# Main Title
|
|
100
|
+
|
|
101
|
+
## Section One
|
|
102
|
+
Content of section one.
|
|
103
|
+
More content here.
|
|
104
|
+
|
|
105
|
+
## Section Two
|
|
106
|
+
Content of section two.
|
|
110
107
|
`;
|
|
111
108
|
const entries = parseMarkdownEntries(content);
|
|
112
109
|
expect(entries).toHaveLength(2);
|
|
@@ -120,10 +117,10 @@ Content of section two.
|
|
|
120
117
|
expect(entries).toHaveLength(0);
|
|
121
118
|
});
|
|
122
119
|
it('should handle multiple lines under a heading', () => {
|
|
123
|
-
const content = `## Heading
|
|
124
|
-
Line 1
|
|
125
|
-
Line 2
|
|
126
|
-
Line 3
|
|
120
|
+
const content = `## Heading
|
|
121
|
+
Line 1
|
|
122
|
+
Line 2
|
|
123
|
+
Line 3
|
|
127
124
|
`;
|
|
128
125
|
const entries = parseMarkdownEntries(content);
|
|
129
126
|
expect(entries).toHaveLength(1);
|
|
@@ -141,12 +138,12 @@ Line 3
|
|
|
141
138
|
});
|
|
142
139
|
describe('extractSummaries', () => {
|
|
143
140
|
it('should extract bullet points from content', () => {
|
|
144
|
-
const content = `# Topic
|
|
145
|
-
|
|
146
|
-
- First summary
|
|
147
|
-
- Second summary
|
|
148
|
-
- See \`details.md\` for more
|
|
149
|
-
Some other text
|
|
141
|
+
const content = `# Topic
|
|
142
|
+
|
|
143
|
+
- First summary
|
|
144
|
+
- Second summary
|
|
145
|
+
- See \`details.md\` for more
|
|
146
|
+
Some other text
|
|
150
147
|
`;
|
|
151
148
|
const summaries = extractSummaries(content);
|
|
152
149
|
expect(summaries).toHaveLength(2);
|
|
@@ -412,11 +409,11 @@ describe('AutoMemoryBridge', () => {
|
|
|
412
409
|
});
|
|
413
410
|
describe('importFromAutoMemory', () => {
|
|
414
411
|
it('should import entries from existing markdown files', async () => {
|
|
415
|
-
const topicContent = `# Debugging Insights
|
|
416
|
-
|
|
417
|
-
## Known Issues
|
|
418
|
-
- Always init HNSW before search
|
|
419
|
-
- SQLite WASM needs sql.js
|
|
412
|
+
const topicContent = `# Debugging Insights
|
|
413
|
+
|
|
414
|
+
## Known Issues
|
|
415
|
+
- Always init HNSW before search
|
|
416
|
+
- SQLite WASM needs sql.js
|
|
420
417
|
`;
|
|
421
418
|
fsSync.writeFileSync(path.join(testDir, 'debugging.md'), topicContent, 'utf-8');
|
|
422
419
|
const result = await bridge.importFromAutoMemory();
|
|
@@ -426,10 +423,10 @@ describe('AutoMemoryBridge', () => {
|
|
|
426
423
|
expect(backend.bulkInsert).toHaveBeenCalled();
|
|
427
424
|
});
|
|
428
425
|
it('should skip entries already in AgentDB', async () => {
|
|
429
|
-
const topicContent = `# Test
|
|
430
|
-
|
|
431
|
-
## Existing
|
|
432
|
-
Already in DB
|
|
426
|
+
const topicContent = `# Test
|
|
427
|
+
|
|
428
|
+
## Existing
|
|
429
|
+
Already in DB
|
|
433
430
|
`;
|
|
434
431
|
fsSync.writeFileSync(path.join(testDir, 'test.md'), topicContent, 'utf-8');
|
|
435
432
|
// Mock backend to return existing entry with matching content hash
|
|
@@ -241,7 +241,7 @@ describe('ADR-049 Performance Benchmarks', () => {
|
|
|
241
241
|
resolveAgentMemoryDir(`agent-${i % 100}`, scopes[i % 3]);
|
|
242
242
|
const dt = performance.now() - t0;
|
|
243
243
|
console.log(` Resolve 10k paths: ${dt.toFixed(2)}ms (${(dt / 10).toFixed(1)}us/each)`);
|
|
244
|
-
expect(dt).toBeLessThan(
|
|
244
|
+
expect(dt).toBeLessThan(200); // Not an ADR-049 target; relaxed for CI variance
|
|
245
245
|
});
|
|
246
246
|
it('AgentMemoryScope: transfer knowledge', async () => {
|
|
247
247
|
const sourceEntries = [];
|
|
@@ -590,4 +590,47 @@ describe('ControllerRegistry', () => {
|
|
|
590
590
|
});
|
|
591
591
|
});
|
|
592
592
|
});
|
|
593
|
+
// ===== HybridBackend Proxy Methods Tests =====
|
|
594
|
+
describe('HybridBackend proxy methods', () => {
|
|
595
|
+
it('should export recordFeedback method', async () => {
|
|
596
|
+
const { HybridBackend } = await import('./hybrid-backend.js');
|
|
597
|
+
const backend = new HybridBackend();
|
|
598
|
+
expect(typeof backend.recordFeedback).toBe('function');
|
|
599
|
+
});
|
|
600
|
+
it('should export verifyWitnessChain method', async () => {
|
|
601
|
+
const { HybridBackend } = await import('./hybrid-backend.js');
|
|
602
|
+
const backend = new HybridBackend();
|
|
603
|
+
expect(typeof backend.verifyWitnessChain).toBe('function');
|
|
604
|
+
});
|
|
605
|
+
it('should export getWitnessChain method', async () => {
|
|
606
|
+
const { HybridBackend } = await import('./hybrid-backend.js');
|
|
607
|
+
const backend = new HybridBackend();
|
|
608
|
+
expect(typeof backend.getWitnessChain).toBe('function');
|
|
609
|
+
});
|
|
610
|
+
it('should return false for recordFeedback when AgentDB unavailable', async () => {
|
|
611
|
+
const { HybridBackend } = await import('./hybrid-backend.js');
|
|
612
|
+
const backend = new HybridBackend();
|
|
613
|
+
await backend.initialize();
|
|
614
|
+
const result = await backend.recordFeedback('entry-1', { score: 0.9 });
|
|
615
|
+
expect(result).toBe(false);
|
|
616
|
+
await backend.shutdown();
|
|
617
|
+
});
|
|
618
|
+
it('should return invalid for verifyWitnessChain when AgentDB unavailable', async () => {
|
|
619
|
+
const { HybridBackend } = await import('./hybrid-backend.js');
|
|
620
|
+
const backend = new HybridBackend();
|
|
621
|
+
await backend.initialize();
|
|
622
|
+
const result = await backend.verifyWitnessChain('entry-1');
|
|
623
|
+
expect(result.valid).toBe(false);
|
|
624
|
+
expect(result.errors).toContain('AgentDB not available');
|
|
625
|
+
await backend.shutdown();
|
|
626
|
+
});
|
|
627
|
+
it('should return empty array for getWitnessChain when AgentDB unavailable', async () => {
|
|
628
|
+
const { HybridBackend } = await import('./hybrid-backend.js');
|
|
629
|
+
const backend = new HybridBackend();
|
|
630
|
+
await backend.initialize();
|
|
631
|
+
const result = await backend.getWitnessChain('entry-1');
|
|
632
|
+
expect(result).toEqual([]);
|
|
633
|
+
await backend.shutdown();
|
|
634
|
+
});
|
|
635
|
+
});
|
|
593
636
|
//# sourceMappingURL=controller-registry.test.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* DatabaseProvider - Platform-aware database selection
|
|
3
3
|
*
|
|
4
4
|
* Automatically selects best backend:
|
|
5
|
-
* -
|
|
5
|
+
* - Linux/macOS: better-sqlite3 (native, fast)
|
|
6
6
|
* - Windows: sql.js (WASM, universal) when native fails
|
|
7
7
|
* - Fallback: JSON file storage
|
|
8
8
|
*
|
|
@@ -21,7 +21,7 @@ export interface DatabaseOptions {
|
|
|
21
21
|
provider?: DatabaseProvider;
|
|
22
22
|
/** Enable verbose logging */
|
|
23
23
|
verbose?: boolean;
|
|
24
|
-
/** Enable WAL mode (
|
|
24
|
+
/** Enable WAL mode (better-sqlite3 only) */
|
|
25
25
|
walMode?: boolean;
|
|
26
26
|
/** Enable query optimization */
|
|
27
27
|
optimize?: boolean;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* DatabaseProvider - Platform-aware database selection
|
|
3
3
|
*
|
|
4
4
|
* Automatically selects best backend:
|
|
5
|
-
* -
|
|
5
|
+
* - Linux/macOS: better-sqlite3 (native, fast)
|
|
6
6
|
* - Windows: sql.js (WASM, universal) when native fails
|
|
7
7
|
* - Fallback: JSON file storage
|
|
8
8
|
*
|
|
@@ -35,7 +35,10 @@ function detectPlatform() {
|
|
|
35
35
|
async function testRvf() {
|
|
36
36
|
return true;
|
|
37
37
|
}
|
|
38
|
-
/** better-sqlite3 removed —
|
|
38
|
+
/** better-sqlite3 removed — always returns false */
|
|
39
|
+
async function testBetterSqlite3() {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
39
42
|
/**
|
|
40
43
|
* Test if sql.js is available and working
|
|
41
44
|
*/
|
|
@@ -172,7 +175,7 @@ export function getPlatformInfo() {
|
|
|
172
175
|
export async function getAvailableProviders() {
|
|
173
176
|
return {
|
|
174
177
|
rvf: true,
|
|
175
|
-
betterSqlite3:
|
|
178
|
+
betterSqlite3: await testBetterSqlite3(),
|
|
176
179
|
sqlJs: await testSqlJs(),
|
|
177
180
|
json: true,
|
|
178
181
|
};
|
|
@@ -64,9 +64,7 @@ describe('DatabaseProvider', () => {
|
|
|
64
64
|
namespace: 'test',
|
|
65
65
|
});
|
|
66
66
|
await db.store(entry);
|
|
67
|
-
|
|
68
|
-
// RVF backend may include internal metadata entries
|
|
69
|
-
expect(count).toBeGreaterThanOrEqual(1);
|
|
67
|
+
await expect(db.count()).resolves.toBe(1);
|
|
70
68
|
await db.shutdown();
|
|
71
69
|
});
|
|
72
70
|
});
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HybridBackend - Combines SQLite (structured queries) + AgentDB (vector search)
|
|
3
|
+
*
|
|
4
|
+
* Per ADR-009: "HybridBackend (SQLite + AgentDB) as default"
|
|
5
|
+
* - SQLite for: Structured queries, ACID transactions, exact matches
|
|
6
|
+
* - AgentDB for: Semantic search, vector similarity, RAG
|
|
7
|
+
*
|
|
8
|
+
* @module v3/memory/hybrid-backend
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'node:events';
|
|
11
|
+
import { IMemoryBackend, MemoryEntry, MemoryEntryUpdate, MemoryQuery, SearchOptions, SearchResult, BackendStats, HealthCheckResult, EmbeddingGenerator } from './types.js';
|
|
12
|
+
import { SQLiteBackend, SQLiteBackendConfig } from './sqlite-backend.js';
|
|
13
|
+
import { AgentDBBackend, AgentDBBackendConfig } from './agentdb-backend.js';
|
|
14
|
+
/**
|
|
15
|
+
* Configuration for HybridBackend
|
|
16
|
+
*/
|
|
17
|
+
export interface HybridBackendConfig {
|
|
18
|
+
/** SQLite configuration */
|
|
19
|
+
sqlite?: Partial<SQLiteBackendConfig>;
|
|
20
|
+
/** AgentDB configuration */
|
|
21
|
+
agentdb?: Partial<AgentDBBackendConfig>;
|
|
22
|
+
/** Default namespace */
|
|
23
|
+
defaultNamespace?: string;
|
|
24
|
+
/** Embedding generator function */
|
|
25
|
+
embeddingGenerator?: EmbeddingGenerator;
|
|
26
|
+
/** Query routing strategy */
|
|
27
|
+
routingStrategy?: 'auto' | 'sqlite-first' | 'agentdb-first';
|
|
28
|
+
/** Enable dual-write (write to both backends) */
|
|
29
|
+
dualWrite?: boolean;
|
|
30
|
+
/** Semantic search threshold for hybrid queries */
|
|
31
|
+
semanticThreshold?: number;
|
|
32
|
+
/** Maximum results to fetch from each backend in hybrid queries */
|
|
33
|
+
hybridMaxResults?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Structured Query Interface
|
|
37
|
+
* Optimized for SQLite's strengths
|
|
38
|
+
*/
|
|
39
|
+
export interface StructuredQuery {
|
|
40
|
+
/** Exact key match */
|
|
41
|
+
key?: string;
|
|
42
|
+
/** Key prefix match */
|
|
43
|
+
keyPrefix?: string;
|
|
44
|
+
/** Namespace filter */
|
|
45
|
+
namespace?: string;
|
|
46
|
+
/** Owner filter */
|
|
47
|
+
ownerId?: string;
|
|
48
|
+
/** Type filter */
|
|
49
|
+
type?: string;
|
|
50
|
+
/** Time range filters */
|
|
51
|
+
createdAfter?: number;
|
|
52
|
+
createdBefore?: number;
|
|
53
|
+
updatedAfter?: number;
|
|
54
|
+
updatedBefore?: number;
|
|
55
|
+
/** Pagination */
|
|
56
|
+
limit?: number;
|
|
57
|
+
offset?: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Semantic Query Interface
|
|
61
|
+
* Optimized for AgentDB's vector search
|
|
62
|
+
*/
|
|
63
|
+
export interface SemanticQuery {
|
|
64
|
+
/** Content to search for (will be embedded) */
|
|
65
|
+
content?: string;
|
|
66
|
+
/** Pre-computed embedding */
|
|
67
|
+
embedding?: Float32Array;
|
|
68
|
+
/** Number of results */
|
|
69
|
+
k?: number;
|
|
70
|
+
/** Similarity threshold (0-1) */
|
|
71
|
+
threshold?: number;
|
|
72
|
+
/** Additional filters */
|
|
73
|
+
filters?: Partial<MemoryQuery>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Hybrid Query Interface
|
|
77
|
+
* Combines structured + semantic search
|
|
78
|
+
*/
|
|
79
|
+
export interface HybridQuery {
|
|
80
|
+
/** Semantic component */
|
|
81
|
+
semantic: SemanticQuery;
|
|
82
|
+
/** Structured component */
|
|
83
|
+
structured?: StructuredQuery;
|
|
84
|
+
/** How to combine results */
|
|
85
|
+
combineStrategy?: 'union' | 'intersection' | 'semantic-first' | 'structured-first';
|
|
86
|
+
/** Weights for score combination */
|
|
87
|
+
weights?: {
|
|
88
|
+
semantic: number;
|
|
89
|
+
structured: number;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* HybridBackend Implementation
|
|
94
|
+
*
|
|
95
|
+
* Intelligently routes queries between SQLite and AgentDB:
|
|
96
|
+
* - Exact matches, prefix queries → SQLite
|
|
97
|
+
* - Semantic search, similarity → AgentDB
|
|
98
|
+
* - Complex hybrid queries → Both backends with intelligent merging
|
|
99
|
+
*/
|
|
100
|
+
export declare class HybridBackend extends EventEmitter implements IMemoryBackend {
|
|
101
|
+
private sqlite;
|
|
102
|
+
private agentdb;
|
|
103
|
+
private config;
|
|
104
|
+
private initialized;
|
|
105
|
+
private stats;
|
|
106
|
+
constructor(config?: HybridBackendConfig);
|
|
107
|
+
/**
|
|
108
|
+
* Initialize both backends
|
|
109
|
+
*/
|
|
110
|
+
initialize(): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Shutdown both backends
|
|
113
|
+
*/
|
|
114
|
+
shutdown(): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Store in both backends (dual-write for consistency)
|
|
117
|
+
*/
|
|
118
|
+
store(entry: MemoryEntry): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Get from AgentDB (has caching enabled)
|
|
121
|
+
*/
|
|
122
|
+
get(id: string): Promise<MemoryEntry | null>;
|
|
123
|
+
/**
|
|
124
|
+
* Get by key (SQLite optimized for exact matches)
|
|
125
|
+
*/
|
|
126
|
+
getByKey(namespace: string, key: string): Promise<MemoryEntry | null>;
|
|
127
|
+
/**
|
|
128
|
+
* Update in both backends
|
|
129
|
+
*/
|
|
130
|
+
update(id: string, update: MemoryEntryUpdate): Promise<MemoryEntry | null>;
|
|
131
|
+
/**
|
|
132
|
+
* Delete from both backends
|
|
133
|
+
*/
|
|
134
|
+
delete(id: string): Promise<boolean>;
|
|
135
|
+
/**
|
|
136
|
+
* Query routing - semantic goes to AgentDB, structured to SQLite
|
|
137
|
+
*/
|
|
138
|
+
query(query: MemoryQuery): Promise<MemoryEntry[]>;
|
|
139
|
+
/**
|
|
140
|
+
* Structured queries (SQL)
|
|
141
|
+
* Routes to SQLite for optimal performance
|
|
142
|
+
*/
|
|
143
|
+
queryStructured(query: StructuredQuery): Promise<MemoryEntry[]>;
|
|
144
|
+
/**
|
|
145
|
+
* Semantic queries (vector)
|
|
146
|
+
* Routes to AgentDB for HNSW-based vector search
|
|
147
|
+
*/
|
|
148
|
+
querySemantic(query: SemanticQuery): Promise<MemoryEntry[]>;
|
|
149
|
+
/**
|
|
150
|
+
* Hybrid queries (combine both)
|
|
151
|
+
* Intelligently merges results from both backends
|
|
152
|
+
*/
|
|
153
|
+
queryHybrid(query: HybridQuery): Promise<MemoryEntry[]>;
|
|
154
|
+
/**
|
|
155
|
+
* Semantic vector search (routes to AgentDB)
|
|
156
|
+
*/
|
|
157
|
+
search(embedding: Float32Array, options: SearchOptions): Promise<SearchResult[]>;
|
|
158
|
+
/**
|
|
159
|
+
* Bulk insert to both backends
|
|
160
|
+
*/
|
|
161
|
+
bulkInsert(entries: MemoryEntry[]): Promise<void>;
|
|
162
|
+
/**
|
|
163
|
+
* Bulk delete from both backends
|
|
164
|
+
*/
|
|
165
|
+
bulkDelete(ids: string[]): Promise<number>;
|
|
166
|
+
/**
|
|
167
|
+
* Count entries (use SQLite for efficiency)
|
|
168
|
+
*/
|
|
169
|
+
count(namespace?: string): Promise<number>;
|
|
170
|
+
/**
|
|
171
|
+
* List namespaces (use SQLite)
|
|
172
|
+
*/
|
|
173
|
+
listNamespaces(): Promise<string[]>;
|
|
174
|
+
/**
|
|
175
|
+
* Clear namespace in both backends
|
|
176
|
+
*/
|
|
177
|
+
clearNamespace(namespace: string): Promise<number>;
|
|
178
|
+
/**
|
|
179
|
+
* Get combined statistics from both backends
|
|
180
|
+
*/
|
|
181
|
+
getStats(): Promise<BackendStats>;
|
|
182
|
+
/**
|
|
183
|
+
* Health check for both backends
|
|
184
|
+
*/
|
|
185
|
+
healthCheck(): Promise<HealthCheckResult>;
|
|
186
|
+
/**
|
|
187
|
+
* Auto-route queries based on properties
|
|
188
|
+
*/
|
|
189
|
+
private autoRoute;
|
|
190
|
+
/**
|
|
191
|
+
* Internal hybrid query implementation
|
|
192
|
+
*/
|
|
193
|
+
private queryHybridInternal;
|
|
194
|
+
/**
|
|
195
|
+
* Combine results using union (all unique results)
|
|
196
|
+
*/
|
|
197
|
+
private combineUnion;
|
|
198
|
+
/**
|
|
199
|
+
* Combine results using intersection (only common results)
|
|
200
|
+
*/
|
|
201
|
+
private combineIntersection;
|
|
202
|
+
/**
|
|
203
|
+
* Semantic-first: Prefer semantic results, add structured if not present
|
|
204
|
+
*/
|
|
205
|
+
private combineSemanticFirst;
|
|
206
|
+
/**
|
|
207
|
+
* Structured-first: Prefer structured results, add semantic if not present
|
|
208
|
+
*/
|
|
209
|
+
private combineStructuredFirst;
|
|
210
|
+
/**
|
|
211
|
+
* Record feedback for a memory entry.
|
|
212
|
+
* Delegates to AgentDB's recordFeedback when available.
|
|
213
|
+
* Gracefully degrades to a no-op when AgentDB is unavailable.
|
|
214
|
+
*/
|
|
215
|
+
recordFeedback(entryId: string, feedback: {
|
|
216
|
+
score: number;
|
|
217
|
+
label?: string;
|
|
218
|
+
context?: Record<string, unknown>;
|
|
219
|
+
}): Promise<boolean>;
|
|
220
|
+
/**
|
|
221
|
+
* Verify a witness chain for a memory entry.
|
|
222
|
+
* Delegates to AgentDB's verifyWitnessChain when available.
|
|
223
|
+
*/
|
|
224
|
+
verifyWitnessChain(entryId: string): Promise<{
|
|
225
|
+
valid: boolean;
|
|
226
|
+
chainLength: number;
|
|
227
|
+
errors: string[];
|
|
228
|
+
}>;
|
|
229
|
+
/**
|
|
230
|
+
* Get the witness chain for a memory entry.
|
|
231
|
+
* Delegates to AgentDB's getWitnessChain when available.
|
|
232
|
+
*/
|
|
233
|
+
getWitnessChain(entryId: string): Promise<Array<{
|
|
234
|
+
hash: string;
|
|
235
|
+
timestamp: number;
|
|
236
|
+
operation: string;
|
|
237
|
+
}>>;
|
|
238
|
+
/**
|
|
239
|
+
* Get underlying backends for advanced operations
|
|
240
|
+
*/
|
|
241
|
+
getSQLiteBackend(): SQLiteBackend;
|
|
242
|
+
getAgentDBBackend(): AgentDBBackend;
|
|
243
|
+
}
|
|
244
|
+
export default HybridBackend;
|
|
245
|
+
//# sourceMappingURL=hybrid-backend.d.ts.map
|