moflo 4.8.21 → 4.8.23
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 +698 -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 +18 -2
- 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/init.js +3 -8
- 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/agentdb-backend.js +26 -26
- package/src/@claude-flow/memory/dist/auto-memory-bridge.test.js +27 -27
- 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/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.js +26 -26
- package/src/@claude-flow/memory/package.json +44 -44
- package/src/@claude-flow/shared/README.md +323 -323
- package/src/@claude-flow/shared/dist/events/event-store.js +31 -31
- package/src/README.md +493 -493
|
@@ -450,26 +450,26 @@ export class AgentDBBackend extends EventEmitter {
|
|
|
450
450
|
}
|
|
451
451
|
try {
|
|
452
452
|
// 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
|
-
)
|
|
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
|
+
)
|
|
473
473
|
`);
|
|
474
474
|
// Create indexes
|
|
475
475
|
await db.run('CREATE INDEX IF NOT EXISTS idx_namespace ON memory_entries(namespace)');
|
|
@@ -507,12 +507,12 @@ export class AgentDBBackend extends EventEmitter {
|
|
|
507
507
|
// Entry is already stored in-memory
|
|
508
508
|
return;
|
|
509
509
|
}
|
|
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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
516
516
|
`, [
|
|
517
517
|
entry.id,
|
|
518
518
|
entry.key,
|
|
@@ -99,14 +99,14 @@ describe('findGitRoot', () => {
|
|
|
99
99
|
});
|
|
100
100
|
describe('parseMarkdownEntries', () => {
|
|
101
101
|
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.
|
|
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.
|
|
110
110
|
`;
|
|
111
111
|
const entries = parseMarkdownEntries(content);
|
|
112
112
|
expect(entries).toHaveLength(2);
|
|
@@ -120,10 +120,10 @@ Content of section two.
|
|
|
120
120
|
expect(entries).toHaveLength(0);
|
|
121
121
|
});
|
|
122
122
|
it('should handle multiple lines under a heading', () => {
|
|
123
|
-
const content = `## Heading
|
|
124
|
-
Line 1
|
|
125
|
-
Line 2
|
|
126
|
-
Line 3
|
|
123
|
+
const content = `## Heading
|
|
124
|
+
Line 1
|
|
125
|
+
Line 2
|
|
126
|
+
Line 3
|
|
127
127
|
`;
|
|
128
128
|
const entries = parseMarkdownEntries(content);
|
|
129
129
|
expect(entries).toHaveLength(1);
|
|
@@ -141,12 +141,12 @@ Line 3
|
|
|
141
141
|
});
|
|
142
142
|
describe('extractSummaries', () => {
|
|
143
143
|
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
|
|
144
|
+
const content = `# Topic
|
|
145
|
+
|
|
146
|
+
- First summary
|
|
147
|
+
- Second summary
|
|
148
|
+
- See \`details.md\` for more
|
|
149
|
+
Some other text
|
|
150
150
|
`;
|
|
151
151
|
const summaries = extractSummaries(content);
|
|
152
152
|
expect(summaries).toHaveLength(2);
|
|
@@ -412,11 +412,11 @@ describe('AutoMemoryBridge', () => {
|
|
|
412
412
|
});
|
|
413
413
|
describe('importFromAutoMemory', () => {
|
|
414
414
|
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
|
|
415
|
+
const topicContent = `# Debugging Insights
|
|
416
|
+
|
|
417
|
+
## Known Issues
|
|
418
|
+
- Always init HNSW before search
|
|
419
|
+
- SQLite WASM needs sql.js
|
|
420
420
|
`;
|
|
421
421
|
fsSync.writeFileSync(path.join(testDir, 'debugging.md'), topicContent, 'utf-8');
|
|
422
422
|
const result = await bridge.importFromAutoMemory();
|
|
@@ -426,10 +426,10 @@ describe('AutoMemoryBridge', () => {
|
|
|
426
426
|
expect(backend.bulkInsert).toHaveBeenCalled();
|
|
427
427
|
});
|
|
428
428
|
it('should skip entries already in AgentDB', async () => {
|
|
429
|
-
const topicContent = `# Test
|
|
430
|
-
|
|
431
|
-
## Existing
|
|
432
|
-
Already in DB
|
|
429
|
+
const topicContent = `# Test
|
|
430
|
+
|
|
431
|
+
## Existing
|
|
432
|
+
Already in DB
|
|
433
433
|
`;
|
|
434
434
|
fsSync.writeFileSync(path.join(testDir, 'test.md'), topicContent, 'utf-8');
|
|
435
435
|
// Mock backend to return existing entry with matching content hash
|
|
@@ -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
|