@cmdoss/memwal-sdk 0.7.0 → 0.9.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 (229) hide show
  1. package/README.md +427 -41
  2. package/dist/client/ClientMemoryManager.js +2 -2
  3. package/dist/client/ClientMemoryManager.js.map +1 -1
  4. package/dist/client/PersonalDataWallet.d.ts.map +1 -1
  5. package/dist/client/SimplePDWClient.d.ts +88 -1
  6. package/dist/client/SimplePDWClient.d.ts.map +1 -1
  7. package/dist/client/SimplePDWClient.js +102 -11
  8. package/dist/client/SimplePDWClient.js.map +1 -1
  9. package/dist/client/namespaces/IndexNamespace.d.ts +1 -1
  10. package/dist/client/namespaces/IndexNamespace.d.ts.map +1 -1
  11. package/dist/client/namespaces/IndexNamespace.js +7 -4
  12. package/dist/client/namespaces/IndexNamespace.js.map +1 -1
  13. package/dist/client/namespaces/MemoryNamespace.d.ts +45 -0
  14. package/dist/client/namespaces/MemoryNamespace.d.ts.map +1 -1
  15. package/dist/client/namespaces/MemoryNamespace.js +292 -46
  16. package/dist/client/namespaces/MemoryNamespace.js.map +1 -1
  17. package/dist/client/namespaces/consolidated/AdvancedNamespace.d.ts +215 -0
  18. package/dist/client/namespaces/consolidated/AdvancedNamespace.d.ts.map +1 -0
  19. package/dist/client/namespaces/consolidated/AdvancedNamespace.js +214 -0
  20. package/dist/client/namespaces/consolidated/AdvancedNamespace.js.map +1 -0
  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 +40 -2
  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/client/namespaces/consolidated/index.d.ts +1 -0
  30. package/dist/client/namespaces/consolidated/index.d.ts.map +1 -1
  31. package/dist/client/namespaces/consolidated/index.js +1 -0
  32. package/dist/client/namespaces/consolidated/index.js.map +1 -1
  33. package/dist/config/ConfigurationHelper.js +61 -61
  34. package/dist/config/defaults.d.ts.map +1 -1
  35. package/dist/config/defaults.js +11 -6
  36. package/dist/config/defaults.js.map +1 -1
  37. package/dist/core/types/index.d.ts +4 -0
  38. package/dist/core/types/index.d.ts.map +1 -1
  39. package/dist/core/types/index.js.map +1 -1
  40. package/dist/graph/GraphService.js +20 -20
  41. package/dist/infrastructure/seal/EncryptionService.d.ts +9 -5
  42. package/dist/infrastructure/seal/EncryptionService.d.ts.map +1 -1
  43. package/dist/infrastructure/seal/EncryptionService.js +37 -15
  44. package/dist/infrastructure/seal/EncryptionService.js.map +1 -1
  45. package/dist/infrastructure/seal/SealService.d.ts +13 -5
  46. package/dist/infrastructure/seal/SealService.d.ts.map +1 -1
  47. package/dist/infrastructure/seal/SealService.js +36 -34
  48. package/dist/infrastructure/seal/SealService.js.map +1 -1
  49. package/dist/infrastructure/walrus/WalrusStorageService.d.ts +6 -0
  50. package/dist/infrastructure/walrus/WalrusStorageService.d.ts.map +1 -1
  51. package/dist/infrastructure/walrus/WalrusStorageService.js +23 -4
  52. package/dist/infrastructure/walrus/WalrusStorageService.js.map +1 -1
  53. package/dist/langchain/createPDWRAG.js +30 -30
  54. package/dist/retrieval/MemoryDecryptionPipeline.d.ts.map +1 -1
  55. package/dist/retrieval/MemoryDecryptionPipeline.js +2 -1
  56. package/dist/retrieval/MemoryDecryptionPipeline.js.map +1 -1
  57. package/dist/services/CapabilityService.d.ts.map +1 -1
  58. package/dist/services/CapabilityService.js +30 -14
  59. package/dist/services/CapabilityService.js.map +1 -1
  60. package/dist/services/CrossContextPermissionService.d.ts.map +1 -1
  61. package/dist/services/CrossContextPermissionService.js +9 -7
  62. package/dist/services/CrossContextPermissionService.js.map +1 -1
  63. package/dist/services/EmbeddingService.d.ts +9 -0
  64. package/dist/services/EmbeddingService.d.ts.map +1 -1
  65. package/dist/services/EmbeddingService.js +31 -10
  66. package/dist/services/EmbeddingService.js.map +1 -1
  67. package/dist/services/EncryptionService.d.ts.map +1 -1
  68. package/dist/services/EncryptionService.js +6 -5
  69. package/dist/services/EncryptionService.js.map +1 -1
  70. package/dist/services/GeminiAIService.js +309 -309
  71. package/dist/services/MemoryIndexService.d.ts +2 -0
  72. package/dist/services/MemoryIndexService.d.ts.map +1 -1
  73. package/dist/services/MemoryIndexService.js +11 -4
  74. package/dist/services/MemoryIndexService.js.map +1 -1
  75. package/dist/services/StorageService.d.ts +1 -0
  76. package/dist/services/StorageService.d.ts.map +1 -1
  77. package/dist/services/StorageService.js +60 -10
  78. package/dist/services/StorageService.js.map +1 -1
  79. package/dist/services/TransactionService.d.ts +20 -0
  80. package/dist/services/TransactionService.d.ts.map +1 -1
  81. package/dist/services/TransactionService.js +43 -0
  82. package/dist/services/TransactionService.js.map +1 -1
  83. package/dist/services/VectorService.js +1 -1
  84. package/dist/services/VectorService.js.map +1 -1
  85. package/dist/services/ViewService.js +2 -2
  86. package/dist/services/ViewService.js.map +1 -1
  87. package/dist/vector/BrowserHnswIndexService.js +1 -1
  88. package/dist/vector/BrowserHnswIndexService.js.map +1 -1
  89. package/dist/vector/HnswWasmService.js +1 -1
  90. package/dist/vector/HnswWasmService.js.map +1 -1
  91. package/dist/vector/NodeHnswService.js +1 -1
  92. package/dist/vector/NodeHnswService.js.map +1 -1
  93. package/package.json +1 -1
  94. package/src/access/PermissionService.ts +635 -635
  95. package/src/access/index.ts +8 -8
  96. package/src/aggregation/AggregationService.ts +389 -389
  97. package/src/aggregation/index.ts +8 -8
  98. package/src/ai-sdk/PDWVectorStore.ts +715 -715
  99. package/src/ai-sdk/index.ts +65 -65
  100. package/src/ai-sdk/tools.ts +460 -460
  101. package/src/ai-sdk/types.ts +404 -404
  102. package/src/batch/BatchManager.ts +597 -597
  103. package/src/batch/BatchingService.ts +429 -429
  104. package/src/batch/MemoryProcessingCache.ts +492 -492
  105. package/src/batch/index.ts +30 -30
  106. package/src/browser.ts +200 -200
  107. package/src/client/ClientMemoryManager.ts +987 -987
  108. package/src/client/PersonalDataWallet.ts +345 -345
  109. package/src/client/SimplePDWClient.ts +1369 -1237
  110. package/src/client/factory.ts +154 -154
  111. package/src/client/namespaces/AnalyticsNamespace.ts +377 -377
  112. package/src/client/namespaces/BatchNamespace.ts +356 -356
  113. package/src/client/namespaces/CacheNamespace.ts +123 -123
  114. package/src/client/namespaces/CapabilityNamespace.ts +217 -217
  115. package/src/client/namespaces/ClassifyNamespace.ts +169 -169
  116. package/src/client/namespaces/ContextNamespace.ts +297 -297
  117. package/src/client/namespaces/EmbeddingsNamespace.ts +99 -99
  118. package/src/client/namespaces/EncryptionNamespace.ts +221 -221
  119. package/src/client/namespaces/GraphNamespace.ts +468 -468
  120. package/src/client/namespaces/IndexNamespace.ts +364 -361
  121. package/src/client/namespaces/MemoryNamespace.ts +1569 -1272
  122. package/src/client/namespaces/PermissionsNamespace.ts +254 -254
  123. package/src/client/namespaces/PipelineNamespace.ts +220 -220
  124. package/src/client/namespaces/SearchNamespace.ts +1049 -1049
  125. package/src/client/namespaces/StorageNamespace.ts +458 -458
  126. package/src/client/namespaces/TxNamespace.ts +260 -260
  127. package/src/client/namespaces/WalletNamespace.ts +243 -243
  128. package/src/client/namespaces/consolidated/AINamespace.ts +449 -449
  129. package/src/client/namespaces/consolidated/AdvancedNamespace.ts +264 -0
  130. package/src/client/namespaces/consolidated/BlockchainNamespace.ts +607 -564
  131. package/src/client/namespaces/consolidated/SecurityNamespace.ts +648 -648
  132. package/src/client/namespaces/consolidated/StorageNamespace.ts +1141 -497
  133. package/src/client/namespaces/consolidated/index.ts +41 -39
  134. package/src/client/signers/DappKitSigner.ts +207 -207
  135. package/src/client/signers/KeypairSigner.ts +108 -108
  136. package/src/client/signers/UnifiedSigner.ts +110 -110
  137. package/src/client/signers/WalletAdapterSigner.ts +159 -159
  138. package/src/client/signers/index.ts +26 -26
  139. package/src/config/ConfigurationHelper.ts +412 -412
  140. package/src/config/defaults.ts +56 -51
  141. package/src/config/index.ts +8 -8
  142. package/src/config/validation.ts +70 -70
  143. package/src/core/index.ts +14 -14
  144. package/src/core/interfaces/IService.ts +307 -307
  145. package/src/core/interfaces/index.ts +8 -8
  146. package/src/core/types/capability.ts +297 -297
  147. package/src/core/types/index.ts +874 -870
  148. package/src/core/types/wallet.ts +270 -270
  149. package/src/core/types.ts +9 -9
  150. package/src/core/wallet.ts +222 -222
  151. package/src/embedding/index.ts +19 -19
  152. package/src/embedding/types.ts +357 -357
  153. package/src/errors/index.ts +602 -602
  154. package/src/errors/recovery.ts +461 -461
  155. package/src/errors/validation.ts +567 -567
  156. package/src/generated/pdw/capability.ts +319 -319
  157. package/src/generated/pdw/deps/sui/object.ts +12 -12
  158. package/src/generated/pdw/deps/sui/vec_map.ts +32 -32
  159. package/src/generated/pdw/memory.ts +1087 -1087
  160. package/src/generated/pdw/wallet.ts +123 -123
  161. package/src/generated/utils/index.ts +159 -159
  162. package/src/graph/GraphService.ts +887 -887
  163. package/src/graph/KnowledgeGraphManager.ts +728 -728
  164. package/src/graph/index.ts +25 -25
  165. package/src/index.ts +498 -498
  166. package/src/infrastructure/index.ts +22 -22
  167. package/src/infrastructure/seal/EncryptionService.ts +628 -603
  168. package/src/infrastructure/seal/SealService.ts +613 -615
  169. package/src/infrastructure/seal/index.ts +9 -9
  170. package/src/infrastructure/sui/BlockchainManager.ts +627 -627
  171. package/src/infrastructure/sui/SuiService.ts +888 -888
  172. package/src/infrastructure/sui/index.ts +9 -9
  173. package/src/infrastructure/walrus/StorageManager.ts +604 -604
  174. package/src/infrastructure/walrus/WalrusStorageService.ts +637 -612
  175. package/src/infrastructure/walrus/index.ts +9 -9
  176. package/src/langchain/PDWEmbeddings.ts +145 -145
  177. package/src/langchain/PDWVectorStore.ts +456 -456
  178. package/src/langchain/createPDWRAG.ts +303 -303
  179. package/src/langchain/index.ts +47 -47
  180. package/src/permissions/ConsentRepository.browser.ts +249 -249
  181. package/src/permissions/ConsentRepository.ts +364 -364
  182. package/src/permissions/index.ts +9 -9
  183. package/src/pipeline/MemoryPipeline.ts +862 -862
  184. package/src/pipeline/PipelineManager.ts +683 -683
  185. package/src/pipeline/index.ts +26 -26
  186. package/src/retrieval/AdvancedSearchService.ts +629 -629
  187. package/src/retrieval/MemoryAnalyticsService.ts +711 -711
  188. package/src/retrieval/MemoryDecryptionPipeline.ts +825 -824
  189. package/src/retrieval/MemoryRetrievalService.ts +904 -904
  190. package/src/retrieval/index.ts +42 -42
  191. package/src/services/BatchService.ts +352 -352
  192. package/src/services/CapabilityService.ts +464 -448
  193. package/src/services/ClassifierService.ts +465 -465
  194. package/src/services/CrossContextPermissionService.ts +486 -484
  195. package/src/services/EmbeddingService.ts +796 -771
  196. package/src/services/EncryptionService.ts +712 -711
  197. package/src/services/GeminiAIService.ts +753 -753
  198. package/src/services/IndexManager.ts +977 -977
  199. package/src/services/MemoryIndexService.ts +1009 -1003
  200. package/src/services/MemoryService.ts +369 -369
  201. package/src/services/QueryService.ts +890 -890
  202. package/src/services/StorageService.ts +1182 -1126
  203. package/src/services/TransactionService.ts +838 -790
  204. package/src/services/VectorService.ts +462 -462
  205. package/src/services/ViewService.ts +484 -484
  206. package/src/services/index.ts +25 -25
  207. package/src/services/storage/BlobAttributesManager.ts +333 -333
  208. package/src/services/storage/KnowledgeGraphManager.ts +425 -425
  209. package/src/services/storage/MemorySearchManager.ts +387 -387
  210. package/src/services/storage/QuiltBatchManager.ts +1130 -1130
  211. package/src/services/storage/WalrusMetadataManager.ts +268 -268
  212. package/src/services/storage/WalrusStorageManager.ts +287 -287
  213. package/src/services/storage/index.ts +57 -57
  214. package/src/types/index.ts +13 -13
  215. package/src/utils/LRUCache.ts +378 -378
  216. package/src/utils/index.ts +76 -76
  217. package/src/utils/memoryIndexOnChain.ts +507 -507
  218. package/src/utils/rebuildIndex.ts +290 -290
  219. package/src/utils/rebuildIndexNode.ts +771 -771
  220. package/src/vector/BrowserHnswIndexService.ts +758 -758
  221. package/src/vector/HnswWasmService.ts +731 -731
  222. package/src/vector/IHnswService.ts +233 -233
  223. package/src/vector/NodeHnswService.ts +833 -833
  224. package/src/vector/VectorManager.ts +478 -478
  225. package/src/vector/createHnswService.ts +135 -135
  226. package/src/vector/index.ts +56 -56
  227. package/src/wallet/ContextWalletService.ts +656 -656
  228. package/src/wallet/MainWalletService.ts +317 -317
  229. package/src/wallet/index.ts +17 -17
@@ -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 (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
- }
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
+ }