@cmdoss/memwal-sdk 0.6.2 → 0.8.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 (247) hide show
  1. package/ARCHITECTURE.md +547 -547
  2. package/BENCHMARKS.md +238 -238
  3. package/README.md +310 -181
  4. package/dist/ai-sdk/tools.d.ts +2 -2
  5. package/dist/ai-sdk/tools.js +2 -2
  6. package/dist/client/ClientMemoryManager.js +2 -2
  7. package/dist/client/ClientMemoryManager.js.map +1 -1
  8. package/dist/client/PersonalDataWallet.d.ts.map +1 -1
  9. package/dist/client/SimplePDWClient.d.ts +29 -1
  10. package/dist/client/SimplePDWClient.d.ts.map +1 -1
  11. package/dist/client/SimplePDWClient.js +45 -13
  12. package/dist/client/SimplePDWClient.js.map +1 -1
  13. package/dist/client/namespaces/EmbeddingsNamespace.d.ts +1 -1
  14. package/dist/client/namespaces/EmbeddingsNamespace.js +1 -1
  15. package/dist/client/namespaces/MemoryNamespace.d.ts +31 -0
  16. package/dist/client/namespaces/MemoryNamespace.d.ts.map +1 -1
  17. package/dist/client/namespaces/MemoryNamespace.js +272 -39
  18. package/dist/client/namespaces/MemoryNamespace.js.map +1 -1
  19. package/dist/client/namespaces/consolidated/AINamespace.d.ts +2 -2
  20. package/dist/client/namespaces/consolidated/AINamespace.js +2 -2
  21. package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts +12 -2
  22. package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts.map +1 -1
  23. package/dist/client/namespaces/consolidated/BlockchainNamespace.js +62 -4
  24. package/dist/client/namespaces/consolidated/BlockchainNamespace.js.map +1 -1
  25. package/dist/client/namespaces/consolidated/StorageNamespace.d.ts +67 -2
  26. package/dist/client/namespaces/consolidated/StorageNamespace.d.ts.map +1 -1
  27. package/dist/client/namespaces/consolidated/StorageNamespace.js +549 -16
  28. package/dist/client/namespaces/consolidated/StorageNamespace.js.map +1 -1
  29. package/dist/config/ConfigurationHelper.js +61 -61
  30. package/dist/config/defaults.js +2 -2
  31. package/dist/config/defaults.js.map +1 -1
  32. package/dist/graph/GraphService.js +21 -21
  33. package/dist/graph/GraphService.js.map +1 -1
  34. package/dist/index.d.ts +3 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/infrastructure/seal/EncryptionService.d.ts +9 -5
  39. package/dist/infrastructure/seal/EncryptionService.d.ts.map +1 -1
  40. package/dist/infrastructure/seal/EncryptionService.js +37 -15
  41. package/dist/infrastructure/seal/EncryptionService.js.map +1 -1
  42. package/dist/infrastructure/seal/SealService.d.ts +13 -5
  43. package/dist/infrastructure/seal/SealService.d.ts.map +1 -1
  44. package/dist/infrastructure/seal/SealService.js +36 -34
  45. package/dist/infrastructure/seal/SealService.js.map +1 -1
  46. package/dist/langchain/createPDWRAG.js +30 -30
  47. package/dist/retrieval/MemoryDecryptionPipeline.d.ts.map +1 -1
  48. package/dist/retrieval/MemoryDecryptionPipeline.js +2 -1
  49. package/dist/retrieval/MemoryDecryptionPipeline.js.map +1 -1
  50. package/dist/retrieval/MemoryRetrievalService.d.ts +31 -0
  51. package/dist/retrieval/MemoryRetrievalService.d.ts.map +1 -1
  52. package/dist/retrieval/MemoryRetrievalService.js +44 -4
  53. package/dist/retrieval/MemoryRetrievalService.js.map +1 -1
  54. package/dist/services/CapabilityService.d.ts.map +1 -1
  55. package/dist/services/CapabilityService.js +30 -14
  56. package/dist/services/CapabilityService.js.map +1 -1
  57. package/dist/services/CrossContextPermissionService.d.ts.map +1 -1
  58. package/dist/services/CrossContextPermissionService.js +9 -7
  59. package/dist/services/CrossContextPermissionService.js.map +1 -1
  60. package/dist/services/EmbeddingService.d.ts +28 -1
  61. package/dist/services/EmbeddingService.d.ts.map +1 -1
  62. package/dist/services/EmbeddingService.js +54 -0
  63. package/dist/services/EmbeddingService.js.map +1 -1
  64. package/dist/services/EncryptionService.d.ts.map +1 -1
  65. package/dist/services/EncryptionService.js +6 -5
  66. package/dist/services/EncryptionService.js.map +1 -1
  67. package/dist/services/GeminiAIService.js +309 -309
  68. package/dist/services/IndexManager.d.ts +5 -1
  69. package/dist/services/IndexManager.d.ts.map +1 -1
  70. package/dist/services/IndexManager.js +17 -40
  71. package/dist/services/IndexManager.js.map +1 -1
  72. package/dist/services/QueryService.js +1 -1
  73. package/dist/services/QueryService.js.map +1 -1
  74. package/dist/services/StorageService.d.ts +11 -0
  75. package/dist/services/StorageService.d.ts.map +1 -1
  76. package/dist/services/StorageService.js +73 -10
  77. package/dist/services/StorageService.js.map +1 -1
  78. package/dist/services/TransactionService.d.ts +20 -0
  79. package/dist/services/TransactionService.d.ts.map +1 -1
  80. package/dist/services/TransactionService.js +43 -0
  81. package/dist/services/TransactionService.js.map +1 -1
  82. package/dist/services/ViewService.js +2 -2
  83. package/dist/services/ViewService.js.map +1 -1
  84. package/dist/services/storage/QuiltBatchManager.d.ts +101 -1
  85. package/dist/services/storage/QuiltBatchManager.d.ts.map +1 -1
  86. package/dist/services/storage/QuiltBatchManager.js +410 -20
  87. package/dist/services/storage/QuiltBatchManager.js.map +1 -1
  88. package/dist/services/storage/index.d.ts +1 -1
  89. package/dist/services/storage/index.d.ts.map +1 -1
  90. package/dist/services/storage/index.js.map +1 -1
  91. package/dist/utils/LRUCache.d.ts +106 -0
  92. package/dist/utils/LRUCache.d.ts.map +1 -0
  93. package/dist/utils/LRUCache.js +281 -0
  94. package/dist/utils/LRUCache.js.map +1 -0
  95. package/dist/utils/index.d.ts +1 -0
  96. package/dist/utils/index.d.ts.map +1 -1
  97. package/dist/utils/index.js +2 -0
  98. package/dist/utils/index.js.map +1 -1
  99. package/dist/utils/memoryIndexOnChain.d.ts +212 -0
  100. package/dist/utils/memoryIndexOnChain.d.ts.map +1 -0
  101. package/dist/utils/memoryIndexOnChain.js +312 -0
  102. package/dist/utils/memoryIndexOnChain.js.map +1 -0
  103. package/dist/utils/rebuildIndexNode.d.ts +29 -0
  104. package/dist/utils/rebuildIndexNode.d.ts.map +1 -1
  105. package/dist/utils/rebuildIndexNode.js +366 -98
  106. package/dist/utils/rebuildIndexNode.js.map +1 -1
  107. package/dist/vector/HnswWasmService.d.ts +20 -5
  108. package/dist/vector/HnswWasmService.d.ts.map +1 -1
  109. package/dist/vector/HnswWasmService.js +73 -40
  110. package/dist/vector/HnswWasmService.js.map +1 -1
  111. package/dist/vector/IHnswService.d.ts +10 -1
  112. package/dist/vector/IHnswService.d.ts.map +1 -1
  113. package/dist/vector/IHnswService.js.map +1 -1
  114. package/dist/vector/NodeHnswService.d.ts +16 -0
  115. package/dist/vector/NodeHnswService.d.ts.map +1 -1
  116. package/dist/vector/NodeHnswService.js +84 -5
  117. package/dist/vector/NodeHnswService.js.map +1 -1
  118. package/dist/vector/createHnswService.d.ts +1 -1
  119. package/dist/vector/createHnswService.js +1 -1
  120. package/dist/vector/index.d.ts +1 -1
  121. package/dist/vector/index.js +1 -1
  122. package/package.json +157 -157
  123. package/src/access/PermissionService.ts +635 -635
  124. package/src/aggregation/AggregationService.ts +389 -389
  125. package/src/ai-sdk/PDWVectorStore.ts +715 -715
  126. package/src/ai-sdk/index.ts +65 -65
  127. package/src/ai-sdk/tools.ts +460 -460
  128. package/src/ai-sdk/types.ts +404 -404
  129. package/src/batch/BatchManager.ts +597 -597
  130. package/src/batch/BatchingService.ts +429 -429
  131. package/src/batch/MemoryProcessingCache.ts +492 -492
  132. package/src/batch/index.ts +30 -30
  133. package/src/browser.ts +200 -200
  134. package/src/client/ClientMemoryManager.ts +987 -987
  135. package/src/client/PersonalDataWallet.ts +345 -345
  136. package/src/client/SimplePDWClient.ts +1289 -1222
  137. package/src/client/factory.ts +154 -154
  138. package/src/client/namespaces/AnalyticsNamespace.ts +377 -377
  139. package/src/client/namespaces/BatchNamespace.ts +356 -356
  140. package/src/client/namespaces/CacheNamespace.ts +123 -123
  141. package/src/client/namespaces/CapabilityNamespace.ts +217 -217
  142. package/src/client/namespaces/ClassifyNamespace.ts +169 -169
  143. package/src/client/namespaces/ContextNamespace.ts +297 -297
  144. package/src/client/namespaces/EmbeddingsNamespace.ts +99 -99
  145. package/src/client/namespaces/EncryptionNamespace.ts +221 -221
  146. package/src/client/namespaces/GraphNamespace.ts +468 -468
  147. package/src/client/namespaces/IndexNamespace.ts +361 -361
  148. package/src/client/namespaces/MemoryNamespace.ts +1422 -1135
  149. package/src/client/namespaces/PermissionsNamespace.ts +254 -254
  150. package/src/client/namespaces/PipelineNamespace.ts +220 -220
  151. package/src/client/namespaces/SearchNamespace.ts +1049 -1049
  152. package/src/client/namespaces/StorageNamespace.ts +458 -458
  153. package/src/client/namespaces/TxNamespace.ts +260 -260
  154. package/src/client/namespaces/WalletNamespace.ts +243 -243
  155. package/src/client/namespaces/consolidated/AINamespace.ts +449 -449
  156. package/src/client/namespaces/consolidated/BlockchainNamespace.ts +607 -546
  157. package/src/client/namespaces/consolidated/SecurityNamespace.ts +648 -648
  158. package/src/client/namespaces/consolidated/StorageNamespace.ts +1141 -497
  159. package/src/client/namespaces/consolidated/index.ts +39 -39
  160. package/src/client/signers/KeypairSigner.ts +108 -108
  161. package/src/client/signers/UnifiedSigner.ts +110 -110
  162. package/src/client/signers/WalletAdapterSigner.ts +159 -159
  163. package/src/client/signers/index.ts +26 -26
  164. package/src/config/ConfigurationHelper.ts +412 -412
  165. package/src/config/defaults.ts +51 -51
  166. package/src/config/index.ts +8 -8
  167. package/src/config/validation.ts +70 -70
  168. package/src/core/index.ts +14 -14
  169. package/src/core/interfaces/IService.ts +307 -307
  170. package/src/core/interfaces/index.ts +8 -8
  171. package/src/core/types/capability.ts +297 -297
  172. package/src/core/types/index.ts +870 -870
  173. package/src/core/types/wallet.ts +270 -270
  174. package/src/core/types.ts +9 -9
  175. package/src/core/wallet.ts +222 -222
  176. package/src/embedding/index.ts +19 -19
  177. package/src/embedding/types.ts +357 -357
  178. package/src/errors/index.ts +602 -602
  179. package/src/errors/recovery.ts +461 -461
  180. package/src/errors/validation.ts +567 -567
  181. package/src/generated/pdw/capability.ts +319 -319
  182. package/src/graph/GraphService.ts +887 -887
  183. package/src/graph/KnowledgeGraphManager.ts +728 -728
  184. package/src/graph/index.ts +25 -25
  185. package/src/index.ts +498 -474
  186. package/src/infrastructure/index.ts +22 -22
  187. package/src/infrastructure/seal/EncryptionService.ts +628 -603
  188. package/src/infrastructure/seal/SealService.ts +613 -615
  189. package/src/infrastructure/seal/index.ts +9 -9
  190. package/src/infrastructure/sui/BlockchainManager.ts +627 -627
  191. package/src/infrastructure/sui/SuiService.ts +888 -888
  192. package/src/infrastructure/sui/index.ts +9 -9
  193. package/src/infrastructure/walrus/StorageManager.ts +604 -604
  194. package/src/infrastructure/walrus/WalrusStorageService.ts +612 -612
  195. package/src/infrastructure/walrus/index.ts +9 -9
  196. package/src/langchain/PDWEmbeddings.ts +145 -145
  197. package/src/langchain/PDWVectorStore.ts +456 -456
  198. package/src/langchain/createPDWRAG.ts +303 -303
  199. package/src/langchain/index.ts +47 -47
  200. package/src/permissions/ConsentRepository.browser.ts +249 -249
  201. package/src/permissions/ConsentRepository.ts +364 -364
  202. package/src/pipeline/MemoryPipeline.ts +862 -862
  203. package/src/pipeline/PipelineManager.ts +683 -683
  204. package/src/pipeline/index.ts +26 -26
  205. package/src/retrieval/AdvancedSearchService.ts +629 -629
  206. package/src/retrieval/MemoryAnalyticsService.ts +711 -711
  207. package/src/retrieval/MemoryDecryptionPipeline.ts +825 -824
  208. package/src/retrieval/MemoryRetrievalService.ts +904 -830
  209. package/src/retrieval/index.ts +42 -42
  210. package/src/services/BatchService.ts +352 -352
  211. package/src/services/CapabilityService.ts +464 -448
  212. package/src/services/ClassifierService.ts +465 -465
  213. package/src/services/CrossContextPermissionService.ts +486 -484
  214. package/src/services/EmbeddingService.ts +771 -706
  215. package/src/services/EncryptionService.ts +712 -711
  216. package/src/services/GeminiAIService.ts +753 -753
  217. package/src/services/IndexManager.ts +977 -1004
  218. package/src/services/MemoryIndexService.ts +1003 -1003
  219. package/src/services/MemoryService.ts +369 -369
  220. package/src/services/QueryService.ts +890 -890
  221. package/src/services/StorageService.ts +1182 -1111
  222. package/src/services/TransactionService.ts +838 -790
  223. package/src/services/VectorService.ts +462 -462
  224. package/src/services/ViewService.ts +484 -484
  225. package/src/services/index.ts +25 -25
  226. package/src/services/storage/BlobAttributesManager.ts +333 -333
  227. package/src/services/storage/KnowledgeGraphManager.ts +425 -425
  228. package/src/services/storage/MemorySearchManager.ts +387 -387
  229. package/src/services/storage/QuiltBatchManager.ts +1130 -660
  230. package/src/services/storage/WalrusMetadataManager.ts +268 -268
  231. package/src/services/storage/WalrusStorageManager.ts +287 -287
  232. package/src/services/storage/index.ts +57 -52
  233. package/src/types/index.ts +13 -13
  234. package/src/utils/LRUCache.ts +378 -0
  235. package/src/utils/index.ts +76 -68
  236. package/src/utils/memoryIndexOnChain.ts +507 -0
  237. package/src/utils/rebuildIndex.ts +290 -290
  238. package/src/utils/rebuildIndexNode.ts +771 -424
  239. package/src/vector/BrowserHnswIndexService.ts +758 -758
  240. package/src/vector/HnswWasmService.ts +731 -679
  241. package/src/vector/IHnswService.ts +233 -224
  242. package/src/vector/NodeHnswService.ts +833 -735
  243. package/src/vector/VectorManager.ts +478 -478
  244. package/src/vector/createHnswService.ts +135 -135
  245. package/src/vector/index.ts +56 -56
  246. package/src/wallet/ContextWalletService.ts +656 -656
  247. package/src/wallet/MainWalletService.ts +317 -317
