@claude-flow/memory 3.0.0-alpha.1 → 3.0.0-alpha.10

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 (163) hide show
  1. package/README.md +356 -18
  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 +215 -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 +22 -3
  11. package/dist/agentdb-adapter.d.ts.map +1 -1
  12. package/dist/agentdb-adapter.js +135 -8
  13. package/dist/agentdb-adapter.js.map +1 -1
  14. package/dist/auto-memory-bridge.d.ts +226 -0
  15. package/dist/auto-memory-bridge.d.ts.map +1 -0
  16. package/dist/auto-memory-bridge.js +709 -0
  17. package/dist/auto-memory-bridge.js.map +1 -0
  18. package/dist/auto-memory-bridge.test.d.ts +8 -0
  19. package/dist/auto-memory-bridge.test.d.ts.map +1 -0
  20. package/dist/auto-memory-bridge.test.js +754 -0
  21. package/dist/auto-memory-bridge.test.js.map +1 -0
  22. package/dist/benchmark.test.d.ts +2 -0
  23. package/dist/benchmark.test.d.ts.map +1 -0
  24. package/dist/benchmark.test.js +277 -0
  25. package/dist/benchmark.test.js.map +1 -0
  26. package/dist/hybrid-backend.d.ts.map +1 -1
  27. package/dist/hybrid-backend.js +29 -4
  28. package/dist/hybrid-backend.js.map +1 -1
  29. package/dist/index.d.ts +8 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +8 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/learning-bridge.d.ts +137 -0
  34. package/dist/learning-bridge.d.ts.map +1 -0
  35. package/dist/learning-bridge.js +335 -0
  36. package/dist/learning-bridge.js.map +1 -0
  37. package/dist/learning-bridge.test.d.ts +8 -0
  38. package/dist/learning-bridge.test.d.ts.map +1 -0
  39. package/dist/learning-bridge.test.js +578 -0
  40. package/dist/learning-bridge.test.js.map +1 -0
  41. package/dist/memory-graph.d.ts +100 -0
  42. package/dist/memory-graph.d.ts.map +1 -0
  43. package/dist/memory-graph.js +333 -0
  44. package/dist/memory-graph.js.map +1 -0
  45. package/dist/memory-graph.test.d.ts +8 -0
  46. package/dist/memory-graph.test.d.ts.map +1 -0
  47. package/dist/memory-graph.test.js +609 -0
  48. package/dist/memory-graph.test.js.map +1 -0
  49. package/dist/sqlite-backend.js +3 -3
  50. package/dist/sqljs-backend.d.ts.map +1 -1
  51. package/dist/sqljs-backend.js +5 -2
  52. package/dist/sqljs-backend.js.map +1 -1
  53. package/dist/types.d.ts +3 -0
  54. package/dist/types.d.ts.map +1 -1
  55. package/package.json +20 -5
  56. package/.agentic-flow/intelligence.json +0 -16
  57. package/__tests__/coverage/base.css +0 -224
  58. package/__tests__/coverage/block-navigation.js +0 -87
  59. package/__tests__/coverage/coverage-final.json +0 -19
  60. package/__tests__/coverage/favicon.png +0 -0
  61. package/__tests__/coverage/index.html +0 -206
  62. package/__tests__/coverage/lcov-report/base.css +0 -224
  63. package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
  64. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  65. package/__tests__/coverage/lcov-report/index.html +0 -206
  66. package/__tests__/coverage/lcov-report/prettify.css +0 -1
  67. package/__tests__/coverage/lcov-report/prettify.js +0 -2
  68. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  69. package/__tests__/coverage/lcov-report/sorter.js +0 -210
  70. package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +0 -2737
  71. package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +0 -3130
  72. package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +0 -601
  73. package/__tests__/coverage/lcov-report/src/application/commands/index.html +0 -131
  74. package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +0 -394
  75. package/__tests__/coverage/lcov-report/src/application/queries/index.html +0 -116
  76. package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +0 -796
  77. package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
  78. package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +0 -793
  79. package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +0 -1633
  80. package/__tests__/coverage/lcov-report/src/database-provider.ts.html +0 -1618
  81. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
  82. package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +0 -952
  83. package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
  84. package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +0 -1294
  85. package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +0 -3124
  86. package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +0 -2167
  87. package/__tests__/coverage/lcov-report/src/index.html +0 -266
  88. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  89. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +0 -116
  90. package/__tests__/coverage/lcov-report/src/migration.ts.html +0 -2092
  91. package/__tests__/coverage/lcov-report/src/query-builder.ts.html +0 -1711
  92. package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +0 -2281
  93. package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +0 -2374
  94. package/__tests__/coverage/lcov-report/src/types.ts.html +0 -2266
  95. package/__tests__/coverage/lcov.info +0 -10238
  96. package/__tests__/coverage/prettify.css +0 -1
  97. package/__tests__/coverage/prettify.js +0 -2
  98. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  99. package/__tests__/coverage/sorter.js +0 -210
  100. package/__tests__/coverage/src/agentdb-adapter.ts.html +0 -2737
  101. package/__tests__/coverage/src/agentdb-backend.ts.html +0 -3130
  102. package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +0 -601
  103. package/__tests__/coverage/src/application/commands/index.html +0 -131
  104. package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +0 -394
  105. package/__tests__/coverage/src/application/queries/index.html +0 -116
  106. package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +0 -796
  107. package/__tests__/coverage/src/application/services/index.html +0 -116
  108. package/__tests__/coverage/src/application/services/memory-application-service.ts.html +0 -793
  109. package/__tests__/coverage/src/cache-manager.ts.html +0 -1633
  110. package/__tests__/coverage/src/database-provider.ts.html +0 -1618
  111. package/__tests__/coverage/src/domain/entities/index.html +0 -116
  112. package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +0 -952
  113. package/__tests__/coverage/src/domain/services/index.html +0 -116
  114. package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +0 -1294
  115. package/__tests__/coverage/src/hnsw-index.ts.html +0 -3124
  116. package/__tests__/coverage/src/hybrid-backend.ts.html +0 -2167
  117. package/__tests__/coverage/src/index.html +0 -266
  118. package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  119. package/__tests__/coverage/src/infrastructure/repositories/index.html +0 -116
  120. package/__tests__/coverage/src/migration.ts.html +0 -2092
  121. package/__tests__/coverage/src/query-builder.ts.html +0 -1711
  122. package/__tests__/coverage/src/sqlite-backend.ts.html +0 -2281
  123. package/__tests__/coverage/src/sqljs-backend.ts.html +0 -2374
  124. package/__tests__/coverage/src/types.ts.html +0 -2266
  125. package/benchmarks/cache-hit-rate.bench.ts +0 -535
  126. package/benchmarks/hnsw-indexing.bench.ts +0 -552
  127. package/benchmarks/memory-write.bench.ts +0 -469
  128. package/benchmarks/vector-search.bench.ts +0 -449
  129. package/docs/AGENTDB-INTEGRATION.md +0 -388
  130. package/docs/CROSS_PLATFORM.md +0 -505
  131. package/docs/WINDOWS_SUPPORT.md +0 -422
  132. package/examples/agentdb-example.ts +0 -345
  133. package/examples/cross-platform-usage.ts +0 -326
  134. package/framework/benchmark.ts +0 -112
  135. package/src/agentdb-adapter.ts +0 -884
  136. package/src/agentdb-backend.test.ts +0 -339
  137. package/src/agentdb-backend.ts +0 -1016
  138. package/src/application/commands/delete-memory.command.ts +0 -172
  139. package/src/application/commands/store-memory.command.ts +0 -103
  140. package/src/application/index.ts +0 -36
  141. package/src/application/queries/search-memory.query.ts +0 -237
  142. package/src/application/services/memory-application-service.ts +0 -236
  143. package/src/cache-manager.ts +0 -516
  144. package/src/database-provider.test.ts +0 -364
  145. package/src/database-provider.ts +0 -511
  146. package/src/domain/entities/memory-entry.ts +0 -289
  147. package/src/domain/index.ts +0 -35
  148. package/src/domain/repositories/memory-repository.interface.ts +0 -120
  149. package/src/domain/services/memory-domain-service.ts +0 -403
  150. package/src/hnsw-index.ts +0 -1013
  151. package/src/hybrid-backend.test.ts +0 -399
  152. package/src/hybrid-backend.ts +0 -694
  153. package/src/index.ts +0 -515
  154. package/src/infrastructure/index.ts +0 -23
  155. package/src/infrastructure/repositories/hybrid-memory-repository.ts +0 -516
  156. package/src/migration.ts +0 -669
  157. package/src/query-builder.ts +0 -542
  158. package/src/sqlite-backend.ts +0 -732
  159. package/src/sqljs-backend.ts +0 -763
  160. package/src/types.ts +0 -727
  161. package/tsconfig.json +0 -9
  162. package/tsconfig.tsbuildinfo +0 -1
  163. package/verify-cross-platform.ts +0 -170
