@cilow/sdk 0.2.0 → 0.2.1

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 (45) hide show
  1. package/README.md +412 -199
  2. package/dist/client.d.mts +224 -0
  3. package/dist/client.d.ts +224 -0
  4. package/dist/client.js +509 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/client.mjs +505 -0
  7. package/dist/client.mjs.map +1 -0
  8. package/dist/index.d.mts +94 -390
  9. package/dist/index.d.ts +94 -390
  10. package/dist/index.js +745 -350
  11. package/dist/index.js.map +1 -0
  12. package/dist/index.mjs +732 -318
  13. package/dist/index.mjs.map +1 -0
  14. package/dist/providers/langchain.js +821 -0
  15. package/dist/providers/langchain.js.map +1 -0
  16. package/dist/providers/langchain.mjs +816 -0
  17. package/dist/providers/langchain.mjs.map +1 -0
  18. package/dist/providers/openai.js +737 -0
  19. package/dist/providers/openai.js.map +1 -0
  20. package/dist/providers/openai.mjs +732 -0
  21. package/dist/providers/openai.mjs.map +1 -0
  22. package/dist/providers/vercel.js +866 -0
  23. package/dist/providers/vercel.js.map +1 -0
  24. package/dist/providers/vercel.mjs +860 -0
  25. package/dist/providers/vercel.mjs.map +1 -0
  26. package/dist/react/hooks.d.mts +327 -0
  27. package/dist/react/hooks.d.ts +327 -0
  28. package/dist/react/hooks.js +1183 -0
  29. package/dist/react/hooks.js.map +1 -0
  30. package/dist/react/hooks.mjs +1172 -0
  31. package/dist/react/hooks.mjs.map +1 -0
  32. package/dist/types.d.mts +494 -0
  33. package/dist/types.d.ts +494 -0
  34. package/dist/types.js +18 -0
  35. package/dist/types.js.map +1 -0
  36. package/dist/types.mjs +14 -0
  37. package/dist/types.mjs.map +1 -0
  38. package/dist/websocket.d.mts +160 -0
  39. package/dist/websocket.d.ts +160 -0
  40. package/dist/websocket.js +342 -0
  41. package/dist/websocket.js.map +1 -0
  42. package/dist/websocket.mjs +339 -0
  43. package/dist/websocket.mjs.map +1 -0
  44. package/package.json +90 -31
  45. package/LICENSE +0 -21