@@ -1,449 +1,449 @@
1
- /**
2
- * AI Namespace - Consolidated AI Features
3
- *
4
- * Merges functionality from:
5
- * - EmbeddingsNamespace: Vector embedding generation
6
- * - ClassifyNamespace: Content classification & analysis
7
- *
8
- * Provides a unified interface for all AI-powered operations.
9
- *
10
- * @module client/namespaces/consolidated
11
- */
12
-
13
- import type { ServiceContainer } from '../../SimplePDWClient';
14
-
15
- // ============================================================================
16
- // Types
17
- // ============================================================================
18
-
19
- /**
20
- * Pattern analysis result
21
- */
22
- export interface PatternAnalysis {
23
- patterns: Array<{
24
- type: string;
25
- confidence: number;
26
- examples: string[];
27
- }>;
28
- categories: string[];
29
- suggestedCategory: string;
30
- }
31
-
32
- /**
33
- * Classification result with full details
34
- */
35
- export interface ClassificationResult {
36
- shouldSave: boolean;
37
- confidence: number;
38
- category: string;
39
- reasoning: string;
40
- }
41
-
42
- /**
43
- * Embedding options
44
- */
45
- export interface EmbedOptions {
46
- type?: 'query' | 'document';
47
- }
48
-
49
- // ============================================================================
50
- // AI Namespace
51
- // ============================================================================
52
-
53
- /**
54
- * AI Namespace - Unified AI Operations
55
- *
56
- * Consolidates embeddings and classification into one namespace.
57
- *
58
- * @example
59
- * ```typescript
60
- * // Generate embeddings
61
- * const vector = await pdw.ai.embed('Hello world');
62
- *
63
- * // Classify content
64
- * const category = await pdw.ai.classify('I love TypeScript');
65
- * ```
66
- */
67
- export class AINamespace {
68
- constructor(private services: ServiceContainer) {}
69
-
70
- // ==========================================================================
71
- // Embedding Operations (from EmbeddingsNamespace)
72
- // ==========================================================================
73
-
74
- /**
75
- * Generate embedding for single text
76
- *
77
- * @param text - Text to embed
78
- * @param options - Embedding options
79
- * @returns Embedding vector (768 dimensions for Gemini)
80
- *
81
- * @example
82
- * ```typescript
83
- * const vector = await pdw.ai.embed('My favorite color is blue');
84
- * console.log(vector.length); // 768
85
- * ```
86
- */
87
- async embed(text: string, options?: EmbedOptions): Promise<number[]> {
88
- if (!this.services.embedding) {
89
- throw new Error('Embedding service not configured. Please provide geminiApiKey.');
90
- }
91
- const result = await this.services.embedding.embedText({ text });
92
- return result.vector;
93
- }
94
-
95
- /**
96
- * Generate embeddings for multiple texts (batch)
97
- *
98
- * @param texts - Array of texts
99
- * @returns Array of embedding vectors
100
- *
101
- * @example
102
- * ```typescript
103
- * const vectors = await pdw.ai.embedBatch(['Hello', 'World', 'TypeScript']);
104
- * console.log(vectors.length); // 3
105
- * ```
106
- */
107
- async embedBatch(texts: string[]): Promise<number[][]> {
108
- if (!this.services.embedding) {
109
- throw new Error('Embedding service not configured.');
110
- }
111
- const result = await this.services.embedding.embedBatch(texts);
112
- return result.vectors;
113
- }
114
-
115
- /**
116
- * Calculate cosine similarity between two vectors
117
- *
118
- * @param vector1 - First vector
119
- * @param vector2 - Second vector
120
- * @returns Similarity score (0-1, higher is more similar)
121
- *
122
- * @example
123
- * ```typescript
124
- * const v1 = await pdw.ai.embed('cat');
125
- * const v2 = await pdw.ai.embed('dog');
126
- * const similarity = pdw.ai.similarity(v1, v2);
127
- * console.log(similarity); // ~0.85 (similar concepts)
128
- * ```
129
- */
130
- similarity(vector1: number[], vector2: number[]): number {
131
- if (!this.services.embedding) {
132
- throw new Error('Embedding service not configured.');
133
- }
134
- return this.services.embedding.calculateCosineSimilarity(vector1, vector2);
135
- }
136
-
137
- /**
138
- * Find most similar vectors from candidates
139
- *
140
- * @param queryVector - Query vector
141
- * @param candidateVectors - Candidate vectors to compare
142
- * @param k - Number of results (default: 5)
143
- * @returns Top k similar vectors with scores
144
- *
145
- * @example
146
- * ```typescript
147
- * const query = await pdw.ai.embed('programming');
148
- * const candidates = await pdw.ai.embedBatch(['TypeScript', 'cooking', 'Java']);
149
- * const similar = pdw.ai.findSimilar(query, candidates, 2);
150
- * // Returns indices 0 (TypeScript) and 2 (Java) as most similar
151
- * ```
152
- */
153
- findSimilar(
154
- queryVector: number[],
155
- candidateVectors: number[][],
156
- k: number = 5
157
- ): Array<{ index: number; score: number }> {
158
- if (!this.services.embedding) {
159
- throw new Error('Embedding service not configured.');
160
- }
161
- const results = this.services.embedding.findMostSimilar(queryVector, candidateVectors, k);
162
- return results.map(r => ({
163
- index: r.index,
164
- score: r.similarity
165
- }));
166
- }
167
-
168
- // ==========================================================================
169
- // Classification Operations (from ClassifyNamespace)
170
- // ==========================================================================
171
-
172
- /**
173
- * Classify content into category
174
- *
175
- * Uses AI to determine the most appropriate category.
176
- *
177
- * @param content - Text content to classify
178
- * @returns Category name (fact, preference, todo, note, general, etc.)
179
- *
180
- * @example
181
- * ```typescript
182
- * const category = await pdw.ai.classify('I prefer dark mode');
183
- * // Returns: 'preference'
184
- * ```
185
- */
186
- async classify(content: string): Promise<string> {
187
- if (!this.services.classifier) {
188
- throw new Error('Classifier service not configured. Please provide geminiApiKey.');
189
- }
190
- return await this.services.classifier.classifyContent(content);
191
- }
192
-
193
- /**
194
- * Determine if content should be saved as a memory
195
- *
196
- * Uses AI and pattern matching to decide if content is worth saving.
197
- * By default, only explicit commands like "remember that" trigger saves.
198
- *
199
- * @param content - Text content to analyze
200
- * @param options - Options for classification
201
- * @param options.explicitOnly - If true (default), only explicit memory commands trigger save
202
- * @returns true if should save, false otherwise
203
- *
204
- * @example
205
- * ```typescript
206
- * // Default: only explicit commands
207
- * const shouldSave = await pdw.ai.shouldSave('Remember that I love TypeScript');
208
- * // Returns: true
209
- *
210
- * // With explicitOnly=false, pattern matching is more aggressive
211
- * const shouldSave2 = await pdw.ai.shouldSave('I love TypeScript', { explicitOnly: false });
212
- * // Returns: true (matches "I love..." pattern)
213
- * ```
214
- */
215
- async shouldSave(content: string, options?: { explicitOnly?: boolean }): Promise<boolean> {
216
- if (!this.services.classifier) {
217
- throw new Error('Classifier service not configured. Please provide geminiApiKey.');
218
- }
219
- const result = await this.services.classifier.shouldSaveMemory(content, {
220
- explicitOnly: options?.explicitOnly ?? true // Default to explicit-only
221
- });
222
- return result.shouldSave;
223
- }
224
-
225
- /**
226
- * Extract memory content from explicit command
227
- *
228
- * Parses commands like "remember that X" and extracts X.
229
- *
230
- * @param message - User message to parse
231
- * @returns Extracted content or null if no command found
232
- *
233
- * @example
234
- * ```typescript
235
- * const content = pdw.ai.extractMemoryContent('Remember that my name is John');
236
- * // Returns: 'my name is John'
237
- *
238
- * const content2 = pdw.ai.extractMemoryContent('Hello there');
239
- * // Returns: null
240
- * ```
241
- */
242
- extractMemoryContent(message: string): string | null {
243
- const patterns = [
244
- /remember that\s+(.+)/i,
245
- /remember:?\s+(.+)/i,
246
- /don't forget that\s+(.+)/i,
247
- /don't forget:?\s+(.+)/i,
248
- /please remember\s+(.+)/i,
249
- /store (?:this )?(?:in|to) memory:?\s*(.+)/i,
250
- /save (?:this )?(?:in|to) memory:?\s*(.+)/i,
251
- /add (?:this )?to (?:my )?memory:?\s*(.+)/i,
252
- /keep in mind:?\s+(.+)/i,
253
- /note that\s+(.+)/i,
254
- ];
255
-
256
- for (const pattern of patterns) {
257
- const match = message.match(pattern);
258
- if (match && match[1]) {
259
- return match[1].trim();
260
- }
261
- }
262
- return null;
263
- }
264
-
265
- /**
266
- * Extract multiple memories from a single message
267
- *
268
- * Splits a message containing multiple facts/memories into individual items.
269
- * Supports comma-separated, semicolon-separated, "and"-separated, and numbered lists.
270
- *
271
- * @param message - User message potentially containing multiple memories
272
- * @returns Array of extracted memory contents, or empty array if no pattern matched
273
- *
274
- * @example
275
- * ```typescript
276
- * // Comma-separated
277
- * pdw.ai.extractMultipleMemories('Remember that my name is John, I work at Google, and my birthday is Dec 25');
278
- * // Returns: ['my name is John', 'I work at Google', 'my birthday is Dec 25']
279
- *
280
- * // Semicolon-separated
281
- * pdw.ai.extractMultipleMemories('Note that: API key is abc123; server port is 3000; database is PostgreSQL');
282
- * // Returns: ['API key is abc123', 'server port is 3000', 'database is PostgreSQL']
283
- *
284
- * // Numbered list
285
- * pdw.ai.extractMultipleMemories('Remember: 1. My email is test@example 2. My phone is 123-456 3. I prefer dark mode');
286
- * // Returns: ['My email is test@example', 'My phone is 123-456', 'I prefer dark mode']
287
- *
288
- * // Single memory (fallback to extractMemoryContent)
289
- * pdw.ai.extractMultipleMemories('Remember that I like pizza');
290
- * // Returns: ['I like pizza']
291
- * ```
292
- */
293
- extractMultipleMemories(message: string): string[] {
294
- // First, extract the content after the memory keyword
295
- const content = this.extractMemoryContent(message);
296
- if (!content) {
297
- return [];
298
- }
299
-
300
- // Try numbered list pattern: "1. xxx 2. yyy 3. zzz"
301
- const numberedPattern = /\d+\.\s*([^0-9]+?)(?=\d+\.|$)/g;
302
- const numberedMatches = [...content.matchAll(numberedPattern)];
303
- if (numberedMatches.length > 1) {
304
- return numberedMatches
305
- .map(m => m[1].trim())
306
- .filter(s => s.length > 0);
307
- }
308
-
309
- // Try bullet list pattern: "- xxx - yyy" or "• xxx • yyy"
310
- const bulletPattern = /[-•]\s*([^-•]+)/g;
311
- const bulletMatches = [...content.matchAll(bulletPattern)];
312
- if (bulletMatches.length > 1) {
313
- return bulletMatches
314
- .map(m => m[1].trim())
315
- .filter(s => s.length > 0);
316
- }
317
-
318
- // Try semicolon-separated
319
- if (content.includes(';')) {
320
- const parts = content.split(';')
321
- .map(s => s.trim())
322
- .filter(s => s.length > 0);
323
- if (parts.length > 1) {
324
- return parts;
325
- }
326
- }
327
-
328
- // Try comma + "and" pattern: "xxx, yyy, and zzz" or "xxx, yyy and zzz"
329
- // Also handles simple comma-separated: "xxx, yyy, zzz"
330
- const commaAndPattern = /,\s*(?:and\s+)?|\s+and\s+/i;
331
- if (commaAndPattern.test(content)) {
332
- const parts = content.split(commaAndPattern)
333
- .map(s => s.trim())
334
- .filter(s => s.length > 0);
335
- if (parts.length > 1) {
336
- return parts;
337
- }
338
- }
339
-
340
- // Single memory - return as array with one item
341
- return [content];
342
- }
343
-
344
- /**
345
- * Check if message is a memory query (asking about stored memories)
346
- *
347
- * @param message - User message to check
348
- * @returns true if user is asking about their memories
349
- *
350
- * @example
351
- * ```typescript
352
- * pdw.ai.isMemoryQuery('What do you remember about me?'); // true
353
- * pdw.ai.isMemoryQuery('What is my name?'); // true
354
- * pdw.ai.isMemoryQuery('Hello'); // false
355
- * ```
356
- */
357
- isMemoryQuery(message: string): boolean {
358
- const queryPatterns = [
359
- /what do you (remember|know) about me/i,
360
- /what('s| is) my (name|email|birthday|job|work|address)/i,
361
- /do you (remember|know) my/i,
362
- /tell me what you (remember|know)/i,
363
- /what have i told you/i,
364
- /what memories do you have/i,
365
- ];
366
- return queryPatterns.some(pattern => pattern.test(message));
367
- }
368
-
369
- /**
370
- * Get full classification result with details
371
- *
372
- * @param content - Text content to classify
373
- * @returns Full classification result with confidence and reasoning
374
- *
375
- * @example
376
- * ```typescript
377
- * const result = await pdw.ai.classifyFull('My birthday is January 15');
378
- * // Returns: { shouldSave: true, confidence: 0.95, category: 'personal_info', reasoning: '...' }
379
- * ```
380
- */
381
- async classifyFull(content: string): Promise<ClassificationResult> {
382
- if (!this.services.classifier) {
383
- throw new Error('Classifier service not configured. Please provide geminiApiKey.');
384
- }
385
- return await this.services.classifier.shouldSaveMemory(content);
386
- }
387
-
388
- /**
389
- * Analyze patterns in content
390
- *
391
- * Detects patterns like personal info, contact details, preferences, etc.
392
- *
393
- * @param content - Text content to analyze
394
- * @returns Pattern analysis with detected patterns and suggested category
395
- *
396
- * @example
397
- * ```typescript
398
- * const analysis = await pdw.ai.patterns('My email is user@example.com');
399
- * // Returns: { patterns: [{ type: 'contact', ... }], suggestedCategory: 'contact' }
400
- * ```
401
- */
402
- async patterns(content: string): Promise<PatternAnalysis> {
403
- if (!this.services.classifier) {
404
- throw new Error('Classifier service not configured. Please provide geminiApiKey.');
405
- }
406
- const result = await this.services.classifier.analyzePatterns(content);
407
- return {
408
- patterns: result.patterns.map((p: string) => ({
409
- type: p,
410
- confidence: 1.0,
411
- examples: []
412
- })),
413
- categories: result.categories || [],
414
- suggestedCategory: result.categories[0] || 'general'
415
- };
416
- }
417
-
418
- /**
419
- * Calculate importance score for content
420
- *
421
- * Uses AI to determine how important the content is (1-10 scale).
422
- *
423
- * @param content - Text content to score
424
- * @returns Importance score (1-10)
425
- *
426
- * @example
427
- * ```typescript
428
- * const importance = await pdw.ai.importance('Emergency contact: 911');
429
- * // Returns: 10
430
- * ```
431
- */
432
- async importance(content: string): Promise<number> {
433
- if (!this.services.classifier) {
434
- throw new Error('Classifier service not configured. Please provide geminiApiKey.');
435
- }
436
- const category = await this.services.classifier.classifyContent(content);
437
- const categoryImportance: Record<string, number> = {
438
- 'emergency': 10,
439
- 'contact': 9,
440
- 'personal_info': 8,
441
- 'career': 7,
442
- 'preference': 6,
443
- 'fact': 5,
444
- 'note': 4,
445
- 'general': 3
446
- };
447
- return categoryImportance[category] || 5;
448
- }
449
- }
1
+ /**
2
+ * AI Namespace - Consolidated AI Features
3
+ *
4
+ * Merges functionality from:
5
+ * - EmbeddingsNamespace: Vector embedding generation
6
+ * - ClassifyNamespace: Content classification & analysis
7
+ *
8
+ * Provides a unified interface for all AI-powered operations.
9
+ *
10
+ * @module client/namespaces/consolidated
11
+ */
12
+
13
+ import type { ServiceContainer } from '../../SimplePDWClient';
14
+
15
+ // ============================================================================
16
+ // Types
17
+ // ============================================================================
18
+
19
+ /**
20
+ * Pattern analysis result
21
+ */
22
+ export interface PatternAnalysis {
23
+ patterns: Array<{
24
+ type: string;
25
+ confidence: number;
26
+ examples: string[];
27
+ }>;
28
+ categories: string[];
29
+ suggestedCategory: string;
30
+ }
31
+
32
+ /**
33
+ * Classification result with full details
34
+ */
35
+ export interface ClassificationResult {
36
+ shouldSave: boolean;
37
+ confidence: number;
38
+ category: string;
39
+ reasoning: string;
40
+ }
41
+
42
+ /**
43
+ * Embedding options
44
+ */
45
+ export interface EmbedOptions {
46
+ type?: 'query' | 'document';
47
+ }
48
+
49
+ // ============================================================================
50
+ // AI Namespace
51
+ // ============================================================================
52
+
53
+ /**
54
+ * AI Namespace - Unified AI Operations
55
+ *
56
+ * Consolidates embeddings and classification into one namespace.
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * // Generate embeddings
61
+ * const vector = await pdw.ai.embed('Hello world');
62
+ *
63
+ * // Classify content
64
+ * const category = await pdw.ai.classify('I love TypeScript');
65
+ * ```
66
+ */
67
+ export class AINamespace {
68
+ constructor(private services: ServiceContainer) {}
69
+
70
+ // ==========================================================================
71
+ // Embedding Operations (from EmbeddingsNamespace)
72
+ // ==========================================================================
73
+
74
+ /**
75
+ * Generate embedding for single text
76
+ *
77
+ * @param text - Text to embed
78
+ * @param options - Embedding options
79
+ * @returns Embedding vector (3072 dimensions for Gemini)
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const vector = await pdw.ai.embed('My favorite color is blue');
84
+ * console.log(vector.length); // 3072
85
+ * ```
86
+ */
87
+ async embed(text: string, options?: EmbedOptions): Promise<number[]> {
88
+ if (!this.services.embedding) {
89
+ throw new Error('Embedding service not configured. Please provide geminiApiKey.');
90
+ }
91
+ const result = await this.services.embedding.embedText({ text });
92
+ return result.vector;
93
+ }
94
+
95
+ /**
96
+ * Generate embeddings for multiple texts (batch)
97
+ *
98
+ * @param texts - Array of texts
99
+ * @returns Array of embedding vectors
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const vectors = await pdw.ai.embedBatch(['Hello', 'World', 'TypeScript']);
104
+ * console.log(vectors.length); // 3
105
+ * ```
106
+ */
107
+ async embedBatch(texts: string[]): Promise<number[][]> {
108
+ if (!this.services.embedding) {
109
+ throw new Error('Embedding service not configured.');
110
+ }
111
+ const result = await this.services.embedding.embedBatch(texts);
112
+ return result.vectors;
113
+ }
114
+
115
+ /**
116
+ * Calculate cosine similarity between two vectors
117
+ *
118
+ * @param vector1 - First vector
119
+ * @param vector2 - Second vector
120
+ * @returns Similarity score (0-1, higher is more similar)
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const v1 = await pdw.ai.embed('cat');
125
+ * const v2 = await pdw.ai.embed('dog');
126
+ * const similarity = pdw.ai.similarity(v1, v2);
127
+ * console.log(similarity); // ~0.85 (similar concepts)
128
+ * ```
129
+ */
130
+ similarity(vector1: number[], vector2: number[]): number {
131
+ if (!this.services.embedding) {
132
+ throw new Error('Embedding service not configured.');
133
+ }
134
+ return this.services.embedding.calculateCosineSimilarity(vector1, vector2);
135
+ }
136
+
137
+ /**
138
+ * Find most similar vectors from candidates
139
+ *
140
+ * @param queryVector - Query vector
141
+ * @param candidateVectors - Candidate vectors to compare
142
+ * @param k - Number of results (default: 5)
143
+ * @returns Top k similar vectors with scores
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * const query = await pdw.ai.embed('programming');
148
+ * const candidates = await pdw.ai.embedBatch(['TypeScript', 'cooking', 'Java']);
149
+ * const similar = pdw.ai.findSimilar(query, candidates, 2);
150
+ * // Returns indices 0 (TypeScript) and 2 (Java) as most similar
151
+ * ```
152
+ */
153
+ findSimilar(
154
+ queryVector: number[],
155
+ candidateVectors: number[][],
156
+ k: number = 5
157
+ ): Array<{ index: number; score: number }> {
158
+ if (!this.services.embedding) {
159
+ throw new Error('Embedding service not configured.');
160
+ }
161
+ const results = this.services.embedding.findMostSimilar(queryVector, candidateVectors, k);
162
+ return results.map(r => ({
163
+ index: r.index,
164
+ score: r.similarity
165
+ }));
166
+ }
167
+
168
+ // ==========================================================================
169
+ // Classification Operations (from ClassifyNamespace)
170
+ // ==========================================================================
171
+
172
+ /**
173
+ * Classify content into category
174
+ *
175
+ * Uses AI to determine the most appropriate category.
176
+ *
177
+ * @param content - Text content to classify
178
+ * @returns Category name (fact, preference, todo, note, general, etc.)
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * const category = await pdw.ai.classify('I prefer dark mode');
183
+ * // Returns: 'preference'
184
+ * ```
185
+ */
186
+ async classify(content: string): Promise<string> {
187
+ if (!this.services.classifier) {
188
+ throw new Error('Classifier service not configured. Please provide geminiApiKey.');
189
+ }
190
+ return await this.services.classifier.classifyContent(content);
191
+ }
192
+
193
+ /**
194
+ * Determine if content should be saved as a memory
195
+ *
196
+ * Uses AI and pattern matching to decide if content is worth saving.
197
+ * By default, only explicit commands like "remember that" trigger saves.
198
+ *
199
+ * @param content - Text content to analyze
200
+ * @param options - Options for classification
201
+ * @param options.explicitOnly - If true (default), only explicit memory commands trigger save
202
+ * @returns true if should save, false otherwise
203
+ *
204
+ * @example
205
+ * ```typescript
206
+ * // Default: only explicit commands
207
+ * const shouldSave = await pdw.ai.shouldSave('Remember that I love TypeScript');
208
+ * // Returns: true
209
+ *
210
+ * // With explicitOnly=false, pattern matching is more aggressive
211
+ * const shouldSave2 = await pdw.ai.shouldSave('I love TypeScript', { explicitOnly: false });
212
+ * // Returns: true (matches "I love..." pattern)
213
+ * ```
214
+ */
215
+ async shouldSave(content: string, options?: { explicitOnly?: boolean }): Promise<boolean> {
216
+ if (!this.services.classifier) {
217
+ throw new Error('Classifier service not configured. Please provide geminiApiKey.');
218
+ }
219
+ const result = await this.services.classifier.shouldSaveMemory(content, {
220
+ explicitOnly: options?.explicitOnly ?? true // Default to explicit-only
221
+ });
222
+ return result.shouldSave;
223
+ }
224
+
225
+ /**
226
+ * Extract memory content from explicit command
227
+ *
228
+ * Parses commands like "remember that X" and extracts X.
229
+ *
230
+ * @param message - User message to parse
231
+ * @returns Extracted content or null if no command found
232
+ *
233
+ * @example
234
+ * ```typescript
235
+ * const content = pdw.ai.extractMemoryContent('Remember that my name is John');
236
+ * // Returns: 'my name is John'
237
+ *
238
+ * const content2 = pdw.ai.extractMemoryContent('Hello there');
239
+ * // Returns: null
240
+ * ```
241
+ */
242
+ extractMemoryContent(message: string): string | null {
243
+ const patterns = [
244
+ /remember that\s+(.+)/i,
245
+ /remember:?\s+(.+)/i,
246
+ /don't forget that\s+(.+)/i,
247
+ /don't forget:?\s+(.+)/i,
248
+ /please remember\s+(.+)/i,
249
+ /store (?:this )?(?:in|to) memory:?\s*(.+)/i,
250
+ /save (?:this )?(?:in|to) memory:?\s*(.+)/i,
251
+ /add (?:this )?to (?:my )?memory:?\s*(.+)/i,
252
+ /keep in mind:?\s+(.+)/i,
253
+ /note that\s+(.+)/i,
254
+ ];
255
+
256
+ for (const pattern of patterns) {
257
+ const match = message.match(pattern);
258
+ if (match && match[1]) {
259
+ return match[1].trim();
260
+ }
261
+ }
262
+ return null;
263
+ }
264
+
265
+ /**
266
+ * Extract multiple memories from a single message
267
+ *
268
+ * Splits a message containing multiple facts/memories into individual items.
269
+ * Supports comma-separated, semicolon-separated, "and"-separated, and numbered lists.
270
+ *
271
+ * @param message - User message potentially containing multiple memories
272
+ * @returns Array of extracted memory contents, or empty array if no pattern matched
273
+ *
274
+ * @example
275
+ * ```typescript
276
+ * // Comma-separated
277
+ * pdw.ai.extractMultipleMemories('Remember that my name is John, I work at Google, and my birthday is Dec 25');
278
+ * // Returns: ['my name is John', 'I work at Google', 'my birthday is Dec 25']
279
+ *
280
+ * // Semicolon-separated
281
+ * pdw.ai.extractMultipleMemories('Note that: API key is abc123; server port is 3000; database is PostgreSQL');
282
+ * // Returns: ['API key is abc123', 'server port is 3000', 'database is PostgreSQL']
283
+ *
284
+ * // Numbered list
285
+ * pdw.ai.extractMultipleMemories('Remember: 1. My email is test@example 2. My phone is 123-456 3. I prefer dark mode');
286
+ * // Returns: ['My email is test@example', 'My phone is 123-456', 'I prefer dark mode']
287
+ *
288
+ * // Single memory (fallback to extractMemoryContent)
289
+ * pdw.ai.extractMultipleMemories('Remember that I like pizza');
290
+ * // Returns: ['I like pizza']
291
+ * ```
292
+ */
293
+ extractMultipleMemories(message: string): string[] {
294
+ // First, extract the content after the memory keyword
295
+ const content = this.extractMemoryContent(message);
296
+ if (!content) {
297
+ return [];
298
+ }
299
+
300
+ // Try numbered list pattern: "1. xxx 2. yyy 3. zzz"
301
+ const numberedPattern = /\d+\.\s*([^0-9]+?)(?=\d+\.|$)/g;
302
+ const numberedMatches = [...content.matchAll(numberedPattern)];
303
+ if (numberedMatches.length > 1) {
304
+ return numberedMatches
305
+ .map(m => m[1].trim())
306
+ .filter(s => s.length > 0);
307
+ }
308
+
309
+ // Try bullet list pattern: "- xxx - yyy" or "• xxx • yyy"
310
+ const bulletPattern = /[-•]\s*([^-•]+)/g;
311
+ const bulletMatches = [...content.matchAll(bulletPattern)];
312
+ if (bulletMatches.length > 1) {
313
+ return bulletMatches
314
+ .map(m => m[1].trim())
315
+ .filter(s => s.length > 0);
316
+ }
317
+
318
+ // Try semicolon-separated
319
+ if (content.includes(';')) {
320
+ const parts = content.split(';')
321
+ .map(s => s.trim())
322
+ .filter(s => s.length > 0);
323
+ if (parts.length > 1) {
324
+ return parts;
325
+ }
326
+ }
327
+
328
+ // Try comma + "and" pattern: "xxx, yyy, and zzz" or "xxx, yyy and zzz"
329
+ // Also handles simple comma-separated: "xxx, yyy, zzz"
330
+ const commaAndPattern = /,\s*(?:and\s+)?|\s+and\s+/i;
331
+ if (commaAndPattern.test(content)) {
332
+ const parts = content.split(commaAndPattern)
333
+ .map(s => s.trim())
334
+ .filter(s => s.length > 0);
335
+ if (parts.length > 1) {
336
+ return parts;
337
+ }
338
+ }
339
+
340
+ // Single memory - return as array with one item
341
+ return [content];
342
+ }
343
+
344
+ /**
345
+ * Check if message is a memory query (asking about stored memories)
346
+ *
347
+ * @param message - User message to check
348
+ * @returns true if user is asking about their memories
349
+ *
350
+ * @example
351
+ * ```typescript
352
+ * pdw.ai.isMemoryQuery('What do you remember about me?'); // true
353
+ * pdw.ai.isMemoryQuery('What is my name?'); // true
354
+ * pdw.ai.isMemoryQuery('Hello'); // false
355
+ * ```
356
+ */
357
+ isMemoryQuery(message: string): boolean {
358
+ const queryPatterns = [
359
+ /what do you (remember|know) about me/i,
360
+ /what('s| is) my (name|email|birthday|job|work|address)/i,
361
+ /do you (remember|know) my/i,
362
+ /tell me what you (remember|know)/i,
363
+ /what have i told you/i,
364
+ /what memories do you have/i,
365
+ ];
366
+ return queryPatterns.some(pattern => pattern.test(message));
367
+ }
368
+
369
+ /**
370
+ * Get full classification result with details
371
+ *
372
+ * @param content - Text content to classify
373
+ * @returns Full classification result with confidence and reasoning
374
+ *
375
+ * @example
376
+ * ```typescript
377
+ * const result = await pdw.ai.classifyFull('My birthday is January 15');
378
+ * // Returns: { shouldSave: true, confidence: 0.95, category: 'personal_info', reasoning: '...' }
379
+ * ```
380
+ */
381
+ async classifyFull(content: string): Promise<ClassificationResult> {
382
+ if (!this.services.classifier) {
383
+ throw new Error('Classifier service not configured. Please provide geminiApiKey.');
384
+ }
385
+ return await this.services.classifier.shouldSaveMemory(content);
386
+ }
387
+
388
+ /**
389
+ * Analyze patterns in content
390
+ *
391
+ * Detects patterns like personal info, contact details, preferences, etc.
392
+ *
393
+ * @param content - Text content to analyze
394
+ * @returns Pattern analysis with detected patterns and suggested category
395
+ *
396
+ * @example
397
+ * ```typescript
398
+ * const analysis = await pdw.ai.patterns('My email is user@example.com');
399
+ * // Returns: { patterns: [{ type: 'contact', ... }], suggestedCategory: 'contact' }
400
+ * ```
401
+ */
402
+ async patterns(content: string): Promise<PatternAnalysis> {
403
+ if (!this.services.classifier) {
404
+ throw new Error('Classifier service not configured. Please provide geminiApiKey.');
405
+ }
406
+ const result = await this.services.classifier.analyzePatterns(content);
407
+ return {
408
+ patterns: result.patterns.map((p: string) => ({
409
+ type: p,
410
+ confidence: 1.0,
411
+ examples: []
412
+ })),
413
+ categories: result.categories || [],
414
+ suggestedCategory: result.categories[0] || 'general'
415
+ };
416
+ }
417
+
418
+ /**
419
+ * Calculate importance score for content
420
+ *
421
+ * Uses AI to determine how important the content is (1-10 scale).
422
+ *
423
+ * @param content - Text content to score
424
+ * @returns Importance score (1-10)
425
+ *
426
+ * @example
427
+ * ```typescript
428
+ * const importance = await pdw.ai.importance('Emergency contact: 911');
429
+ * // Returns: 10
430
+ * ```
431
+ */
432
+ async importance(content: string): Promise<number> {
433
+ if (!this.services.classifier) {
434
+ throw new Error('Classifier service not configured. Please provide geminiApiKey.');
435
+ }
436
+ const category = await this.services.classifier.classifyContent(content);
437
+ const categoryImportance: Record<string, number> = {
438
+ 'emergency': 10,
439
+ 'contact': 9,
440
+ 'personal_info': 8,
441
+ 'career': 7,
442
+ 'preference': 6,
443
+ 'fact': 5,
444
+ 'note': 4,
445
+ 'general': 3
446
+ };
447
+ return categoryImportance[category] || 5;
448
+ }
449
+ }