@@ -1,172 +0,0 @@
1
- /**
2
- * Delete Memory Command - Application Layer (CQRS)
3
- *
4
- * Command for deleting memory entries.
5
- * Supports soft delete and hard delete.
6
- *
7
- * @module v3/memory/application/commands
8
- */
9
-
10
- import { IMemoryRepository } from '../../domain/repositories/memory-repository.interface.js';
11
-
12
- /**
13
- * Delete Memory Command Input
14
- */
15
- export interface DeleteMemoryInput {
16
- id?: string;
17
- namespace?: string;
18
- key?: string;
19
- hardDelete?: boolean;
20
- }
21
-
22
- /**
23
- * Delete Memory Command Result
24
- */
25
- export interface DeleteMemoryResult {
26
- success: boolean;
27
- deleted: boolean;
28
- entryId?: string;
29
- wasHardDelete: boolean;
30
- }
31
-
32
- /**
33
- * Delete Memory Command Handler
34
- */
35
- export class DeleteMemoryCommandHandler {
36
- constructor(private readonly repository: IMemoryRepository) {}
37
-
38
- async execute(input: DeleteMemoryInput): Promise<DeleteMemoryResult> {
39
- let entryId: string | undefined;
40
-
41
- // Find entry by ID or by namespace:key
42
- if (input.id) {
43
- entryId = input.id;
44
- } else if (input.namespace && input.key) {
45
- const entry = await this.repository.findByKey(input.namespace, input.key);
46
- entryId = entry?.id;
47
- }
48
-
49
- if (!entryId) {
50
- return {
51
- success: false,
52
- deleted: false,
53
- wasHardDelete: false,
54
- };
55
- }
56
-
57
- if (input.hardDelete) {
58
- // Hard delete - remove from database
59
- const deleted = await this.repository.delete(entryId);
60
- return {
61
- success: true,
62
- deleted,
63
- entryId,
64
- wasHardDelete: true,
65
- };
66
- } else {
67
- // Soft delete - mark as deleted
68
- const entry = await this.repository.findById(entryId);
69
- if (entry) {
70
- entry.delete();
71
- await this.repository.save(entry);
72
- return {
73
- success: true,
74
- deleted: true,
75
- entryId,
76
- wasHardDelete: false,
77
- };
78
- }
79
- }
80
-
81
- return {
82
- success: false,
83
- deleted: false,
84
- entryId,
85
- wasHardDelete: false,
86
- };
87
- }
88
- }
89
-
90
- /**
91
- * Bulk Delete Command Input
92
- */
93
- export interface BulkDeleteMemoryInput {
94
- ids?: string[];
95
- namespace?: string;
96
- olderThan?: Date;
97
- hardDelete?: boolean;
98
- }
99
-
100
- /**
101
- * Bulk Delete Command Result
102
- */
103
- export interface BulkDeleteMemoryResult {
104
- success: boolean;
105
- deletedCount: number;
106
- failedCount: number;
107
- errors: Array<{ id: string; error: string }>;
108
- }
109
-
110
- /**
111
- * Bulk Delete Memory Command Handler
112
- */
113
- export class BulkDeleteMemoryCommandHandler {
114
- constructor(private readonly repository: IMemoryRepository) {}
115
-
116
- async execute(input: BulkDeleteMemoryInput): Promise<BulkDeleteMemoryResult> {
117
- let idsToDelete: string[] = [];
118
-
119
- if (input.ids) {
120
- idsToDelete = input.ids;
121
- } else if (input.namespace) {
122
- const entries = await this.repository.findByNamespace(input.namespace);
123
- idsToDelete = entries
124
- .filter((e) => !input.olderThan || e.createdAt < input.olderThan)
125
- .map((e) => e.id);
126
- }
127
-
128
- if (idsToDelete.length === 0) {
129
- return {
130
- success: true,
131
- deletedCount: 0,
132
- failedCount: 0,
133
- errors: [],
134
- };
135
- }
136
-
137
- if (input.hardDelete) {
138
- const result = await this.repository.deleteMany(idsToDelete);
139
- return {
140
- success: result.failed === 0,
141
- deletedCount: result.success,
142
- failedCount: result.failed,
143
- errors: result.errors,
144
- };
145
- } else {
146
- // Soft delete
147
- const entries = await this.repository.findByIds(idsToDelete);
148
- let deletedCount = 0;
149
- const errors: Array<{ id: string; error: string }> = [];
150
-
151
- for (const entry of entries) {
152
- try {
153
- entry.delete();
154
- await this.repository.save(entry);
155
- deletedCount++;
156
- } catch (error) {
157
- errors.push({
158
- id: entry.id,
159
- error: error instanceof Error ? error.message : 'Unknown error',
160
- });
161
- }
162
- }
163
-
164
- return {
165
- success: errors.length === 0,
166
- deletedCount,
167
- failedCount: errors.length,
168
- errors,
169
- };
170
- }
171
- }
172
- }
@@ -1,103 +0,0 @@
1
- /**
2
- * Store Memory Command - Application Layer (CQRS)
3
- *
4
- * Command for storing a new memory entry.
5
- * Implements CQRS pattern per ADR-002.
6
- *
7
- * @module v3/memory/application/commands
8
- */
9
-
10
- import { MemoryEntry, MemoryType } from '../../domain/entities/memory-entry.js';
11
- import { IMemoryRepository } from '../../domain/repositories/memory-repository.interface.js';
12
- import { MemoryDomainService } from '../../domain/services/memory-domain-service.js';
13
-
14
- /**
15
- * Store Memory Command Input
16
- */
17
- export interface StoreMemoryInput {
18
- namespace: string;
19
- key: string;
20
- value: unknown;
21
- type?: MemoryType;
22
- vector?: Float32Array;
23
- metadata?: Record<string, unknown>;
24
- ttl?: number;
25
- }
26
-
27
- /**
28
- * Store Memory Command Result
29
- */
30
- export interface StoreMemoryResult {
31
- success: boolean;
32
- entryId: string;
33
- entry: MemoryEntry;
34
- isUpdate: boolean;
35
- }
36
-
37
- /**
38
- * Store Memory Command Handler
39
- *
40
- * Handles the command to store a memory entry.
41
- * Coordinates between domain services and repository.
42
- */
43
- export class StoreMemoryCommandHandler {
44
- constructor(
45
- private readonly repository: IMemoryRepository,
46
- private readonly domainService: MemoryDomainService
47
- ) {}
48
-
49
- /**
50
- * Execute the store memory command
51
- */
52
- async execute(input: StoreMemoryInput): Promise<StoreMemoryResult> {
53
- // Check if entry already exists
54
- const existing = await this.repository.findByKey(input.namespace, input.key);
55
- const isUpdate = existing !== null;
56
-
57
- let entry: MemoryEntry;
58
-
59
- if (existing) {
60
- // Update existing entry
61
- existing.updateValue(input.value);
62
- if (input.vector) {
63
- existing.updateVector(input.vector);
64
- }
65
- if (input.metadata) {
66
- for (const [key, value] of Object.entries(input.metadata)) {
67
- existing.setMetadata(key, value);
68
- }
69
- }
70
- await this.repository.save(existing);
71
- entry = existing;
72
- } else {
73
- // Create new entry
74
- if (input.type) {
75
- entry = MemoryEntry.create({
76
- namespace: input.namespace,
77
- key: input.key,
78
- value: input.value,
79
- type: input.type,
80
- vector: input.vector,
81
- metadata: input.metadata,
82
- ttl: input.ttl,
83
- });
84
- await this.repository.save(entry);
85
- } else {
86
- // Use domain service for type detection
87
- entry = await this.domainService.storeWithTypeDetection(
88
- input.namespace,
89
- input.key,
90
- input.value,
91
- input.vector
92
- );
93
- }
94
- }
95
-
96
- return {
97
- success: true,
98
- entryId: entry.id,
99
- entry,
100
- isUpdate,
101
- };
102
- }
103
- }
@@ -1,36 +0,0 @@
1
- /**
2
- * Memory Application Layer - Public Exports
3
- *
4
- * Exports all application services, commands, and queries.
5
- *
6
- * @module v3/memory/application
7
- */
8
-
9
- // Commands
10
- export {
11
- StoreMemoryCommandHandler,
12
- type StoreMemoryInput,
13
- type StoreMemoryResult,
14
- } from './commands/store-memory.command.js';
15
-
16
- export {
17
- DeleteMemoryCommandHandler,
18
- BulkDeleteMemoryCommandHandler,
19
- type DeleteMemoryInput,
20
- type DeleteMemoryResult,
21
- type BulkDeleteMemoryInput,
22
- type BulkDeleteMemoryResult,
23
- } from './commands/delete-memory.command.js';
24
-
25
- // Queries
26
- export {
27
- SearchMemoryQueryHandler,
28
- GetMemoryByKeyQueryHandler,
29
- type SearchMemoryInput,
30
- type SearchMemoryResult,
31
- type GetMemoryByKeyInput,
32
- type GetMemoryByKeyResult,
33
- } from './queries/search-memory.query.js';
34
-
35
- // Application Service
36
- export { MemoryApplicationService } from './services/memory-application-service.js';
@@ -1,237 +0,0 @@
1
- /**
2
- * Search Memory Query - Application Layer (CQRS)
3
- *
4
- * Query for searching memory entries.
5
- * Supports text search, vector search, and filtering.
6
- *
7
- * @module v3/memory/application/queries
8
- */
9
-
10
- import { MemoryEntry, MemoryType, MemoryStatus } from '../../domain/entities/memory-entry.js';
11
- import {
12
- IMemoryRepository,
13
- VectorSearchResult,
14
- MemoryQueryOptions,
15
- } from '../../domain/repositories/memory-repository.interface.js';
16
-
17
- /**
18
- * Search Memory Query Input
19
- */
20
- export interface SearchMemoryInput {
21
- // Vector search
22
- vector?: Float32Array;
23
- similarityThreshold?: number;
24
-
25
- // Filter options
26
- namespace?: string;
27
- type?: MemoryType;
28
- status?: MemoryStatus;
29
-
30
- // Pagination
31
- limit?: number;
32
- offset?: number;
33
-
34
- // Sorting
35
- orderBy?: 'createdAt' | 'updatedAt' | 'accessCount' | 'lastAccessedAt';
36
- orderDirection?: 'asc' | 'desc';
37
-
38
- // Text search (searches in value and metadata)
39
- textQuery?: string;
40
-
41
- // Access tracking
42
- trackAccess?: boolean;
43
- }
44
-
45
- /**
46
- * Search Memory Query Result
47
- */
48
- export interface SearchMemoryResult {
49
- entries: MemoryEntry[];
50
- total: number;
51
- hasMore: boolean;
52
- searchType: 'vector' | 'filter' | 'text';
53
- similarities?: number[];
54
- }
55
-
56
- /**
57
- * Search Memory Query Handler
58
- */
59
- export class SearchMemoryQueryHandler {
60
- constructor(private readonly repository: IMemoryRepository) {}
61
-
62
- async execute(input: SearchMemoryInput): Promise<SearchMemoryResult> {
63
- const limit = input.limit ?? 10;
64
- const offset = input.offset ?? 0;
65
-
66
- // Vector search takes precedence
67
- if (input.vector) {
68
- return this.executeVectorSearch(input, limit, offset);
69
- }
70
-
71
- // Text search
72
- if (input.textQuery) {
73
- return this.executeTextSearch(input, limit, offset);
74
- }
75
-
76
- // Filter-based search
77
- return this.executeFilterSearch(input, limit, offset);
78
- }
79
-
80
- private async executeVectorSearch(
81
- input: SearchMemoryInput,
82
- limit: number,
83
- offset: number
84
- ): Promise<SearchMemoryResult> {
85
- const results = await this.repository.searchByVector({
86
- vector: input.vector!,
87
- namespace: input.namespace,
88
- limit: limit + offset, // Get extra for pagination
89
- threshold: input.similarityThreshold ?? 0.5,
90
- type: input.type,
91
- });
92
-
93
- // Apply offset
94
- const paginatedResults = results.slice(offset, offset + limit);
95
-
96
- // Track access if requested
97
- if (input.trackAccess) {
98
- await this.trackEntryAccess(paginatedResults.map((r) => r.entry));
99
- }
100
-
101
- return {
102
- entries: paginatedResults.map((r) => r.entry),
103
- total: results.length,
104
- hasMore: results.length > offset + limit,
105
- searchType: 'vector',
106
- similarities: paginatedResults.map((r) => r.similarity),
107
- };
108
- }
109
-
110
- private async executeTextSearch(
111
- input: SearchMemoryInput,
112
- limit: number,
113
- offset: number
114
- ): Promise<SearchMemoryResult> {
115
- // Get all entries matching filters
116
- const options: MemoryQueryOptions = {
117
- namespace: input.namespace,
118
- type: input.type,
119
- status: input.status ?? 'active',
120
- orderBy: input.orderBy ?? 'createdAt',
121
- orderDirection: input.orderDirection ?? 'desc',
122
- };
123
-
124
- const allEntries = await this.repository.findAll(options);
125
-
126
- // Filter by text query
127
- const query = input.textQuery!.toLowerCase();
128
- const matchingEntries = allEntries.filter((entry) => {
129
- const valueStr = JSON.stringify(entry.value).toLowerCase();
130
- const metadataStr = JSON.stringify(entry.metadata).toLowerCase();
131
- return valueStr.includes(query) || metadataStr.includes(query);
132
- });
133
-
134
- // Paginate
135
- const paginatedEntries = matchingEntries.slice(offset, offset + limit);
136
-
137
- // Track access if requested
138
- if (input.trackAccess) {
139
- await this.trackEntryAccess(paginatedEntries);
140
- }
141
-
142
- return {
143
- entries: paginatedEntries,
144
- total: matchingEntries.length,
145
- hasMore: matchingEntries.length > offset + limit,
146
- searchType: 'text',
147
- };
148
- }
149
-
150
- private async executeFilterSearch(
151
- input: SearchMemoryInput,
152
- limit: number,
153
- offset: number
154
- ): Promise<SearchMemoryResult> {
155
- const options: MemoryQueryOptions = {
156
- namespace: input.namespace,
157
- type: input.type,
158
- status: input.status ?? 'active',
159
- limit,
160
- offset,
161
- orderBy: input.orderBy ?? 'createdAt',
162
- orderDirection: input.orderDirection ?? 'desc',
163
- };
164
-
165
- const entries = await this.repository.findAll(options);
166
- const total = await this.repository.count({
167
- namespace: input.namespace,
168
- type: input.type,
169
- status: input.status ?? 'active',
170
- });
171
-
172
- // Track access if requested
173
- if (input.trackAccess) {
174
- await this.trackEntryAccess(entries);
175
- }
176
-
177
- return {
178
- entries,
179
- total,
180
- hasMore: total > offset + limit,
181
- searchType: 'filter',
182
- };
183
- }
184
-
185
- private async trackEntryAccess(entries: MemoryEntry[]): Promise<void> {
186
- for (const entry of entries) {
187
- entry.recordAccess();
188
- await this.repository.save(entry);
189
- }
190
- }
191
- }
192
-
193
- /**
194
- * Get Memory By Key Query Input
195
- */
196
- export interface GetMemoryByKeyInput {
197
- namespace: string;
198
- key: string;
199
- trackAccess?: boolean;
200
- }
201
-
202
- /**
203
- * Get Memory By Key Query Result
204
- */
205
- export interface GetMemoryByKeyResult {
206
- found: boolean;
207
- entry?: MemoryEntry;
208
- }
209
-
210
- /**
211
- * Get Memory By Key Query Handler
212
- */
213
- export class GetMemoryByKeyQueryHandler {
214
- constructor(private readonly repository: IMemoryRepository) {}
215
-
216
- async execute(input: GetMemoryByKeyInput): Promise<GetMemoryByKeyResult> {
217
- const entry = await this.repository.findByKey(input.namespace, input.key);
218
-
219
- if (!entry) {
220
- return { found: false };
221
- }
222
-
223
- if (!entry.isAccessible()) {
224
- return { found: false };
225
- }
226
-
227
- if (input.trackAccess) {
228
- entry.recordAccess();
229
- await this.repository.save(entry);
230
- }
231
-
232
- return {
233
- found: true,
234
- entry,
235
- };
236
- }
237
- }