@@ -0,0 +1,505 @@
1
+ // src/client.ts
2
+ async function fetchWithRetry(url, options, config) {
3
+ const controller = new AbortController();
4
+ const timeoutId = setTimeout(() => controller.abort(), config.timeout);
5
+ let lastError = null;
6
+ for (let attempt = 0; attempt <= config.retries; attempt++) {
7
+ try {
8
+ const response = await fetch(url, {
9
+ ...options,
10
+ signal: controller.signal
11
+ });
12
+ clearTimeout(timeoutId);
13
+ if (!response.ok) {
14
+ const errorBody = await response.text();
15
+ let apiError;
16
+ try {
17
+ apiError = JSON.parse(errorBody);
18
+ } catch {
19
+ apiError = {
20
+ code: `HTTP_${response.status}`,
21
+ message: errorBody || response.statusText
22
+ };
23
+ }
24
+ throw new CilowApiError(apiError.message, apiError.code, response.status, apiError.details);
25
+ }
26
+ return response;
27
+ } catch (error) {
28
+ lastError = error;
29
+ if (error instanceof CilowApiError) {
30
+ throw error;
31
+ }
32
+ if (config.debug) {
33
+ console.warn(`Cilow API request failed (attempt ${attempt + 1}/${config.retries + 1}):`, error);
34
+ }
35
+ if (attempt < config.retries) {
36
+ await new Promise((resolve) => setTimeout(resolve, Math.pow(2, attempt) * 100));
37
+ }
38
+ }
39
+ }
40
+ clearTimeout(timeoutId);
41
+ throw lastError || new Error("Request failed");
42
+ }
43
+ var CilowApiError = class extends Error {
44
+ constructor(message, code, statusCode, details) {
45
+ super(message);
46
+ this.code = code;
47
+ this.statusCode = statusCode;
48
+ this.details = details;
49
+ this.name = "CilowApiError";
50
+ }
51
+ };
52
+ var CilowClient = class {
53
+ constructor(config) {
54
+ this.baseUrl = config.apiUrl.replace(/\/$/, "");
55
+ this.apiKey = config.apiKey;
56
+ this.timeout = config.timeout ?? 3e4;
57
+ this.retries = config.retries ?? 3;
58
+ this.debug = config.debug ?? false;
59
+ const authHeaders = this.apiKey.startsWith("cilow_") ? { "X-API-Key": this.apiKey } : { Authorization: `Bearer ${this.apiKey}` };
60
+ this.headers = {
61
+ "Content-Type": "application/json",
62
+ ...authHeaders,
63
+ ...config.headers
64
+ };
65
+ }
66
+ /**
67
+ * Make an API request
68
+ */
69
+ async request(method, path, body, queryParams) {
70
+ let url = `${this.baseUrl}${path}`;
71
+ if (queryParams) {
72
+ const params = new URLSearchParams();
73
+ for (const [key, value] of Object.entries(queryParams)) {
74
+ if (value !== void 0) {
75
+ params.append(key, String(value));
76
+ }
77
+ }
78
+ const queryString = params.toString();
79
+ if (queryString) {
80
+ url += `?${queryString}`;
81
+ }
82
+ }
83
+ if (this.debug) {
84
+ console.log(`Cilow API: ${method} ${url}`);
85
+ }
86
+ const response = await fetchWithRetry(
87
+ url,
88
+ {
89
+ method,
90
+ headers: this.headers,
91
+ body: body ? JSON.stringify(body) : void 0
92
+ },
93
+ { timeout: this.timeout, retries: this.retries, debug: this.debug }
94
+ );
95
+ const text = await response.text();
96
+ if (!text) {
97
+ return void 0;
98
+ }
99
+ return JSON.parse(text);
100
+ }
101
+ // ===========================================================================
102
+ // Simple API (remember, recall, forget)
103
+ // ===========================================================================
104
+ /**
105
+ * Store a memory (simple API)
106
+ *
107
+ * @param content - The content to remember
108
+ * @param options - Optional configuration
109
+ * @returns The created memory ID
110
+ *
111
+ * @example
112
+ * ```typescript
113
+ * await cilow.remember("User prefers dark mode", {
114
+ * tags: ["preference"],
115
+ * userId: "user-123"
116
+ * });
117
+ * ```
118
+ */
119
+ async remember(content, options) {
120
+ const response = await this.request("POST", "/api/v1/memory/add", {
121
+ content,
122
+ tags: options?.tags ?? [],
123
+ user_id: options?.userId,
124
+ session_id: options?.sessionId,
125
+ metadata: options?.metadata,
126
+ type: options?.tier
127
+ });
128
+ return response.memory_id || response.id || "";
129
+ }
130
+ /**
131
+ * Search memories (simple API)
132
+ *
133
+ * @param query - Search query text
134
+ * @param options - Search options
135
+ * @returns Array of search results
136
+ *
137
+ * @example
138
+ * ```typescript
139
+ * const memories = await cilow.recall("user preferences", {
140
+ * limit: 10,
141
+ * tags: ["preference"]
142
+ * });
143
+ * ```
144
+ */
145
+ async recall(query, options) {
146
+ const response = await this.request("POST", "/api/v1/memory/search", {
147
+ query,
148
+ limit: options?.limit ?? 10,
149
+ min_score: options?.minRelevance ?? 0.3,
150
+ tags: options?.tags,
151
+ user_id: options?.userId
152
+ });
153
+ return (response.results ?? []).map((r) => ({
154
+ memory: {
155
+ id: r.memory_id,
156
+ content: r.content,
157
+ tags: r.tags ?? [],
158
+ tier: "hot",
159
+ status: "active",
160
+ accessCount: 0,
161
+ tokenCount: Math.ceil(r.content.length / 4),
162
+ metadata: {},
163
+ createdAt: r.created_at ?? (/* @__PURE__ */ new Date()).toISOString(),
164
+ updatedAt: r.created_at ?? (/* @__PURE__ */ new Date()).toISOString(),
165
+ lastAccessedAt: (/* @__PURE__ */ new Date()).toISOString()
166
+ },
167
+ score: r.similarity,
168
+ highlights: []
169
+ }));
170
+ }
171
+ /**
172
+ * Delete memories (simple API)
173
+ *
174
+ * @param filter - Filter criteria for deletion
175
+ * @returns Number of memories deleted
176
+ *
177
+ * @example
178
+ * ```typescript
179
+ * // Delete by tags
180
+ * await cilow.forget({ tags: ["temporary"] });
181
+ *
182
+ * // Delete by user
183
+ * await cilow.forget({ userId: "user-123" });
184
+ *
185
+ * // Delete specific memory
186
+ * await cilow.forget({ memoryId: "mem-abc" });
187
+ * ```
188
+ */
189
+ async forget(filter) {
190
+ if (filter.memoryId) {
191
+ await this.deleteMemory(filter.memoryId);
192
+ return 1;
193
+ }
194
+ const response = await this.request("DELETE", "/api/v1/memories/bulk", {
195
+ filter_tags: filter.tags,
196
+ user_id: filter.userId,
197
+ session_id: filter.sessionId,
198
+ older_than: filter.olderThan
199
+ });
200
+ return response.deleted ?? 0;
201
+ }
202
+ // ===========================================================================
203
+ // Memory CRUD Operations
204
+ // ===========================================================================
205
+ /**
206
+ * Create a new memory
207
+ */
208
+ async createMemory(content, options) {
209
+ return this.request("POST", "/api/v1/memories", {
210
+ content,
211
+ tags: options?.tags ?? [],
212
+ user_id: options?.userId,
213
+ session_id: options?.sessionId,
214
+ metadata: options?.metadata,
215
+ tier: options?.tier
216
+ });
217
+ }
218
+ /**
219
+ * Get a memory by ID
220
+ */
221
+ async getMemory(memoryId) {
222
+ return this.request("GET", `/api/v1/memories/${memoryId}`);
223
+ }
224
+ /**
225
+ * Update a memory
226
+ */
227
+ async updateMemory(memoryId, updates) {
228
+ return this.request("PATCH", `/api/v1/memories/${memoryId}`, {
229
+ content: updates.content,
230
+ tags: updates.tags,
231
+ metadata: updates.metadata,
232
+ tier: updates.tier
233
+ });
234
+ }
235
+ /**
236
+ * Delete a memory
237
+ */
238
+ async deleteMemory(memoryId) {
239
+ await this.request("DELETE", `/api/v1/memories/${memoryId}`);
240
+ }
241
+ /**
242
+ * List memories with pagination
243
+ */
244
+ async listMemories(options) {
245
+ const response = await this.request(
246
+ "GET",
247
+ "/api/v1/memory/list",
248
+ void 0,
249
+ {
250
+ limit: options?.limit ?? 20,
251
+ offset: options?.offset ?? 0,
252
+ user_id: options?.userId,
253
+ session_id: options?.sessionId,
254
+ tags: options?.tags?.join(","),
255
+ type: options?.tier
256
+ }
257
+ );
258
+ const items = (response.memories ?? []).map((m) => ({
259
+ id: m.memory_id || m.id || "",
260
+ content: m.content,
261
+ tags: m.tags ?? [],
262
+ createdAt: m.created_at ?? (/* @__PURE__ */ new Date()).toISOString(),
263
+ tier: m.type || "hot"
264
+ }));
265
+ const limit = options?.limit ?? 20;
266
+ const offset = options?.offset ?? 0;
267
+ const total = response.total ?? items.length;
268
+ return {
269
+ items,
270
+ total,
271
+ limit,
272
+ offset,
273
+ hasMore: offset + items.length < total
274
+ };
275
+ }
276
+ // ===========================================================================
277
+ // Search Operations
278
+ // ===========================================================================
279
+ /**
280
+ * Search memories with full options
281
+ */
282
+ async searchMemories(query) {
283
+ const response = await this.request("POST", "/api/v1/memories/search", {
284
+ text: query.text,
285
+ limit: query.limit ?? 10,
286
+ min_relevance: query.minRelevance ?? 0.3,
287
+ filter_tags: query.tags,
288
+ user_id: query.userId,
289
+ session_id: query.sessionId,
290
+ tier: query.tier,
291
+ created_after: query.createdAfter,
292
+ created_before: query.createdBefore,
293
+ include_archived: query.includeArchived,
294
+ mode: query.mode ?? "hybrid"
295
+ });
296
+ return response.results ?? [];
297
+ }
298
+ /**
299
+ * Advanced search with reranking and boosts
300
+ */
301
+ async advancedSearch(query) {
302
+ const response = await this.request("POST", "/api/v1/memories/search/advanced", {
303
+ text: query.text,
304
+ limit: query.limit ?? 10,
305
+ min_relevance: query.minRelevance ?? 0.3,
306
+ filter_tags: query.tags,
307
+ required_tags: query.requiredTags,
308
+ excluded_tags: query.excludedTags,
309
+ user_id: query.userId,
310
+ session_id: query.sessionId,
311
+ recency_boost: query.recencyBoost,
312
+ frequency_boost: query.frequencyBoost,
313
+ metadata_filters: query.metadataFilters,
314
+ reranker: query.reranker
315
+ });
316
+ return response.results ?? [];
317
+ }
318
+ /**
319
+ * Get context for AI applications
320
+ */
321
+ async getContext(query, options) {
322
+ const maxTokens = options?.maxTokens ?? 4e3;
323
+ const tokensPerChar = 0.25;
324
+ const results = await this.searchMemories({
325
+ text: query,
326
+ limit: 30,
327
+ minRelevance: 0.3,
328
+ userId: options?.userId,
329
+ tags: options?.tags
330
+ });
331
+ let context = "";
332
+ let estimatedTokens = 0;
333
+ const memoryIds = [];
334
+ const scores = [];
335
+ for (const result of results) {
336
+ const memoryText = `[Relevance: ${(result.score * 100).toFixed(0)}%]
337
+ ${result.memory.content}
338
+
339
+ `;
340
+ const memoryTokens = Math.ceil(memoryText.length * tokensPerChar);
341
+ if (estimatedTokens + memoryTokens > maxTokens) break;
342
+ context += memoryText;
343
+ estimatedTokens += memoryTokens;
344
+ memoryIds.push(result.memory.id);
345
+ scores.push(result.score);
346
+ }
347
+ return {
348
+ context: context.trim(),
349
+ memoriesUsed: memoryIds.length,
350
+ estimatedTokens,
351
+ memoryIds,
352
+ scores
353
+ };
354
+ }
355
+ // ===========================================================================
356
+ // Conversation Operations
357
+ // ===========================================================================
358
+ /**
359
+ * Store a conversation turn
360
+ */
361
+ async storeConversation(turn) {
362
+ const content = `User: ${turn.userMessage}
363
+
364
+ Assistant: ${turn.assistantResponse}`;
365
+ const tags = ["conversation"];
366
+ if (turn.sessionId) {
367
+ tags.push(`session:${turn.sessionId}`);
368
+ }
369
+ return this.remember(content, {
370
+ tags,
371
+ userId: turn.userId,
372
+ sessionId: turn.sessionId,
373
+ metadata: {
374
+ type: "conversation",
375
+ ...turn.metadata
376
+ }
377
+ });
378
+ }
379
+ /**
380
+ * Get conversation history for a session
381
+ */
382
+ async getConversationHistory(sessionId, options) {
383
+ const response = await this.listMemories({
384
+ sessionId,
385
+ tags: ["conversation"],
386
+ limit: options?.limit ?? 50,
387
+ offset: options?.offset ?? 0
388
+ });
389
+ return response.items;
390
+ }
391
+ // ===========================================================================
392
+ // Graph Operations
393
+ // ===========================================================================
394
+ /**
395
+ * Get a graph node
396
+ */
397
+ async getGraphNode(nodeId) {
398
+ return this.request("GET", `/api/v1/graph/nodes/${nodeId}`);
399
+ }
400
+ /**
401
+ * Create a graph node
402
+ */
403
+ async createGraphNode(type, name, properties) {
404
+ return this.request("POST", "/api/v1/graph/nodes", {
405
+ type,
406
+ name,
407
+ properties: properties ?? {}
408
+ });
409
+ }
410
+ /**
411
+ * Create a graph edge
412
+ */
413
+ async createGraphEdge(sourceId, targetId, type, properties) {
414
+ return this.request("POST", "/api/v1/graph/edges", {
415
+ source_id: sourceId,
416
+ target_id: targetId,
417
+ type,
418
+ properties: properties ?? {}
419
+ });
420
+ }
421
+ /**
422
+ * Traverse the graph from a starting node
423
+ */
424
+ async traverseGraph(options) {
425
+ return this.request("POST", "/api/v1/graph/traverse", {
426
+ start_node_id: options.startNodeId,
427
+ max_depth: options.maxDepth ?? 3,
428
+ relationship_types: options.relationshipTypes,
429
+ limit: options.limit ?? 100,
430
+ direction: options.direction ?? "both"
431
+ });
432
+ }
433
+ /**
434
+ * Get related nodes for a memory
435
+ */
436
+ async getRelatedNodes(memoryId) {
437
+ const response = await this.request(
438
+ "GET",
439
+ `/api/v1/memories/${memoryId}/related-nodes`
440
+ );
441
+ return response.nodes ?? [];
442
+ }
443
+ // ===========================================================================
444
+ // Statistics & Admin
445
+ // ===========================================================================
446
+ /**
447
+ * Get memory statistics
448
+ */
449
+ async getStats() {
450
+ return this.request("GET", "/api/v1/stats");
451
+ }
452
+ /**
453
+ * Get all tags with counts
454
+ */
455
+ async getTags() {
456
+ const response = await this.request("GET", "/api/v1/tags");
457
+ return response.tags ?? [];
458
+ }
459
+ /**
460
+ * Get user statistics
461
+ */
462
+ async getUserStats(userId) {
463
+ return this.request("GET", `/api/v1/users/${userId}/stats`);
464
+ }
465
+ /**
466
+ * Health check
467
+ */
468
+ async healthCheck() {
469
+ return this.request("GET", "/health");
470
+ }
471
+ // ===========================================================================
472
+ // Batch Operations
473
+ // ===========================================================================
474
+ /**
475
+ * Batch create memories
476
+ */
477
+ async batchCreate(items) {
478
+ const response = await this.request("POST", "/api/v1/memories/batch", {
479
+ memories: items.map((item) => ({
480
+ content: item.content,
481
+ tags: item.options?.tags ?? [],
482
+ user_id: item.options?.userId,
483
+ session_id: item.options?.sessionId,
484
+ metadata: item.options?.metadata
485
+ }))
486
+ });
487
+ return response.ids ?? [];
488
+ }
489
+ /**
490
+ * Batch delete memories
491
+ */
492
+ async batchDelete(memoryIds) {
493
+ const response = await this.request("DELETE", "/api/v1/memories/batch", {
494
+ ids: memoryIds
495
+ });
496
+ return response.deleted ?? 0;
497
+ }
498
+ };
499
+ function createClient(config) {
500
+ return new CilowClient(config);
501
+ }
502
+
503
+ export { CilowApiError, CilowClient, createClient };
504
+ //# sourceMappingURL=client.mjs.map
505
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":"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","file":"client.mjs","sourcesContent":["/**\n * Cilow Client - Core HTTP Client for Cilow API\n *\n * Provides a clean, type-safe interface for interacting with the Cilow\n * memory system API.\n */\n\nimport type {\n Memory,\n MemorySummary,\n SearchResult,\n SearchQuery,\n AdvancedSearchOptions,\n GraphNode,\n GraphEdge,\n GraphSubgraph,\n GraphTraversalOptions,\n MemoryStats,\n TagCount,\n UserStats,\n CilowConfig,\n CreateMemoryOptions,\n UpdateMemoryOptions,\n PaginatedResponse,\n HealthCheck,\n ApiError,\n ContextResult,\n ConversationTurn,\n} from './types';\n\n/**\n * HTTP fetch wrapper with error handling and retries\n */\nasync function fetchWithRetry(\n url: string,\n options: RequestInit,\n config: { timeout: number; retries: number; debug: boolean }\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= config.retries; attempt++) {\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n let apiError: ApiError;\n\n try {\n apiError = JSON.parse(errorBody);\n } catch {\n apiError = {\n code: `HTTP_${response.status}`,\n message: errorBody || response.statusText,\n };\n }\n\n throw new CilowApiError(apiError.message, apiError.code, response.status, apiError.details);\n }\n\n return response;\n } catch (error) {\n lastError = error as Error;\n\n if (error instanceof CilowApiError) {\n throw error;\n }\n\n if (config.debug) {\n console.warn(`Cilow API request failed (attempt ${attempt + 1}/${config.retries + 1}):`, error);\n }\n\n if (attempt < config.retries) {\n // Exponential backoff\n await new Promise((resolve) => setTimeout(resolve, Math.pow(2, attempt) * 100));\n }\n }\n }\n\n clearTimeout(timeoutId);\n throw lastError || new Error('Request failed');\n}\n\n/**\n * Custom error class for Cilow API errors\n */\nexport class CilowApiError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode: number,\n public readonly details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'CilowApiError';\n }\n}\n\n/**\n * CilowClient - Main client class for interacting with the Cilow API\n *\n * @example\n * ```typescript\n * const client = new CilowClient({\n * apiUrl: 'https://api.cilow.ai',\n * apiKey: 'your-api-key'\n * });\n *\n * // Store a memory\n * const memoryId = await client.remember(\"User prefers dark mode\", {\n * tags: [\"preference\", \"ui\"]\n * });\n *\n * // Search memories\n * const results = await client.recall(\"user preferences\");\n *\n * // Delete memories\n * await client.forget({ tags: [\"old\"] });\n * ```\n */\nexport class CilowClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly retries: number;\n private readonly headers: Record<string, string>;\n private readonly debug: boolean;\n\n constructor(config: CilowConfig) {\n this.baseUrl = config.apiUrl.replace(/\\/$/, '');\n this.apiKey = config.apiKey;\n this.timeout = config.timeout ?? 30000;\n this.retries = config.retries ?? 3;\n this.debug = config.debug ?? false;\n\n // Support both API key and Bearer token auth\n const authHeaders: Record<string, string> = this.apiKey.startsWith('cilow_')\n ? { 'X-API-Key': this.apiKey }\n : { Authorization: `Bearer ${this.apiKey}` };\n\n this.headers = {\n 'Content-Type': 'application/json',\n ...authHeaders,\n ...config.headers,\n };\n }\n\n /**\n * Make an API request\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n queryParams?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n let url = `${this.baseUrl}${path}`;\n\n if (queryParams) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(queryParams)) {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n }\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n if (this.debug) {\n console.log(`Cilow API: ${method} ${url}`);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method,\n headers: this.headers,\n body: body ? JSON.stringify(body) : undefined,\n },\n { timeout: this.timeout, retries: this.retries, debug: this.debug }\n );\n\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n\n return JSON.parse(text) as T;\n }\n\n // ===========================================================================\n // Simple API (remember, recall, forget)\n // ===========================================================================\n\n /**\n * Store a memory (simple API)\n *\n * @param content - The content to remember\n * @param options - Optional configuration\n * @returns The created memory ID\n *\n * @example\n * ```typescript\n * await cilow.remember(\"User prefers dark mode\", {\n * tags: [\"preference\"],\n * userId: \"user-123\"\n * });\n * ```\n */\n async remember(content: string, options?: CreateMemoryOptions): Promise<string> {\n const response = await this.request<{ memory_id: string; id?: string }>('POST', '/api/v1/memory/add', {\n content,\n tags: options?.tags ?? [],\n user_id: options?.userId,\n session_id: options?.sessionId,\n metadata: options?.metadata,\n type: options?.tier,\n });\n\n return response.memory_id || response.id || '';\n }\n\n /**\n * Search memories (simple API)\n *\n * @param query - Search query text\n * @param options - Search options\n * @returns Array of search results\n *\n * @example\n * ```typescript\n * const memories = await cilow.recall(\"user preferences\", {\n * limit: 10,\n * tags: [\"preference\"]\n * });\n * ```\n */\n async recall(\n query: string,\n options?: {\n limit?: number;\n minRelevance?: number;\n tags?: string[];\n userId?: string;\n }\n ): Promise<SearchResult[]> {\n interface ApiSearchResult {\n memory_id: string;\n content: string;\n score: number;\n similarity: number;\n tags?: string[];\n created_at?: string;\n }\n\n const response = await this.request<{ results: ApiSearchResult[] }>('POST', '/api/v1/memory/search', {\n query,\n limit: options?.limit ?? 10,\n min_score: options?.minRelevance ?? 0.3,\n tags: options?.tags,\n user_id: options?.userId,\n });\n\n // Transform API response to SDK format with defaults for required fields\n return (response.results ?? []).map((r): SearchResult => ({\n memory: {\n id: r.memory_id,\n content: r.content,\n tags: r.tags ?? [],\n tier: 'hot' as const,\n status: 'active' as const,\n accessCount: 0,\n tokenCount: Math.ceil(r.content.length / 4),\n metadata: {},\n createdAt: r.created_at ?? new Date().toISOString(),\n updatedAt: r.created_at ?? new Date().toISOString(),\n lastAccessedAt: new Date().toISOString(),\n },\n score: r.similarity,\n highlights: [],\n }));\n }\n\n /**\n * Delete memories (simple API)\n *\n * @param filter - Filter criteria for deletion\n * @returns Number of memories deleted\n *\n * @example\n * ```typescript\n * // Delete by tags\n * await cilow.forget({ tags: [\"temporary\"] });\n *\n * // Delete by user\n * await cilow.forget({ userId: \"user-123\" });\n *\n * // Delete specific memory\n * await cilow.forget({ memoryId: \"mem-abc\" });\n * ```\n */\n async forget(filter: {\n memoryId?: string;\n tags?: string[];\n userId?: string;\n sessionId?: string;\n olderThan?: string;\n }): Promise<number> {\n if (filter.memoryId) {\n await this.deleteMemory(filter.memoryId);\n return 1;\n }\n\n const response = await this.request<{ deleted: number }>('DELETE', '/api/v1/memories/bulk', {\n filter_tags: filter.tags,\n user_id: filter.userId,\n session_id: filter.sessionId,\n older_than: filter.olderThan,\n });\n\n return response.deleted ?? 0;\n }\n\n // ===========================================================================\n // Memory CRUD Operations\n // ===========================================================================\n\n /**\n * Create a new memory\n */\n async createMemory(content: string, options?: CreateMemoryOptions): Promise<Memory> {\n return this.request<Memory>('POST', '/api/v1/memories', {\n content,\n tags: options?.tags ?? [],\n user_id: options?.userId,\n session_id: options?.sessionId,\n metadata: options?.metadata,\n tier: options?.tier,\n });\n }\n\n /**\n * Get a memory by ID\n */\n async getMemory(memoryId: string): Promise<Memory> {\n return this.request<Memory>('GET', `/api/v1/memories/${memoryId}`);\n }\n\n /**\n * Update a memory\n */\n async updateMemory(memoryId: string, updates: UpdateMemoryOptions): Promise<Memory> {\n return this.request<Memory>('PATCH', `/api/v1/memories/${memoryId}`, {\n content: updates.content,\n tags: updates.tags,\n metadata: updates.metadata,\n tier: updates.tier,\n });\n }\n\n /**\n * Delete a memory\n */\n async deleteMemory(memoryId: string): Promise<void> {\n await this.request<void>('DELETE', `/api/v1/memories/${memoryId}`);\n }\n\n /**\n * List memories with pagination\n */\n async listMemories(options?: {\n limit?: number;\n offset?: number;\n userId?: string;\n sessionId?: string;\n tags?: string[];\n tier?: string;\n }): Promise<PaginatedResponse<MemorySummary>> {\n interface ApiMemory {\n memory_id: string;\n id?: string;\n content: string;\n tags?: string[];\n created_at?: string;\n type?: string;\n }\n\n const response = await this.request<{ memories: ApiMemory[]; total?: number }>(\n 'GET',\n '/api/v1/memory/list',\n undefined,\n {\n limit: options?.limit ?? 20,\n offset: options?.offset ?? 0,\n user_id: options?.userId,\n session_id: options?.sessionId,\n tags: options?.tags?.join(','),\n type: options?.tier,\n }\n );\n\n const items: MemorySummary[] = (response.memories ?? []).map((m) => ({\n id: m.memory_id || m.id || '',\n content: m.content,\n tags: m.tags ?? [],\n createdAt: m.created_at ?? new Date().toISOString(),\n tier: (m.type as MemorySummary['tier']) || 'hot',\n }));\n\n const limit = options?.limit ?? 20;\n const offset = options?.offset ?? 0;\n const total = response.total ?? items.length;\n\n return {\n items,\n total,\n limit,\n offset,\n hasMore: offset + items.length < total,\n };\n }\n\n // ===========================================================================\n // Search Operations\n // ===========================================================================\n\n /**\n * Search memories with full options\n */\n async searchMemories(query: SearchQuery): Promise<SearchResult[]> {\n const response = await this.request<{ results: SearchResult[] }>('POST', '/api/v1/memories/search', {\n text: query.text,\n limit: query.limit ?? 10,\n min_relevance: query.minRelevance ?? 0.3,\n filter_tags: query.tags,\n user_id: query.userId,\n session_id: query.sessionId,\n tier: query.tier,\n created_after: query.createdAfter,\n created_before: query.createdBefore,\n include_archived: query.includeArchived,\n mode: query.mode ?? 'hybrid',\n });\n\n return response.results ?? [];\n }\n\n /**\n * Advanced search with reranking and boosts\n */\n async advancedSearch(query: AdvancedSearchOptions): Promise<SearchResult[]> {\n const response = await this.request<{ results: SearchResult[] }>('POST', '/api/v1/memories/search/advanced', {\n text: query.text,\n limit: query.limit ?? 10,\n min_relevance: query.minRelevance ?? 0.3,\n filter_tags: query.tags,\n required_tags: query.requiredTags,\n excluded_tags: query.excludedTags,\n user_id: query.userId,\n session_id: query.sessionId,\n recency_boost: query.recencyBoost,\n frequency_boost: query.frequencyBoost,\n metadata_filters: query.metadataFilters,\n reranker: query.reranker,\n });\n\n return response.results ?? [];\n }\n\n /**\n * Get context for AI applications\n */\n async getContext(\n query: string,\n options?: {\n maxTokens?: number;\n userId?: string;\n tags?: string[];\n }\n ): Promise<ContextResult> {\n const maxTokens = options?.maxTokens ?? 4000;\n const tokensPerChar = 0.25;\n\n const results = await this.searchMemories({\n text: query,\n limit: 30,\n minRelevance: 0.3,\n userId: options?.userId,\n tags: options?.tags,\n });\n\n let context = '';\n let estimatedTokens = 0;\n const memoryIds: string[] = [];\n const scores: number[] = [];\n\n for (const result of results) {\n const memoryText = `[Relevance: ${(result.score * 100).toFixed(0)}%]\\n${result.memory.content}\\n\\n`;\n const memoryTokens = Math.ceil(memoryText.length * tokensPerChar);\n\n if (estimatedTokens + memoryTokens > maxTokens) break;\n\n context += memoryText;\n estimatedTokens += memoryTokens;\n memoryIds.push(result.memory.id);\n scores.push(result.score);\n }\n\n return {\n context: context.trim(),\n memoriesUsed: memoryIds.length,\n estimatedTokens,\n memoryIds,\n scores,\n };\n }\n\n // ===========================================================================\n // Conversation Operations\n // ===========================================================================\n\n /**\n * Store a conversation turn\n */\n async storeConversation(turn: ConversationTurn & { userId: string }): Promise<string> {\n const content = `User: ${turn.userMessage}\\n\\nAssistant: ${turn.assistantResponse}`;\n const tags = ['conversation'];\n\n if (turn.sessionId) {\n tags.push(`session:${turn.sessionId}`);\n }\n\n return this.remember(content, {\n tags,\n userId: turn.userId,\n sessionId: turn.sessionId,\n metadata: {\n type: 'conversation',\n ...turn.metadata,\n },\n });\n }\n\n /**\n * Get conversation history for a session\n */\n async getConversationHistory(\n sessionId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<MemorySummary[]> {\n const response = await this.listMemories({\n sessionId,\n tags: ['conversation'],\n limit: options?.limit ?? 50,\n offset: options?.offset ?? 0,\n });\n\n return response.items;\n }\n\n // ===========================================================================\n // Graph Operations\n // ===========================================================================\n\n /**\n * Get a graph node\n */\n async getGraphNode(nodeId: string): Promise<GraphNode> {\n return this.request<GraphNode>('GET', `/api/v1/graph/nodes/${nodeId}`);\n }\n\n /**\n * Create a graph node\n */\n async createGraphNode(\n type: string,\n name: string,\n properties?: Record<string, unknown>\n ): Promise<GraphNode> {\n return this.request<GraphNode>('POST', '/api/v1/graph/nodes', {\n type,\n name,\n properties: properties ?? {},\n });\n }\n\n /**\n * Create a graph edge\n */\n async createGraphEdge(\n sourceId: string,\n targetId: string,\n type: string,\n properties?: Record<string, unknown>\n ): Promise<GraphEdge> {\n return this.request<GraphEdge>('POST', '/api/v1/graph/edges', {\n source_id: sourceId,\n target_id: targetId,\n type,\n properties: properties ?? {},\n });\n }\n\n /**\n * Traverse the graph from a starting node\n */\n async traverseGraph(options: GraphTraversalOptions): Promise<GraphSubgraph> {\n return this.request<GraphSubgraph>('POST', '/api/v1/graph/traverse', {\n start_node_id: options.startNodeId,\n max_depth: options.maxDepth ?? 3,\n relationship_types: options.relationshipTypes,\n limit: options.limit ?? 100,\n direction: options.direction ?? 'both',\n });\n }\n\n /**\n * Get related nodes for a memory\n */\n async getRelatedNodes(memoryId: string): Promise<GraphNode[]> {\n const response = await this.request<{ nodes: GraphNode[] }>(\n 'GET',\n `/api/v1/memories/${memoryId}/related-nodes`\n );\n return response.nodes ?? [];\n }\n\n // ===========================================================================\n // Statistics & Admin\n // ===========================================================================\n\n /**\n * Get memory statistics\n */\n async getStats(): Promise<MemoryStats> {\n return this.request<MemoryStats>('GET', '/api/v1/stats');\n }\n\n /**\n * Get all tags with counts\n */\n async getTags(): Promise<TagCount[]> {\n const response = await this.request<{ tags: TagCount[] }>('GET', '/api/v1/tags');\n return response.tags ?? [];\n }\n\n /**\n * Get user statistics\n */\n async getUserStats(userId: string): Promise<UserStats> {\n return this.request<UserStats>('GET', `/api/v1/users/${userId}/stats`);\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<HealthCheck> {\n return this.request<HealthCheck>('GET', '/health');\n }\n\n // ===========================================================================\n // Batch Operations\n // ===========================================================================\n\n /**\n * Batch create memories\n */\n async batchCreate(\n items: Array<{ content: string; options?: CreateMemoryOptions }>\n ): Promise<string[]> {\n const response = await this.request<{ ids: string[] }>('POST', '/api/v1/memories/batch', {\n memories: items.map((item) => ({\n content: item.content,\n tags: item.options?.tags ?? [],\n user_id: item.options?.userId,\n session_id: item.options?.sessionId,\n metadata: item.options?.metadata,\n })),\n });\n\n return response.ids ?? [];\n }\n\n /**\n * Batch delete memories\n */\n async batchDelete(memoryIds: string[]): Promise<number> {\n const response = await this.request<{ deleted: number }>('DELETE', '/api/v1/memories/batch', {\n ids: memoryIds,\n });\n\n return response.deleted ?? 0;\n }\n}\n\n/**\n * Create a Cilow client instance (convenience function)\n */\nexport function createClient(config: CilowConfig): CilowClient {\n return new CilowClient(config);\n}\n"]}