@prmichaelsen/remember-core 0.12.0

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 (198) hide show
  1. package/README.md +100 -0
  2. package/dist/collections/composite-ids.d.ts +47 -0
  3. package/dist/collections/composite-ids.d.ts.map +1 -0
  4. package/dist/collections/composite-ids.js +97 -0
  5. package/dist/collections/composite-ids.js.map +1 -0
  6. package/dist/collections/dot-notation.d.ts +37 -0
  7. package/dist/collections/dot-notation.d.ts.map +1 -0
  8. package/dist/collections/dot-notation.js +100 -0
  9. package/dist/collections/dot-notation.js.map +1 -0
  10. package/dist/collections/index.d.ts +7 -0
  11. package/dist/collections/index.d.ts.map +1 -0
  12. package/dist/collections/index.js +7 -0
  13. package/dist/collections/index.js.map +1 -0
  14. package/dist/collections/tracking-arrays.d.ts +28 -0
  15. package/dist/collections/tracking-arrays.d.ts.map +1 -0
  16. package/dist/collections/tracking-arrays.js +67 -0
  17. package/dist/collections/tracking-arrays.js.map +1 -0
  18. package/dist/config/debug.d.ts +36 -0
  19. package/dist/config/debug.d.ts.map +1 -0
  20. package/dist/config/debug.js +48 -0
  21. package/dist/config/debug.js.map +1 -0
  22. package/dist/config/environment.d.ts +71 -0
  23. package/dist/config/environment.d.ts.map +1 -0
  24. package/dist/config/environment.js +57 -0
  25. package/dist/config/environment.js.map +1 -0
  26. package/dist/config/index.d.ts +9 -0
  27. package/dist/config/index.d.ts.map +1 -0
  28. package/dist/config/index.js +27 -0
  29. package/dist/config/index.js.map +1 -0
  30. package/dist/constants/content-types.d.ts +60 -0
  31. package/dist/constants/content-types.d.ts.map +1 -0
  32. package/dist/constants/content-types.js +450 -0
  33. package/dist/constants/content-types.js.map +1 -0
  34. package/dist/constants/index.d.ts +3 -0
  35. package/dist/constants/index.d.ts.map +1 -0
  36. package/dist/constants/index.js +3 -0
  37. package/dist/constants/index.js.map +1 -0
  38. package/dist/database/firestore/index.d.ts +8 -0
  39. package/dist/database/firestore/index.d.ts.map +1 -0
  40. package/dist/database/firestore/index.js +10 -0
  41. package/dist/database/firestore/index.js.map +1 -0
  42. package/dist/database/firestore/init.d.ts +51 -0
  43. package/dist/database/firestore/init.d.ts.map +1 -0
  44. package/dist/database/firestore/init.js +92 -0
  45. package/dist/database/firestore/init.js.map +1 -0
  46. package/dist/database/firestore/paths.d.ts +54 -0
  47. package/dist/database/firestore/paths.d.ts.map +1 -0
  48. package/dist/database/firestore/paths.js +103 -0
  49. package/dist/database/firestore/paths.js.map +1 -0
  50. package/dist/database/weaviate/client.d.ts +68 -0
  51. package/dist/database/weaviate/client.d.ts.map +1 -0
  52. package/dist/database/weaviate/client.js +157 -0
  53. package/dist/database/weaviate/client.js.map +1 -0
  54. package/dist/database/weaviate/index.d.ts +6 -0
  55. package/dist/database/weaviate/index.d.ts.map +1 -0
  56. package/dist/database/weaviate/index.js +9 -0
  57. package/dist/database/weaviate/index.js.map +1 -0
  58. package/dist/database/weaviate/schema.d.ts +22 -0
  59. package/dist/database/weaviate/schema.d.ts.map +1 -0
  60. package/dist/database/weaviate/schema.js +50 -0
  61. package/dist/database/weaviate/schema.js.map +1 -0
  62. package/dist/database/weaviate/space-schema.d.ts +36 -0
  63. package/dist/database/weaviate/space-schema.d.ts.map +1 -0
  64. package/dist/database/weaviate/space-schema.js +65 -0
  65. package/dist/database/weaviate/space-schema.js.map +1 -0
  66. package/dist/database/weaviate/v2-collections.d.ts +160 -0
  67. package/dist/database/weaviate/v2-collections.d.ts.map +1 -0
  68. package/dist/database/weaviate/v2-collections.js +275 -0
  69. package/dist/database/weaviate/v2-collections.js.map +1 -0
  70. package/dist/errors/app-errors.d.ts +64 -0
  71. package/dist/errors/app-errors.d.ts.map +1 -0
  72. package/dist/errors/app-errors.js +90 -0
  73. package/dist/errors/app-errors.js.map +1 -0
  74. package/dist/errors/base.error.d.ts +15 -0
  75. package/dist/errors/base.error.d.ts.map +1 -0
  76. package/dist/errors/base.error.js +25 -0
  77. package/dist/errors/base.error.js.map +1 -0
  78. package/dist/errors/index.d.ts +19 -0
  79. package/dist/errors/index.d.ts.map +1 -0
  80. package/dist/errors/index.js +25 -0
  81. package/dist/errors/index.js.map +1 -0
  82. package/dist/index.d.ts +8 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +9 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/services/confirmation-token.service.d.ts +56 -0
  87. package/dist/services/confirmation-token.service.d.ts.map +1 -0
  88. package/dist/services/confirmation-token.service.js +118 -0
  89. package/dist/services/confirmation-token.service.js.map +1 -0
  90. package/dist/services/credentials-provider.d.ts +25 -0
  91. package/dist/services/credentials-provider.d.ts.map +1 -0
  92. package/dist/services/credentials-provider.js +31 -0
  93. package/dist/services/credentials-provider.js.map +1 -0
  94. package/dist/services/index.d.ts +11 -0
  95. package/dist/services/index.d.ts.map +1 -0
  96. package/dist/services/index.js +17 -0
  97. package/dist/services/index.js.map +1 -0
  98. package/dist/services/memory.service.d.ts +129 -0
  99. package/dist/services/memory.service.d.ts.map +1 -0
  100. package/dist/services/memory.service.js +294 -0
  101. package/dist/services/memory.service.js.map +1 -0
  102. package/dist/services/preferences.service.d.ts +27 -0
  103. package/dist/services/preferences.service.d.ts.map +1 -0
  104. package/dist/services/preferences.service.js +106 -0
  105. package/dist/services/preferences.service.js.map +1 -0
  106. package/dist/services/relationship.service.d.ts +75 -0
  107. package/dist/services/relationship.service.d.ts.map +1 -0
  108. package/dist/services/relationship.service.js +211 -0
  109. package/dist/services/relationship.service.js.map +1 -0
  110. package/dist/services/space-config.service.d.ts +22 -0
  111. package/dist/services/space-config.service.d.ts.map +1 -0
  112. package/dist/services/space-config.service.js +50 -0
  113. package/dist/services/space-config.service.js.map +1 -0
  114. package/dist/services/space.service.d.ts +160 -0
  115. package/dist/services/space.service.d.ts.map +1 -0
  116. package/dist/services/space.service.js +815 -0
  117. package/dist/services/space.service.js.map +1 -0
  118. package/dist/testing/index.d.ts +8 -0
  119. package/dist/testing/index.d.ts.map +1 -0
  120. package/dist/testing/index.js +8 -0
  121. package/dist/testing/index.js.map +1 -0
  122. package/dist/testing/test-data-generator.d.ts +100 -0
  123. package/dist/testing/test-data-generator.d.ts.map +1 -0
  124. package/dist/testing/test-data-generator.js +194 -0
  125. package/dist/testing/test-data-generator.js.map +1 -0
  126. package/dist/testing/weaviate-mock.d.ts +317 -0
  127. package/dist/testing/weaviate-mock.d.ts.map +1 -0
  128. package/dist/testing/weaviate-mock.js +233 -0
  129. package/dist/testing/weaviate-mock.js.map +1 -0
  130. package/dist/types/auth.types.d.ts +36 -0
  131. package/dist/types/auth.types.d.ts.map +1 -0
  132. package/dist/types/auth.types.js +9 -0
  133. package/dist/types/auth.types.js.map +1 -0
  134. package/dist/types/context.types.d.ts +78 -0
  135. package/dist/types/context.types.d.ts.map +1 -0
  136. package/dist/types/context.types.js +6 -0
  137. package/dist/types/context.types.js.map +1 -0
  138. package/dist/types/index.d.ts +14 -0
  139. package/dist/types/index.d.ts.map +1 -0
  140. package/dist/types/index.js +6 -0
  141. package/dist/types/index.js.map +1 -0
  142. package/dist/types/llm.types.d.ts +8 -0
  143. package/dist/types/llm.types.d.ts.map +1 -0
  144. package/dist/types/llm.types.js +8 -0
  145. package/dist/types/llm.types.js.map +1 -0
  146. package/dist/types/memory.types.d.ts +83 -0
  147. package/dist/types/memory.types.d.ts.map +1 -0
  148. package/dist/types/memory.types.js +6 -0
  149. package/dist/types/memory.types.js.map +1 -0
  150. package/dist/types/preferences.types.d.ts +285 -0
  151. package/dist/types/preferences.types.d.ts.map +1 -0
  152. package/dist/types/preferences.types.js +195 -0
  153. package/dist/types/preferences.types.js.map +1 -0
  154. package/dist/types/result.types.d.ts +60 -0
  155. package/dist/types/result.types.d.ts.map +1 -0
  156. package/dist/types/result.types.js +82 -0
  157. package/dist/types/result.types.js.map +1 -0
  158. package/dist/types/search.types.d.ts +49 -0
  159. package/dist/types/search.types.d.ts.map +1 -0
  160. package/dist/types/search.types.js +6 -0
  161. package/dist/types/search.types.js.map +1 -0
  162. package/dist/types/shared.types.d.ts +91 -0
  163. package/dist/types/shared.types.d.ts.map +1 -0
  164. package/dist/types/shared.types.js +57 -0
  165. package/dist/types/shared.types.js.map +1 -0
  166. package/dist/types/space.types.d.ts +82 -0
  167. package/dist/types/space.types.d.ts.map +1 -0
  168. package/dist/types/space.types.js +18 -0
  169. package/dist/types/space.types.js.map +1 -0
  170. package/dist/types/utils.types.d.ts +51 -0
  171. package/dist/types/utils.types.d.ts.map +1 -0
  172. package/dist/types/utils.types.js +4 -0
  173. package/dist/types/utils.types.js.map +1 -0
  174. package/dist/utils/auth-helpers.d.ts +23 -0
  175. package/dist/utils/auth-helpers.d.ts.map +1 -0
  176. package/dist/utils/auth-helpers.js +31 -0
  177. package/dist/utils/auth-helpers.js.map +1 -0
  178. package/dist/utils/debug.d.ts +45 -0
  179. package/dist/utils/debug.d.ts.map +1 -0
  180. package/dist/utils/debug.js +112 -0
  181. package/dist/utils/debug.js.map +1 -0
  182. package/dist/utils/error-handler.d.ts +46 -0
  183. package/dist/utils/error-handler.d.ts.map +1 -0
  184. package/dist/utils/error-handler.js +63 -0
  185. package/dist/utils/error-handler.js.map +1 -0
  186. package/dist/utils/filters.d.ts +42 -0
  187. package/dist/utils/filters.d.ts.map +1 -0
  188. package/dist/utils/filters.js +132 -0
  189. package/dist/utils/filters.js.map +1 -0
  190. package/dist/utils/index.d.ts +9 -0
  191. package/dist/utils/index.d.ts.map +1 -0
  192. package/dist/utils/index.js +9 -0
  193. package/dist/utils/index.js.map +1 -0
  194. package/dist/utils/logger.d.ts +22 -0
  195. package/dist/utils/logger.d.ts.map +1 -0
  196. package/dist/utils/logger.js +68 -0
  197. package/dist/utils/logger.js.map +1 -0
  198. package/package.json +100 -0
