@claude-flow/memory 3.0.0-alpha.2 → 3.0.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +858 -249
- package/dist/agent-memory-scope.d.ts +131 -0
- package/dist/agent-memory-scope.d.ts.map +1 -0
- package/dist/agent-memory-scope.js +223 -0
- package/dist/agent-memory-scope.js.map +1 -0
- package/dist/agent-memory-scope.test.d.ts +8 -0
- package/dist/agent-memory-scope.test.d.ts.map +1 -0
- package/dist/agent-memory-scope.test.js +463 -0
- package/dist/agent-memory-scope.test.js.map +1 -0
- package/dist/agentdb-adapter.d.ts +82 -4
- package/dist/agentdb-adapter.d.ts.map +1 -1
- package/dist/agentdb-adapter.js +388 -17
- package/dist/agentdb-adapter.js.map +1 -1
- package/dist/agentdb-backend.d.ts +6 -0
- package/dist/agentdb-backend.d.ts.map +1 -1
- package/dist/agentdb-backend.js +115 -51
- package/dist/agentdb-backend.js.map +1 -1
- package/dist/auto-memory-bridge.d.ts +237 -0
- package/dist/auto-memory-bridge.d.ts.map +1 -0
- package/dist/auto-memory-bridge.js +758 -0
- package/dist/auto-memory-bridge.js.map +1 -0
- package/dist/auto-memory-bridge.test.d.ts +8 -0
- package/dist/auto-memory-bridge.test.d.ts.map +1 -0
- package/dist/auto-memory-bridge.test.js +849 -0
- package/dist/auto-memory-bridge.test.js.map +1 -0
- package/dist/benchmark.test.d.ts +2 -0
- package/dist/benchmark.test.d.ts.map +1 -0
- package/dist/benchmark.test.js +277 -0
- package/dist/benchmark.test.js.map +1 -0
- package/dist/consolidator.d.ts +96 -0
- package/dist/consolidator.d.ts.map +1 -0
- package/dist/consolidator.js +209 -0
- package/dist/consolidator.js.map +1 -0
- package/dist/consolidator.test.d.ts +17 -0
- package/dist/consolidator.test.d.ts.map +1 -0
- package/dist/consolidator.test.js +239 -0
- package/dist/consolidator.test.js.map +1 -0
- package/dist/controller-registry.d.ts +232 -0
- package/dist/controller-registry.d.ts.map +1 -0
- package/dist/controller-registry.js +1049 -0
- package/dist/controller-registry.js.map +1 -0
- package/dist/controller-registry.test.d.ts +14 -0
- package/dist/controller-registry.test.d.ts.map +1 -0
- package/dist/controller-registry.test.js +691 -0
- package/dist/controller-registry.test.js.map +1 -0
- package/dist/database-provider.d.ts +14 -2
- package/dist/database-provider.d.ts.map +1 -1
- package/dist/database-provider.js +63 -3
- package/dist/database-provider.js.map +1 -1
- package/dist/database-provider.test.js +56 -3
- package/dist/database-provider.test.js.map +1 -1
- package/dist/entity-tagger.d.ts +31 -0
- package/dist/entity-tagger.d.ts.map +1 -0
- package/dist/entity-tagger.js +80 -0
- package/dist/entity-tagger.js.map +1 -0
- package/dist/entity-tagger.test.d.ts +12 -0
- package/dist/entity-tagger.test.d.ts.map +1 -0
- package/dist/entity-tagger.test.js +70 -0
- package/dist/entity-tagger.test.js.map +1 -0
- package/dist/fts5.test.d.ts +13 -0
- package/dist/fts5.test.d.ts.map +1 -0
- package/dist/fts5.test.js +144 -0
- package/dist/fts5.test.js.map +1 -0
- package/dist/graceful-retrieval.test.d.ts +14 -0
- package/dist/graceful-retrieval.test.d.ts.map +1 -0
- package/dist/graceful-retrieval.test.js +192 -0
- package/dist/graceful-retrieval.test.js.map +1 -0
- package/dist/hnsw-index.d.ts +51 -0
- package/dist/hnsw-index.d.ts.map +1 -1
- package/dist/hnsw-index.js +396 -12
- package/dist/hnsw-index.js.map +1 -1
- package/dist/hnsw-persistence.test.d.ts +13 -0
- package/dist/hnsw-persistence.test.d.ts.map +1 -0
- package/dist/hnsw-persistence.test.js +208 -0
- package/dist/hnsw-persistence.test.js.map +1 -0
- package/dist/hybrid-backend.d.ts +28 -0
- package/dist/hybrid-backend.d.ts.map +1 -1
- package/dist/hybrid-backend.js +82 -4
- package/dist/hybrid-backend.js.map +1 -1
- package/dist/hybrid-backend.test.js +6 -5
- package/dist/hybrid-backend.test.js.map +1 -1
- package/dist/index.d.ts +167 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +277 -30
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +10 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +71 -0
- package/dist/index.test.js.map +1 -0
- package/dist/json-security.d.ts +12 -0
- package/dist/json-security.d.ts.map +1 -0
- package/dist/json-security.js +20 -0
- package/dist/json-security.js.map +1 -0
- package/dist/learning-bridge.d.ts +137 -0
- package/dist/learning-bridge.d.ts.map +1 -0
- package/dist/learning-bridge.js +335 -0
- package/dist/learning-bridge.js.map +1 -0
- package/dist/learning-bridge.test.d.ts +8 -0
- package/dist/learning-bridge.test.d.ts.map +1 -0
- package/dist/learning-bridge.test.js +578 -0
- package/dist/learning-bridge.test.js.map +1 -0
- package/dist/memory-graph.d.ts +100 -0
- package/dist/memory-graph.d.ts.map +1 -0
- package/dist/memory-graph.js +333 -0
- package/dist/memory-graph.js.map +1 -0
- package/dist/memory-graph.test.d.ts +8 -0
- package/dist/memory-graph.test.d.ts.map +1 -0
- package/dist/memory-graph.test.js +609 -0
- package/dist/memory-graph.test.js.map +1 -0
- package/dist/persistent-sona.d.ts +144 -0
- package/dist/persistent-sona.d.ts.map +1 -0
- package/dist/persistent-sona.js +332 -0
- package/dist/persistent-sona.js.map +1 -0
- package/dist/rvf-backend.d.ts +53 -0
- package/dist/rvf-backend.d.ts.map +1 -0
- package/dist/rvf-backend.js +643 -0
- package/dist/rvf-backend.js.map +1 -0
- package/dist/rvf-learning-store.d.ts +139 -0
- package/dist/rvf-learning-store.d.ts.map +1 -0
- package/dist/rvf-learning-store.js +295 -0
- package/dist/rvf-learning-store.js.map +1 -0
- package/dist/rvf-migration.d.ts +45 -0
- package/dist/rvf-migration.d.ts.map +1 -0
- package/dist/rvf-migration.js +254 -0
- package/dist/rvf-migration.js.map +1 -0
- package/dist/smart-retrieval.d.ts +118 -0
- package/dist/smart-retrieval.d.ts.map +1 -0
- package/dist/smart-retrieval.js +322 -0
- package/dist/smart-retrieval.js.map +1 -0
- package/dist/smart-retrieval.test.d.ts +2 -0
- package/dist/smart-retrieval.test.d.ts.map +1 -0
- package/dist/smart-retrieval.test.js +238 -0
- package/dist/smart-retrieval.test.js.map +1 -0
- package/dist/sqlite-backend.d.ts +10 -0
- package/dist/sqlite-backend.d.ts.map +1 -1
- package/dist/sqlite-backend.js +170 -74
- package/dist/sqlite-backend.js.map +1 -1
- package/dist/sqljs-backend.d.ts +9 -0
- package/dist/sqljs-backend.d.ts.map +1 -1
- package/dist/sqljs-backend.js +120 -29
- package/dist/sqljs-backend.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +48 -35
- package/.agentic-flow/intelligence.json +0 -16
- package/__tests__/coverage/base.css +0 -224
- package/__tests__/coverage/block-navigation.js +0 -87
- package/__tests__/coverage/coverage-final.json +0 -19
- package/__tests__/coverage/favicon.png +0 -0
- package/__tests__/coverage/index.html +0 -206
- package/__tests__/coverage/lcov-report/base.css +0 -224
- package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
- package/__tests__/coverage/lcov-report/favicon.png +0 -0
- package/__tests__/coverage/lcov-report/index.html +0 -206
- package/__tests__/coverage/lcov-report/prettify.css +0 -1
- package/__tests__/coverage/lcov-report/prettify.js +0 -2
- package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/lcov-report/sorter.js +0 -210
- package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +0 -2737
- package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +0 -3130
- package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +0 -601
- package/__tests__/coverage/lcov-report/src/application/commands/index.html +0 -131
- package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +0 -394
- package/__tests__/coverage/lcov-report/src/application/queries/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +0 -796
- package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +0 -793
- package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +0 -1633
- package/__tests__/coverage/lcov-report/src/database-provider.ts.html +0 -1618
- package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +0 -952
- package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +0 -1294
- package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +0 -3124
- package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +0 -2167
- package/__tests__/coverage/lcov-report/src/index.html +0 -266
- package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
- package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/migration.ts.html +0 -2092
- package/__tests__/coverage/lcov-report/src/query-builder.ts.html +0 -1711
- package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +0 -2281
- package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +0 -2374
- package/__tests__/coverage/lcov-report/src/types.ts.html +0 -2266
- package/__tests__/coverage/lcov.info +0 -10238
- package/__tests__/coverage/prettify.css +0 -1
- package/__tests__/coverage/prettify.js +0 -2
- package/__tests__/coverage/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/sorter.js +0 -210
- package/__tests__/coverage/src/agentdb-adapter.ts.html +0 -2737
- package/__tests__/coverage/src/agentdb-backend.ts.html +0 -3130
- package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +0 -601
- package/__tests__/coverage/src/application/commands/index.html +0 -131
- package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +0 -394
- package/__tests__/coverage/src/application/queries/index.html +0 -116
- package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +0 -796
- package/__tests__/coverage/src/application/services/index.html +0 -116
- package/__tests__/coverage/src/application/services/memory-application-service.ts.html +0 -793
- package/__tests__/coverage/src/cache-manager.ts.html +0 -1633
- package/__tests__/coverage/src/database-provider.ts.html +0 -1618
- package/__tests__/coverage/src/domain/entities/index.html +0 -116
- package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +0 -952
- package/__tests__/coverage/src/domain/services/index.html +0 -116
- package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +0 -1294
- package/__tests__/coverage/src/hnsw-index.ts.html +0 -3124
- package/__tests__/coverage/src/hybrid-backend.ts.html +0 -2167
- package/__tests__/coverage/src/index.html +0 -266
- package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
- package/__tests__/coverage/src/infrastructure/repositories/index.html +0 -116
- package/__tests__/coverage/src/migration.ts.html +0 -2092
- package/__tests__/coverage/src/query-builder.ts.html +0 -1711
- package/__tests__/coverage/src/sqlite-backend.ts.html +0 -2281
- package/__tests__/coverage/src/sqljs-backend.ts.html +0 -2374
- package/__tests__/coverage/src/types.ts.html +0 -2266
- package/benchmarks/cache-hit-rate.bench.ts +0 -535
- package/benchmarks/hnsw-indexing.bench.ts +0 -552
- package/benchmarks/memory-write.bench.ts +0 -469
- package/benchmarks/vector-search.bench.ts +0 -449
- package/docs/AGENTDB-INTEGRATION.md +0 -388
- package/docs/CROSS_PLATFORM.md +0 -505
- package/docs/WINDOWS_SUPPORT.md +0 -422
- package/examples/agentdb-example.ts +0 -345
- package/examples/cross-platform-usage.ts +0 -326
- package/framework/benchmark.ts +0 -112
- package/src/agentdb-adapter.ts +0 -884
- package/src/agentdb-backend.test.ts +0 -339
- package/src/agentdb-backend.ts +0 -1016
- package/src/application/commands/delete-memory.command.ts +0 -172
- package/src/application/commands/store-memory.command.ts +0 -103
- package/src/application/index.ts +0 -36
- package/src/application/queries/search-memory.query.ts +0 -237
- package/src/application/services/memory-application-service.ts +0 -236
- package/src/cache-manager.ts +0 -516
- package/src/database-provider.test.ts +0 -364
- package/src/database-provider.ts +0 -511
- package/src/domain/entities/memory-entry.ts +0 -289
- package/src/domain/index.ts +0 -35
- package/src/domain/repositories/memory-repository.interface.ts +0 -120
- package/src/domain/services/memory-domain-service.ts +0 -403
- package/src/hnsw-index.ts +0 -1013
- package/src/hybrid-backend.test.ts +0 -399
- package/src/hybrid-backend.ts +0 -694
- package/src/index.ts +0 -515
- package/src/infrastructure/index.ts +0 -23
- package/src/infrastructure/repositories/hybrid-memory-repository.ts +0 -516
- package/src/migration.ts +0 -669
- package/src/query-builder.ts +0 -542
- package/src/sqlite-backend.ts +0 -732
- package/src/sqljs-backend.ts +0 -763
- package/src/types.ts +0 -727
- package/tmp.json +0 -0
- package/tsconfig.json +0 -9
- package/tsconfig.tsbuildinfo +0 -1
- package/verify-cross-platform.ts +0 -170
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Agent-Scoped Memory
|
|
3
|
+
*
|
|
4
|
+
* TDD London School (mock-first) tests for the 3-scope agent memory system.
|
|
5
|
+
* Uses vi.mock for ESM-compatible fs mocking.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
// ESM-compatible mock: vi.mock is hoisted above imports automatically
|
|
10
|
+
vi.mock('node:fs', async (importOriginal) => {
|
|
11
|
+
const actual = await importOriginal();
|
|
12
|
+
return {
|
|
13
|
+
...actual,
|
|
14
|
+
existsSync: vi.fn(actual.existsSync),
|
|
15
|
+
readdirSync: vi.fn(actual.readdirSync),
|
|
16
|
+
statSync: vi.fn(actual.statSync),
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
20
|
+
import { resolveAgentMemoryDir, createAgentBridge, transferKnowledge, listAgentScopes, } from './agent-memory-scope.js';
|
|
21
|
+
import { createDefaultEntry } from './types.js';
|
|
22
|
+
import { AutoMemoryBridge } from './auto-memory-bridge.js';
|
|
23
|
+
// Cast mocked fs functions for test control
|
|
24
|
+
const mockExistsSync = existsSync;
|
|
25
|
+
const mockReaddirSync = readdirSync;
|
|
26
|
+
const mockStatSync = statSync;
|
|
27
|
+
// ===== Mock Backend =====
|
|
28
|
+
function createMockBackend(entries = []) {
|
|
29
|
+
return {
|
|
30
|
+
initialize: vi.fn().mockResolvedValue(undefined),
|
|
31
|
+
shutdown: vi.fn().mockResolvedValue(undefined),
|
|
32
|
+
store: vi.fn().mockResolvedValue(undefined),
|
|
33
|
+
get: vi.fn().mockResolvedValue(null),
|
|
34
|
+
getByKey: vi.fn().mockResolvedValue(null),
|
|
35
|
+
update: vi.fn().mockResolvedValue(null),
|
|
36
|
+
delete: vi.fn().mockResolvedValue(true),
|
|
37
|
+
query: vi.fn().mockResolvedValue(entries),
|
|
38
|
+
search: vi.fn().mockResolvedValue([]),
|
|
39
|
+
bulkInsert: vi.fn().mockResolvedValue(undefined),
|
|
40
|
+
bulkDelete: vi.fn().mockResolvedValue(0),
|
|
41
|
+
count: vi.fn().mockResolvedValue(0),
|
|
42
|
+
listNamespaces: vi.fn().mockResolvedValue([]),
|
|
43
|
+
clearNamespace: vi.fn().mockResolvedValue(0),
|
|
44
|
+
getStats: vi.fn().mockResolvedValue({
|
|
45
|
+
totalEntries: 0,
|
|
46
|
+
entriesByNamespace: {},
|
|
47
|
+
entriesByType: {},
|
|
48
|
+
memoryUsage: 0,
|
|
49
|
+
avgQueryTime: 0,
|
|
50
|
+
avgSearchTime: 0,
|
|
51
|
+
}),
|
|
52
|
+
healthCheck: vi.fn().mockResolvedValue({
|
|
53
|
+
status: 'healthy',
|
|
54
|
+
components: {
|
|
55
|
+
storage: { status: 'healthy', latency: 0 },
|
|
56
|
+
index: { status: 'healthy', latency: 0 },
|
|
57
|
+
cache: { status: 'healthy', latency: 0 },
|
|
58
|
+
},
|
|
59
|
+
timestamp: Date.now(),
|
|
60
|
+
issues: [],
|
|
61
|
+
recommendations: [],
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// ===== Test Fixtures =====
|
|
66
|
+
function createTestEntry(overrides = {}) {
|
|
67
|
+
const base = createDefaultEntry({
|
|
68
|
+
key: 'test-key',
|
|
69
|
+
content: 'Test content for knowledge transfer',
|
|
70
|
+
namespace: 'learnings',
|
|
71
|
+
tags: ['insight', 'architecture'],
|
|
72
|
+
metadata: {
|
|
73
|
+
confidence: 0.95,
|
|
74
|
+
category: 'architecture',
|
|
75
|
+
summary: 'Use event sourcing for state changes',
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
// When overrides.metadata is provided, use it directly (don't merge with base metadata)
|
|
79
|
+
const metadata = overrides.metadata !== undefined ? overrides.metadata : base.metadata;
|
|
80
|
+
return { ...base, ...overrides, metadata };
|
|
81
|
+
}
|
|
82
|
+
// ===== resolveAgentMemoryDir =====
|
|
83
|
+
describe('resolveAgentMemoryDir', () => {
|
|
84
|
+
const originalHome = process.env.HOME;
|
|
85
|
+
const originalUserProfile = process.env.USERPROFILE;
|
|
86
|
+
beforeEach(() => {
|
|
87
|
+
mockExistsSync.mockReset();
|
|
88
|
+
// Default: no .git found anywhere
|
|
89
|
+
mockExistsSync.mockReturnValue(false);
|
|
90
|
+
});
|
|
91
|
+
afterEach(() => {
|
|
92
|
+
process.env.HOME = originalHome;
|
|
93
|
+
process.env.USERPROFILE = originalUserProfile;
|
|
94
|
+
});
|
|
95
|
+
it('should resolve project scope to gitRoot/.claude/agent-memory/name/', () => {
|
|
96
|
+
mockExistsSync.mockImplementation((p) => {
|
|
97
|
+
return String(p) === path.join('/workspaces/my-project', '.git');
|
|
98
|
+
});
|
|
99
|
+
const result = resolveAgentMemoryDir('coder', 'project', '/workspaces/my-project/src');
|
|
100
|
+
expect(result).toBe(path.join('/workspaces/my-project', '.claude', 'agent-memory', 'coder'));
|
|
101
|
+
});
|
|
102
|
+
it('should resolve local scope to gitRoot/.claude/agent-memory-local/name/', () => {
|
|
103
|
+
mockExistsSync.mockImplementation((p) => {
|
|
104
|
+
return String(p) === path.join('/workspaces/my-project', '.git');
|
|
105
|
+
});
|
|
106
|
+
const result = resolveAgentMemoryDir('researcher', 'local', '/workspaces/my-project/src');
|
|
107
|
+
expect(result).toBe(path.join('/workspaces/my-project', '.claude', 'agent-memory-local', 'researcher'));
|
|
108
|
+
});
|
|
109
|
+
it('should resolve user scope to ~/.claude/agent-memory/name/', () => {
|
|
110
|
+
process.env.HOME = '/home/testuser';
|
|
111
|
+
const result = resolveAgentMemoryDir('planner', 'user');
|
|
112
|
+
expect(result).toBe(path.join('/home/testuser', '.claude', 'agent-memory', 'planner'));
|
|
113
|
+
});
|
|
114
|
+
it('should sanitize agent name by replacing special characters', () => {
|
|
115
|
+
process.env.HOME = '/home/testuser';
|
|
116
|
+
const result = resolveAgentMemoryDir('my agent!@#name', 'user');
|
|
117
|
+
expect(result).toBe(path.join('/home/testuser', '.claude', 'agent-memory', 'my_agent___name'));
|
|
118
|
+
});
|
|
119
|
+
it('should handle path traversal attempts in agent name', () => {
|
|
120
|
+
process.env.HOME = '/home/testuser';
|
|
121
|
+
const result = resolveAgentMemoryDir('../../../etc/passwd', 'user');
|
|
122
|
+
expect(result).toContain('______etc_passwd');
|
|
123
|
+
expect(result).not.toContain('..');
|
|
124
|
+
});
|
|
125
|
+
it('should handle dots and slashes in agent name', () => {
|
|
126
|
+
process.env.HOME = '/home/testuser';
|
|
127
|
+
const result = resolveAgentMemoryDir('agent/with.dots', 'user');
|
|
128
|
+
expect(result).toBe(path.join('/home/testuser', '.claude', 'agent-memory', 'agent_with_dots'));
|
|
129
|
+
});
|
|
130
|
+
it('should fall back to workingDir when no git root is found', () => {
|
|
131
|
+
mockExistsSync.mockReturnValue(false);
|
|
132
|
+
const result = resolveAgentMemoryDir('coder', 'project', '/some/dir');
|
|
133
|
+
expect(result).toBe(path.join('/some/dir', '.claude', 'agent-memory', 'coder'));
|
|
134
|
+
});
|
|
135
|
+
it('should fall back to USERPROFILE when HOME is not set', () => {
|
|
136
|
+
delete process.env.HOME;
|
|
137
|
+
process.env.USERPROFILE = '/Users/testuser';
|
|
138
|
+
const result = resolveAgentMemoryDir('coder', 'user');
|
|
139
|
+
expect(result).toBe(path.join('/Users/testuser', '.claude', 'agent-memory', 'coder'));
|
|
140
|
+
});
|
|
141
|
+
it('should use cwd as fallback for project scope when workingDir is omitted', () => {
|
|
142
|
+
mockExistsSync.mockReturnValue(false);
|
|
143
|
+
const cwd = process.cwd();
|
|
144
|
+
const result = resolveAgentMemoryDir('coder', 'project');
|
|
145
|
+
expect(result).toBe(path.join(cwd, '.claude', 'agent-memory', 'coder'));
|
|
146
|
+
});
|
|
147
|
+
it('should preserve hyphens and underscores in agent name', () => {
|
|
148
|
+
process.env.HOME = '/home/testuser';
|
|
149
|
+
const result = resolveAgentMemoryDir('my-agent_01', 'user');
|
|
150
|
+
expect(result).toBe(path.join('/home/testuser', '.claude', 'agent-memory', 'my-agent_01'));
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
// ===== createAgentBridge =====
|
|
154
|
+
describe('createAgentBridge', () => {
|
|
155
|
+
beforeEach(() => {
|
|
156
|
+
mockExistsSync.mockReset();
|
|
157
|
+
mockExistsSync.mockReturnValue(false);
|
|
158
|
+
});
|
|
159
|
+
it('should create a bridge with correct memoryDir for project scope', () => {
|
|
160
|
+
mockExistsSync.mockImplementation((p) => {
|
|
161
|
+
return String(p) === path.join('/workspaces/project', '.git');
|
|
162
|
+
});
|
|
163
|
+
const backend = createMockBackend();
|
|
164
|
+
const bridge = createAgentBridge(backend, {
|
|
165
|
+
agentName: 'coder',
|
|
166
|
+
scope: 'project',
|
|
167
|
+
workingDir: '/workspaces/project',
|
|
168
|
+
});
|
|
169
|
+
expect(bridge).toBeInstanceOf(AutoMemoryBridge);
|
|
170
|
+
expect(bridge.getMemoryDir()).toBe(path.join('/workspaces/project', '.claude', 'agent-memory', 'coder'));
|
|
171
|
+
bridge.destroy();
|
|
172
|
+
});
|
|
173
|
+
it('should create a bridge with correct memoryDir for user scope', () => {
|
|
174
|
+
const originalHome = process.env.HOME;
|
|
175
|
+
process.env.HOME = '/home/testuser';
|
|
176
|
+
const backend = createMockBackend();
|
|
177
|
+
const bridge = createAgentBridge(backend, {
|
|
178
|
+
agentName: 'reviewer',
|
|
179
|
+
scope: 'user',
|
|
180
|
+
});
|
|
181
|
+
expect(bridge).toBeInstanceOf(AutoMemoryBridge);
|
|
182
|
+
expect(bridge.getMemoryDir()).toBe(path.join('/home/testuser', '.claude', 'agent-memory', 'reviewer'));
|
|
183
|
+
bridge.destroy();
|
|
184
|
+
process.env.HOME = originalHome;
|
|
185
|
+
});
|
|
186
|
+
it('should create a bridge with correct memoryDir for local scope', () => {
|
|
187
|
+
mockExistsSync.mockImplementation((p) => {
|
|
188
|
+
return String(p) === path.join('/workspaces/project', '.git');
|
|
189
|
+
});
|
|
190
|
+
const backend = createMockBackend();
|
|
191
|
+
const bridge = createAgentBridge(backend, {
|
|
192
|
+
agentName: 'tester',
|
|
193
|
+
scope: 'local',
|
|
194
|
+
workingDir: '/workspaces/project',
|
|
195
|
+
});
|
|
196
|
+
expect(bridge).toBeInstanceOf(AutoMemoryBridge);
|
|
197
|
+
expect(bridge.getMemoryDir()).toBe(path.join('/workspaces/project', '.claude', 'agent-memory-local', 'tester'));
|
|
198
|
+
bridge.destroy();
|
|
199
|
+
});
|
|
200
|
+
it('should pass through other config options to AutoMemoryBridge', () => {
|
|
201
|
+
const backend = createMockBackend();
|
|
202
|
+
const bridge = createAgentBridge(backend, {
|
|
203
|
+
agentName: 'coder',
|
|
204
|
+
scope: 'project',
|
|
205
|
+
workingDir: '/tmp/test',
|
|
206
|
+
syncMode: 'on-session-end',
|
|
207
|
+
maxIndexLines: 100,
|
|
208
|
+
minConfidence: 0.9,
|
|
209
|
+
});
|
|
210
|
+
expect(bridge).toBeInstanceOf(AutoMemoryBridge);
|
|
211
|
+
bridge.destroy();
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
// ===== transferKnowledge =====
|
|
215
|
+
describe('transferKnowledge', () => {
|
|
216
|
+
let targetBridge;
|
|
217
|
+
let targetBackend;
|
|
218
|
+
beforeEach(() => {
|
|
219
|
+
mockExistsSync.mockReset();
|
|
220
|
+
mockExistsSync.mockReturnValue(false);
|
|
221
|
+
targetBackend = createMockBackend();
|
|
222
|
+
targetBridge = new AutoMemoryBridge(targetBackend, {
|
|
223
|
+
memoryDir: '/tmp/test-agent-memory',
|
|
224
|
+
syncMode: 'on-session-end',
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
afterEach(() => {
|
|
228
|
+
targetBridge.destroy();
|
|
229
|
+
});
|
|
230
|
+
it('should transfer high-confidence entries', async () => {
|
|
231
|
+
const entry = createTestEntry({
|
|
232
|
+
metadata: { confidence: 0.95, category: 'architecture', summary: 'Use event sourcing' },
|
|
233
|
+
});
|
|
234
|
+
const sourceBackend = createMockBackend([entry]);
|
|
235
|
+
const result = await transferKnowledge(sourceBackend, targetBridge, {
|
|
236
|
+
sourceNamespace: 'learnings',
|
|
237
|
+
minConfidence: 0.8,
|
|
238
|
+
});
|
|
239
|
+
expect(result.transferred).toBe(1);
|
|
240
|
+
expect(result.skipped).toBe(0);
|
|
241
|
+
expect(targetBackend.store).toHaveBeenCalled();
|
|
242
|
+
});
|
|
243
|
+
it('should skip entries below minConfidence', async () => {
|
|
244
|
+
const lowConfEntry = createTestEntry({
|
|
245
|
+
metadata: { confidence: 0.3, category: 'debugging', summary: 'Low conf item' },
|
|
246
|
+
});
|
|
247
|
+
const sourceBackend = createMockBackend([lowConfEntry]);
|
|
248
|
+
const result = await transferKnowledge(sourceBackend, targetBridge, {
|
|
249
|
+
sourceNamespace: 'learnings',
|
|
250
|
+
minConfidence: 0.8,
|
|
251
|
+
});
|
|
252
|
+
expect(result.transferred).toBe(0);
|
|
253
|
+
expect(result.skipped).toBe(1);
|
|
254
|
+
});
|
|
255
|
+
it('should filter by categories when specified', async () => {
|
|
256
|
+
const archEntry = createTestEntry({
|
|
257
|
+
metadata: { confidence: 0.95, category: 'architecture', summary: 'Arch pattern' },
|
|
258
|
+
});
|
|
259
|
+
const secEntry = createTestEntry({
|
|
260
|
+
metadata: { confidence: 0.95, category: 'security', summary: 'Security pattern' },
|
|
261
|
+
});
|
|
262
|
+
const sourceBackend = createMockBackend([archEntry, secEntry]);
|
|
263
|
+
const result = await transferKnowledge(sourceBackend, targetBridge, {
|
|
264
|
+
sourceNamespace: 'learnings',
|
|
265
|
+
categories: ['architecture'],
|
|
266
|
+
});
|
|
267
|
+
expect(result.transferred).toBe(1);
|
|
268
|
+
expect(result.skipped).toBe(1);
|
|
269
|
+
});
|
|
270
|
+
it('should respect maxEntries limit', async () => {
|
|
271
|
+
const entries = Array.from({ length: 10 }, (_, i) => createTestEntry({
|
|
272
|
+
key: `entry-${i}`,
|
|
273
|
+
metadata: { confidence: 0.95, category: 'architecture', summary: `Pattern ${i}` },
|
|
274
|
+
}));
|
|
275
|
+
const sourceBackend = createMockBackend(entries);
|
|
276
|
+
const result = await transferKnowledge(sourceBackend, targetBridge, {
|
|
277
|
+
sourceNamespace: 'learnings',
|
|
278
|
+
maxEntries: 3,
|
|
279
|
+
});
|
|
280
|
+
expect(result.transferred).toBe(3);
|
|
281
|
+
});
|
|
282
|
+
it('should handle empty source', async () => {
|
|
283
|
+
const sourceBackend = createMockBackend([]);
|
|
284
|
+
const result = await transferKnowledge(sourceBackend, targetBridge, {
|
|
285
|
+
sourceNamespace: 'learnings',
|
|
286
|
+
});
|
|
287
|
+
expect(result.transferred).toBe(0);
|
|
288
|
+
expect(result.skipped).toBe(0);
|
|
289
|
+
});
|
|
290
|
+
it('should set transfer source metadata on insights', async () => {
|
|
291
|
+
const entry = createTestEntry({
|
|
292
|
+
metadata: { confidence: 0.95, category: 'architecture', summary: 'Test pattern' },
|
|
293
|
+
});
|
|
294
|
+
const sourceBackend = createMockBackend([entry]);
|
|
295
|
+
const recordSpy = vi.spyOn(targetBridge, 'recordInsight');
|
|
296
|
+
await transferKnowledge(sourceBackend, targetBridge, {
|
|
297
|
+
sourceNamespace: 'my-namespace',
|
|
298
|
+
});
|
|
299
|
+
expect(recordSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
300
|
+
source: 'transfer:my-namespace',
|
|
301
|
+
}));
|
|
302
|
+
});
|
|
303
|
+
it('should use default category when entry has no category metadata', async () => {
|
|
304
|
+
const entry = createTestEntry({
|
|
305
|
+
metadata: { confidence: 0.95, summary: 'No category' },
|
|
306
|
+
});
|
|
307
|
+
const sourceBackend = createMockBackend([entry]);
|
|
308
|
+
const recordSpy = vi.spyOn(targetBridge, 'recordInsight');
|
|
309
|
+
await transferKnowledge(sourceBackend, targetBridge, {
|
|
310
|
+
sourceNamespace: 'learnings',
|
|
311
|
+
});
|
|
312
|
+
expect(recordSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
313
|
+
category: 'project-patterns',
|
|
314
|
+
}));
|
|
315
|
+
});
|
|
316
|
+
it('should use first line of content as summary when metadata.summary is missing', async () => {
|
|
317
|
+
const entry = createTestEntry({
|
|
318
|
+
content: 'First line summary\nSecond line detail',
|
|
319
|
+
metadata: { confidence: 0.9 },
|
|
320
|
+
});
|
|
321
|
+
const sourceBackend = createMockBackend([entry]);
|
|
322
|
+
const recordSpy = vi.spyOn(targetBridge, 'recordInsight');
|
|
323
|
+
await transferKnowledge(sourceBackend, targetBridge, {
|
|
324
|
+
sourceNamespace: 'learnings',
|
|
325
|
+
});
|
|
326
|
+
expect(recordSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
327
|
+
summary: 'First line summary',
|
|
328
|
+
}));
|
|
329
|
+
});
|
|
330
|
+
it('should include entries without category when no category filter is set', async () => {
|
|
331
|
+
const entry = createTestEntry({
|
|
332
|
+
metadata: { confidence: 0.95 },
|
|
333
|
+
});
|
|
334
|
+
const sourceBackend = createMockBackend([entry]);
|
|
335
|
+
const result = await transferKnowledge(sourceBackend, targetBridge, {
|
|
336
|
+
sourceNamespace: 'learnings',
|
|
337
|
+
});
|
|
338
|
+
expect(result.transferred).toBe(1);
|
|
339
|
+
});
|
|
340
|
+
it('should default minConfidence to 0.8 when not specified', async () => {
|
|
341
|
+
const borderline = createTestEntry({
|
|
342
|
+
key: 'border',
|
|
343
|
+
metadata: { confidence: 0.79, summary: 'Borderline' },
|
|
344
|
+
});
|
|
345
|
+
const passing = createTestEntry({
|
|
346
|
+
key: 'passing',
|
|
347
|
+
metadata: { confidence: 0.81, summary: 'Passing' },
|
|
348
|
+
});
|
|
349
|
+
const sourceBackend = createMockBackend([borderline, passing]);
|
|
350
|
+
const result = await transferKnowledge(sourceBackend, targetBridge, {
|
|
351
|
+
sourceNamespace: 'learnings',
|
|
352
|
+
});
|
|
353
|
+
expect(result.transferred).toBe(1);
|
|
354
|
+
expect(result.skipped).toBe(1);
|
|
355
|
+
});
|
|
356
|
+
it('should default maxEntries to 20 when not specified', async () => {
|
|
357
|
+
const entries = Array.from({ length: 30 }, (_, i) => createTestEntry({
|
|
358
|
+
key: `entry-${i}`,
|
|
359
|
+
metadata: { confidence: 0.95, summary: `Pattern ${i}` },
|
|
360
|
+
}));
|
|
361
|
+
const sourceBackend = createMockBackend(entries);
|
|
362
|
+
const result = await transferKnowledge(sourceBackend, targetBridge, {
|
|
363
|
+
sourceNamespace: 'learnings',
|
|
364
|
+
});
|
|
365
|
+
expect(result.transferred).toBe(20);
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
// ===== listAgentScopes =====
|
|
369
|
+
describe('listAgentScopes', () => {
|
|
370
|
+
const originalHome = process.env.HOME;
|
|
371
|
+
beforeEach(() => {
|
|
372
|
+
mockExistsSync.mockReset();
|
|
373
|
+
mockReaddirSync.mockReset();
|
|
374
|
+
mockStatSync.mockReset();
|
|
375
|
+
// Default: nothing exists
|
|
376
|
+
mockExistsSync.mockReturnValue(false);
|
|
377
|
+
});
|
|
378
|
+
afterEach(() => {
|
|
379
|
+
process.env.HOME = originalHome;
|
|
380
|
+
});
|
|
381
|
+
it('should return empty agents when dirs do not exist', () => {
|
|
382
|
+
process.env.HOME = '/home/testuser';
|
|
383
|
+
mockExistsSync.mockReturnValue(false);
|
|
384
|
+
const scopes = listAgentScopes('/workspaces/project');
|
|
385
|
+
expect(scopes).toHaveLength(3);
|
|
386
|
+
expect(scopes[0]).toEqual({ scope: 'project', agents: [] });
|
|
387
|
+
expect(scopes[1]).toEqual({ scope: 'local', agents: [] });
|
|
388
|
+
expect(scopes[2]).toEqual({ scope: 'user', agents: [] });
|
|
389
|
+
});
|
|
390
|
+
it('should list agents from existing directories', () => {
|
|
391
|
+
process.env.HOME = '/home/testuser';
|
|
392
|
+
// Compute the expected directories (no git root, falls back to workingDir)
|
|
393
|
+
const projectDir = path.join('/workspaces/project', '.claude', 'agent-memory');
|
|
394
|
+
const localDir = path.join('/workspaces/project', '.claude', 'agent-memory-local');
|
|
395
|
+
const userDir = path.join('/home/testuser', '.claude', 'agent-memory');
|
|
396
|
+
mockExistsSync.mockImplementation((p) => {
|
|
397
|
+
const s = String(p);
|
|
398
|
+
if (s === projectDir)
|
|
399
|
+
return true;
|
|
400
|
+
if (s === localDir)
|
|
401
|
+
return true;
|
|
402
|
+
if (s === userDir)
|
|
403
|
+
return true;
|
|
404
|
+
// No .git found
|
|
405
|
+
return false;
|
|
406
|
+
});
|
|
407
|
+
mockReaddirSync.mockImplementation((p) => {
|
|
408
|
+
const s = String(p);
|
|
409
|
+
if (s === projectDir)
|
|
410
|
+
return ['coder', 'tester'];
|
|
411
|
+
if (s === localDir)
|
|
412
|
+
return ['researcher'];
|
|
413
|
+
if (s === userDir)
|
|
414
|
+
return ['planner'];
|
|
415
|
+
return [];
|
|
416
|
+
});
|
|
417
|
+
mockStatSync.mockReturnValue({ isDirectory: () => true });
|
|
418
|
+
const scopes = listAgentScopes('/workspaces/project');
|
|
419
|
+
expect(scopes[0]).toEqual({ scope: 'project', agents: ['coder', 'tester'] });
|
|
420
|
+
expect(scopes[1]).toEqual({ scope: 'local', agents: ['researcher'] });
|
|
421
|
+
expect(scopes[2]).toEqual({ scope: 'user', agents: ['planner'] });
|
|
422
|
+
});
|
|
423
|
+
it('should return all three scopes in order: project, local, user', () => {
|
|
424
|
+
mockExistsSync.mockReturnValue(false);
|
|
425
|
+
const scopes = listAgentScopes('/tmp/test');
|
|
426
|
+
expect(scopes.map((s) => s.scope)).toEqual(['project', 'local', 'user']);
|
|
427
|
+
});
|
|
428
|
+
it('should handle readdir errors gracefully', () => {
|
|
429
|
+
process.env.HOME = '/home/testuser';
|
|
430
|
+
const projectDir = path.join('/workspaces/project', '.claude', 'agent-memory');
|
|
431
|
+
mockExistsSync.mockImplementation((p) => {
|
|
432
|
+
return String(p) === projectDir;
|
|
433
|
+
});
|
|
434
|
+
mockReaddirSync.mockImplementation(() => {
|
|
435
|
+
throw new Error('Permission denied');
|
|
436
|
+
});
|
|
437
|
+
const scopes = listAgentScopes('/workspaces/project');
|
|
438
|
+
expect(scopes[0]).toEqual({ scope: 'project', agents: [] });
|
|
439
|
+
});
|
|
440
|
+
it('should skip non-directory entries', () => {
|
|
441
|
+
process.env.HOME = '/home/testuser';
|
|
442
|
+
const projectDir = path.join('/workspaces/project', '.claude', 'agent-memory');
|
|
443
|
+
mockExistsSync.mockImplementation((p) => {
|
|
444
|
+
return String(p) === projectDir;
|
|
445
|
+
});
|
|
446
|
+
mockReaddirSync.mockImplementation((p) => {
|
|
447
|
+
if (String(p) === projectDir)
|
|
448
|
+
return ['coder', 'readme.md'];
|
|
449
|
+
return [];
|
|
450
|
+
});
|
|
451
|
+
let callCount = 0;
|
|
452
|
+
mockStatSync.mockImplementation(() => {
|
|
453
|
+
callCount++;
|
|
454
|
+
if (callCount === 1) {
|
|
455
|
+
return { isDirectory: () => true };
|
|
456
|
+
}
|
|
457
|
+
return { isDirectory: () => false };
|
|
458
|
+
});
|
|
459
|
+
const scopes = listAgentScopes('/workspaces/project');
|
|
460
|
+
expect(scopes[0].agents).toEqual(['coder']);
|
|
461
|
+
});
|
|
462
|
+
});
|
|
463
|
+
//# sourceMappingURL=agent-memory-scope.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-memory-scope.test.js","sourceRoot":"","sources":["../src/agent-memory-scope.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -93,13 +93,32 @@ export declare class AgentDBAdapter extends EventEmitter implements IMemoryBacke
|
|
|
93
93
|
*/
|
|
94
94
|
search(embedding: Float32Array, options: SearchOptions): Promise<SearchResult[]>;
|
|
95
95
|
/**
|
|
96
|
-
* Bulk insert entries
|
|
96
|
+
* Bulk insert entries (OPTIMIZED: 2-3x faster with batched operations)
|
|
97
|
+
*
|
|
98
|
+
* Performance improvements:
|
|
99
|
+
* - Parallel embedding generation
|
|
100
|
+
* - Batched index updates
|
|
101
|
+
* - Deferred cache population
|
|
102
|
+
* - Single event emission
|
|
97
103
|
*/
|
|
98
|
-
bulkInsert(entries: MemoryEntry[]
|
|
104
|
+
bulkInsert(entries: MemoryEntry[], options?: {
|
|
105
|
+
batchSize?: number;
|
|
106
|
+
}): Promise<void>;
|
|
99
107
|
/**
|
|
100
|
-
* Bulk delete entries
|
|
108
|
+
* Bulk delete entries (OPTIMIZED: parallel deletion)
|
|
101
109
|
*/
|
|
102
110
|
bulkDelete(ids: string[]): Promise<number>;
|
|
111
|
+
/**
|
|
112
|
+
* Bulk get entries by IDs (OPTIMIZED: parallel fetch with cache)
|
|
113
|
+
*/
|
|
114
|
+
bulkGet(ids: string[]): Promise<Map<string, MemoryEntry | null>>;
|
|
115
|
+
/**
|
|
116
|
+
* Bulk update entries (OPTIMIZED: batched updates)
|
|
117
|
+
*/
|
|
118
|
+
bulkUpdate(updates: Array<{
|
|
119
|
+
id: string;
|
|
120
|
+
update: MemoryEntryUpdate;
|
|
121
|
+
}>): Promise<Map<string, MemoryEntry | null>>;
|
|
103
122
|
/**
|
|
104
123
|
* Get entry count
|
|
105
124
|
*/
|
|
@@ -125,9 +144,27 @@ export declare class AgentDBAdapter extends EventEmitter implements IMemoryBacke
|
|
|
125
144
|
*/
|
|
126
145
|
storeEntry(input: MemoryEntryInput): Promise<MemoryEntry>;
|
|
127
146
|
/**
|
|
128
|
-
* Semantic search by content string
|
|
147
|
+
* Semantic search by content string.
|
|
148
|
+
*
|
|
149
|
+
* ADR-125 Phase 5 — degrades gracefully when the embedding generator is
|
|
150
|
+
* unavailable. Instead of throwing, emits `health:embedder` with
|
|
151
|
+
* `status: 'degraded'` and falls back to {@link searchKeyword} so the
|
|
152
|
+
* memory subsystem remains usable when `@claude-flow/embeddings` is
|
|
153
|
+
* unreachable (per ADR-124's lazy/degrade posture).
|
|
129
154
|
*/
|
|
130
155
|
semanticSearch(content: string, k?: number, threshold?: number): Promise<SearchResult[]>;
|
|
156
|
+
/**
|
|
157
|
+
* Keyword search — in-memory token-overlap ranking against the
|
|
158
|
+
* `entries` map. Used as a fallback when the embedder is unavailable
|
|
159
|
+
* and as the "sparse" arm of the hybridSearch controller.
|
|
160
|
+
*
|
|
161
|
+
* Falls back to the SqlJs / SQLite backend FTS5 path when a backend is
|
|
162
|
+
* wired that exposes a `searchKeyword` method. The AgentDBAdapter itself
|
|
163
|
+
* keeps the implementation cheap and dependency-free.
|
|
164
|
+
*
|
|
165
|
+
* @internal ADR-125 Phase 5
|
|
166
|
+
*/
|
|
167
|
+
searchKeyword(query: string, options?: SearchOptions): Promise<SearchResult[]>;
|
|
131
168
|
private queryByPrefix;
|
|
132
169
|
private queryByTags;
|
|
133
170
|
private querySemanticWithFilters;
|
|
@@ -139,8 +176,49 @@ export declare class AgentDBAdapter extends EventEmitter implements IMemoryBacke
|
|
|
139
176
|
private checkStorageHealth;
|
|
140
177
|
private checkIndexHealth;
|
|
141
178
|
private checkCacheHealth;
|
|
179
|
+
/**
|
|
180
|
+
* Path to the HNSW snapshot sidecar.
|
|
181
|
+
* Convention: `<persistencePath>.hnsw`
|
|
182
|
+
*/
|
|
183
|
+
private getHnswSidecarPath;
|
|
184
|
+
/**
|
|
185
|
+
* Path to the in-memory Maps (entries/namespaceIndex/keyIndex/tagIndex) sidecar.
|
|
186
|
+
* Convention: `<persistencePath>.meta.json`
|
|
187
|
+
*/
|
|
188
|
+
private getMetaSidecarPath;
|
|
189
|
+
/**
|
|
190
|
+
* Persist a snapshot of the in-memory state to disk.
|
|
191
|
+
*
|
|
192
|
+
* Writes two sidecar files alongside `persistencePath`:
|
|
193
|
+
* - `<persistencePath>.hnsw` — binary HNSW snapshot via {@link HNSWIndex.serialize}
|
|
194
|
+
* - `<persistencePath>.meta.json` — entries + indices in stable JSON
|
|
195
|
+
*
|
|
196
|
+
* Public so {@link MemoryService} can trigger periodic snapshots (ADR-125 Phase 3).
|
|
197
|
+
*/
|
|
198
|
+
saveSnapshot(): Promise<void>;
|
|
199
|
+
/**
|
|
200
|
+
* ADR-125 Phase 3 — real persistence implementation.
|
|
201
|
+
*
|
|
202
|
+
* Loads two sidecar files alongside `persistencePath` (when both exist):
|
|
203
|
+
* - `<persistencePath>.hnsw` — binary HNSW snapshot
|
|
204
|
+
* - `<persistencePath>.meta.json` — entries + namespaceIndex + keyIndex + tagIndex
|
|
205
|
+
*
|
|
206
|
+
* Emits `persistence:loaded` with `{ status: 'restored' | 'fresh' | 'corrupt' }`.
|
|
207
|
+
* Falls back to a fresh state on any deserialize / IO error so callers don't throw.
|
|
208
|
+
*/
|
|
142
209
|
private loadFromDisk;
|
|
210
|
+
/**
|
|
211
|
+
* ADR-125 Phase 3 — real snapshot implementation.
|
|
212
|
+
*
|
|
213
|
+
* Writes both sidecars atomically via a temp-file-and-rename dance so a
|
|
214
|
+
* crash mid-write doesn't leave half-baked state on disk.
|
|
215
|
+
*/
|
|
143
216
|
private saveToDisk;
|
|
217
|
+
/**
|
|
218
|
+
* Build a stable, diff-friendly JSON representation of the in-memory Maps.
|
|
219
|
+
* Keys are sorted; embeddings are serialized as plain number arrays.
|
|
220
|
+
*/
|
|
221
|
+
private buildPersistedMeta;
|
|
144
222
|
}
|
|
145
223
|
export default AgentDBAdapter;
|
|
146
224
|
//# sourceMappingURL=agentdb-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentdb-adapter.d.ts","sourceRoot":"","sources":["../src/agentdb-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"agentdb-adapter.d.ts","sourceRoot":"","sources":["../src/agentdb-adapter.ts"],"names":[],"mappings":"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"}
|