@claude-flow/memory 3.0.0-alpha.2 → 3.0.0-alpha.21

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.
Files changed (253) hide show
  1. package/README.md +651 -42
  2. package/dist/agent-memory-scope.d.ts +131 -0
  3. package/dist/agent-memory-scope.d.ts.map +1 -0
  4. package/dist/agent-memory-scope.js +223 -0
  5. package/dist/agent-memory-scope.js.map +1 -0
  6. package/dist/agent-memory-scope.test.d.ts +8 -0
  7. package/dist/agent-memory-scope.test.d.ts.map +1 -0
  8. package/dist/agent-memory-scope.test.js +463 -0
  9. package/dist/agent-memory-scope.test.js.map +1 -0
  10. package/dist/agentdb-adapter.d.ts +82 -4
  11. package/dist/agentdb-adapter.d.ts.map +1 -1
  12. package/dist/agentdb-adapter.js +388 -17
  13. package/dist/agentdb-adapter.js.map +1 -1
  14. package/dist/agentdb-backend.d.ts +6 -0
  15. package/dist/agentdb-backend.d.ts.map +1 -1
  16. package/dist/agentdb-backend.js +89 -25
  17. package/dist/agentdb-backend.js.map +1 -1
  18. package/dist/auto-memory-bridge.d.ts +237 -0
  19. package/dist/auto-memory-bridge.d.ts.map +1 -0
  20. package/dist/auto-memory-bridge.js +758 -0
  21. package/dist/auto-memory-bridge.js.map +1 -0
  22. package/dist/auto-memory-bridge.test.d.ts +8 -0
  23. package/dist/auto-memory-bridge.test.d.ts.map +1 -0
  24. package/dist/auto-memory-bridge.test.js +849 -0
  25. package/dist/auto-memory-bridge.test.js.map +1 -0
  26. package/dist/benchmark.test.d.ts +2 -0
  27. package/dist/benchmark.test.d.ts.map +1 -0
  28. package/dist/benchmark.test.js +277 -0
  29. package/dist/benchmark.test.js.map +1 -0
  30. package/dist/consolidator.d.ts +96 -0
  31. package/dist/consolidator.d.ts.map +1 -0
  32. package/dist/consolidator.js +209 -0
  33. package/dist/consolidator.js.map +1 -0
  34. package/dist/consolidator.test.d.ts +17 -0
  35. package/dist/consolidator.test.d.ts.map +1 -0
  36. package/dist/consolidator.test.js +239 -0
  37. package/dist/consolidator.test.js.map +1 -0
  38. package/dist/controller-registry.d.ts +248 -0
  39. package/dist/controller-registry.d.ts.map +1 -0
  40. package/dist/controller-registry.js +1086 -0
  41. package/dist/controller-registry.js.map +1 -0
  42. package/dist/controller-registry.test.d.ts +14 -0
  43. package/dist/controller-registry.test.d.ts.map +1 -0
  44. package/dist/controller-registry.test.js +691 -0
  45. package/dist/controller-registry.test.js.map +1 -0
  46. package/dist/database-provider.d.ts +14 -2
  47. package/dist/database-provider.d.ts.map +1 -1
  48. package/dist/database-provider.js +63 -3
  49. package/dist/database-provider.js.map +1 -1
  50. package/dist/database-provider.test.js +56 -3
  51. package/dist/database-provider.test.js.map +1 -1
  52. package/dist/entity-tagger.d.ts +31 -0
  53. package/dist/entity-tagger.d.ts.map +1 -0
  54. package/dist/entity-tagger.js +80 -0
  55. package/dist/entity-tagger.js.map +1 -0
  56. package/dist/entity-tagger.test.d.ts +12 -0
  57. package/dist/entity-tagger.test.d.ts.map +1 -0
  58. package/dist/entity-tagger.test.js +70 -0
  59. package/dist/entity-tagger.test.js.map +1 -0
  60. package/dist/fts5.test.d.ts +13 -0
  61. package/dist/fts5.test.d.ts.map +1 -0
  62. package/dist/fts5.test.js +144 -0
  63. package/dist/fts5.test.js.map +1 -0
  64. package/dist/graceful-retrieval.test.d.ts +14 -0
  65. package/dist/graceful-retrieval.test.d.ts.map +1 -0
  66. package/dist/graceful-retrieval.test.js +192 -0
  67. package/dist/graceful-retrieval.test.js.map +1 -0
  68. package/dist/hnsw-index.d.ts +51 -0
  69. package/dist/hnsw-index.d.ts.map +1 -1
  70. package/dist/hnsw-index.js +396 -12
  71. package/dist/hnsw-index.js.map +1 -1
  72. package/dist/hnsw-persistence.test.d.ts +13 -0
  73. package/dist/hnsw-persistence.test.d.ts.map +1 -0
  74. package/dist/hnsw-persistence.test.js +208 -0
  75. package/dist/hnsw-persistence.test.js.map +1 -0
  76. package/dist/hybrid-backend.d.ts +28 -0
  77. package/dist/hybrid-backend.d.ts.map +1 -1
  78. package/dist/hybrid-backend.js +82 -4
  79. package/dist/hybrid-backend.js.map +1 -1
  80. package/dist/hybrid-backend.test.js +6 -5
  81. package/dist/hybrid-backend.test.js.map +1 -1
  82. package/dist/index.d.ts +167 -9
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +277 -30
  85. package/dist/index.js.map +1 -1
  86. package/dist/index.test.d.ts +10 -0
  87. package/dist/index.test.d.ts.map +1 -0
  88. package/dist/index.test.js +71 -0
  89. package/dist/index.test.js.map +1 -0
  90. package/dist/json-security.d.ts +12 -0
  91. package/dist/json-security.d.ts.map +1 -0
  92. package/dist/json-security.js +20 -0
  93. package/dist/json-security.js.map +1 -0
  94. package/dist/learning-bridge.d.ts +137 -0
  95. package/dist/learning-bridge.d.ts.map +1 -0
  96. package/dist/learning-bridge.js +335 -0
  97. package/dist/learning-bridge.js.map +1 -0
  98. package/dist/learning-bridge.test.d.ts +8 -0
  99. package/dist/learning-bridge.test.d.ts.map +1 -0
  100. package/dist/learning-bridge.test.js +578 -0
  101. package/dist/learning-bridge.test.js.map +1 -0
  102. package/dist/memory-graph.d.ts +100 -0
  103. package/dist/memory-graph.d.ts.map +1 -0
  104. package/dist/memory-graph.js +333 -0
  105. package/dist/memory-graph.js.map +1 -0
  106. package/dist/memory-graph.test.d.ts +8 -0
  107. package/dist/memory-graph.test.d.ts.map +1 -0
  108. package/dist/memory-graph.test.js +609 -0
  109. package/dist/memory-graph.test.js.map +1 -0
  110. package/dist/persistent-sona.d.ts +144 -0
  111. package/dist/persistent-sona.d.ts.map +1 -0
  112. package/dist/persistent-sona.js +332 -0
  113. package/dist/persistent-sona.js.map +1 -0
  114. package/dist/rvf-backend.d.ts +53 -0
  115. package/dist/rvf-backend.d.ts.map +1 -0
  116. package/dist/rvf-backend.js +643 -0
  117. package/dist/rvf-backend.js.map +1 -0
  118. package/dist/rvf-learning-store.d.ts +139 -0
  119. package/dist/rvf-learning-store.d.ts.map +1 -0
  120. package/dist/rvf-learning-store.js +295 -0
  121. package/dist/rvf-learning-store.js.map +1 -0
  122. package/dist/rvf-migration.d.ts +45 -0
  123. package/dist/rvf-migration.d.ts.map +1 -0
  124. package/dist/rvf-migration.js +254 -0
  125. package/dist/rvf-migration.js.map +1 -0
  126. package/dist/smart-retrieval.d.ts +118 -0
  127. package/dist/smart-retrieval.d.ts.map +1 -0
  128. package/dist/smart-retrieval.js +322 -0
  129. package/dist/smart-retrieval.js.map +1 -0
  130. package/dist/smart-retrieval.test.d.ts +2 -0
  131. package/dist/smart-retrieval.test.d.ts.map +1 -0
  132. package/dist/smart-retrieval.test.js +238 -0
  133. package/dist/smart-retrieval.test.js.map +1 -0
  134. package/dist/sqlite-backend.d.ts +10 -0
  135. package/dist/sqlite-backend.d.ts.map +1 -1
  136. package/dist/sqlite-backend.js +104 -8
  137. package/dist/sqlite-backend.js.map +1 -1
  138. package/dist/sqljs-backend.d.ts +9 -0
  139. package/dist/sqljs-backend.d.ts.map +1 -1
  140. package/dist/sqljs-backend.js +96 -5
  141. package/dist/sqljs-backend.js.map +1 -1
  142. package/dist/types.d.ts +3 -0
  143. package/dist/types.d.ts.map +1 -1
  144. package/package.json +21 -8
  145. package/.agentic-flow/intelligence.json +0 -16
  146. package/__tests__/coverage/base.css +0 -224
  147. package/__tests__/coverage/block-navigation.js +0 -87
  148. package/__tests__/coverage/coverage-final.json +0 -19
  149. package/__tests__/coverage/favicon.png +0 -0
  150. package/__tests__/coverage/index.html +0 -206
  151. package/__tests__/coverage/lcov-report/base.css +0 -224
  152. package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
  153. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  154. package/__tests__/coverage/lcov-report/index.html +0 -206
  155. package/__tests__/coverage/lcov-report/prettify.css +0 -1
  156. package/__tests__/coverage/lcov-report/prettify.js +0 -2
  157. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  158. package/__tests__/coverage/lcov-report/sorter.js +0 -210
  159. package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +0 -2737
  160. package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +0 -3130
  161. package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +0 -601
  162. package/__tests__/coverage/lcov-report/src/application/commands/index.html +0 -131
  163. package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +0 -394
  164. package/__tests__/coverage/lcov-report/src/application/queries/index.html +0 -116
  165. package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +0 -796
  166. package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
  167. package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +0 -793
  168. package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +0 -1633
  169. package/__tests__/coverage/lcov-report/src/database-provider.ts.html +0 -1618
  170. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
  171. package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +0 -952
  172. package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
  173. package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +0 -1294
  174. package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +0 -3124
  175. package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +0 -2167
  176. package/__tests__/coverage/lcov-report/src/index.html +0 -266
  177. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  178. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +0 -116
  179. package/__tests__/coverage/lcov-report/src/migration.ts.html +0 -2092
  180. package/__tests__/coverage/lcov-report/src/query-builder.ts.html +0 -1711
  181. package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +0 -2281
  182. package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +0 -2374
  183. package/__tests__/coverage/lcov-report/src/types.ts.html +0 -2266
  184. package/__tests__/coverage/lcov.info +0 -10238
  185. package/__tests__/coverage/prettify.css +0 -1
  186. package/__tests__/coverage/prettify.js +0 -2
  187. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  188. package/__tests__/coverage/sorter.js +0 -210
  189. package/__tests__/coverage/src/agentdb-adapter.ts.html +0 -2737
  190. package/__tests__/coverage/src/agentdb-backend.ts.html +0 -3130
  191. package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +0 -601
  192. package/__tests__/coverage/src/application/commands/index.html +0 -131
  193. package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +0 -394
  194. package/__tests__/coverage/src/application/queries/index.html +0 -116
  195. package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +0 -796
  196. package/__tests__/coverage/src/application/services/index.html +0 -116
  197. package/__tests__/coverage/src/application/services/memory-application-service.ts.html +0 -793
  198. package/__tests__/coverage/src/cache-manager.ts.html +0 -1633
  199. package/__tests__/coverage/src/database-provider.ts.html +0 -1618
  200. package/__tests__/coverage/src/domain/entities/index.html +0 -116
  201. package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +0 -952
  202. package/__tests__/coverage/src/domain/services/index.html +0 -116
  203. package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +0 -1294
  204. package/__tests__/coverage/src/hnsw-index.ts.html +0 -3124
  205. package/__tests__/coverage/src/hybrid-backend.ts.html +0 -2167
  206. package/__tests__/coverage/src/index.html +0 -266
  207. package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  208. package/__tests__/coverage/src/infrastructure/repositories/index.html +0 -116
  209. package/__tests__/coverage/src/migration.ts.html +0 -2092
  210. package/__tests__/coverage/src/query-builder.ts.html +0 -1711
  211. package/__tests__/coverage/src/sqlite-backend.ts.html +0 -2281
  212. package/__tests__/coverage/src/sqljs-backend.ts.html +0 -2374
  213. package/__tests__/coverage/src/types.ts.html +0 -2266
  214. package/benchmarks/cache-hit-rate.bench.ts +0 -535
  215. package/benchmarks/hnsw-indexing.bench.ts +0 -552
  216. package/benchmarks/memory-write.bench.ts +0 -469
  217. package/benchmarks/vector-search.bench.ts +0 -449
  218. package/docs/AGENTDB-INTEGRATION.md +0 -388
  219. package/docs/CROSS_PLATFORM.md +0 -505
  220. package/docs/WINDOWS_SUPPORT.md +0 -422
  221. package/examples/agentdb-example.ts +0 -345
  222. package/examples/cross-platform-usage.ts +0 -326
  223. package/framework/benchmark.ts +0 -112
  224. package/src/agentdb-adapter.ts +0 -884
  225. package/src/agentdb-backend.test.ts +0 -339
  226. package/src/agentdb-backend.ts +0 -1016
  227. package/src/application/commands/delete-memory.command.ts +0 -172
  228. package/src/application/commands/store-memory.command.ts +0 -103
  229. package/src/application/index.ts +0 -36
  230. package/src/application/queries/search-memory.query.ts +0 -237
  231. package/src/application/services/memory-application-service.ts +0 -236
  232. package/src/cache-manager.ts +0 -516
  233. package/src/database-provider.test.ts +0 -364
  234. package/src/database-provider.ts +0 -511
  235. package/src/domain/entities/memory-entry.ts +0 -289
  236. package/src/domain/index.ts +0 -35
  237. package/src/domain/repositories/memory-repository.interface.ts +0 -120
  238. package/src/domain/services/memory-domain-service.ts +0 -403
  239. package/src/hnsw-index.ts +0 -1013
  240. package/src/hybrid-backend.test.ts +0 -399
  241. package/src/hybrid-backend.ts +0 -694
  242. package/src/index.ts +0 -515
  243. package/src/infrastructure/index.ts +0 -23
  244. package/src/infrastructure/repositories/hybrid-memory-repository.ts +0 -516
  245. package/src/migration.ts +0 -669
  246. package/src/query-builder.ts +0 -542
  247. package/src/sqlite-backend.ts +0 -732
  248. package/src/sqljs-backend.ts +0 -763
  249. package/src/types.ts +0 -727
  250. package/tmp.json +0 -0
  251. package/tsconfig.json +0 -9
  252. package/tsconfig.tsbuildinfo +0 -1
  253. 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[]): Promise<void>;
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":"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"}
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;AAG3C,OAAO,EACL,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAGjB,kBAAkB,EAKnB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IAEnB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IAEnB,qBAAqB;IACrB,YAAY,EAAE,OAAO,CAAC;IAEtB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAElB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IAEjB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IAEd,oCAAoC;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAE3B,wBAAwB;IACxB,gBAAgB,EAAE,MAAM,CAAC;IAEzB,mCAAmC;IACnC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IAExC,iCAAiC;IACjC,kBAAkB,EAAE,OAAO,CAAC;IAE5B,uBAAuB;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiBD;;;;;;;;;GASG;AACH,qBAAa,cAAe,SAAQ,YAAa,YAAW,cAAc;IACxE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,WAAW,CAAkB;IAGrC,OAAO,CAAC,KAAK,CAOX;gBAEU,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IA0BtD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C9C;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqBlD;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAO3E;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA0DhF;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiC1C;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA2CvD;;OAEG;IACG,MAAM,CACV,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC;IA8B1B;;;;;;;;OAQG;IACG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEzF;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmDhD;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC;IA8BtE;;OAEG;IACG,UAAU,CACd,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAC,GACxD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC;IAY3C;;OAEG;IACG,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOhD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzC;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcxD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAoCvC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IA4C/C;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAM/D;;;;;;;;OAQG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,CAAC,GAAE,MAAW,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC;IAkB1B;;;;;;;;;;OAUG;IACG,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAA0C,GAClD,OAAO,CAAC,YAAY,EAAE,CAAC;IA4B1B,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,WAAW;YAqCL,wBAAwB;IAyBtC,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,YAAY;IAkEpB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,gBAAgB;IAmBxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;;;;;;;OAQG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;;;;;;;;OASG;YACW,YAAY;IAwE1B;;;;;OAKG;YACW,UAAU;IA2CxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAwB3B;AAoCD,eAAe,cAAc,CAAC"}