@@ -0,0 +1,294 @@
1
+ /**
2
+ * MemoryService — unified CRUD + search for user memories.
3
+ *
4
+ * Extracted from 6 remember-mcp tool handlers:
5
+ * create-memory.ts, search-memory.ts, find-similar.ts,
6
+ * query-memory.ts, update-memory.ts, delete-memory.ts
7
+ *
8
+ * Design: accepts Weaviate collection + Logger via constructor. No MCP-specific code.
9
+ */
10
+ import { Filters } from 'weaviate-client';
11
+ import { isValidContentType, DEFAULT_CONTENT_TYPE } from '../constants/content-types.js';
12
+ import { fetchMemoryWithAllProperties } from '../database/weaviate/client.js';
13
+ import { buildCombinedSearchFilters, buildMemoryOnlyFilters, buildDeletedFilter, combineFiltersWithAnd, } from '../utils/filters.js';
14
+ // ─── Service ─────────────────────────────────────────────────────────────
15
+ /**
16
+ * MemoryService provides transport-agnostic memory CRUD + search operations.
17
+ *
18
+ * @param collection - A Weaviate collection instance for the user (Memory_users_{userId})
19
+ * @param userId - The owner user ID
20
+ * @param logger - Logger instance
21
+ */
22
+ export class MemoryService {
23
+ collection;
24
+ userId;
25
+ logger;
26
+ constructor(collection, userId, logger) {
27
+ this.collection = collection;
28
+ this.userId = userId;
29
+ this.logger = logger;
30
+ }
31
+ // ── Create ──────────────────────────────────────────────────────────
32
+ async create(input) {
33
+ const now = new Date().toISOString();
34
+ const contentType = input.type && isValidContentType(input.type) ? input.type : DEFAULT_CONTENT_TYPE;
35
+ const properties = {
36
+ user_id: this.userId,
37
+ doc_type: 'memory',
38
+ content: input.content,
39
+ title: input.title,
40
+ summary: input.title,
41
+ content_type: contentType,
42
+ weight: input.weight ?? 0.5,
43
+ trust_score: input.trust ?? 0.25,
44
+ confidence: 1.0,
45
+ context_summary: input.context_summary || 'Memory created',
46
+ context_conversation_id: input.context_conversation_id,
47
+ relationship_ids: [],
48
+ access_count: 0,
49
+ last_accessed_at: now,
50
+ created_at: now,
51
+ updated_at: now,
52
+ version: 1,
53
+ tags: input.tags || [],
54
+ references: input.references || [],
55
+ template_id: input.template_id,
56
+ base_weight: input.weight ?? 0.5,
57
+ computed_weight: input.weight ?? 0.5,
58
+ parent_id: input.parent_id ?? null,
59
+ thread_root_id: input.thread_root_id ?? null,
60
+ moderation_flags: input.moderation_flags ?? [],
61
+ space_ids: [],
62
+ group_ids: [],
63
+ };
64
+ const memoryId = await this.collection.data.insert({ properties });
65
+ this.logger.info('Memory created', { memoryId, userId: this.userId });
66
+ return { memory_id: memoryId, created_at: now };
67
+ }
68
+ // ── Search (hybrid) ─────────────────────────────────────────────────
69
+ async search(input) {
70
+ if (!input.query?.trim())
71
+ throw new Error('Query cannot be empty');
72
+ const includeRelationships = input.include_relationships !== false;
73
+ const alpha = input.alpha ?? 0.7;
74
+ const limit = input.limit ?? 10;
75
+ const offset = input.offset ?? 0;
76
+ const deletedFilter = buildDeletedFilter(this.collection, input.deleted_filter || 'exclude');
77
+ const searchFilters = includeRelationships
78
+ ? buildCombinedSearchFilters(this.collection, input.filters)
79
+ : buildMemoryOnlyFilters(this.collection, input.filters);
80
+ const combinedFilters = combineFiltersWithAnd([deletedFilter, searchFilters].filter((f) => f !== null));
81
+ const searchOptions = { alpha, limit: limit + offset };
82
+ if (combinedFilters)
83
+ searchOptions.filters = combinedFilters;
84
+ const results = await this.collection.query.hybrid(input.query, searchOptions);
85
+ const paginated = results.objects.slice(offset);
86
+ const memories = [];
87
+ const relationships = [];
88
+ for (const obj of paginated) {
89
+ const doc = { id: obj.uuid, ...obj.properties };
90
+ if (doc.doc_type === 'memory')
91
+ memories.push(doc);
92
+ else if (doc.doc_type === 'relationship')
93
+ relationships.push(doc);
94
+ }
95
+ return {
96
+ memories,
97
+ relationships: includeRelationships ? relationships : undefined,
98
+ total: memories.length + relationships.length,
99
+ offset,
100
+ limit,
101
+ };
102
+ }
103
+ // ── Find Similar (vector) ──────────────────────────────────────────
104
+ async findSimilar(input) {
105
+ if (!input.memory_id && !input.text)
106
+ throw new Error('Either memory_id or text must be provided');
107
+ if (input.memory_id && input.text)
108
+ throw new Error('Provide either memory_id or text, not both');
109
+ const limit = input.limit ?? 10;
110
+ const minSimilarity = input.min_similarity ?? 0.7;
111
+ const deletedFilter = buildDeletedFilter(this.collection, input.deleted_filter || 'exclude');
112
+ let results;
113
+ if (input.memory_id) {
114
+ const memory = await this.collection.query.fetchObjectById(input.memory_id, {
115
+ returnProperties: ['user_id', 'doc_type', 'content'],
116
+ });
117
+ if (!memory)
118
+ throw new Error(`Memory not found: ${input.memory_id}`);
119
+ if (memory.properties.user_id !== this.userId)
120
+ throw new Error('Unauthorized');
121
+ if (memory.properties.doc_type !== 'memory')
122
+ throw new Error('Can only find similar for memory documents');
123
+ const opts = { limit: limit + 1, distance: 1 - minSimilarity, returnMetadata: ['distance'] };
124
+ if (deletedFilter)
125
+ opts.filters = deletedFilter;
126
+ results = await this.collection.query.nearObject(input.memory_id, opts);
127
+ results.objects = results.objects.filter((o) => o.uuid !== input.memory_id);
128
+ }
129
+ else {
130
+ const opts = { limit, distance: 1 - minSimilarity, returnMetadata: ['distance'] };
131
+ if (deletedFilter)
132
+ opts.filters = deletedFilter;
133
+ results = await this.collection.query.nearText(input.text, opts);
134
+ }
135
+ if (!input.include_relationships) {
136
+ results.objects = results.objects.filter((o) => o.properties.doc_type === 'memory');
137
+ }
138
+ const items = results.objects
139
+ .map((obj) => ({
140
+ id: obj.uuid,
141
+ ...obj.properties,
142
+ similarity: Math.max(0, Math.min(1, 1 - (obj.metadata?.distance ?? 0))),
143
+ }))
144
+ .sort((a, b) => b.similarity - a.similarity)
145
+ .slice(0, limit);
146
+ return { similar_memories: items, total: items.length };
147
+ }
148
+ // ── Query (semantic / nearText) ────────────────────────────────────
149
+ async query(input) {
150
+ if (!input.query?.trim())
151
+ throw new Error('Query cannot be empty');
152
+ const limit = input.limit ?? 5;
153
+ const minRelevance = input.min_relevance ?? 0.6;
154
+ const deletedFilter = buildDeletedFilter(this.collection, input.deleted_filter || 'exclude');
155
+ const searchFilters = buildCombinedSearchFilters(this.collection, input.filters);
156
+ const combinedFilters = combineFiltersWithAnd([deletedFilter, searchFilters].filter((f) => f !== null));
157
+ const opts = { limit, distance: 1 - minRelevance, returnMetadata: ['distance'] };
158
+ if (combinedFilters)
159
+ opts.filters = combinedFilters;
160
+ const results = await this.collection.query.nearText(input.query, opts);
161
+ const items = results.objects
162
+ .map((obj) => ({
163
+ id: obj.uuid,
164
+ ...obj.properties,
165
+ relevance: Math.max(0, Math.min(1, 1 - (obj.metadata?.distance ?? 0))),
166
+ }))
167
+ .sort((a, b) => b.relevance - a.relevance);
168
+ return { memories: items, total: items.length };
169
+ }
170
+ // ── Update ─────────────────────────────────────────────────────────
171
+ async update(input) {
172
+ const existing = await fetchMemoryWithAllProperties(this.collection, input.memory_id);
173
+ if (!existing?.properties)
174
+ throw new Error(`Memory not found: ${input.memory_id}`);
175
+ if (existing.properties.user_id !== this.userId)
176
+ throw new Error('Unauthorized');
177
+ if (existing.properties.doc_type !== 'memory')
178
+ throw new Error('Cannot update relationships with this method');
179
+ if (existing.properties.deleted_at)
180
+ throw new Error(`Cannot update deleted memory: ${input.memory_id}`);
181
+ const updates = {};
182
+ const updatedFields = [];
183
+ if (input.content !== undefined) {
184
+ updates.content = input.content;
185
+ updatedFields.push('content');
186
+ }
187
+ if (input.title !== undefined) {
188
+ updates.title = input.title;
189
+ updates.summary = input.title;
190
+ updatedFields.push('title');
191
+ }
192
+ if (input.type !== undefined) {
193
+ if (!isValidContentType(input.type))
194
+ throw new Error(`Invalid content type: ${input.type}`);
195
+ updates.content_type = input.type;
196
+ updatedFields.push('content_type');
197
+ }
198
+ if (input.weight !== undefined) {
199
+ if (input.weight < 0 || input.weight > 1)
200
+ throw new Error('Weight must be between 0 and 1');
201
+ updates.weight = input.weight;
202
+ updates.base_weight = input.weight;
203
+ updates.computed_weight = input.weight;
204
+ updatedFields.push('weight');
205
+ }
206
+ if (input.trust !== undefined) {
207
+ if (input.trust < 0 || input.trust > 1)
208
+ throw new Error('Trust must be between 0 and 1');
209
+ updates.trust_score = input.trust;
210
+ updatedFields.push('trust_score');
211
+ }
212
+ if (input.tags !== undefined) {
213
+ updates.tags = input.tags;
214
+ updatedFields.push('tags');
215
+ }
216
+ if (input.references !== undefined) {
217
+ updates.references = input.references;
218
+ updatedFields.push('references');
219
+ }
220
+ if (input.parent_id !== undefined) {
221
+ updates.parent_id = input.parent_id;
222
+ updatedFields.push('parent_id');
223
+ }
224
+ if (input.thread_root_id !== undefined) {
225
+ updates.thread_root_id = input.thread_root_id;
226
+ updatedFields.push('thread_root_id');
227
+ }
228
+ if (input.moderation_flags !== undefined) {
229
+ updates.moderation_flags = input.moderation_flags;
230
+ updatedFields.push('moderation_flags');
231
+ }
232
+ if (updatedFields.length === 0)
233
+ throw new Error('No fields provided for update');
234
+ const now = new Date().toISOString();
235
+ updates.updated_at = now;
236
+ updates.version = existing.properties.version + 1;
237
+ // Use replace() instead of update() (Weaviate bug with non-vectorized fields)
238
+ await this.collection.data.replace({
239
+ id: input.memory_id,
240
+ properties: { ...existing.properties, ...updates },
241
+ });
242
+ this.logger.info('Memory updated', {
243
+ memoryId: input.memory_id,
244
+ version: updates.version,
245
+ updatedFields,
246
+ });
247
+ return {
248
+ memory_id: input.memory_id,
249
+ updated_at: now,
250
+ version: updates.version,
251
+ updated_fields: updatedFields,
252
+ };
253
+ }
254
+ // ── Delete (soft) ──────────────────────────────────────────────────
255
+ async delete(input) {
256
+ const existing = await fetchMemoryWithAllProperties(this.collection, input.memory_id);
257
+ if (!existing?.properties)
258
+ throw new Error(`Memory not found: ${input.memory_id}`);
259
+ if (existing.properties.user_id !== this.userId)
260
+ throw new Error('Unauthorized');
261
+ if (existing.properties.doc_type !== 'memory')
262
+ throw new Error('Cannot delete relationships with this method');
263
+ if (existing.properties.deleted_at)
264
+ throw new Error(`Memory already deleted: ${input.memory_id}`);
265
+ // Find orphaned relationships
266
+ const relResults = await this.collection.query.fetchObjects({
267
+ filters: Filters.and(this.collection.filter.byProperty('doc_type').equal('relationship'), this.collection.filter.byProperty('related_memory_ids').containsAny([input.memory_id])),
268
+ limit: 100,
269
+ });
270
+ const orphanedIds = relResults.objects.map((r) => r.uuid);
271
+ // Soft delete — set deleted_at, deleted_by, deletion_reason
272
+ const now = new Date().toISOString();
273
+ await this.collection.data.replace({
274
+ id: input.memory_id,
275
+ properties: {
276
+ ...existing.properties,
277
+ deleted_at: now,
278
+ deleted_by: this.userId,
279
+ deletion_reason: input.reason || null,
280
+ updated_at: now,
281
+ },
282
+ });
283
+ this.logger.info('Memory soft-deleted', {
284
+ memoryId: input.memory_id,
285
+ orphanedRelationships: orphanedIds.length,
286
+ });
287
+ return {
288
+ memory_id: input.memory_id,
289
+ deleted_at: now,
290
+ orphaned_relationship_ids: orphanedIds,
291
+ };
292
+ }
293
+ }
294
+ //# sourceMappingURL=memory.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.service.js","sourceRoot":"","sources":["../../src/services/memory.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Preferences Database Service.
3
+ *
4
+ * Ported from remember-mcp/src/services/preferences-database.service.ts.
5
+ * Handles Firestore operations for user preferences.
6
+ * Design: uses imported Firestore helpers and path utilities from database modules.
7
+ */
8
+ import type { Logger } from '../utils/logger.js';
9
+ import type { UserPreferences } from '../types/preferences.types.js';
10
+ export declare class PreferencesDatabaseService {
11
+ private logger;
12
+ constructor(logger: Logger);
13
+ /**
14
+ * Get user preferences. Returns defaults if preferences don't exist.
15
+ */
16
+ getPreferences(userId: string): Promise<UserPreferences>;
17
+ /**
18
+ * Update user preferences (partial update with merge).
19
+ * Creates with defaults if preferences don't exist.
20
+ */
21
+ updatePreferences(userId: string, updates: Partial<Omit<UserPreferences, 'user_id' | 'created_at'>>): Promise<UserPreferences>;
22
+ /**
23
+ * Create preferences with defaults.
24
+ */
25
+ createPreferences(userId: string): Promise<UserPreferences>;
26
+ }
27
+ //# sourceMappingURL=preferences.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.service.d.ts","sourceRoot":"","sources":["../../src/services/preferences.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGrE,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2B9D;;;OAGG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC,GAChE,OAAO,CAAC,eAAe,CAAC;IAoC3B;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAwBlE"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Preferences Database Service.
3
+ *
4
+ * Ported from remember-mcp/src/services/preferences-database.service.ts.
5
+ * Handles Firestore operations for user preferences.
6
+ * Design: uses imported Firestore helpers and path utilities from database modules.
7
+ */
8
+ import { getDocument, setDocument } from '../database/firestore/init.js';
9
+ import { getUserPreferencesPath } from '../database/firestore/paths.js';
10
+ import { DEFAULT_PREFERENCES } from '../types/preferences.types.js';
11
+ export class PreferencesDatabaseService {
12
+ logger;
13
+ constructor(logger) {
14
+ this.logger = logger;
15
+ }
16
+ /**
17
+ * Get user preferences. Returns defaults if preferences don't exist.
18
+ */
19
+ async getPreferences(userId) {
20
+ try {
21
+ const pathParts = getUserPreferencesPath(userId).split('/');
22
+ const docId = pathParts.pop();
23
+ const collectionPath = pathParts.join('/');
24
+ const doc = await getDocument(collectionPath, docId);
25
+ if (!doc) {
26
+ const now = new Date().toISOString();
27
+ return {
28
+ user_id: userId,
29
+ ...DEFAULT_PREFERENCES,
30
+ created_at: now,
31
+ updated_at: now,
32
+ };
33
+ }
34
+ return doc;
35
+ }
36
+ catch (error) {
37
+ this.logger.error('Failed to get preferences', {
38
+ error: error instanceof Error ? error.message : String(error),
39
+ });
40
+ throw new Error(`Failed to get preferences: ${error instanceof Error ? error.message : String(error)}`);
41
+ }
42
+ }
43
+ /**
44
+ * Update user preferences (partial update with merge).
45
+ * Creates with defaults if preferences don't exist.
46
+ */
47
+ async updatePreferences(userId, updates) {
48
+ try {
49
+ const pathParts = getUserPreferencesPath(userId).split('/');
50
+ const docId = pathParts.pop();
51
+ const collectionPath = pathParts.join('/');
52
+ const now = new Date().toISOString();
53
+ const doc = await getDocument(collectionPath, docId);
54
+ if (!doc) {
55
+ const newPrefs = {
56
+ user_id: userId,
57
+ ...DEFAULT_PREFERENCES,
58
+ ...updates,
59
+ created_at: now,
60
+ updated_at: now,
61
+ };
62
+ await setDocument(collectionPath, docId, newPrefs);
63
+ this.logger.info('Preferences created with defaults', { userId });
64
+ return newPrefs;
65
+ }
66
+ const updateData = { ...updates, updated_at: now };
67
+ await setDocument(collectionPath, docId, updateData, { merge: true });
68
+ this.logger.info('Preferences updated', { userId });
69
+ const updatedDoc = await getDocument(collectionPath, docId);
70
+ return updatedDoc;
71
+ }
72
+ catch (error) {
73
+ this.logger.error('Failed to update preferences', {
74
+ error: error instanceof Error ? error.message : String(error),
75
+ });
76
+ throw new Error(`Failed to update preferences: ${error instanceof Error ? error.message : String(error)}`);
77
+ }
78
+ }
79
+ /**
80
+ * Create preferences with defaults.
81
+ */
82
+ async createPreferences(userId) {
83
+ try {
84
+ const pathParts = getUserPreferencesPath(userId).split('/');
85
+ const docId = pathParts.pop();
86
+ const collectionPath = pathParts.join('/');
87
+ const now = new Date().toISOString();
88
+ const preferences = {
89
+ user_id: userId,
90
+ ...DEFAULT_PREFERENCES,
91
+ created_at: now,
92
+ updated_at: now,
93
+ };
94
+ await setDocument(collectionPath, docId, preferences);
95
+ this.logger.info('Preferences created', { userId });
96
+ return preferences;
97
+ }
98
+ catch (error) {
99
+ this.logger.error('Failed to create preferences', {
100
+ error: error instanceof Error ? error.message : String(error),
101
+ });
102
+ throw new Error(`Failed to create preferences: ${error instanceof Error ? error.message : String(error)}`);
103
+ }
104
+ }
105
+ }
106
+ //# sourceMappingURL=preferences.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.service.js","sourceRoot":"","sources":["../../src/services/preferences.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * RelationshipService — CRUD + search for memory relationships.
3
+ *
4
+ * Extracted from 4 remember-mcp tool handlers:
5
+ * create-relationship.ts, update-relationship.ts,
6
+ * search-relationship.ts, delete-relationship.ts
7
+ *
8
+ * Relationships are stored with doc_type='relationship' in the same
9
+ * Weaviate collection as memories (Memory_users_{userId}).
10
+ */
11
+ import type { Logger } from '../utils/logger.js';
12
+ import { type DeletedFilter } from '../utils/filters.js';
13
+ export interface CreateRelationshipInput {
14
+ memory_ids: string[];
15
+ relationship_type: string;
16
+ observation: string;
17
+ strength?: number;
18
+ confidence?: number;
19
+ tags?: string[];
20
+ context_summary?: string;
21
+ context_conversation_id?: string;
22
+ }
23
+ export interface CreateRelationshipResult {
24
+ relationship_id: string;
25
+ memory_ids: string[];
26
+ created_at: string;
27
+ }
28
+ export interface UpdateRelationshipInput {
29
+ relationship_id: string;
30
+ relationship_type?: string;
31
+ observation?: string;
32
+ strength?: number;
33
+ confidence?: number;
34
+ tags?: string[];
35
+ }
36
+ export interface UpdateRelationshipResult {
37
+ relationship_id: string;
38
+ updated_at: string;
39
+ version: number;
40
+ updated_fields: string[];
41
+ }
42
+ export interface SearchRelationshipInput {
43
+ query: string;
44
+ relationship_types?: string[];
45
+ strength_min?: number;
46
+ confidence_min?: number;
47
+ tags?: string[];
48
+ limit?: number;
49
+ offset?: number;
50
+ deleted_filter?: DeletedFilter;
51
+ }
52
+ export interface SearchRelationshipResult {
53
+ relationships: Record<string, unknown>[];
54
+ total: number;
55
+ offset: number;
56
+ limit: number;
57
+ }
58
+ export interface DeleteRelationshipInput {
59
+ relationship_id: string;
60
+ }
61
+ export interface DeleteRelationshipResult {
62
+ relationship_id: string;
63
+ memories_updated: number;
64
+ }
65
+ export declare class RelationshipService {
66
+ private collection;
67
+ private userId;
68
+ private logger;
69
+ constructor(collection: any, userId: string, logger: Logger);
70
+ create(input: CreateRelationshipInput): Promise<CreateRelationshipResult>;
71
+ update(input: UpdateRelationshipInput): Promise<UpdateRelationshipResult>;
72
+ search(input: SearchRelationshipInput): Promise<SearchRelationshipResult>;
73
+ delete(input: DeleteRelationshipInput): Promise<DeleteRelationshipResult>;
74
+ }
75
+ //# sourceMappingURL=relationship.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship.service.d.ts","sourceRoot":"","sources":["../../src/services/relationship.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAID,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;gBAFN,UAAU,EAAE,GAAG,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM;IAKlB,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAkEzE,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA0CzE,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA+CzE,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAuChF"}