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

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 (156) 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/index.d.ts +8 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +8 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/learning-bridge.d.ts +137 -0
  31. package/dist/learning-bridge.d.ts.map +1 -0
  32. package/dist/learning-bridge.js +335 -0
  33. package/dist/learning-bridge.js.map +1 -0
  34. package/dist/learning-bridge.test.d.ts +8 -0
  35. package/dist/learning-bridge.test.d.ts.map +1 -0
  36. package/dist/learning-bridge.test.js +578 -0
  37. package/dist/learning-bridge.test.js.map +1 -0
  38. package/dist/memory-graph.d.ts +100 -0
  39. package/dist/memory-graph.d.ts.map +1 -0
  40. package/dist/memory-graph.js +333 -0
  41. package/dist/memory-graph.js.map +1 -0
  42. package/dist/memory-graph.test.d.ts +8 -0
  43. package/dist/memory-graph.test.d.ts.map +1 -0
  44. package/dist/memory-graph.test.js +609 -0
  45. package/dist/memory-graph.test.js.map +1 -0
  46. package/dist/types.d.ts +3 -0
  47. package/dist/types.d.ts.map +1 -1
  48. package/package.json +19 -4
  49. package/.agentic-flow/intelligence.json +0 -16
  50. package/__tests__/coverage/base.css +0 -224
  51. package/__tests__/coverage/block-navigation.js +0 -87
  52. package/__tests__/coverage/coverage-final.json +0 -19
  53. package/__tests__/coverage/favicon.png +0 -0
  54. package/__tests__/coverage/index.html +0 -206
  55. package/__tests__/coverage/lcov-report/base.css +0 -224
  56. package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
  57. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  58. package/__tests__/coverage/lcov-report/index.html +0 -206
  59. package/__tests__/coverage/lcov-report/prettify.css +0 -1
  60. package/__tests__/coverage/lcov-report/prettify.js +0 -2
  61. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  62. package/__tests__/coverage/lcov-report/sorter.js +0 -210
  63. package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +0 -2737
  64. package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +0 -3130
  65. package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +0 -601
  66. package/__tests__/coverage/lcov-report/src/application/commands/index.html +0 -131
  67. package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +0 -394
  68. package/__tests__/coverage/lcov-report/src/application/queries/index.html +0 -116
  69. package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +0 -796
  70. package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
  71. package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +0 -793
  72. package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +0 -1633
  73. package/__tests__/coverage/lcov-report/src/database-provider.ts.html +0 -1618
  74. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
  75. package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +0 -952
  76. package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
  77. package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +0 -1294
  78. package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +0 -3124
  79. package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +0 -2167
  80. package/__tests__/coverage/lcov-report/src/index.html +0 -266
  81. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  82. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +0 -116
  83. package/__tests__/coverage/lcov-report/src/migration.ts.html +0 -2092
  84. package/__tests__/coverage/lcov-report/src/query-builder.ts.html +0 -1711
  85. package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +0 -2281
  86. package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +0 -2374
  87. package/__tests__/coverage/lcov-report/src/types.ts.html +0 -2266
  88. package/__tests__/coverage/lcov.info +0 -10238
  89. package/__tests__/coverage/prettify.css +0 -1
  90. package/__tests__/coverage/prettify.js +0 -2
  91. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  92. package/__tests__/coverage/sorter.js +0 -210
  93. package/__tests__/coverage/src/agentdb-adapter.ts.html +0 -2737
  94. package/__tests__/coverage/src/agentdb-backend.ts.html +0 -3130
  95. package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +0 -601
  96. package/__tests__/coverage/src/application/commands/index.html +0 -131
  97. package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +0 -394
  98. package/__tests__/coverage/src/application/queries/index.html +0 -116
  99. package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +0 -796
  100. package/__tests__/coverage/src/application/services/index.html +0 -116
  101. package/__tests__/coverage/src/application/services/memory-application-service.ts.html +0 -793
  102. package/__tests__/coverage/src/cache-manager.ts.html +0 -1633
  103. package/__tests__/coverage/src/database-provider.ts.html +0 -1618
  104. package/__tests__/coverage/src/domain/entities/index.html +0 -116
  105. package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +0 -952
  106. package/__tests__/coverage/src/domain/services/index.html +0 -116
  107. package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +0 -1294
  108. package/__tests__/coverage/src/hnsw-index.ts.html +0 -3124
  109. package/__tests__/coverage/src/hybrid-backend.ts.html +0 -2167
  110. package/__tests__/coverage/src/index.html +0 -266
  111. package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  112. package/__tests__/coverage/src/infrastructure/repositories/index.html +0 -116
  113. package/__tests__/coverage/src/migration.ts.html +0 -2092
  114. package/__tests__/coverage/src/query-builder.ts.html +0 -1711
  115. package/__tests__/coverage/src/sqlite-backend.ts.html +0 -2281
  116. package/__tests__/coverage/src/sqljs-backend.ts.html +0 -2374
  117. package/__tests__/coverage/src/types.ts.html +0 -2266
  118. package/benchmarks/cache-hit-rate.bench.ts +0 -535
  119. package/benchmarks/hnsw-indexing.bench.ts +0 -552
  120. package/benchmarks/memory-write.bench.ts +0 -469
  121. package/benchmarks/vector-search.bench.ts +0 -449
  122. package/docs/AGENTDB-INTEGRATION.md +0 -388
  123. package/docs/CROSS_PLATFORM.md +0 -505
  124. package/docs/WINDOWS_SUPPORT.md +0 -422
  125. package/examples/agentdb-example.ts +0 -345
  126. package/examples/cross-platform-usage.ts +0 -326
  127. package/framework/benchmark.ts +0 -112
  128. package/src/agentdb-adapter.ts +0 -884
  129. package/src/agentdb-backend.test.ts +0 -339
  130. package/src/agentdb-backend.ts +0 -1016
  131. package/src/application/commands/delete-memory.command.ts +0 -172
  132. package/src/application/commands/store-memory.command.ts +0 -103
  133. package/src/application/index.ts +0 -36
  134. package/src/application/queries/search-memory.query.ts +0 -237
  135. package/src/application/services/memory-application-service.ts +0 -236
  136. package/src/cache-manager.ts +0 -516
  137. package/src/database-provider.test.ts +0 -364
  138. package/src/database-provider.ts +0 -511
  139. package/src/domain/entities/memory-entry.ts +0 -289
  140. package/src/domain/index.ts +0 -35
  141. package/src/domain/repositories/memory-repository.interface.ts +0 -120
  142. package/src/domain/services/memory-domain-service.ts +0 -403
  143. package/src/hnsw-index.ts +0 -1013
  144. package/src/hybrid-backend.test.ts +0 -399
  145. package/src/hybrid-backend.ts +0 -694
  146. package/src/index.ts +0 -515
  147. package/src/infrastructure/index.ts +0 -23
  148. package/src/infrastructure/repositories/hybrid-memory-repository.ts +0 -516
  149. package/src/migration.ts +0 -669
  150. package/src/query-builder.ts +0 -542
  151. package/src/sqlite-backend.ts +0 -732
  152. package/src/sqljs-backend.ts +0 -763
  153. package/src/types.ts +0 -727
  154. package/tsconfig.json +0 -9
  155. package/tsconfig.tsbuildinfo +0 -1
  156. 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
- }