@nebula-ai/sdk 0.0.29 → 0.0.33
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.
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -134,7 +134,7 @@ var NebulaClient = class {
|
|
|
134
134
|
signal: controller.signal
|
|
135
135
|
});
|
|
136
136
|
clearTimeout(timeoutId);
|
|
137
|
-
if (response.status === 200) {
|
|
137
|
+
if (response.status === 200 || response.status === 202) {
|
|
138
138
|
return await response.json();
|
|
139
139
|
} else if (response.status === 401) {
|
|
140
140
|
throw new NebulaAuthenticationException("Invalid API key");
|
|
@@ -252,7 +252,7 @@ var NebulaClient = class {
|
|
|
252
252
|
if (options?.metadata_filters) {
|
|
253
253
|
params.metadata_filters = JSON.stringify(options.metadata_filters);
|
|
254
254
|
}
|
|
255
|
-
const response = await this._makeRequest("GET", "/v1/
|
|
255
|
+
const response = await this._makeRequest("GET", "/v1/memories", void 0, params);
|
|
256
256
|
let conversations;
|
|
257
257
|
if (response && response.results) {
|
|
258
258
|
conversations = response.results;
|
|
@@ -265,7 +265,7 @@ var NebulaClient = class {
|
|
|
265
265
|
}
|
|
266
266
|
async getConversationMessages(conversationIdOrIds) {
|
|
267
267
|
if (typeof conversationIdOrIds === "string") {
|
|
268
|
-
const response2 = await this._makeRequest("GET", `/v1/
|
|
268
|
+
const response2 = await this._makeRequest("GET", `/v1/memories/${conversationIdOrIds}`);
|
|
269
269
|
if (!response2 || !response2.results) {
|
|
270
270
|
return [];
|
|
271
271
|
}
|
|
@@ -274,9 +274,8 @@ var NebulaClient = class {
|
|
|
274
274
|
if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {
|
|
275
275
|
return {};
|
|
276
276
|
}
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
});
|
|
277
|
+
const params = { ids: conversationIdOrIds };
|
|
278
|
+
const response = await this._makeRequest("GET", "/v1/memories", void 0, params);
|
|
280
279
|
console.log("\u{1F50D} SDK: Raw batch response:", response);
|
|
281
280
|
console.log("\u{1F50D} SDK: Response has results?", !!response?.results);
|
|
282
281
|
if (response?.results) {
|
|
@@ -712,7 +711,7 @@ var NebulaClient = class {
|
|
|
712
711
|
/** Delete a conversation and all its messages */
|
|
713
712
|
async deleteConversation(conversationId) {
|
|
714
713
|
try {
|
|
715
|
-
await this._makeRequest("DELETE", `/v1/
|
|
714
|
+
await this._makeRequest("DELETE", `/v1/memories/${conversationId}`);
|
|
716
715
|
return true;
|
|
717
716
|
} catch (error) {
|
|
718
717
|
if (error instanceof Error) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":["GraphSearchResultType","response","docMetadata","data","url","headers","respData"],"mappings":"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","file":"index.js","sourcesContent":["// Data models matching the actual Nebula Python SDK exactly\n\n// Enums\nexport enum GraphSearchResultType {\n ENTITY = \"entity\",\n RELATIONSHIP = \"relationship\",\n COMMUNITY = \"community\"\n}\n\n// Core interfaces matching Python SDK exactly\nexport interface Chunk {\n id: string;\n content: string;\n metadata: Record<string, any>;\n role?: string; // For conversation messages\n}\n\nexport interface MemoryResponse {\n id: string;\n content?: string;\n chunks?: Chunk[];\n metadata: Record<string, any>;\n collection_ids: string[];\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Memory {\n collection_id: string;\n content: string | string[] | Array<{content: string; role: string; metadata?: Record<string, any>; authority?: number}>;\n role?: string; // user, assistant, or custom\n memory_id?: string; // ID of existing memory to append to\n metadata: Record<string, any>;\n authority?: number; // Optional authority score (0.0 - 1.0)\n}\n\nexport interface Collection {\n id: string;\n name: string;\n description?: string;\n metadata: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n memory_count: number;\n owner_id?: string;\n}\n\nexport interface SearchResult {\n id: string; // chunk_id\n score: number;\n metadata: Record<string, any>;\n source?: string;\n timestamp?: string;\n display_name?: string;\n source_role?: string;\n memory_id?: string; // Parent memory/conversation container\n owner_id?: string;\n\n // Chunk fields\n content?: string;\n\n // Graph variant discriminator and payload\n graph_result_type?: GraphSearchResultType;\n graph_entity?: GraphEntityResult;\n graph_relationship?: GraphRelationshipResult;\n graph_community?: GraphCommunityResult;\n chunk_ids?: string[];\n}\n\nexport interface GraphEntityResult {\n id?: string;\n name: string;\n description: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphRelationshipResult {\n id?: string;\n subject: string;\n predicate: string;\n object: string;\n subject_id?: string;\n object_id?: string;\n description?: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphCommunityResult {\n id?: string;\n name: string;\n summary: string;\n metadata: Record<string, any>;\n}\n\nexport interface AgentResponse {\n content: string;\n agent_id: string;\n conversation_id?: string;\n metadata: Record<string, any>;\n citations: Record<string, any>[];\n}\n\nexport interface SearchOptions {\n limit: number;\n filters?: Record<string, any>;\n search_mode?: 'fast' | 'super';\n}\n\n// Configuration interface\nexport interface NebulaClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n}\n\n// Error types matching Python SDK\nexport class NebulaException extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'NebulaException';\n }\n}\n\nexport class NebulaClientException extends NebulaException {\n constructor(message: string, public cause?: Error) {\n super(message);\n this.name = 'NebulaClientException';\n }\n}\n\nexport class NebulaAuthenticationException extends NebulaException {\n constructor(message: string = 'Invalid API key') {\n super(message, 401);\n this.name = 'NebulaAuthenticationException';\n }\n}\n\nexport class NebulaRateLimitException extends NebulaException {\n constructor(message: string = 'Rate limit exceeded') {\n super(message, 429);\n this.name = 'NebulaRateLimitException';\n }\n}\n\nexport class NebulaValidationException extends NebulaException {\n constructor(message: string = 'Validation error', public details?: any) {\n super(message, 400);\n this.name = 'NebulaValidationException';\n }\n}\n\nexport class NebulaCollectionNotFoundException extends NebulaException {\n constructor(message: string = 'Collection not found') {\n super(message, 404);\n this.name = 'NebulaCollectionNotFoundException';\n }\n}\n\nexport class NebulaNotFoundException extends NebulaException {\n constructor(resourceId: string, resourceType: string = 'Resource') {\n super(`${resourceType} not found: ${resourceId}`, 404);\n this.name = 'NebulaNotFoundException';\n }\n}\n","import {\n Memory,\n MemoryResponse,\n Collection,\n SearchResult,\n GraphSearchResultType,\n GraphEntityResult,\n GraphRelationshipResult,\n GraphCommunityResult,\n NebulaClientConfig,\n NebulaException,\n NebulaClientException,\n NebulaAuthenticationException,\n NebulaRateLimitException,\n NebulaValidationException,\n NebulaNotFoundException,\n} from './types';\n\n/**\n * Official Nebula JavaScript/TypeScript SDK\n * Mirrors the exact Nebula Python SDK client.py implementation\n */\nexport class NebulaClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(config: NebulaClientConfig) {\n this.apiKey = config.apiKey;\n if (!this.apiKey) {\n throw new NebulaClientException(\n 'API key is required. Pass it to the constructor or set NEBULA_API_KEY environment variable.'\n );\n }\n\n this.baseUrl = (config.baseUrl || 'https://api.nebulacloud.app').replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n }\n\n // Public mutators used by tests\n setApiKey(next: string) {\n this.apiKey = next;\n }\n setBaseUrl(next: string) {\n this.baseUrl = (next || this.baseUrl).replace(/\\/$/, '');\n }\n // Kept for backwards-compat tests; no-op in current implementation\n setCorsProxy(_next: string) {\n // no-op\n }\n\n /** Check if API key is set */\n isApiKeySet(): boolean {\n return !!(this.apiKey && this.apiKey.trim() !== '');\n }\n\n /** Detect if a token looks like a Nebula API key (public.raw) */\n private _isNebulaApiKey(token?: string): boolean {\n const candidate = token || this.apiKey;\n if (!candidate) return false;\n const parts = candidate.split('.');\n if (parts.length !== 2) return false;\n const [publicPart, rawPart] = parts;\n return publicPart.startsWith('key_') && !!rawPart && rawPart.length > 0;\n }\n\n /** Build authentication headers */\n private _buildAuthHeaders(includeContentType: boolean = true): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this._isNebulaApiKey()) {\n headers['X-API-Key'] = this.apiKey;\n } else {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (includeContentType) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n }\n\n /** Make an HTTP request to the Nebula API */\n private async _makeRequest(\n method: string,\n endpoint: string,\n jsonData?: any, // Can be object, array, or primitive for JSON body\n params?: Record<string, any>\n ): Promise<any> {\n const url = new URL(endpoint, this.baseUrl);\n\n if (params) {\n console.log('SDK: _makeRequest params before processing:', params);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n // Handle array parameters (e.g., collection_ids)\n if (Array.isArray(value)) {\n console.log(`SDK: Adding array param ${key}:`, value);\n value.forEach((item) => {\n url.searchParams.append(key, String(item));\n console.log(`SDK: Appended ${key}=${item} to URL`);\n });\n } else {\n console.log(`SDK: Adding single param ${key}:`, value);\n url.searchParams.append(key, String(value));\n }\n }\n });\n }\n\n console.log('SDK: Final URL being requested:', url.toString());\n\n const headers = this._buildAuthHeaders(true);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: jsonData ? JSON.stringify(jsonData) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n return await response.json();\n } else if (response.status === 401) {\n throw new NebulaAuthenticationException('Invalid API key');\n } else if (response.status === 429) {\n throw new NebulaRateLimitException('Rate limit exceeded');\n } else if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaValidationException(errorData.message || 'Validation error', errorData.details);\n } else if (response.status === 422) {\n const errorData = await response.json().catch(() => ({}));\n console.error('[SDK] 422 Validation error - Full details:');\n console.error(' Status:', response.status);\n console.error(' Error data:', JSON.stringify(errorData, null, 2));\n console.error(' Message:', errorData.message);\n console.error(' Detail:', errorData.detail);\n throw new NebulaValidationException(\n errorData.message || (typeof errorData.detail === 'string' ? errorData.detail : JSON.stringify(errorData.detail)) || 'Validation error',\n errorData\n );\n } else {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(errorData.message || `API error: ${response.status}`, response.status, errorData);\n }\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof NebulaException) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new NebulaClientException(`Request timed out after ${this.timeout} milliseconds`);\n }\n\n if (error instanceof Error) {\n throw new NebulaClientException(`Request failed: ${error.message}`, error);\n }\n\n throw new NebulaClientException(`Request failed: ${String(error)}`);\n }\n }\n\n // Collection Management Methods\n\n /** Create a new collection */\n async createCollection(options: {\n name: string;\n description?: string;\n metadata?: Record<string, any>;\n }): Promise<Collection> {\n const data: Record<string, any> = { name: options.name };\n if (options.description) data.description = options.description;\n if (options.metadata) data.metadata = options.metadata;\n\n const response = await this._makeRequest('POST', '/v1/collections', data);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get a specific collection by ID */\n async getCollection(collectionId: string): Promise<Collection> {\n const response = await this._makeRequest('GET', `/v1/collections/${collectionId}`);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get a specific collection by name */\n async getCollectionByName(name: string): Promise<Collection> {\n const response = await this._makeRequest('GET', `/v1/collections/name/${name}`);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get all collections */\n async listCollections(options?: {\n limit?: number;\n offset?: number;\n }): Promise<Collection[]> {\n const params = {\n limit: options?.limit ?? 100,\n offset: options?.offset ?? 0\n };\n const response = await this._makeRequest('GET', '/v1/collections', undefined, params);\n\n let collections: any[];\n if (response.results) {\n collections = response.results;\n } else if (Array.isArray(response)) {\n collections = response;\n } else {\n collections = [response];\n }\n\n return collections.map((collection) => this._collectionFromDict(collection));\n }\n\n // Conversations Methods\n\n /**\n * List conversations for the authenticated user with optional metadata filtering\n *\n * @param options - Configuration for listing conversations\n * @param options.limit - Maximum number of conversations to return (default: 100)\n * @param options.offset - Number of conversations to skip for pagination (default: 0)\n * @param options.collection_ids - Optional list of collection IDs to filter conversations by\n * @param options.metadata_filters - Optional metadata filters using MongoDB-like operators.\n * Supported operators: $eq, $ne, $in, $nin, $exists, $and, $or\n *\n * @returns Promise resolving to array of conversation objects with fields: id, created_at, user_id, name, collection_ids\n *\n * @example\n * // Get all playground conversations\n * const conversations = await client.listConversations({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * 'metadata.playground': { $eq: true }\n * }\n * });\n *\n * @example\n * // Filter by session ID\n * const conversations = await client.listConversations({\n * metadata_filters: {\n * 'metadata.session_id': { $eq: 'session-123' }\n * }\n * });\n */\n async listConversations(options?: {\n limit?: number;\n offset?: number;\n collection_ids?: string[];\n metadata_filters?: Record<string, any>;\n }): Promise<any[]> {\n const params: Record<string, any> = {\n limit: options?.limit ?? 100,\n offset: options?.offset ?? 0\n };\n // Convert collection_ids to collection_ids for the API\n if (options?.collection_ids && options.collection_ids.length > 0) {\n params.collection_ids = options.collection_ids;\n }\n // Add metadata_filters if provided (serialize to JSON string for query parameter)\n if (options?.metadata_filters) {\n params.metadata_filters = JSON.stringify(options.metadata_filters);\n }\n const response = await this._makeRequest('GET', '/v1/conversations', undefined, params);\n\n let conversations: any[];\n if (response && response.results) {\n conversations = response.results;\n } else if (Array.isArray(response)) {\n conversations = response;\n } else {\n conversations = response ? [response] : [];\n }\n\n return conversations;\n }\n\n /** Get conversation messages directly from the conversations API */\n async getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;\n async getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;\n async getConversationMessages(conversationIdOrIds: string | string[]): Promise<MemoryResponse[] | Record<string, MemoryResponse[]>> {\n // Handle single conversation ID (backward compatibility)\n if (typeof conversationIdOrIds === 'string') {\n const response = await this._makeRequest('GET', `/v1/conversations/${conversationIdOrIds}`);\n\n if (!response || !response.results) {\n return [];\n }\n\n return this._transformConversationMessages(response.results);\n }\n\n // Handle multiple conversation IDs\n if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {\n return {};\n }\n\n // Use POST request with conversation IDs in body for batch retrieval\n // This performs a single SQL query with IN clause for optimal performance\n const response = await this._makeRequest('POST', '/v1/conversations/batch', {\n conversation_ids: conversationIdOrIds\n });\n\n console.log('🔍 SDK: Raw batch response:', response);\n console.log('🔍 SDK: Response has results?', !!response?.results);\n if (response?.results) {\n console.log('🔍 SDK: Results keys:', Object.keys(response.results));\n console.log('🔍 SDK: Sample result:', Object.keys(response.results)[0], ':', response.results[Object.keys(response.results)[0]]);\n }\n\n const results: Record<string, MemoryResponse[]> = {};\n\n if (response && response.results) {\n // Backend returns { \"results\": { \"results\": { conversation_id: MessageResponse[] } } } format (double-nested)\n const batchResults = response.results.results || response.results;\n console.log('🔍 SDK: Processing', Object.keys(batchResults).length, 'conversations');\n for (const [conversationId, messages] of Object.entries(batchResults)) {\n if (Array.isArray(messages)) {\n const transformed = this._transformConversationMessages(messages as any[]);\n results[conversationId] = transformed;\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: ${messages.length} raw -> ${transformed.length} transformed`);\n } else {\n results[conversationId] = [];\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: not array, setting empty`);\n }\n }\n }\n\n // Ensure all requested conversation IDs are present in results (even if empty)\n for (const conversationId of conversationIdOrIds) {\n if (!(conversationId in results)) {\n results[conversationId] = [];\n }\n }\n\n return results;\n }\n\n /** Helper method to transform conversation messages to MemoryResponse format */\n private _transformConversationMessages(messageResponses: any[]): MemoryResponse[] {\n return messageResponses.map((msgResp: any) => {\n const msgId = String(msgResp.id || '');\n const msg = msgResp.message || {}; // The actual Message object\n const metadata = msgResp.metadata || {};\n\n // Normalize content to a string - could be string or object\n let text: string = '';\n const rawContent = msg.content;\n if (typeof rawContent === 'string') {\n text = rawContent;\n } else if (rawContent && typeof rawContent === 'object') {\n // Handle structured content\n text = String(rawContent.content || rawContent.text || JSON.stringify(rawContent));\n } else if (rawContent != null) {\n text = String(rawContent);\n }\n\n // Get role from the Message object\n const role = msg.role || metadata.role || 'user';\n\n // Merge message metadata with response metadata\n const combinedMetadata = {\n ...metadata,\n role, // Ensure role is in metadata for UI compatibility\n };\n\n return {\n id: msgId,\n content: text,\n metadata: combinedMetadata,\n created_at: msgResp.created_at,\n collection_ids: msgResp.collection_ids || [],\n } as MemoryResponse;\n });\n }\n\n /** Update a collection */\n async updateCollection(options: {\n collectionId: string;\n name?: string;\n description?: string;\n metadata?: Record<string, any>;\n }): Promise<Collection> {\n const data: Record<string, any> = {};\n if (options.name !== undefined) data.name = options.name;\n if (options.description !== undefined) data.description = options.description;\n if (options.metadata !== undefined) data.metadata = options.metadata;\n\n const response = await this._makeRequest('POST', `/v1/collections/${options.collectionId}`, data);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Delete a collection */\n async deleteCollection(collectionId: string): Promise<boolean> {\n await this._makeRequest('DELETE', `/v1/collections/${collectionId}`);\n return true;\n }\n\n // Memory Management Methods\n\n /**\n * Legacy convenience: store raw text content into a collection as a document\n */\n async store(content: string, collectionId: string, metadata: Record<string, any> = {}): Promise<MemoryResponse> {\n const docMetadata = {\n ...metadata,\n memory_type: 'memory',\n timestamp: new Date().toISOString(),\n } as Record<string, any>;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([collectionId]),\n raw_text: String(content || ''),\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create engram: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n const id = respData?.results?.engram_id || respData?.results?.id || respData?.id || '';\n\n const result: MemoryResponse = {\n id: String(id),\n content: String(content || ''),\n metadata: docMetadata,\n collection_ids: [collectionId],\n created_at: docMetadata.timestamp,\n updated_at: docMetadata.timestamp,\n };\n return result;\n }\n\n /**\n * Store a single memory using the unified engrams API.\n *\n * Automatically infers memory type:\n * - If role is present, creates a conversation\n * - Otherwise, creates a document\n */\n async storeMemory(\n memory: Memory | Record<string, any>,\n name?: string\n ): Promise<string> {\n let mem: Memory;\n\n if ('collection_id' in memory) {\n mem = memory as Memory;\n } else {\n mem = {\n collection_id: (memory as any).collection_id,\n content: (memory as any).content || '',\n role: (memory as any).role,\n memory_id: (memory as any).memory_id,\n metadata: (memory as any).metadata || {},\n };\n }\n\n // If memory_id is present, append to existing memory\n if (mem.memory_id) {\n return await this._appendToMemory(mem.memory_id, mem);\n }\n\n // Automatically infer memory type from role presence\n const memoryType = mem.role ? 'conversation' : 'document';\n\n // Handle conversation creation\n if (memoryType === 'conversation') {\n // Use new unified POST /v1/memories endpoint\n const docMetadata = { ...mem.metadata };\n const data = {\n engram_type: 'conversation',\n name: name || 'Conversation',\n metadata: JSON.stringify(docMetadata),\n collection_ids: JSON.stringify([mem.collection_id]),\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create conversation: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n const convId = respData.results.engram_id || respData.results.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n\n // If content and role provided, append initial message\n if (mem.content && mem.role) {\n const appendMem: Memory = {\n collection_id: mem.collection_id,\n content: [\n {\n content: String(mem.content),\n role: mem.role,\n metadata: mem.metadata,\n ...(typeof (mem as any).authority === 'number' ? { authority: Number((mem as any).authority) } : {})\n },\n ],\n memory_id: convId,\n metadata: {},\n };\n await this._appendToMemory(convId, appendMem);\n }\n\n return String(convId);\n }\n throw new NebulaClientException('Failed to create conversation: invalid response format');\n }\n\n // Handle document/text memory\n const contentText = String(mem.content || '');\n if (!contentText) {\n throw new NebulaClientException('Content is required for document memories');\n }\n\n const contentHash = await this._sha256(contentText);\n const docMetadata = { ...mem.metadata } as Record<string, any>;\n docMetadata.memory_type = 'memory';\n docMetadata.content_hash = contentHash;\n // If authority provided for document, persist in metadata for ranking\n if (typeof (mem as any).authority === 'number') {\n const v = Number((mem as any).authority);\n if (!Number.isNaN(v) && v >= 0 && v <= 1) {\n (docMetadata as any).authority = v;\n }\n }\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([mem.collection_id]),\n raw_text: contentText,\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create engram: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n if (respData.results.engram_id) return String(respData.results.engram_id);\n if (respData.results.id) return String(respData.results.id);\n }\n return '';\n }\n\n /**\n * Internal method to append content to an existing engram\n *\n * @throws NebulaNotFoundException if engram_id doesn't exist\n */\n private async _appendToMemory(memoryId: string, memory: Memory): Promise<string> {\n const collectionId = memory.collection_id;\n const content = memory.content;\n const metadata = memory.metadata;\n\n if (!collectionId) {\n throw new NebulaClientException('collection_id is required');\n }\n\n const payload: Record<string, any> = {\n collection_id: collectionId,\n };\n\n // Determine content type and set appropriate field\n if (Array.isArray(content)) {\n if (content.length > 0 && typeof content[0] === 'object' && 'content' in content[0]) {\n // Array of message objects (conversation)\n payload.messages = content;\n } else {\n // Array of strings (chunks)\n payload.chunks = content;\n }\n } else if (typeof content === 'string') {\n // Raw text string\n payload.raw_text = content;\n } else {\n throw new NebulaClientException(\n 'content must be a string, array of strings, or array of message objects'\n );\n }\n\n if (metadata) {\n payload.metadata = metadata;\n }\n\n try {\n await this._makeRequest('POST', `/v1/memories/${memoryId}/append`, payload);\n return memoryId;\n } catch (error) {\n // Convert 404 errors to NebulaNotFoundException\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(memoryId, 'Memory');\n }\n throw error;\n }\n }\n\n /** Store multiple memories using the unified engrams API */\n async storeMemories(memories: Memory[]): Promise<string[]> {\n const results: string[] = [];\n const convGroups: Record<string, Memory[]> = {};\n const others: Memory[] = [];\n\n for (const m of memories) {\n if (m.role) {\n const key = m.memory_id || `__new__::${m.collection_id}`;\n if (!convGroups[key]) convGroups[key] = [];\n convGroups[key].push(m);\n } else {\n others.push(m);\n }\n }\n\n // Process conversation groups using new unified API\n for (const [key, group] of Object.entries(convGroups)) {\n const collectionId = group[0].collection_id;\n let convId: string;\n\n // Create conversation if needed\n if (key.startsWith('__new__::')) {\n // Pass a placeholder role to trigger conversation creation\n convId = await this.storeMemory(\n {\n collection_id: collectionId,\n content: '',\n role: 'assistant', // Placeholder role to infer conversation type\n metadata: {},\n },\n 'Conversation'\n );\n } else {\n convId = key;\n }\n\n // Append messages using new unified API\n const messages = group.map((m) => ({\n content: String(m.content || ''),\n role: m.role!,\n metadata: m.metadata || {},\n }));\n\n const appendMem: Memory = {\n collection_id: collectionId,\n content: messages,\n memory_id: convId,\n metadata: {},\n };\n await this._appendToMemory(convId, appendMem);\n\n results.push(...Array(group.length).fill(String(convId)));\n }\n\n // Process others (text/json) individually\n for (const m of others) {\n results.push(await this.storeMemory(m));\n }\n\n return results;\n }\n\n /** Delete one or more memories */\n async delete(memoryIds: string | string[]): Promise<boolean | {\n message: string;\n results: {\n successful: string[];\n failed: Array<{ id: string; error: string }>;\n summary: {\n total: number;\n succeeded: number;\n failed: number;\n };\n };\n }> {\n try {\n console.log('[SDK] delete() called with:', { memoryIds, type: typeof memoryIds, isArray: Array.isArray(memoryIds) });\n\n // Handle single ID vs array\n if (typeof memoryIds === 'string') {\n console.log('[SDK] Single deletion path for ID:', memoryIds);\n // Single deletion - try existing endpoint first for backward compatibility\n try {\n await this._makeRequest('DELETE', `/v1/memories/${memoryIds}`);\n return true;\n } catch {\n // Fall back to new unified endpoint\n try {\n console.log('[SDK] Falling back to POST /v1/memories/delete with single ID');\n // Send the UUID string directly as body (not wrapped in {ids: ...})\n const response = await this._makeRequest('POST', '/v1/memories/delete', memoryIds);\n return typeof response === 'object' && response.success !== undefined\n ? response.success\n : true;\n } catch (error) {\n throw error;\n }\n }\n } else {\n console.log('[SDK] Batch deletion path for IDs:', memoryIds);\n console.log('[SDK] Sending POST request with body:', memoryIds);\n // Batch deletion - send array directly as body (not wrapped in {ids: ...})\n // FastAPI Body() without embed=True expects the value directly\n const response = await this._makeRequest('POST', '/v1/memories/delete', memoryIds);\n console.log('[SDK] Batch deletion response:', response);\n return response;\n }\n } catch (error) {\n console.error('[SDK] Delete error:', error);\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Delete a specific chunk or message within a memory */\n async deleteChunk(chunkId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/chunks/${chunkId}`);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(chunkId, 'Chunk');\n }\n throw error;\n }\n }\n\n /** Update a specific chunk or message within a memory */\n async updateChunk(\n chunkId: string,\n content: string,\n metadata?: Record<string, any>\n ): Promise<boolean> {\n const payload: any = { content };\n if (metadata !== undefined) {\n payload.metadata = metadata;\n }\n\n try {\n await this._makeRequest('PATCH', `/v1/chunks/${chunkId}`, payload);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(chunkId, 'Chunk');\n }\n throw error;\n }\n }\n\n /**\n * Update memory-level properties including name, metadata, and collection associations.\n *\n * This method allows updating properties of an entire memory (document or conversation)\n * without modifying its content. For updating individual chunks or messages within a memory,\n * use updateChunk(). For updating content, use storeMemory() to append.\n *\n * @param options - Update configuration\n * @param options.memoryId - The ID of the memory to update\n * @param options.name - New name for the memory (useful for conversations and documents)\n * @param options.metadata - Metadata to set. By default, replaces existing metadata.\n * Set mergeMetadata=true to merge with existing metadata instead.\n * @param options.collectionIds - New collection associations. Must specify at least one valid collection.\n * @param options.mergeMetadata - If true, merges provided metadata with existing metadata.\n * If false (default), replaces existing metadata entirely.\n *\n * @returns Promise resolving to true if successful\n *\n * @throws NebulaNotFoundException if memory_id doesn't exist\n * @throws NebulaValidationException if validation fails (e.g., no fields provided)\n * @throws NebulaAuthenticationException if user doesn't have permission to update this memory\n */\n async updateMemory(options: {\n memoryId: string;\n name?: string;\n metadata?: Record<string, any>;\n collectionIds?: string[];\n mergeMetadata?: boolean;\n }): Promise<boolean> {\n const payload: any = {};\n\n if (options.name !== undefined) {\n payload.name = options.name;\n }\n if (options.metadata !== undefined) {\n payload.metadata = options.metadata;\n payload.merge_metadata = options.mergeMetadata ?? false;\n }\n if (options.collectionIds !== undefined) {\n payload.collection_ids = options.collectionIds;\n }\n\n if (Object.keys(payload).length === 0) {\n throw new NebulaValidationException(\n 'At least one field (name, metadata, or collectionIds) must be provided to update'\n );\n }\n\n try {\n await this._makeRequest('PATCH', `/v1/memories/${options.memoryId}`, payload);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(options.memoryId, 'Memory');\n }\n throw error;\n }\n }\n\n /** Delete a conversation and all its messages */\n async deleteConversation(conversationId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/conversations/${conversationId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /**\n * Get all memories from specific collections with optional metadata filtering\n *\n * @param options - Configuration for listing memories\n * @param options.collection_ids - One or more collection IDs to retrieve memories from\n * @param options.limit - Maximum number of memories to return (default: 100)\n * @param options.offset - Number of memories to skip for pagination (default: 0)\n * @param options.metadata_filters - Optional metadata filters using MongoDB-like operators.\n * Supported operators: $eq, $ne, $in, $nin, $exists, $and, $or\n *\n * @returns Promise resolving to array of MemoryResponse objects\n *\n * @example\n * // Get all playground memories excluding conversations\n * const memories = await client.listMemories({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * 'metadata.content_type': { $ne: 'conversation' }\n * }\n * });\n *\n * @example\n * // Complex filter with multiple conditions\n * const memories = await client.listMemories({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * $and: [\n * { 'metadata.playground': { $eq: true } },\n * { 'metadata.session_id': { $exists: true } }\n * ]\n * }\n * });\n */\n async listMemories(options: {\n collection_ids: string | string[];\n limit?: number;\n offset?: number;\n metadata_filters?: Record<string, any>;\n }): Promise<MemoryResponse[]> {\n const ids = Array.isArray(options.collection_ids) ? options.collection_ids : [options.collection_ids];\n if (!ids.length) {\n throw new NebulaClientException('collection_ids must be provided to list_memories().');\n }\n\n const params: Record<string, any> = {\n limit: options.limit ?? 100,\n offset: options.offset ?? 0,\n collection_ids: ids\n };\n\n // Add metadata_filters if provided (serialize to JSON string for query parameter)\n if (options.metadata_filters) {\n params.metadata_filters = JSON.stringify(options.metadata_filters);\n }\n\n const response = await this._makeRequest('GET', '/v1/memories', undefined, params);\n\n let documents: any[];\n if (response.results) {\n documents = response.results;\n } else if (Array.isArray(response)) {\n documents = response;\n } else {\n documents = [response];\n }\n\n return documents.map((doc) => this._memoryResponseFromDict(doc, ids));\n }\n\n /** Get a specific memory by engram ID */\n async getMemory(memoryId: string): Promise<MemoryResponse> {\n const response = await this._makeRequest('GET', `/v1/memories/${memoryId}`);\n\n const content = response.text || response.content;\n const chunks = Array.isArray(response.chunks) ? response.chunks : undefined;\n\n const memoryData = {\n id: response.id,\n content,\n chunks,\n metadata: response.metadata || {},\n collection_ids: response.collection_ids || [],\n };\n\n return this._memoryResponseFromDict(memoryData, []);\n }\n\n // Search Methods\n\n /**\n * Search within specific collections with optional metadata filtering.\n *\n * @param options - Search configuration\n * @param options.query - Search query string\n * @param options.collection_ids - One or more collection IDs to search within\n * @param options.limit - Maximum number of results to return (default: 10)\n * @param options.retrieval_type - Retrieval strategy (default: ADVANCED)\n * @param options.filters - Optional filters to apply to the search. Supports comprehensive metadata filtering\n * with MongoDB-like operators for both vector/chunk search and graph search.\n * @param options.searchSettings - Optional search configuration\n *\n * @returns Promise resolving to array of SearchResult objects containing both vector/chunk and graph search results\n *\n * @example\n * // Basic equality filter\n * await client.search({\n * query: \"machine learning\",\n * collection_ids: [\"research-collection\"],\n * filters: {\n * \"metadata.category\": { $eq: \"research\" },\n * \"metadata.verified\": true // Shorthand for $eq\n * }\n * });\n *\n * @example\n * // Numeric comparisons\n * await client.search({\n * query: \"high priority\",\n * collection_ids: [\"tasks\"],\n * filters: {\n * \"metadata.priority\": { $gte: 8 },\n * \"metadata.score\": { $lt: 100 }\n * }\n * });\n *\n * @example\n * // String matching\n * await client.search({\n * query: \"employees\",\n * collection_ids: [\"team\"],\n * filters: {\n * \"metadata.email\": { $ilike: \"%@company.com\" } // Case-insensitive\n * }\n * });\n *\n * @example\n * // Array operations\n * await client.search({\n * query: \"developers\",\n * collection_ids: [\"team\"],\n * filters: {\n * \"metadata.skills\": { $overlap: [\"python\", \"typescript\"] } // Has any\n * }\n * });\n *\n * @example\n * // Nested paths\n * await client.search({\n * query: \"users\",\n * collection_ids: [\"profiles\"],\n * filters: {\n * \"metadata.user.preferences.theme\": { $eq: \"dark\" }\n * }\n * });\n *\n * @example\n * // Complex logical combinations\n * await client.search({\n * query: \"candidates\",\n * collection_ids: [\"hiring\"],\n * filters: {\n * $and: [\n * { \"metadata.verified\": true },\n * { \"metadata.level\": { $gte: 5 } },\n * {\n * $or: [\n * { \"metadata.skills\": { $overlap: [\"python\", \"go\"] } },\n * { \"metadata.years_experience\": { $gte: 8 } }\n * ]\n * }\n * ]\n * }\n * });\n *\n * @remarks\n * Supported Operators:\n * - Comparison: $eq, $ne, $lt, $lte, $gt, $gte\n * - String: $like (case-sensitive), $ilike (case-insensitive)\n * - Array: $in, $nin, $overlap, $contains\n * - JSONB: $json_contains\n * - Logical: $and, $or\n *\n * For comprehensive filtering documentation, see the Metadata Filtering Guide:\n * https://docs.nebulacloud.app/guides/metadata-filtering\n */\n async search(options: {\n query: string;\n collection_ids: string | string[];\n limit?: number;\n filters?: Record<string, any>;\n search_mode?: 'fast' | 'super';\n searchSettings?: Record<string, any>;\n }): Promise<SearchResult[]> {\n const collectionIds = Array.isArray(options.collection_ids) ? options.collection_ids : [options.collection_ids];\n // Filter out empty/invalid collection IDs\n const validCollectionIds = collectionIds.filter(id => id && id.trim() !== '');\n if (!validCollectionIds.length) {\n throw new NebulaClientException('collection_ids must be provided to search().');\n }\n\n const limit = options.limit ?? 10;\n const searchMode = options.search_mode ?? 'super';\n\n // Build effective search settings with simplified structure\n const effectiveSettings: Record<string, any> = {\n ...options.searchSettings\n };\n effectiveSettings.limit = limit;\n\n const userFilters = { ...effectiveSettings.filters } as Record<string, any>;\n if (options.filters) {\n Object.assign(userFilters, options.filters);\n }\n userFilters.collection_ids = { $overlap: validCollectionIds };\n effectiveSettings.filters = userFilters;\n\n const data = {\n query: options.query,\n search_mode: searchMode,\n search_settings: effectiveSettings,\n };\n\n const response = await this._makeRequest('POST', '/v1/retrieval/search', data);\n\n let chunkResults: any[] = [];\n let graphResults: any[] = [];\n\n if (response.results) {\n chunkResults = response.results.chunk_search_results || [];\n graphResults = response.results.graph_search_results || [];\n }\n\n const out: SearchResult[] = [];\n out.push(...chunkResults.map((result) => this._searchResultFromDict(result)));\n for (const g of graphResults) {\n out.push(this._searchResultFromGraphDict(g));\n }\n\n return out;\n }\n\n /**\n * Legacy wrapper: store a two-message conversation turn as a document\n */\n async storeConversation(\n userMessage: string,\n assistantMessage: string,\n collectionId: string,\n sessionId: string\n ): Promise<MemoryResponse> {\n const content = `User: ${String(userMessage || '')}\\nAssistant: ${String(assistantMessage || '')}`;\n const metadata = { session_id: sessionId, content_type: 'conversation' } as Record<string, any>;\n return this.store(content, collectionId, metadata);\n }\n\n /**\n * Legacy wrapper: search conversations optionally scoped by session\n */\n async searchConversations(\n query: string,\n collectionId: string,\n sessionId?: string,\n includeAllSessions: boolean = true\n ): Promise<SearchResult[]> {\n const filters: Record<string, any> = { 'metadata.content_type': 'conversation' };\n if (sessionId && !includeAllSessions) {\n (filters as any)['metadata.session_id'] = sessionId;\n }\n return this.search({\n query,\n collection_ids: [collectionId],\n limit: 10,\n filters\n });\n }\n\n // Health Check\n async healthCheck(): Promise<Record<string, any>> {\n return this._makeRequest('GET', '/health');\n }\n\n // Helpers\n\n private _collectionFromDict(data: any): Collection {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const collectionId = String(data.id || '');\n const collectionName = data.name || '';\n const collectionDescription = data.description;\n const collectionOwnerId = data.owner_id ? String(data.owner_id) : undefined;\n const memoryCount = data.document_count || 0;\n\n const metadata = {\n graph_collection_status: data.graph_collection_status || '',\n graph_sync_status: data.graph_sync_status || '',\n user_count: data.user_count || 0,\n document_count: data.document_count || 0,\n };\n\n return {\n id: collectionId,\n name: collectionName,\n description: collectionDescription,\n metadata,\n created_at: createdAt,\n updated_at: updatedAt,\n memory_count: memoryCount,\n owner_id: collectionOwnerId,\n } as Collection;\n }\n\n private _memoryResponseFromDict(data: any, collectionIds: string[]): MemoryResponse {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const engramId = String(data.id || '');\n const content = data.content || data.text;\n let chunks: string[] | undefined;\n\n if (data.chunks && Array.isArray(data.chunks)) {\n if (data.chunks.every((x: any) => typeof x === 'string')) {\n chunks = data.chunks;\n } else {\n chunks = data.chunks\n .filter((item: any) => item && typeof item === 'object' && 'text' in item)\n .map((item: any) => item.text);\n }\n }\n\n const metadata = { ...data.metadata };\n if (data.engram_id) {\n (metadata as any).engram_id = data.engram_id;\n }\n\n let finalId = engramId;\n if (data.engram_id && !engramId) {\n finalId = data.engram_id;\n }\n\n if (data.document_metadata) {\n Object.assign(metadata, data.document_metadata);\n }\n\n return {\n id: finalId,\n content,\n chunks,\n metadata,\n collection_ids: data.collection_ids || collectionIds,\n created_at: createdAt,\n updated_at: updatedAt,\n } as MemoryResponse;\n }\n\n private _searchResultFromDict(data: any): SearchResult {\n const content = data.content || data.text || '';\n const resultId = data.id || data.chunk_id || '';\n\n return {\n id: String(resultId),\n content: String(content),\n score: Number(data.score || 0.0),\n metadata: data.metadata || {},\n source: data.source,\n };\n }\n\n private _searchResultFromGraphDict(data: any): SearchResult {\n const rid = data.id ? String(data.id) : '';\n const rtype =\n GraphSearchResultType[(data.result_type || 'entity').toUpperCase() as keyof typeof GraphSearchResultType] ||\n GraphSearchResultType.ENTITY;\n const content = data.content || {};\n const score = data.score !== undefined ? Number(data.score) : 0.0;\n const metadata = data.metadata || {};\n const chunkIds = Array.isArray(data.chunk_ids) ? data.chunk_ids : undefined;\n let timestamp: string | undefined;\n if (data.timestamp) {\n if (typeof data.timestamp === 'string') {\n timestamp = data.timestamp;\n } else if (data.timestamp instanceof Date) {\n timestamp = data.timestamp.toISOString();\n } else {\n const parsed = new Date(data.timestamp);\n if (!Number.isNaN(parsed.valueOf())) {\n timestamp = parsed.toISOString();\n }\n }\n }\n\n const displayName = typeof data.display_name === 'string' ? data.display_name : undefined;\n const sourceRole = typeof data.source_role === 'string' ? data.source_role : undefined;\n const engramId = data.engram_id ? String(data.engram_id) : undefined;\n const ownerId = data.owner_id ? String(data.owner_id) : undefined;\n\n let entity: GraphEntityResult | undefined;\n let rel: GraphRelationshipResult | undefined;\n let comm: GraphCommunityResult | undefined;\n\n if (rtype === GraphSearchResultType.ENTITY) {\n entity = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n description: content.description || '',\n metadata: content.metadata || {},\n };\n } else if (rtype === GraphSearchResultType.RELATIONSHIP) {\n rel = {\n id: content.id ? String(content.id) : undefined,\n subject: content.subject || '',\n predicate: content.predicate || '',\n object: content.object || '',\n subject_id: content.subject_id ? String(content.subject_id) : undefined,\n object_id: content.object_id ? String(content.object_id) : undefined,\n description: content.description,\n metadata: content.metadata || {},\n };\n } else {\n comm = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n summary: content.summary || '',\n metadata: content.metadata || {},\n };\n }\n\n return {\n id: rid,\n score,\n metadata,\n source: 'graph',\n content: undefined,\n graph_result_type: rtype,\n graph_entity: entity,\n graph_relationship: rel,\n graph_community: comm,\n chunk_ids: chunkIds,\n timestamp,\n display_name: displayName,\n source_role: sourceRole,\n engram_id: engramId,\n owner_id: ownerId,\n } as SearchResult;\n }\n\n private async _sha256(message: string): Promise<string> {\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private _formDataFromObject(obj: Record<string, any>): FormData {\n const formData = new FormData();\n Object.entries(obj).forEach(([key, value]) => {\n formData.append(key, value as any);\n });\n return formData;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":["GraphSearchResultType","response","docMetadata","data","url","headers","respData"],"mappings":"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","file":"index.js","sourcesContent":["// Data models matching the actual Nebula Python SDK exactly\n\n// Enums\nexport enum GraphSearchResultType {\n ENTITY = \"entity\",\n RELATIONSHIP = \"relationship\",\n COMMUNITY = \"community\"\n}\n\n// Core interfaces matching Python SDK exactly\nexport interface Chunk {\n id: string;\n content: string;\n metadata: Record<string, any>;\n role?: string; // For conversation messages\n}\n\nexport interface MemoryResponse {\n id: string;\n content?: string;\n chunks?: Chunk[];\n metadata: Record<string, any>;\n collection_ids: string[];\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Memory {\n collection_id: string;\n content: string | string[] | Array<{content: string; role: string; metadata?: Record<string, any>; authority?: number}>;\n role?: string; // user, assistant, or custom\n memory_id?: string; // ID of existing memory to append to\n metadata: Record<string, any>;\n authority?: number; // Optional authority score (0.0 - 1.0)\n}\n\nexport interface Collection {\n id: string;\n name: string;\n description?: string;\n metadata: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n memory_count: number;\n owner_id?: string;\n}\n\nexport interface SearchResult {\n id: string; // chunk_id\n score: number;\n metadata: Record<string, any>;\n source?: string;\n timestamp?: string;\n display_name?: string;\n source_role?: string;\n memory_id?: string; // Parent memory/conversation container\n owner_id?: string;\n\n // Chunk fields\n content?: string;\n\n // Graph variant discriminator and payload\n graph_result_type?: GraphSearchResultType;\n graph_entity?: GraphEntityResult;\n graph_relationship?: GraphRelationshipResult;\n graph_community?: GraphCommunityResult;\n chunk_ids?: string[];\n}\n\nexport interface GraphEntityResult {\n id?: string;\n name: string;\n description: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphRelationshipResult {\n id?: string;\n subject: string;\n predicate: string;\n object: string;\n subject_id?: string;\n object_id?: string;\n description?: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphCommunityResult {\n id?: string;\n name: string;\n summary: string;\n metadata: Record<string, any>;\n}\n\nexport interface AgentResponse {\n content: string;\n agent_id: string;\n conversation_id?: string;\n metadata: Record<string, any>;\n citations: Record<string, any>[];\n}\n\nexport interface SearchOptions {\n limit: number;\n filters?: Record<string, any>;\n search_mode?: 'fast' | 'super';\n}\n\n// Configuration interface\nexport interface NebulaClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n}\n\n// Error types matching Python SDK\nexport class NebulaException extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'NebulaException';\n }\n}\n\nexport class NebulaClientException extends NebulaException {\n constructor(message: string, public cause?: Error) {\n super(message);\n this.name = 'NebulaClientException';\n }\n}\n\nexport class NebulaAuthenticationException extends NebulaException {\n constructor(message: string = 'Invalid API key') {\n super(message, 401);\n this.name = 'NebulaAuthenticationException';\n }\n}\n\nexport class NebulaRateLimitException extends NebulaException {\n constructor(message: string = 'Rate limit exceeded') {\n super(message, 429);\n this.name = 'NebulaRateLimitException';\n }\n}\n\nexport class NebulaValidationException extends NebulaException {\n constructor(message: string = 'Validation error', public details?: any) {\n super(message, 400);\n this.name = 'NebulaValidationException';\n }\n}\n\nexport class NebulaCollectionNotFoundException extends NebulaException {\n constructor(message: string = 'Collection not found') {\n super(message, 404);\n this.name = 'NebulaCollectionNotFoundException';\n }\n}\n\nexport class NebulaNotFoundException extends NebulaException {\n constructor(resourceId: string, resourceType: string = 'Resource') {\n super(`${resourceType} not found: ${resourceId}`, 404);\n this.name = 'NebulaNotFoundException';\n }\n}\n","import {\n Memory,\n MemoryResponse,\n Collection,\n SearchResult,\n GraphSearchResultType,\n GraphEntityResult,\n GraphRelationshipResult,\n GraphCommunityResult,\n NebulaClientConfig,\n NebulaException,\n NebulaClientException,\n NebulaAuthenticationException,\n NebulaRateLimitException,\n NebulaValidationException,\n NebulaNotFoundException,\n} from './types';\n\n/**\n * Official Nebula JavaScript/TypeScript SDK\n * Mirrors the exact Nebula Python SDK client.py implementation\n */\nexport class NebulaClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(config: NebulaClientConfig) {\n this.apiKey = config.apiKey;\n if (!this.apiKey) {\n throw new NebulaClientException(\n 'API key is required. Pass it to the constructor or set NEBULA_API_KEY environment variable.'\n );\n }\n\n this.baseUrl = (config.baseUrl || 'https://api.nebulacloud.app').replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n }\n\n // Public mutators used by tests\n setApiKey(next: string) {\n this.apiKey = next;\n }\n setBaseUrl(next: string) {\n this.baseUrl = (next || this.baseUrl).replace(/\\/$/, '');\n }\n // Kept for backwards-compat tests; no-op in current implementation\n setCorsProxy(_next: string) {\n // no-op\n }\n\n /** Check if API key is set */\n isApiKeySet(): boolean {\n return !!(this.apiKey && this.apiKey.trim() !== '');\n }\n\n /** Detect if a token looks like a Nebula API key (public.raw) */\n private _isNebulaApiKey(token?: string): boolean {\n const candidate = token || this.apiKey;\n if (!candidate) return false;\n const parts = candidate.split('.');\n if (parts.length !== 2) return false;\n const [publicPart, rawPart] = parts;\n return publicPart.startsWith('key_') && !!rawPart && rawPart.length > 0;\n }\n\n /** Build authentication headers */\n private _buildAuthHeaders(includeContentType: boolean = true): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this._isNebulaApiKey()) {\n headers['X-API-Key'] = this.apiKey;\n } else {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (includeContentType) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n }\n\n /** Make an HTTP request to the Nebula API */\n private async _makeRequest(\n method: string,\n endpoint: string,\n jsonData?: any, // Can be object, array, or primitive for JSON body\n params?: Record<string, any>\n ): Promise<any> {\n const url = new URL(endpoint, this.baseUrl);\n\n if (params) {\n console.log('SDK: _makeRequest params before processing:', params);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n // Handle array parameters (e.g., collection_ids)\n if (Array.isArray(value)) {\n console.log(`SDK: Adding array param ${key}:`, value);\n value.forEach((item) => {\n url.searchParams.append(key, String(item));\n console.log(`SDK: Appended ${key}=${item} to URL`);\n });\n } else {\n console.log(`SDK: Adding single param ${key}:`, value);\n url.searchParams.append(key, String(value));\n }\n }\n });\n }\n\n console.log('SDK: Final URL being requested:', url.toString());\n\n const headers = this._buildAuthHeaders(true);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: jsonData ? JSON.stringify(jsonData) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200 || response.status === 202) {\n return await response.json();\n } else if (response.status === 401) {\n throw new NebulaAuthenticationException('Invalid API key');\n } else if (response.status === 429) {\n throw new NebulaRateLimitException('Rate limit exceeded');\n } else if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaValidationException(errorData.message || 'Validation error', errorData.details);\n } else if (response.status === 422) {\n const errorData = await response.json().catch(() => ({}));\n console.error('[SDK] 422 Validation error - Full details:');\n console.error(' Status:', response.status);\n console.error(' Error data:', JSON.stringify(errorData, null, 2));\n console.error(' Message:', errorData.message);\n console.error(' Detail:', errorData.detail);\n throw new NebulaValidationException(\n errorData.message || (typeof errorData.detail === 'string' ? errorData.detail : JSON.stringify(errorData.detail)) || 'Validation error',\n errorData\n );\n } else {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(errorData.message || `API error: ${response.status}`, response.status, errorData);\n }\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof NebulaException) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new NebulaClientException(`Request timed out after ${this.timeout} milliseconds`);\n }\n\n if (error instanceof Error) {\n throw new NebulaClientException(`Request failed: ${error.message}`, error);\n }\n\n throw new NebulaClientException(`Request failed: ${String(error)}`);\n }\n }\n\n // Collection Management Methods\n\n /** Create a new collection */\n async createCollection(options: {\n name: string;\n description?: string;\n metadata?: Record<string, any>;\n }): Promise<Collection> {\n const data: Record<string, any> = { name: options.name };\n if (options.description) data.description = options.description;\n if (options.metadata) data.metadata = options.metadata;\n\n const response = await this._makeRequest('POST', '/v1/collections', data);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get a specific collection by ID */\n async getCollection(collectionId: string): Promise<Collection> {\n const response = await this._makeRequest('GET', `/v1/collections/${collectionId}`);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get a specific collection by name */\n async getCollectionByName(name: string): Promise<Collection> {\n const response = await this._makeRequest('GET', `/v1/collections/name/${name}`);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get all collections */\n async listCollections(options?: {\n limit?: number;\n offset?: number;\n }): Promise<Collection[]> {\n const params = {\n limit: options?.limit ?? 100,\n offset: options?.offset ?? 0\n };\n const response = await this._makeRequest('GET', '/v1/collections', undefined, params);\n\n let collections: any[];\n if (response.results) {\n collections = response.results;\n } else if (Array.isArray(response)) {\n collections = response;\n } else {\n collections = [response];\n }\n\n return collections.map((collection) => this._collectionFromDict(collection));\n }\n\n // Conversations Methods\n\n /**\n * List conversations for the authenticated user with optional metadata filtering\n *\n * @param options - Configuration for listing conversations\n * @param options.limit - Maximum number of conversations to return (default: 100)\n * @param options.offset - Number of conversations to skip for pagination (default: 0)\n * @param options.collection_ids - Optional list of collection IDs to filter conversations by\n * @param options.metadata_filters - Optional metadata filters using MongoDB-like operators.\n * Supported operators: $eq, $ne, $in, $nin, $exists, $and, $or\n *\n * @returns Promise resolving to array of conversation objects with fields: id, created_at, user_id, name, collection_ids\n *\n * @example\n * // Get all playground conversations\n * const conversations = await client.listConversations({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * 'metadata.playground': { $eq: true }\n * }\n * });\n *\n * @example\n * // Filter by session ID\n * const conversations = await client.listConversations({\n * metadata_filters: {\n * 'metadata.session_id': { $eq: 'session-123' }\n * }\n * });\n */\n async listConversations(options?: {\n limit?: number;\n offset?: number;\n collection_ids?: string[];\n metadata_filters?: Record<string, any>;\n }): Promise<any[]> {\n const params: Record<string, any> = {\n limit: options?.limit ?? 100,\n offset: options?.offset ?? 0\n };\n // Convert collection_ids to collection_ids for the API\n if (options?.collection_ids && options.collection_ids.length > 0) {\n params.collection_ids = options.collection_ids;\n }\n // Add metadata_filters if provided (serialize to JSON string for query parameter)\n if (options?.metadata_filters) {\n params.metadata_filters = JSON.stringify(options.metadata_filters);\n }\n const response = await this._makeRequest('GET', '/v1/memories', undefined, params);\n\n let conversations: any[];\n if (response && response.results) {\n conversations = response.results;\n } else if (Array.isArray(response)) {\n conversations = response;\n } else {\n conversations = response ? [response] : [];\n }\n\n return conversations;\n }\n\n /** Get conversation messages directly from the conversations API */\n async getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;\n async getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;\n async getConversationMessages(conversationIdOrIds: string | string[]): Promise<MemoryResponse[] | Record<string, MemoryResponse[]>> {\n // Handle single conversation ID (backward compatibility)\n if (typeof conversationIdOrIds === 'string') {\n const response = await this._makeRequest('GET', `/v1/memories/${conversationIdOrIds}`);\n\n if (!response || !response.results) {\n return [];\n }\n\n return this._transformConversationMessages(response.results);\n }\n\n // Handle multiple conversation IDs\n if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {\n return {};\n }\n\n // Use GET request with ids query parameter for batch retrieval\n // This performs a single SQL query with IN clause for optimal performance\n const params = { ids: conversationIdOrIds };\n const response = await this._makeRequest('GET', '/v1/memories', undefined, params);\n\n console.log('🔍 SDK: Raw batch response:', response);\n console.log('🔍 SDK: Response has results?', !!response?.results);\n if (response?.results) {\n console.log('🔍 SDK: Results keys:', Object.keys(response.results));\n console.log('🔍 SDK: Sample result:', Object.keys(response.results)[0], ':', response.results[Object.keys(response.results)[0]]);\n }\n\n const results: Record<string, MemoryResponse[]> = {};\n\n if (response && response.results) {\n // Backend returns { \"results\": { \"results\": { conversation_id: MessageResponse[] } } } format (double-nested)\n const batchResults = response.results.results || response.results;\n console.log('🔍 SDK: Processing', Object.keys(batchResults).length, 'conversations');\n for (const [conversationId, messages] of Object.entries(batchResults)) {\n if (Array.isArray(messages)) {\n const transformed = this._transformConversationMessages(messages as any[]);\n results[conversationId] = transformed;\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: ${messages.length} raw -> ${transformed.length} transformed`);\n } else {\n results[conversationId] = [];\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: not array, setting empty`);\n }\n }\n }\n\n // Ensure all requested conversation IDs are present in results (even if empty)\n for (const conversationId of conversationIdOrIds) {\n if (!(conversationId in results)) {\n results[conversationId] = [];\n }\n }\n\n return results;\n }\n\n /** Helper method to transform conversation messages to MemoryResponse format */\n private _transformConversationMessages(messageResponses: any[]): MemoryResponse[] {\n return messageResponses.map((msgResp: any) => {\n const msgId = String(msgResp.id || '');\n const msg = msgResp.message || {}; // The actual Message object\n const metadata = msgResp.metadata || {};\n\n // Normalize content to a string - could be string or object\n let text: string = '';\n const rawContent = msg.content;\n if (typeof rawContent === 'string') {\n text = rawContent;\n } else if (rawContent && typeof rawContent === 'object') {\n // Handle structured content\n text = String(rawContent.content || rawContent.text || JSON.stringify(rawContent));\n } else if (rawContent != null) {\n text = String(rawContent);\n }\n\n // Get role from the Message object\n const role = msg.role || metadata.role || 'user';\n\n // Merge message metadata with response metadata\n const combinedMetadata = {\n ...metadata,\n role, // Ensure role is in metadata for UI compatibility\n };\n\n return {\n id: msgId,\n content: text,\n metadata: combinedMetadata,\n created_at: msgResp.created_at,\n collection_ids: msgResp.collection_ids || [],\n } as MemoryResponse;\n });\n }\n\n /** Update a collection */\n async updateCollection(options: {\n collectionId: string;\n name?: string;\n description?: string;\n metadata?: Record<string, any>;\n }): Promise<Collection> {\n const data: Record<string, any> = {};\n if (options.name !== undefined) data.name = options.name;\n if (options.description !== undefined) data.description = options.description;\n if (options.metadata !== undefined) data.metadata = options.metadata;\n\n const response = await this._makeRequest('POST', `/v1/collections/${options.collectionId}`, data);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Delete a collection */\n async deleteCollection(collectionId: string): Promise<boolean> {\n await this._makeRequest('DELETE', `/v1/collections/${collectionId}`);\n return true;\n }\n\n // Memory Management Methods\n\n /**\n * Legacy convenience: store raw text content into a collection as a document\n */\n async store(content: string, collectionId: string, metadata: Record<string, any> = {}): Promise<MemoryResponse> {\n const docMetadata = {\n ...metadata,\n memory_type: 'memory',\n timestamp: new Date().toISOString(),\n } as Record<string, any>;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([collectionId]),\n raw_text: String(content || ''),\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create engram: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n const id = respData?.results?.engram_id || respData?.results?.id || respData?.id || '';\n\n const result: MemoryResponse = {\n id: String(id),\n content: String(content || ''),\n metadata: docMetadata,\n collection_ids: [collectionId],\n created_at: docMetadata.timestamp,\n updated_at: docMetadata.timestamp,\n };\n return result;\n }\n\n /**\n * Store a single memory using the unified engrams API.\n *\n * Automatically infers memory type:\n * - If role is present, creates a conversation\n * - Otherwise, creates a document\n */\n async storeMemory(\n memory: Memory | Record<string, any>,\n name?: string\n ): Promise<string> {\n let mem: Memory;\n\n if ('collection_id' in memory) {\n mem = memory as Memory;\n } else {\n mem = {\n collection_id: (memory as any).collection_id,\n content: (memory as any).content || '',\n role: (memory as any).role,\n memory_id: (memory as any).memory_id,\n metadata: (memory as any).metadata || {},\n };\n }\n\n // If memory_id is present, append to existing memory\n if (mem.memory_id) {\n return await this._appendToMemory(mem.memory_id, mem);\n }\n\n // Automatically infer memory type from role presence\n const memoryType = mem.role ? 'conversation' : 'document';\n\n // Handle conversation creation\n if (memoryType === 'conversation') {\n // Use new unified POST /v1/memories endpoint\n const docMetadata = { ...mem.metadata };\n const data = {\n engram_type: 'conversation',\n name: name || 'Conversation',\n metadata: JSON.stringify(docMetadata),\n collection_ids: JSON.stringify([mem.collection_id]),\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create conversation: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n const convId = respData.results.engram_id || respData.results.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n\n // If content and role provided, append initial message\n if (mem.content && mem.role) {\n const appendMem: Memory = {\n collection_id: mem.collection_id,\n content: [\n {\n content: String(mem.content),\n role: mem.role,\n metadata: mem.metadata,\n ...(typeof (mem as any).authority === 'number' ? { authority: Number((mem as any).authority) } : {})\n },\n ],\n memory_id: convId,\n metadata: {},\n };\n await this._appendToMemory(convId, appendMem);\n }\n\n return String(convId);\n }\n throw new NebulaClientException('Failed to create conversation: invalid response format');\n }\n\n // Handle document/text memory\n const contentText = String(mem.content || '');\n if (!contentText) {\n throw new NebulaClientException('Content is required for document memories');\n }\n\n const contentHash = await this._sha256(contentText);\n const docMetadata = { ...mem.metadata } as Record<string, any>;\n docMetadata.memory_type = 'memory';\n docMetadata.content_hash = contentHash;\n // If authority provided for document, persist in metadata for ranking\n if (typeof (mem as any).authority === 'number') {\n const v = Number((mem as any).authority);\n if (!Number.isNaN(v) && v >= 0 && v <= 1) {\n (docMetadata as any).authority = v;\n }\n }\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([mem.collection_id]),\n raw_text: contentText,\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create engram: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n if (respData.results.engram_id) return String(respData.results.engram_id);\n if (respData.results.id) return String(respData.results.id);\n }\n return '';\n }\n\n /**\n * Internal method to append content to an existing engram\n *\n * @throws NebulaNotFoundException if engram_id doesn't exist\n */\n private async _appendToMemory(memoryId: string, memory: Memory): Promise<string> {\n const collectionId = memory.collection_id;\n const content = memory.content;\n const metadata = memory.metadata;\n\n if (!collectionId) {\n throw new NebulaClientException('collection_id is required');\n }\n\n const payload: Record<string, any> = {\n collection_id: collectionId,\n };\n\n // Determine content type and set appropriate field\n if (Array.isArray(content)) {\n if (content.length > 0 && typeof content[0] === 'object' && 'content' in content[0]) {\n // Array of message objects (conversation)\n payload.messages = content;\n } else {\n // Array of strings (chunks)\n payload.chunks = content;\n }\n } else if (typeof content === 'string') {\n // Raw text string\n payload.raw_text = content;\n } else {\n throw new NebulaClientException(\n 'content must be a string, array of strings, or array of message objects'\n );\n }\n\n if (metadata) {\n payload.metadata = metadata;\n }\n\n try {\n await this._makeRequest('POST', `/v1/memories/${memoryId}/append`, payload);\n return memoryId;\n } catch (error) {\n // Convert 404 errors to NebulaNotFoundException\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(memoryId, 'Memory');\n }\n throw error;\n }\n }\n\n /** Store multiple memories using the unified engrams API */\n async storeMemories(memories: Memory[]): Promise<string[]> {\n const results: string[] = [];\n const convGroups: Record<string, Memory[]> = {};\n const others: Memory[] = [];\n\n for (const m of memories) {\n if (m.role) {\n const key = m.memory_id || `__new__::${m.collection_id}`;\n if (!convGroups[key]) convGroups[key] = [];\n convGroups[key].push(m);\n } else {\n others.push(m);\n }\n }\n\n // Process conversation groups using new unified API\n for (const [key, group] of Object.entries(convGroups)) {\n const collectionId = group[0].collection_id;\n let convId: string;\n\n // Create conversation if needed\n if (key.startsWith('__new__::')) {\n // Pass a placeholder role to trigger conversation creation\n convId = await this.storeMemory(\n {\n collection_id: collectionId,\n content: '',\n role: 'assistant', // Placeholder role to infer conversation type\n metadata: {},\n },\n 'Conversation'\n );\n } else {\n convId = key;\n }\n\n // Append messages using new unified API\n const messages = group.map((m) => ({\n content: String(m.content || ''),\n role: m.role!,\n metadata: m.metadata || {},\n }));\n\n const appendMem: Memory = {\n collection_id: collectionId,\n content: messages,\n memory_id: convId,\n metadata: {},\n };\n await this._appendToMemory(convId, appendMem);\n\n results.push(...Array(group.length).fill(String(convId)));\n }\n\n // Process others (text/json) individually\n for (const m of others) {\n results.push(await this.storeMemory(m));\n }\n\n return results;\n }\n\n /** Delete one or more memories */\n async delete(memoryIds: string | string[]): Promise<boolean | {\n message: string;\n results: {\n successful: string[];\n failed: Array<{ id: string; error: string }>;\n summary: {\n total: number;\n succeeded: number;\n failed: number;\n };\n };\n }> {\n try {\n console.log('[SDK] delete() called with:', { memoryIds, type: typeof memoryIds, isArray: Array.isArray(memoryIds) });\n\n // Handle single ID vs array\n if (typeof memoryIds === 'string') {\n console.log('[SDK] Single deletion path for ID:', memoryIds);\n // Single deletion - try existing endpoint first for backward compatibility\n try {\n await this._makeRequest('DELETE', `/v1/memories/${memoryIds}`);\n return true;\n } catch {\n // Fall back to new unified endpoint\n try {\n console.log('[SDK] Falling back to POST /v1/memories/delete with single ID');\n // Send the UUID string directly as body (not wrapped in {ids: ...})\n const response = await this._makeRequest('POST', '/v1/memories/delete', memoryIds);\n return typeof response === 'object' && response.success !== undefined\n ? response.success\n : true;\n } catch (error) {\n throw error;\n }\n }\n } else {\n console.log('[SDK] Batch deletion path for IDs:', memoryIds);\n console.log('[SDK] Sending POST request with body:', memoryIds);\n // Batch deletion - send array directly as body (not wrapped in {ids: ...})\n // FastAPI Body() without embed=True expects the value directly\n const response = await this._makeRequest('POST', '/v1/memories/delete', memoryIds);\n console.log('[SDK] Batch deletion response:', response);\n return response;\n }\n } catch (error) {\n console.error('[SDK] Delete error:', error);\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Delete a specific chunk or message within a memory */\n async deleteChunk(chunkId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/chunks/${chunkId}`);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(chunkId, 'Chunk');\n }\n throw error;\n }\n }\n\n /** Update a specific chunk or message within a memory */\n async updateChunk(\n chunkId: string,\n content: string,\n metadata?: Record<string, any>\n ): Promise<boolean> {\n const payload: any = { content };\n if (metadata !== undefined) {\n payload.metadata = metadata;\n }\n\n try {\n await this._makeRequest('PATCH', `/v1/chunks/${chunkId}`, payload);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(chunkId, 'Chunk');\n }\n throw error;\n }\n }\n\n /**\n * Update memory-level properties including name, metadata, and collection associations.\n *\n * This method allows updating properties of an entire memory (document or conversation)\n * without modifying its content. For updating individual chunks or messages within a memory,\n * use updateChunk(). For updating content, use storeMemory() to append.\n *\n * @param options - Update configuration\n * @param options.memoryId - The ID of the memory to update\n * @param options.name - New name for the memory (useful for conversations and documents)\n * @param options.metadata - Metadata to set. By default, replaces existing metadata.\n * Set mergeMetadata=true to merge with existing metadata instead.\n * @param options.collectionIds - New collection associations. Must specify at least one valid collection.\n * @param options.mergeMetadata - If true, merges provided metadata with existing metadata.\n * If false (default), replaces existing metadata entirely.\n *\n * @returns Promise resolving to true if successful\n *\n * @throws NebulaNotFoundException if memory_id doesn't exist\n * @throws NebulaValidationException if validation fails (e.g., no fields provided)\n * @throws NebulaAuthenticationException if user doesn't have permission to update this memory\n */\n async updateMemory(options: {\n memoryId: string;\n name?: string;\n metadata?: Record<string, any>;\n collectionIds?: string[];\n mergeMetadata?: boolean;\n }): Promise<boolean> {\n const payload: any = {};\n\n if (options.name !== undefined) {\n payload.name = options.name;\n }\n if (options.metadata !== undefined) {\n payload.metadata = options.metadata;\n payload.merge_metadata = options.mergeMetadata ?? false;\n }\n if (options.collectionIds !== undefined) {\n payload.collection_ids = options.collectionIds;\n }\n\n if (Object.keys(payload).length === 0) {\n throw new NebulaValidationException(\n 'At least one field (name, metadata, or collectionIds) must be provided to update'\n );\n }\n\n try {\n await this._makeRequest('PATCH', `/v1/memories/${options.memoryId}`, payload);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(options.memoryId, 'Memory');\n }\n throw error;\n }\n }\n\n /** Delete a conversation and all its messages */\n async deleteConversation(conversationId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/memories/${conversationId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /**\n * Get all memories from specific collections with optional metadata filtering\n *\n * @param options - Configuration for listing memories\n * @param options.collection_ids - One or more collection IDs to retrieve memories from\n * @param options.limit - Maximum number of memories to return (default: 100)\n * @param options.offset - Number of memories to skip for pagination (default: 0)\n * @param options.metadata_filters - Optional metadata filters using MongoDB-like operators.\n * Supported operators: $eq, $ne, $in, $nin, $exists, $and, $or\n *\n * @returns Promise resolving to array of MemoryResponse objects\n *\n * @example\n * // Get all playground memories excluding conversations\n * const memories = await client.listMemories({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * 'metadata.content_type': { $ne: 'conversation' }\n * }\n * });\n *\n * @example\n * // Complex filter with multiple conditions\n * const memories = await client.listMemories({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * $and: [\n * { 'metadata.playground': { $eq: true } },\n * { 'metadata.session_id': { $exists: true } }\n * ]\n * }\n * });\n */\n async listMemories(options: {\n collection_ids: string | string[];\n limit?: number;\n offset?: number;\n metadata_filters?: Record<string, any>;\n }): Promise<MemoryResponse[]> {\n const ids = Array.isArray(options.collection_ids) ? options.collection_ids : [options.collection_ids];\n if (!ids.length) {\n throw new NebulaClientException('collection_ids must be provided to list_memories().');\n }\n\n const params: Record<string, any> = {\n limit: options.limit ?? 100,\n offset: options.offset ?? 0,\n collection_ids: ids\n };\n\n // Add metadata_filters if provided (serialize to JSON string for query parameter)\n if (options.metadata_filters) {\n params.metadata_filters = JSON.stringify(options.metadata_filters);\n }\n\n const response = await this._makeRequest('GET', '/v1/memories', undefined, params);\n\n let documents: any[];\n if (response.results) {\n documents = response.results;\n } else if (Array.isArray(response)) {\n documents = response;\n } else {\n documents = [response];\n }\n\n return documents.map((doc) => this._memoryResponseFromDict(doc, ids));\n }\n\n /** Get a specific memory by engram ID */\n async getMemory(memoryId: string): Promise<MemoryResponse> {\n const response = await this._makeRequest('GET', `/v1/memories/${memoryId}`);\n\n const content = response.text || response.content;\n const chunks = Array.isArray(response.chunks) ? response.chunks : undefined;\n\n const memoryData = {\n id: response.id,\n content,\n chunks,\n metadata: response.metadata || {},\n collection_ids: response.collection_ids || [],\n };\n\n return this._memoryResponseFromDict(memoryData, []);\n }\n\n // Search Methods\n\n /**\n * Search within specific collections with optional metadata filtering.\n *\n * @param options - Search configuration\n * @param options.query - Search query string\n * @param options.collection_ids - One or more collection IDs to search within\n * @param options.limit - Maximum number of results to return (default: 10)\n * @param options.retrieval_type - Retrieval strategy (default: ADVANCED)\n * @param options.filters - Optional filters to apply to the search. Supports comprehensive metadata filtering\n * with MongoDB-like operators for both vector/chunk search and graph search.\n * @param options.searchSettings - Optional search configuration\n *\n * @returns Promise resolving to array of SearchResult objects containing both vector/chunk and graph search results\n *\n * @example\n * // Basic equality filter\n * await client.search({\n * query: \"machine learning\",\n * collection_ids: [\"research-collection\"],\n * filters: {\n * \"metadata.category\": { $eq: \"research\" },\n * \"metadata.verified\": true // Shorthand for $eq\n * }\n * });\n *\n * @example\n * // Numeric comparisons\n * await client.search({\n * query: \"high priority\",\n * collection_ids: [\"tasks\"],\n * filters: {\n * \"metadata.priority\": { $gte: 8 },\n * \"metadata.score\": { $lt: 100 }\n * }\n * });\n *\n * @example\n * // String matching\n * await client.search({\n * query: \"employees\",\n * collection_ids: [\"team\"],\n * filters: {\n * \"metadata.email\": { $ilike: \"%@company.com\" } // Case-insensitive\n * }\n * });\n *\n * @example\n * // Array operations\n * await client.search({\n * query: \"developers\",\n * collection_ids: [\"team\"],\n * filters: {\n * \"metadata.skills\": { $overlap: [\"python\", \"typescript\"] } // Has any\n * }\n * });\n *\n * @example\n * // Nested paths\n * await client.search({\n * query: \"users\",\n * collection_ids: [\"profiles\"],\n * filters: {\n * \"metadata.user.preferences.theme\": { $eq: \"dark\" }\n * }\n * });\n *\n * @example\n * // Complex logical combinations\n * await client.search({\n * query: \"candidates\",\n * collection_ids: [\"hiring\"],\n * filters: {\n * $and: [\n * { \"metadata.verified\": true },\n * { \"metadata.level\": { $gte: 5 } },\n * {\n * $or: [\n * { \"metadata.skills\": { $overlap: [\"python\", \"go\"] } },\n * { \"metadata.years_experience\": { $gte: 8 } }\n * ]\n * }\n * ]\n * }\n * });\n *\n * @remarks\n * Supported Operators:\n * - Comparison: $eq, $ne, $lt, $lte, $gt, $gte\n * - String: $like (case-sensitive), $ilike (case-insensitive)\n * - Array: $in, $nin, $overlap, $contains\n * - JSONB: $json_contains\n * - Logical: $and, $or\n *\n * For comprehensive filtering documentation, see the Metadata Filtering Guide:\n * https://docs.nebulacloud.app/guides/metadata-filtering\n */\n async search(options: {\n query: string;\n collection_ids: string | string[];\n limit?: number;\n filters?: Record<string, any>;\n search_mode?: 'fast' | 'super';\n searchSettings?: Record<string, any>;\n }): Promise<SearchResult[]> {\n const collectionIds = Array.isArray(options.collection_ids) ? options.collection_ids : [options.collection_ids];\n // Filter out empty/invalid collection IDs\n const validCollectionIds = collectionIds.filter(id => id && id.trim() !== '');\n if (!validCollectionIds.length) {\n throw new NebulaClientException('collection_ids must be provided to search().');\n }\n\n const limit = options.limit ?? 10;\n const searchMode = options.search_mode ?? 'super';\n\n // Build effective search settings with simplified structure\n const effectiveSettings: Record<string, any> = {\n ...options.searchSettings\n };\n effectiveSettings.limit = limit;\n\n const userFilters = { ...effectiveSettings.filters } as Record<string, any>;\n if (options.filters) {\n Object.assign(userFilters, options.filters);\n }\n userFilters.collection_ids = { $overlap: validCollectionIds };\n effectiveSettings.filters = userFilters;\n\n const data = {\n query: options.query,\n search_mode: searchMode,\n search_settings: effectiveSettings,\n };\n\n const response = await this._makeRequest('POST', '/v1/retrieval/search', data);\n\n let chunkResults: any[] = [];\n let graphResults: any[] = [];\n\n if (response.results) {\n chunkResults = response.results.chunk_search_results || [];\n graphResults = response.results.graph_search_results || [];\n }\n\n const out: SearchResult[] = [];\n out.push(...chunkResults.map((result) => this._searchResultFromDict(result)));\n for (const g of graphResults) {\n out.push(this._searchResultFromGraphDict(g));\n }\n\n return out;\n }\n\n /**\n * Legacy wrapper: store a two-message conversation turn as a document\n */\n async storeConversation(\n userMessage: string,\n assistantMessage: string,\n collectionId: string,\n sessionId: string\n ): Promise<MemoryResponse> {\n const content = `User: ${String(userMessage || '')}\\nAssistant: ${String(assistantMessage || '')}`;\n const metadata = { session_id: sessionId, content_type: 'conversation' } as Record<string, any>;\n return this.store(content, collectionId, metadata);\n }\n\n /**\n * Legacy wrapper: search conversations optionally scoped by session\n */\n async searchConversations(\n query: string,\n collectionId: string,\n sessionId?: string,\n includeAllSessions: boolean = true\n ): Promise<SearchResult[]> {\n const filters: Record<string, any> = { 'metadata.content_type': 'conversation' };\n if (sessionId && !includeAllSessions) {\n (filters as any)['metadata.session_id'] = sessionId;\n }\n return this.search({\n query,\n collection_ids: [collectionId],\n limit: 10,\n filters\n });\n }\n\n // Health Check\n async healthCheck(): Promise<Record<string, any>> {\n return this._makeRequest('GET', '/health');\n }\n\n // Helpers\n\n private _collectionFromDict(data: any): Collection {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const collectionId = String(data.id || '');\n const collectionName = data.name || '';\n const collectionDescription = data.description;\n const collectionOwnerId = data.owner_id ? String(data.owner_id) : undefined;\n const memoryCount = data.document_count || 0;\n\n const metadata = {\n graph_collection_status: data.graph_collection_status || '',\n graph_sync_status: data.graph_sync_status || '',\n user_count: data.user_count || 0,\n document_count: data.document_count || 0,\n };\n\n return {\n id: collectionId,\n name: collectionName,\n description: collectionDescription,\n metadata,\n created_at: createdAt,\n updated_at: updatedAt,\n memory_count: memoryCount,\n owner_id: collectionOwnerId,\n } as Collection;\n }\n\n private _memoryResponseFromDict(data: any, collectionIds: string[]): MemoryResponse {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const engramId = String(data.id || '');\n const content = data.content || data.text;\n let chunks: string[] | undefined;\n\n if (data.chunks && Array.isArray(data.chunks)) {\n if (data.chunks.every((x: any) => typeof x === 'string')) {\n chunks = data.chunks;\n } else {\n chunks = data.chunks\n .filter((item: any) => item && typeof item === 'object' && 'text' in item)\n .map((item: any) => item.text);\n }\n }\n\n const metadata = { ...data.metadata };\n if (data.engram_id) {\n (metadata as any).engram_id = data.engram_id;\n }\n\n let finalId = engramId;\n if (data.engram_id && !engramId) {\n finalId = data.engram_id;\n }\n\n if (data.document_metadata) {\n Object.assign(metadata, data.document_metadata);\n }\n\n return {\n id: finalId,\n content,\n chunks,\n metadata,\n collection_ids: data.collection_ids || collectionIds,\n created_at: createdAt,\n updated_at: updatedAt,\n } as MemoryResponse;\n }\n\n private _searchResultFromDict(data: any): SearchResult {\n const content = data.content || data.text || '';\n const resultId = data.id || data.chunk_id || '';\n\n return {\n id: String(resultId),\n content: String(content),\n score: Number(data.score || 0.0),\n metadata: data.metadata || {},\n source: data.source,\n };\n }\n\n private _searchResultFromGraphDict(data: any): SearchResult {\n const rid = data.id ? String(data.id) : '';\n const rtype =\n GraphSearchResultType[(data.result_type || 'entity').toUpperCase() as keyof typeof GraphSearchResultType] ||\n GraphSearchResultType.ENTITY;\n const content = data.content || {};\n const score = data.score !== undefined ? Number(data.score) : 0.0;\n const metadata = data.metadata || {};\n const chunkIds = Array.isArray(data.chunk_ids) ? data.chunk_ids : undefined;\n let timestamp: string | undefined;\n if (data.timestamp) {\n if (typeof data.timestamp === 'string') {\n timestamp = data.timestamp;\n } else if (data.timestamp instanceof Date) {\n timestamp = data.timestamp.toISOString();\n } else {\n const parsed = new Date(data.timestamp);\n if (!Number.isNaN(parsed.valueOf())) {\n timestamp = parsed.toISOString();\n }\n }\n }\n\n const displayName = typeof data.display_name === 'string' ? data.display_name : undefined;\n const sourceRole = typeof data.source_role === 'string' ? data.source_role : undefined;\n const engramId = data.engram_id ? String(data.engram_id) : undefined;\n const ownerId = data.owner_id ? String(data.owner_id) : undefined;\n\n let entity: GraphEntityResult | undefined;\n let rel: GraphRelationshipResult | undefined;\n let comm: GraphCommunityResult | undefined;\n\n if (rtype === GraphSearchResultType.ENTITY) {\n entity = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n description: content.description || '',\n metadata: content.metadata || {},\n };\n } else if (rtype === GraphSearchResultType.RELATIONSHIP) {\n rel = {\n id: content.id ? String(content.id) : undefined,\n subject: content.subject || '',\n predicate: content.predicate || '',\n object: content.object || '',\n subject_id: content.subject_id ? String(content.subject_id) : undefined,\n object_id: content.object_id ? String(content.object_id) : undefined,\n description: content.description,\n metadata: content.metadata || {},\n };\n } else {\n comm = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n summary: content.summary || '',\n metadata: content.metadata || {},\n };\n }\n\n return {\n id: rid,\n score,\n metadata,\n source: 'graph',\n content: undefined,\n graph_result_type: rtype,\n graph_entity: entity,\n graph_relationship: rel,\n graph_community: comm,\n chunk_ids: chunkIds,\n timestamp,\n display_name: displayName,\n source_role: sourceRole,\n engram_id: engramId,\n owner_id: ownerId,\n } as SearchResult;\n }\n\n private async _sha256(message: string): Promise<string> {\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private _formDataFromObject(obj: Record<string, any>): FormData {\n const formData = new FormData();\n Object.entries(obj).forEach(([key, value]) => {\n formData.append(key, value as any);\n });\n return formData;\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -132,7 +132,7 @@ var NebulaClient = class {
|
|
|
132
132
|
signal: controller.signal
|
|
133
133
|
});
|
|
134
134
|
clearTimeout(timeoutId);
|
|
135
|
-
if (response.status === 200) {
|
|
135
|
+
if (response.status === 200 || response.status === 202) {
|
|
136
136
|
return await response.json();
|
|
137
137
|
} else if (response.status === 401) {
|
|
138
138
|
throw new NebulaAuthenticationException("Invalid API key");
|
|
@@ -250,7 +250,7 @@ var NebulaClient = class {
|
|
|
250
250
|
if (options?.metadata_filters) {
|
|
251
251
|
params.metadata_filters = JSON.stringify(options.metadata_filters);
|
|
252
252
|
}
|
|
253
|
-
const response = await this._makeRequest("GET", "/v1/
|
|
253
|
+
const response = await this._makeRequest("GET", "/v1/memories", void 0, params);
|
|
254
254
|
let conversations;
|
|
255
255
|
if (response && response.results) {
|
|
256
256
|
conversations = response.results;
|
|
@@ -263,7 +263,7 @@ var NebulaClient = class {
|
|
|
263
263
|
}
|
|
264
264
|
async getConversationMessages(conversationIdOrIds) {
|
|
265
265
|
if (typeof conversationIdOrIds === "string") {
|
|
266
|
-
const response2 = await this._makeRequest("GET", `/v1/
|
|
266
|
+
const response2 = await this._makeRequest("GET", `/v1/memories/${conversationIdOrIds}`);
|
|
267
267
|
if (!response2 || !response2.results) {
|
|
268
268
|
return [];
|
|
269
269
|
}
|
|
@@ -272,9 +272,8 @@ var NebulaClient = class {
|
|
|
272
272
|
if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {
|
|
273
273
|
return {};
|
|
274
274
|
}
|
|
275
|
-
const
|
|
276
|
-
|
|
277
|
-
});
|
|
275
|
+
const params = { ids: conversationIdOrIds };
|
|
276
|
+
const response = await this._makeRequest("GET", "/v1/memories", void 0, params);
|
|
278
277
|
console.log("\u{1F50D} SDK: Raw batch response:", response);
|
|
279
278
|
console.log("\u{1F50D} SDK: Response has results?", !!response?.results);
|
|
280
279
|
if (response?.results) {
|
|
@@ -710,7 +709,7 @@ var NebulaClient = class {
|
|
|
710
709
|
/** Delete a conversation and all its messages */
|
|
711
710
|
async deleteConversation(conversationId) {
|
|
712
711
|
try {
|
|
713
|
-
await this._makeRequest("DELETE", `/v1/
|
|
712
|
+
await this._makeRequest("DELETE", `/v1/memories/${conversationId}`);
|
|
714
713
|
return true;
|
|
715
714
|
} catch (error) {
|
|
716
715
|
if (error instanceof Error) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":["GraphSearchResultType","response","docMetadata","data","url","headers","respData"],"mappings":"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","file":"index.mjs","sourcesContent":["// Data models matching the actual Nebula Python SDK exactly\n\n// Enums\nexport enum GraphSearchResultType {\n ENTITY = \"entity\",\n RELATIONSHIP = \"relationship\",\n COMMUNITY = \"community\"\n}\n\n// Core interfaces matching Python SDK exactly\nexport interface Chunk {\n id: string;\n content: string;\n metadata: Record<string, any>;\n role?: string; // For conversation messages\n}\n\nexport interface MemoryResponse {\n id: string;\n content?: string;\n chunks?: Chunk[];\n metadata: Record<string, any>;\n collection_ids: string[];\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Memory {\n collection_id: string;\n content: string | string[] | Array<{content: string; role: string; metadata?: Record<string, any>; authority?: number}>;\n role?: string; // user, assistant, or custom\n memory_id?: string; // ID of existing memory to append to\n metadata: Record<string, any>;\n authority?: number; // Optional authority score (0.0 - 1.0)\n}\n\nexport interface Collection {\n id: string;\n name: string;\n description?: string;\n metadata: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n memory_count: number;\n owner_id?: string;\n}\n\nexport interface SearchResult {\n id: string; // chunk_id\n score: number;\n metadata: Record<string, any>;\n source?: string;\n timestamp?: string;\n display_name?: string;\n source_role?: string;\n memory_id?: string; // Parent memory/conversation container\n owner_id?: string;\n\n // Chunk fields\n content?: string;\n\n // Graph variant discriminator and payload\n graph_result_type?: GraphSearchResultType;\n graph_entity?: GraphEntityResult;\n graph_relationship?: GraphRelationshipResult;\n graph_community?: GraphCommunityResult;\n chunk_ids?: string[];\n}\n\nexport interface GraphEntityResult {\n id?: string;\n name: string;\n description: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphRelationshipResult {\n id?: string;\n subject: string;\n predicate: string;\n object: string;\n subject_id?: string;\n object_id?: string;\n description?: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphCommunityResult {\n id?: string;\n name: string;\n summary: string;\n metadata: Record<string, any>;\n}\n\nexport interface AgentResponse {\n content: string;\n agent_id: string;\n conversation_id?: string;\n metadata: Record<string, any>;\n citations: Record<string, any>[];\n}\n\nexport interface SearchOptions {\n limit: number;\n filters?: Record<string, any>;\n search_mode?: 'fast' | 'super';\n}\n\n// Configuration interface\nexport interface NebulaClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n}\n\n// Error types matching Python SDK\nexport class NebulaException extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'NebulaException';\n }\n}\n\nexport class NebulaClientException extends NebulaException {\n constructor(message: string, public cause?: Error) {\n super(message);\n this.name = 'NebulaClientException';\n }\n}\n\nexport class NebulaAuthenticationException extends NebulaException {\n constructor(message: string = 'Invalid API key') {\n super(message, 401);\n this.name = 'NebulaAuthenticationException';\n }\n}\n\nexport class NebulaRateLimitException extends NebulaException {\n constructor(message: string = 'Rate limit exceeded') {\n super(message, 429);\n this.name = 'NebulaRateLimitException';\n }\n}\n\nexport class NebulaValidationException extends NebulaException {\n constructor(message: string = 'Validation error', public details?: any) {\n super(message, 400);\n this.name = 'NebulaValidationException';\n }\n}\n\nexport class NebulaCollectionNotFoundException extends NebulaException {\n constructor(message: string = 'Collection not found') {\n super(message, 404);\n this.name = 'NebulaCollectionNotFoundException';\n }\n}\n\nexport class NebulaNotFoundException extends NebulaException {\n constructor(resourceId: string, resourceType: string = 'Resource') {\n super(`${resourceType} not found: ${resourceId}`, 404);\n this.name = 'NebulaNotFoundException';\n }\n}\n","import {\n Memory,\n MemoryResponse,\n Collection,\n SearchResult,\n GraphSearchResultType,\n GraphEntityResult,\n GraphRelationshipResult,\n GraphCommunityResult,\n NebulaClientConfig,\n NebulaException,\n NebulaClientException,\n NebulaAuthenticationException,\n NebulaRateLimitException,\n NebulaValidationException,\n NebulaNotFoundException,\n} from './types';\n\n/**\n * Official Nebula JavaScript/TypeScript SDK\n * Mirrors the exact Nebula Python SDK client.py implementation\n */\nexport class NebulaClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(config: NebulaClientConfig) {\n this.apiKey = config.apiKey;\n if (!this.apiKey) {\n throw new NebulaClientException(\n 'API key is required. Pass it to the constructor or set NEBULA_API_KEY environment variable.'\n );\n }\n\n this.baseUrl = (config.baseUrl || 'https://api.nebulacloud.app').replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n }\n\n // Public mutators used by tests\n setApiKey(next: string) {\n this.apiKey = next;\n }\n setBaseUrl(next: string) {\n this.baseUrl = (next || this.baseUrl).replace(/\\/$/, '');\n }\n // Kept for backwards-compat tests; no-op in current implementation\n setCorsProxy(_next: string) {\n // no-op\n }\n\n /** Check if API key is set */\n isApiKeySet(): boolean {\n return !!(this.apiKey && this.apiKey.trim() !== '');\n }\n\n /** Detect if a token looks like a Nebula API key (public.raw) */\n private _isNebulaApiKey(token?: string): boolean {\n const candidate = token || this.apiKey;\n if (!candidate) return false;\n const parts = candidate.split('.');\n if (parts.length !== 2) return false;\n const [publicPart, rawPart] = parts;\n return publicPart.startsWith('key_') && !!rawPart && rawPart.length > 0;\n }\n\n /** Build authentication headers */\n private _buildAuthHeaders(includeContentType: boolean = true): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this._isNebulaApiKey()) {\n headers['X-API-Key'] = this.apiKey;\n } else {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (includeContentType) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n }\n\n /** Make an HTTP request to the Nebula API */\n private async _makeRequest(\n method: string,\n endpoint: string,\n jsonData?: any, // Can be object, array, or primitive for JSON body\n params?: Record<string, any>\n ): Promise<any> {\n const url = new URL(endpoint, this.baseUrl);\n\n if (params) {\n console.log('SDK: _makeRequest params before processing:', params);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n // Handle array parameters (e.g., collection_ids)\n if (Array.isArray(value)) {\n console.log(`SDK: Adding array param ${key}:`, value);\n value.forEach((item) => {\n url.searchParams.append(key, String(item));\n console.log(`SDK: Appended ${key}=${item} to URL`);\n });\n } else {\n console.log(`SDK: Adding single param ${key}:`, value);\n url.searchParams.append(key, String(value));\n }\n }\n });\n }\n\n console.log('SDK: Final URL being requested:', url.toString());\n\n const headers = this._buildAuthHeaders(true);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: jsonData ? JSON.stringify(jsonData) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n return await response.json();\n } else if (response.status === 401) {\n throw new NebulaAuthenticationException('Invalid API key');\n } else if (response.status === 429) {\n throw new NebulaRateLimitException('Rate limit exceeded');\n } else if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaValidationException(errorData.message || 'Validation error', errorData.details);\n } else if (response.status === 422) {\n const errorData = await response.json().catch(() => ({}));\n console.error('[SDK] 422 Validation error - Full details:');\n console.error(' Status:', response.status);\n console.error(' Error data:', JSON.stringify(errorData, null, 2));\n console.error(' Message:', errorData.message);\n console.error(' Detail:', errorData.detail);\n throw new NebulaValidationException(\n errorData.message || (typeof errorData.detail === 'string' ? errorData.detail : JSON.stringify(errorData.detail)) || 'Validation error',\n errorData\n );\n } else {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(errorData.message || `API error: ${response.status}`, response.status, errorData);\n }\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof NebulaException) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new NebulaClientException(`Request timed out after ${this.timeout} milliseconds`);\n }\n\n if (error instanceof Error) {\n throw new NebulaClientException(`Request failed: ${error.message}`, error);\n }\n\n throw new NebulaClientException(`Request failed: ${String(error)}`);\n }\n }\n\n // Collection Management Methods\n\n /** Create a new collection */\n async createCollection(options: {\n name: string;\n description?: string;\n metadata?: Record<string, any>;\n }): Promise<Collection> {\n const data: Record<string, any> = { name: options.name };\n if (options.description) data.description = options.description;\n if (options.metadata) data.metadata = options.metadata;\n\n const response = await this._makeRequest('POST', '/v1/collections', data);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get a specific collection by ID */\n async getCollection(collectionId: string): Promise<Collection> {\n const response = await this._makeRequest('GET', `/v1/collections/${collectionId}`);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get a specific collection by name */\n async getCollectionByName(name: string): Promise<Collection> {\n const response = await this._makeRequest('GET', `/v1/collections/name/${name}`);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get all collections */\n async listCollections(options?: {\n limit?: number;\n offset?: number;\n }): Promise<Collection[]> {\n const params = {\n limit: options?.limit ?? 100,\n offset: options?.offset ?? 0\n };\n const response = await this._makeRequest('GET', '/v1/collections', undefined, params);\n\n let collections: any[];\n if (response.results) {\n collections = response.results;\n } else if (Array.isArray(response)) {\n collections = response;\n } else {\n collections = [response];\n }\n\n return collections.map((collection) => this._collectionFromDict(collection));\n }\n\n // Conversations Methods\n\n /**\n * List conversations for the authenticated user with optional metadata filtering\n *\n * @param options - Configuration for listing conversations\n * @param options.limit - Maximum number of conversations to return (default: 100)\n * @param options.offset - Number of conversations to skip for pagination (default: 0)\n * @param options.collection_ids - Optional list of collection IDs to filter conversations by\n * @param options.metadata_filters - Optional metadata filters using MongoDB-like operators.\n * Supported operators: $eq, $ne, $in, $nin, $exists, $and, $or\n *\n * @returns Promise resolving to array of conversation objects with fields: id, created_at, user_id, name, collection_ids\n *\n * @example\n * // Get all playground conversations\n * const conversations = await client.listConversations({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * 'metadata.playground': { $eq: true }\n * }\n * });\n *\n * @example\n * // Filter by session ID\n * const conversations = await client.listConversations({\n * metadata_filters: {\n * 'metadata.session_id': { $eq: 'session-123' }\n * }\n * });\n */\n async listConversations(options?: {\n limit?: number;\n offset?: number;\n collection_ids?: string[];\n metadata_filters?: Record<string, any>;\n }): Promise<any[]> {\n const params: Record<string, any> = {\n limit: options?.limit ?? 100,\n offset: options?.offset ?? 0\n };\n // Convert collection_ids to collection_ids for the API\n if (options?.collection_ids && options.collection_ids.length > 0) {\n params.collection_ids = options.collection_ids;\n }\n // Add metadata_filters if provided (serialize to JSON string for query parameter)\n if (options?.metadata_filters) {\n params.metadata_filters = JSON.stringify(options.metadata_filters);\n }\n const response = await this._makeRequest('GET', '/v1/conversations', undefined, params);\n\n let conversations: any[];\n if (response && response.results) {\n conversations = response.results;\n } else if (Array.isArray(response)) {\n conversations = response;\n } else {\n conversations = response ? [response] : [];\n }\n\n return conversations;\n }\n\n /** Get conversation messages directly from the conversations API */\n async getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;\n async getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;\n async getConversationMessages(conversationIdOrIds: string | string[]): Promise<MemoryResponse[] | Record<string, MemoryResponse[]>> {\n // Handle single conversation ID (backward compatibility)\n if (typeof conversationIdOrIds === 'string') {\n const response = await this._makeRequest('GET', `/v1/conversations/${conversationIdOrIds}`);\n\n if (!response || !response.results) {\n return [];\n }\n\n return this._transformConversationMessages(response.results);\n }\n\n // Handle multiple conversation IDs\n if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {\n return {};\n }\n\n // Use POST request with conversation IDs in body for batch retrieval\n // This performs a single SQL query with IN clause for optimal performance\n const response = await this._makeRequest('POST', '/v1/conversations/batch', {\n conversation_ids: conversationIdOrIds\n });\n\n console.log('🔍 SDK: Raw batch response:', response);\n console.log('🔍 SDK: Response has results?', !!response?.results);\n if (response?.results) {\n console.log('🔍 SDK: Results keys:', Object.keys(response.results));\n console.log('🔍 SDK: Sample result:', Object.keys(response.results)[0], ':', response.results[Object.keys(response.results)[0]]);\n }\n\n const results: Record<string, MemoryResponse[]> = {};\n\n if (response && response.results) {\n // Backend returns { \"results\": { \"results\": { conversation_id: MessageResponse[] } } } format (double-nested)\n const batchResults = response.results.results || response.results;\n console.log('🔍 SDK: Processing', Object.keys(batchResults).length, 'conversations');\n for (const [conversationId, messages] of Object.entries(batchResults)) {\n if (Array.isArray(messages)) {\n const transformed = this._transformConversationMessages(messages as any[]);\n results[conversationId] = transformed;\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: ${messages.length} raw -> ${transformed.length} transformed`);\n } else {\n results[conversationId] = [];\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: not array, setting empty`);\n }\n }\n }\n\n // Ensure all requested conversation IDs are present in results (even if empty)\n for (const conversationId of conversationIdOrIds) {\n if (!(conversationId in results)) {\n results[conversationId] = [];\n }\n }\n\n return results;\n }\n\n /** Helper method to transform conversation messages to MemoryResponse format */\n private _transformConversationMessages(messageResponses: any[]): MemoryResponse[] {\n return messageResponses.map((msgResp: any) => {\n const msgId = String(msgResp.id || '');\n const msg = msgResp.message || {}; // The actual Message object\n const metadata = msgResp.metadata || {};\n\n // Normalize content to a string - could be string or object\n let text: string = '';\n const rawContent = msg.content;\n if (typeof rawContent === 'string') {\n text = rawContent;\n } else if (rawContent && typeof rawContent === 'object') {\n // Handle structured content\n text = String(rawContent.content || rawContent.text || JSON.stringify(rawContent));\n } else if (rawContent != null) {\n text = String(rawContent);\n }\n\n // Get role from the Message object\n const role = msg.role || metadata.role || 'user';\n\n // Merge message metadata with response metadata\n const combinedMetadata = {\n ...metadata,\n role, // Ensure role is in metadata for UI compatibility\n };\n\n return {\n id: msgId,\n content: text,\n metadata: combinedMetadata,\n created_at: msgResp.created_at,\n collection_ids: msgResp.collection_ids || [],\n } as MemoryResponse;\n });\n }\n\n /** Update a collection */\n async updateCollection(options: {\n collectionId: string;\n name?: string;\n description?: string;\n metadata?: Record<string, any>;\n }): Promise<Collection> {\n const data: Record<string, any> = {};\n if (options.name !== undefined) data.name = options.name;\n if (options.description !== undefined) data.description = options.description;\n if (options.metadata !== undefined) data.metadata = options.metadata;\n\n const response = await this._makeRequest('POST', `/v1/collections/${options.collectionId}`, data);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Delete a collection */\n async deleteCollection(collectionId: string): Promise<boolean> {\n await this._makeRequest('DELETE', `/v1/collections/${collectionId}`);\n return true;\n }\n\n // Memory Management Methods\n\n /**\n * Legacy convenience: store raw text content into a collection as a document\n */\n async store(content: string, collectionId: string, metadata: Record<string, any> = {}): Promise<MemoryResponse> {\n const docMetadata = {\n ...metadata,\n memory_type: 'memory',\n timestamp: new Date().toISOString(),\n } as Record<string, any>;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([collectionId]),\n raw_text: String(content || ''),\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create engram: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n const id = respData?.results?.engram_id || respData?.results?.id || respData?.id || '';\n\n const result: MemoryResponse = {\n id: String(id),\n content: String(content || ''),\n metadata: docMetadata,\n collection_ids: [collectionId],\n created_at: docMetadata.timestamp,\n updated_at: docMetadata.timestamp,\n };\n return result;\n }\n\n /**\n * Store a single memory using the unified engrams API.\n *\n * Automatically infers memory type:\n * - If role is present, creates a conversation\n * - Otherwise, creates a document\n */\n async storeMemory(\n memory: Memory | Record<string, any>,\n name?: string\n ): Promise<string> {\n let mem: Memory;\n\n if ('collection_id' in memory) {\n mem = memory as Memory;\n } else {\n mem = {\n collection_id: (memory as any).collection_id,\n content: (memory as any).content || '',\n role: (memory as any).role,\n memory_id: (memory as any).memory_id,\n metadata: (memory as any).metadata || {},\n };\n }\n\n // If memory_id is present, append to existing memory\n if (mem.memory_id) {\n return await this._appendToMemory(mem.memory_id, mem);\n }\n\n // Automatically infer memory type from role presence\n const memoryType = mem.role ? 'conversation' : 'document';\n\n // Handle conversation creation\n if (memoryType === 'conversation') {\n // Use new unified POST /v1/memories endpoint\n const docMetadata = { ...mem.metadata };\n const data = {\n engram_type: 'conversation',\n name: name || 'Conversation',\n metadata: JSON.stringify(docMetadata),\n collection_ids: JSON.stringify([mem.collection_id]),\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create conversation: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n const convId = respData.results.engram_id || respData.results.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n\n // If content and role provided, append initial message\n if (mem.content && mem.role) {\n const appendMem: Memory = {\n collection_id: mem.collection_id,\n content: [\n {\n content: String(mem.content),\n role: mem.role,\n metadata: mem.metadata,\n ...(typeof (mem as any).authority === 'number' ? { authority: Number((mem as any).authority) } : {})\n },\n ],\n memory_id: convId,\n metadata: {},\n };\n await this._appendToMemory(convId, appendMem);\n }\n\n return String(convId);\n }\n throw new NebulaClientException('Failed to create conversation: invalid response format');\n }\n\n // Handle document/text memory\n const contentText = String(mem.content || '');\n if (!contentText) {\n throw new NebulaClientException('Content is required for document memories');\n }\n\n const contentHash = await this._sha256(contentText);\n const docMetadata = { ...mem.metadata } as Record<string, any>;\n docMetadata.memory_type = 'memory';\n docMetadata.content_hash = contentHash;\n // If authority provided for document, persist in metadata for ranking\n if (typeof (mem as any).authority === 'number') {\n const v = Number((mem as any).authority);\n if (!Number.isNaN(v) && v >= 0 && v <= 1) {\n (docMetadata as any).authority = v;\n }\n }\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([mem.collection_id]),\n raw_text: contentText,\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create engram: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n if (respData.results.engram_id) return String(respData.results.engram_id);\n if (respData.results.id) return String(respData.results.id);\n }\n return '';\n }\n\n /**\n * Internal method to append content to an existing engram\n *\n * @throws NebulaNotFoundException if engram_id doesn't exist\n */\n private async _appendToMemory(memoryId: string, memory: Memory): Promise<string> {\n const collectionId = memory.collection_id;\n const content = memory.content;\n const metadata = memory.metadata;\n\n if (!collectionId) {\n throw new NebulaClientException('collection_id is required');\n }\n\n const payload: Record<string, any> = {\n collection_id: collectionId,\n };\n\n // Determine content type and set appropriate field\n if (Array.isArray(content)) {\n if (content.length > 0 && typeof content[0] === 'object' && 'content' in content[0]) {\n // Array of message objects (conversation)\n payload.messages = content;\n } else {\n // Array of strings (chunks)\n payload.chunks = content;\n }\n } else if (typeof content === 'string') {\n // Raw text string\n payload.raw_text = content;\n } else {\n throw new NebulaClientException(\n 'content must be a string, array of strings, or array of message objects'\n );\n }\n\n if (metadata) {\n payload.metadata = metadata;\n }\n\n try {\n await this._makeRequest('POST', `/v1/memories/${memoryId}/append`, payload);\n return memoryId;\n } catch (error) {\n // Convert 404 errors to NebulaNotFoundException\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(memoryId, 'Memory');\n }\n throw error;\n }\n }\n\n /** Store multiple memories using the unified engrams API */\n async storeMemories(memories: Memory[]): Promise<string[]> {\n const results: string[] = [];\n const convGroups: Record<string, Memory[]> = {};\n const others: Memory[] = [];\n\n for (const m of memories) {\n if (m.role) {\n const key = m.memory_id || `__new__::${m.collection_id}`;\n if (!convGroups[key]) convGroups[key] = [];\n convGroups[key].push(m);\n } else {\n others.push(m);\n }\n }\n\n // Process conversation groups using new unified API\n for (const [key, group] of Object.entries(convGroups)) {\n const collectionId = group[0].collection_id;\n let convId: string;\n\n // Create conversation if needed\n if (key.startsWith('__new__::')) {\n // Pass a placeholder role to trigger conversation creation\n convId = await this.storeMemory(\n {\n collection_id: collectionId,\n content: '',\n role: 'assistant', // Placeholder role to infer conversation type\n metadata: {},\n },\n 'Conversation'\n );\n } else {\n convId = key;\n }\n\n // Append messages using new unified API\n const messages = group.map((m) => ({\n content: String(m.content || ''),\n role: m.role!,\n metadata: m.metadata || {},\n }));\n\n const appendMem: Memory = {\n collection_id: collectionId,\n content: messages,\n memory_id: convId,\n metadata: {},\n };\n await this._appendToMemory(convId, appendMem);\n\n results.push(...Array(group.length).fill(String(convId)));\n }\n\n // Process others (text/json) individually\n for (const m of others) {\n results.push(await this.storeMemory(m));\n }\n\n return results;\n }\n\n /** Delete one or more memories */\n async delete(memoryIds: string | string[]): Promise<boolean | {\n message: string;\n results: {\n successful: string[];\n failed: Array<{ id: string; error: string }>;\n summary: {\n total: number;\n succeeded: number;\n failed: number;\n };\n };\n }> {\n try {\n console.log('[SDK] delete() called with:', { memoryIds, type: typeof memoryIds, isArray: Array.isArray(memoryIds) });\n\n // Handle single ID vs array\n if (typeof memoryIds === 'string') {\n console.log('[SDK] Single deletion path for ID:', memoryIds);\n // Single deletion - try existing endpoint first for backward compatibility\n try {\n await this._makeRequest('DELETE', `/v1/memories/${memoryIds}`);\n return true;\n } catch {\n // Fall back to new unified endpoint\n try {\n console.log('[SDK] Falling back to POST /v1/memories/delete with single ID');\n // Send the UUID string directly as body (not wrapped in {ids: ...})\n const response = await this._makeRequest('POST', '/v1/memories/delete', memoryIds);\n return typeof response === 'object' && response.success !== undefined\n ? response.success\n : true;\n } catch (error) {\n throw error;\n }\n }\n } else {\n console.log('[SDK] Batch deletion path for IDs:', memoryIds);\n console.log('[SDK] Sending POST request with body:', memoryIds);\n // Batch deletion - send array directly as body (not wrapped in {ids: ...})\n // FastAPI Body() without embed=True expects the value directly\n const response = await this._makeRequest('POST', '/v1/memories/delete', memoryIds);\n console.log('[SDK] Batch deletion response:', response);\n return response;\n }\n } catch (error) {\n console.error('[SDK] Delete error:', error);\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Delete a specific chunk or message within a memory */\n async deleteChunk(chunkId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/chunks/${chunkId}`);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(chunkId, 'Chunk');\n }\n throw error;\n }\n }\n\n /** Update a specific chunk or message within a memory */\n async updateChunk(\n chunkId: string,\n content: string,\n metadata?: Record<string, any>\n ): Promise<boolean> {\n const payload: any = { content };\n if (metadata !== undefined) {\n payload.metadata = metadata;\n }\n\n try {\n await this._makeRequest('PATCH', `/v1/chunks/${chunkId}`, payload);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(chunkId, 'Chunk');\n }\n throw error;\n }\n }\n\n /**\n * Update memory-level properties including name, metadata, and collection associations.\n *\n * This method allows updating properties of an entire memory (document or conversation)\n * without modifying its content. For updating individual chunks or messages within a memory,\n * use updateChunk(). For updating content, use storeMemory() to append.\n *\n * @param options - Update configuration\n * @param options.memoryId - The ID of the memory to update\n * @param options.name - New name for the memory (useful for conversations and documents)\n * @param options.metadata - Metadata to set. By default, replaces existing metadata.\n * Set mergeMetadata=true to merge with existing metadata instead.\n * @param options.collectionIds - New collection associations. Must specify at least one valid collection.\n * @param options.mergeMetadata - If true, merges provided metadata with existing metadata.\n * If false (default), replaces existing metadata entirely.\n *\n * @returns Promise resolving to true if successful\n *\n * @throws NebulaNotFoundException if memory_id doesn't exist\n * @throws NebulaValidationException if validation fails (e.g., no fields provided)\n * @throws NebulaAuthenticationException if user doesn't have permission to update this memory\n */\n async updateMemory(options: {\n memoryId: string;\n name?: string;\n metadata?: Record<string, any>;\n collectionIds?: string[];\n mergeMetadata?: boolean;\n }): Promise<boolean> {\n const payload: any = {};\n\n if (options.name !== undefined) {\n payload.name = options.name;\n }\n if (options.metadata !== undefined) {\n payload.metadata = options.metadata;\n payload.merge_metadata = options.mergeMetadata ?? false;\n }\n if (options.collectionIds !== undefined) {\n payload.collection_ids = options.collectionIds;\n }\n\n if (Object.keys(payload).length === 0) {\n throw new NebulaValidationException(\n 'At least one field (name, metadata, or collectionIds) must be provided to update'\n );\n }\n\n try {\n await this._makeRequest('PATCH', `/v1/memories/${options.memoryId}`, payload);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(options.memoryId, 'Memory');\n }\n throw error;\n }\n }\n\n /** Delete a conversation and all its messages */\n async deleteConversation(conversationId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/conversations/${conversationId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /**\n * Get all memories from specific collections with optional metadata filtering\n *\n * @param options - Configuration for listing memories\n * @param options.collection_ids - One or more collection IDs to retrieve memories from\n * @param options.limit - Maximum number of memories to return (default: 100)\n * @param options.offset - Number of memories to skip for pagination (default: 0)\n * @param options.metadata_filters - Optional metadata filters using MongoDB-like operators.\n * Supported operators: $eq, $ne, $in, $nin, $exists, $and, $or\n *\n * @returns Promise resolving to array of MemoryResponse objects\n *\n * @example\n * // Get all playground memories excluding conversations\n * const memories = await client.listMemories({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * 'metadata.content_type': { $ne: 'conversation' }\n * }\n * });\n *\n * @example\n * // Complex filter with multiple conditions\n * const memories = await client.listMemories({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * $and: [\n * { 'metadata.playground': { $eq: true } },\n * { 'metadata.session_id': { $exists: true } }\n * ]\n * }\n * });\n */\n async listMemories(options: {\n collection_ids: string | string[];\n limit?: number;\n offset?: number;\n metadata_filters?: Record<string, any>;\n }): Promise<MemoryResponse[]> {\n const ids = Array.isArray(options.collection_ids) ? options.collection_ids : [options.collection_ids];\n if (!ids.length) {\n throw new NebulaClientException('collection_ids must be provided to list_memories().');\n }\n\n const params: Record<string, any> = {\n limit: options.limit ?? 100,\n offset: options.offset ?? 0,\n collection_ids: ids\n };\n\n // Add metadata_filters if provided (serialize to JSON string for query parameter)\n if (options.metadata_filters) {\n params.metadata_filters = JSON.stringify(options.metadata_filters);\n }\n\n const response = await this._makeRequest('GET', '/v1/memories', undefined, params);\n\n let documents: any[];\n if (response.results) {\n documents = response.results;\n } else if (Array.isArray(response)) {\n documents = response;\n } else {\n documents = [response];\n }\n\n return documents.map((doc) => this._memoryResponseFromDict(doc, ids));\n }\n\n /** Get a specific memory by engram ID */\n async getMemory(memoryId: string): Promise<MemoryResponse> {\n const response = await this._makeRequest('GET', `/v1/memories/${memoryId}`);\n\n const content = response.text || response.content;\n const chunks = Array.isArray(response.chunks) ? response.chunks : undefined;\n\n const memoryData = {\n id: response.id,\n content,\n chunks,\n metadata: response.metadata || {},\n collection_ids: response.collection_ids || [],\n };\n\n return this._memoryResponseFromDict(memoryData, []);\n }\n\n // Search Methods\n\n /**\n * Search within specific collections with optional metadata filtering.\n *\n * @param options - Search configuration\n * @param options.query - Search query string\n * @param options.collection_ids - One or more collection IDs to search within\n * @param options.limit - Maximum number of results to return (default: 10)\n * @param options.retrieval_type - Retrieval strategy (default: ADVANCED)\n * @param options.filters - Optional filters to apply to the search. Supports comprehensive metadata filtering\n * with MongoDB-like operators for both vector/chunk search and graph search.\n * @param options.searchSettings - Optional search configuration\n *\n * @returns Promise resolving to array of SearchResult objects containing both vector/chunk and graph search results\n *\n * @example\n * // Basic equality filter\n * await client.search({\n * query: \"machine learning\",\n * collection_ids: [\"research-collection\"],\n * filters: {\n * \"metadata.category\": { $eq: \"research\" },\n * \"metadata.verified\": true // Shorthand for $eq\n * }\n * });\n *\n * @example\n * // Numeric comparisons\n * await client.search({\n * query: \"high priority\",\n * collection_ids: [\"tasks\"],\n * filters: {\n * \"metadata.priority\": { $gte: 8 },\n * \"metadata.score\": { $lt: 100 }\n * }\n * });\n *\n * @example\n * // String matching\n * await client.search({\n * query: \"employees\",\n * collection_ids: [\"team\"],\n * filters: {\n * \"metadata.email\": { $ilike: \"%@company.com\" } // Case-insensitive\n * }\n * });\n *\n * @example\n * // Array operations\n * await client.search({\n * query: \"developers\",\n * collection_ids: [\"team\"],\n * filters: {\n * \"metadata.skills\": { $overlap: [\"python\", \"typescript\"] } // Has any\n * }\n * });\n *\n * @example\n * // Nested paths\n * await client.search({\n * query: \"users\",\n * collection_ids: [\"profiles\"],\n * filters: {\n * \"metadata.user.preferences.theme\": { $eq: \"dark\" }\n * }\n * });\n *\n * @example\n * // Complex logical combinations\n * await client.search({\n * query: \"candidates\",\n * collection_ids: [\"hiring\"],\n * filters: {\n * $and: [\n * { \"metadata.verified\": true },\n * { \"metadata.level\": { $gte: 5 } },\n * {\n * $or: [\n * { \"metadata.skills\": { $overlap: [\"python\", \"go\"] } },\n * { \"metadata.years_experience\": { $gte: 8 } }\n * ]\n * }\n * ]\n * }\n * });\n *\n * @remarks\n * Supported Operators:\n * - Comparison: $eq, $ne, $lt, $lte, $gt, $gte\n * - String: $like (case-sensitive), $ilike (case-insensitive)\n * - Array: $in, $nin, $overlap, $contains\n * - JSONB: $json_contains\n * - Logical: $and, $or\n *\n * For comprehensive filtering documentation, see the Metadata Filtering Guide:\n * https://docs.nebulacloud.app/guides/metadata-filtering\n */\n async search(options: {\n query: string;\n collection_ids: string | string[];\n limit?: number;\n filters?: Record<string, any>;\n search_mode?: 'fast' | 'super';\n searchSettings?: Record<string, any>;\n }): Promise<SearchResult[]> {\n const collectionIds = Array.isArray(options.collection_ids) ? options.collection_ids : [options.collection_ids];\n // Filter out empty/invalid collection IDs\n const validCollectionIds = collectionIds.filter(id => id && id.trim() !== '');\n if (!validCollectionIds.length) {\n throw new NebulaClientException('collection_ids must be provided to search().');\n }\n\n const limit = options.limit ?? 10;\n const searchMode = options.search_mode ?? 'super';\n\n // Build effective search settings with simplified structure\n const effectiveSettings: Record<string, any> = {\n ...options.searchSettings\n };\n effectiveSettings.limit = limit;\n\n const userFilters = { ...effectiveSettings.filters } as Record<string, any>;\n if (options.filters) {\n Object.assign(userFilters, options.filters);\n }\n userFilters.collection_ids = { $overlap: validCollectionIds };\n effectiveSettings.filters = userFilters;\n\n const data = {\n query: options.query,\n search_mode: searchMode,\n search_settings: effectiveSettings,\n };\n\n const response = await this._makeRequest('POST', '/v1/retrieval/search', data);\n\n let chunkResults: any[] = [];\n let graphResults: any[] = [];\n\n if (response.results) {\n chunkResults = response.results.chunk_search_results || [];\n graphResults = response.results.graph_search_results || [];\n }\n\n const out: SearchResult[] = [];\n out.push(...chunkResults.map((result) => this._searchResultFromDict(result)));\n for (const g of graphResults) {\n out.push(this._searchResultFromGraphDict(g));\n }\n\n return out;\n }\n\n /**\n * Legacy wrapper: store a two-message conversation turn as a document\n */\n async storeConversation(\n userMessage: string,\n assistantMessage: string,\n collectionId: string,\n sessionId: string\n ): Promise<MemoryResponse> {\n const content = `User: ${String(userMessage || '')}\\nAssistant: ${String(assistantMessage || '')}`;\n const metadata = { session_id: sessionId, content_type: 'conversation' } as Record<string, any>;\n return this.store(content, collectionId, metadata);\n }\n\n /**\n * Legacy wrapper: search conversations optionally scoped by session\n */\n async searchConversations(\n query: string,\n collectionId: string,\n sessionId?: string,\n includeAllSessions: boolean = true\n ): Promise<SearchResult[]> {\n const filters: Record<string, any> = { 'metadata.content_type': 'conversation' };\n if (sessionId && !includeAllSessions) {\n (filters as any)['metadata.session_id'] = sessionId;\n }\n return this.search({\n query,\n collection_ids: [collectionId],\n limit: 10,\n filters\n });\n }\n\n // Health Check\n async healthCheck(): Promise<Record<string, any>> {\n return this._makeRequest('GET', '/health');\n }\n\n // Helpers\n\n private _collectionFromDict(data: any): Collection {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const collectionId = String(data.id || '');\n const collectionName = data.name || '';\n const collectionDescription = data.description;\n const collectionOwnerId = data.owner_id ? String(data.owner_id) : undefined;\n const memoryCount = data.document_count || 0;\n\n const metadata = {\n graph_collection_status: data.graph_collection_status || '',\n graph_sync_status: data.graph_sync_status || '',\n user_count: data.user_count || 0,\n document_count: data.document_count || 0,\n };\n\n return {\n id: collectionId,\n name: collectionName,\n description: collectionDescription,\n metadata,\n created_at: createdAt,\n updated_at: updatedAt,\n memory_count: memoryCount,\n owner_id: collectionOwnerId,\n } as Collection;\n }\n\n private _memoryResponseFromDict(data: any, collectionIds: string[]): MemoryResponse {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const engramId = String(data.id || '');\n const content = data.content || data.text;\n let chunks: string[] | undefined;\n\n if (data.chunks && Array.isArray(data.chunks)) {\n if (data.chunks.every((x: any) => typeof x === 'string')) {\n chunks = data.chunks;\n } else {\n chunks = data.chunks\n .filter((item: any) => item && typeof item === 'object' && 'text' in item)\n .map((item: any) => item.text);\n }\n }\n\n const metadata = { ...data.metadata };\n if (data.engram_id) {\n (metadata as any).engram_id = data.engram_id;\n }\n\n let finalId = engramId;\n if (data.engram_id && !engramId) {\n finalId = data.engram_id;\n }\n\n if (data.document_metadata) {\n Object.assign(metadata, data.document_metadata);\n }\n\n return {\n id: finalId,\n content,\n chunks,\n metadata,\n collection_ids: data.collection_ids || collectionIds,\n created_at: createdAt,\n updated_at: updatedAt,\n } as MemoryResponse;\n }\n\n private _searchResultFromDict(data: any): SearchResult {\n const content = data.content || data.text || '';\n const resultId = data.id || data.chunk_id || '';\n\n return {\n id: String(resultId),\n content: String(content),\n score: Number(data.score || 0.0),\n metadata: data.metadata || {},\n source: data.source,\n };\n }\n\n private _searchResultFromGraphDict(data: any): SearchResult {\n const rid = data.id ? String(data.id) : '';\n const rtype =\n GraphSearchResultType[(data.result_type || 'entity').toUpperCase() as keyof typeof GraphSearchResultType] ||\n GraphSearchResultType.ENTITY;\n const content = data.content || {};\n const score = data.score !== undefined ? Number(data.score) : 0.0;\n const metadata = data.metadata || {};\n const chunkIds = Array.isArray(data.chunk_ids) ? data.chunk_ids : undefined;\n let timestamp: string | undefined;\n if (data.timestamp) {\n if (typeof data.timestamp === 'string') {\n timestamp = data.timestamp;\n } else if (data.timestamp instanceof Date) {\n timestamp = data.timestamp.toISOString();\n } else {\n const parsed = new Date(data.timestamp);\n if (!Number.isNaN(parsed.valueOf())) {\n timestamp = parsed.toISOString();\n }\n }\n }\n\n const displayName = typeof data.display_name === 'string' ? data.display_name : undefined;\n const sourceRole = typeof data.source_role === 'string' ? data.source_role : undefined;\n const engramId = data.engram_id ? String(data.engram_id) : undefined;\n const ownerId = data.owner_id ? String(data.owner_id) : undefined;\n\n let entity: GraphEntityResult | undefined;\n let rel: GraphRelationshipResult | undefined;\n let comm: GraphCommunityResult | undefined;\n\n if (rtype === GraphSearchResultType.ENTITY) {\n entity = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n description: content.description || '',\n metadata: content.metadata || {},\n };\n } else if (rtype === GraphSearchResultType.RELATIONSHIP) {\n rel = {\n id: content.id ? String(content.id) : undefined,\n subject: content.subject || '',\n predicate: content.predicate || '',\n object: content.object || '',\n subject_id: content.subject_id ? String(content.subject_id) : undefined,\n object_id: content.object_id ? String(content.object_id) : undefined,\n description: content.description,\n metadata: content.metadata || {},\n };\n } else {\n comm = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n summary: content.summary || '',\n metadata: content.metadata || {},\n };\n }\n\n return {\n id: rid,\n score,\n metadata,\n source: 'graph',\n content: undefined,\n graph_result_type: rtype,\n graph_entity: entity,\n graph_relationship: rel,\n graph_community: comm,\n chunk_ids: chunkIds,\n timestamp,\n display_name: displayName,\n source_role: sourceRole,\n engram_id: engramId,\n owner_id: ownerId,\n } as SearchResult;\n }\n\n private async _sha256(message: string): Promise<string> {\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private _formDataFromObject(obj: Record<string, any>): FormData {\n const formData = new FormData();\n Object.entries(obj).forEach(([key, value]) => {\n formData.append(key, value as any);\n });\n return formData;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":["GraphSearchResultType","response","docMetadata","data","url","headers","respData"],"mappings":"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","file":"index.mjs","sourcesContent":["// Data models matching the actual Nebula Python SDK exactly\n\n// Enums\nexport enum GraphSearchResultType {\n ENTITY = \"entity\",\n RELATIONSHIP = \"relationship\",\n COMMUNITY = \"community\"\n}\n\n// Core interfaces matching Python SDK exactly\nexport interface Chunk {\n id: string;\n content: string;\n metadata: Record<string, any>;\n role?: string; // For conversation messages\n}\n\nexport interface MemoryResponse {\n id: string;\n content?: string;\n chunks?: Chunk[];\n metadata: Record<string, any>;\n collection_ids: string[];\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Memory {\n collection_id: string;\n content: string | string[] | Array<{content: string; role: string; metadata?: Record<string, any>; authority?: number}>;\n role?: string; // user, assistant, or custom\n memory_id?: string; // ID of existing memory to append to\n metadata: Record<string, any>;\n authority?: number; // Optional authority score (0.0 - 1.0)\n}\n\nexport interface Collection {\n id: string;\n name: string;\n description?: string;\n metadata: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n memory_count: number;\n owner_id?: string;\n}\n\nexport interface SearchResult {\n id: string; // chunk_id\n score: number;\n metadata: Record<string, any>;\n source?: string;\n timestamp?: string;\n display_name?: string;\n source_role?: string;\n memory_id?: string; // Parent memory/conversation container\n owner_id?: string;\n\n // Chunk fields\n content?: string;\n\n // Graph variant discriminator and payload\n graph_result_type?: GraphSearchResultType;\n graph_entity?: GraphEntityResult;\n graph_relationship?: GraphRelationshipResult;\n graph_community?: GraphCommunityResult;\n chunk_ids?: string[];\n}\n\nexport interface GraphEntityResult {\n id?: string;\n name: string;\n description: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphRelationshipResult {\n id?: string;\n subject: string;\n predicate: string;\n object: string;\n subject_id?: string;\n object_id?: string;\n description?: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphCommunityResult {\n id?: string;\n name: string;\n summary: string;\n metadata: Record<string, any>;\n}\n\nexport interface AgentResponse {\n content: string;\n agent_id: string;\n conversation_id?: string;\n metadata: Record<string, any>;\n citations: Record<string, any>[];\n}\n\nexport interface SearchOptions {\n limit: number;\n filters?: Record<string, any>;\n search_mode?: 'fast' | 'super';\n}\n\n// Configuration interface\nexport interface NebulaClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n}\n\n// Error types matching Python SDK\nexport class NebulaException extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'NebulaException';\n }\n}\n\nexport class NebulaClientException extends NebulaException {\n constructor(message: string, public cause?: Error) {\n super(message);\n this.name = 'NebulaClientException';\n }\n}\n\nexport class NebulaAuthenticationException extends NebulaException {\n constructor(message: string = 'Invalid API key') {\n super(message, 401);\n this.name = 'NebulaAuthenticationException';\n }\n}\n\nexport class NebulaRateLimitException extends NebulaException {\n constructor(message: string = 'Rate limit exceeded') {\n super(message, 429);\n this.name = 'NebulaRateLimitException';\n }\n}\n\nexport class NebulaValidationException extends NebulaException {\n constructor(message: string = 'Validation error', public details?: any) {\n super(message, 400);\n this.name = 'NebulaValidationException';\n }\n}\n\nexport class NebulaCollectionNotFoundException extends NebulaException {\n constructor(message: string = 'Collection not found') {\n super(message, 404);\n this.name = 'NebulaCollectionNotFoundException';\n }\n}\n\nexport class NebulaNotFoundException extends NebulaException {\n constructor(resourceId: string, resourceType: string = 'Resource') {\n super(`${resourceType} not found: ${resourceId}`, 404);\n this.name = 'NebulaNotFoundException';\n }\n}\n","import {\n Memory,\n MemoryResponse,\n Collection,\n SearchResult,\n GraphSearchResultType,\n GraphEntityResult,\n GraphRelationshipResult,\n GraphCommunityResult,\n NebulaClientConfig,\n NebulaException,\n NebulaClientException,\n NebulaAuthenticationException,\n NebulaRateLimitException,\n NebulaValidationException,\n NebulaNotFoundException,\n} from './types';\n\n/**\n * Official Nebula JavaScript/TypeScript SDK\n * Mirrors the exact Nebula Python SDK client.py implementation\n */\nexport class NebulaClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(config: NebulaClientConfig) {\n this.apiKey = config.apiKey;\n if (!this.apiKey) {\n throw new NebulaClientException(\n 'API key is required. Pass it to the constructor or set NEBULA_API_KEY environment variable.'\n );\n }\n\n this.baseUrl = (config.baseUrl || 'https://api.nebulacloud.app').replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n }\n\n // Public mutators used by tests\n setApiKey(next: string) {\n this.apiKey = next;\n }\n setBaseUrl(next: string) {\n this.baseUrl = (next || this.baseUrl).replace(/\\/$/, '');\n }\n // Kept for backwards-compat tests; no-op in current implementation\n setCorsProxy(_next: string) {\n // no-op\n }\n\n /** Check if API key is set */\n isApiKeySet(): boolean {\n return !!(this.apiKey && this.apiKey.trim() !== '');\n }\n\n /** Detect if a token looks like a Nebula API key (public.raw) */\n private _isNebulaApiKey(token?: string): boolean {\n const candidate = token || this.apiKey;\n if (!candidate) return false;\n const parts = candidate.split('.');\n if (parts.length !== 2) return false;\n const [publicPart, rawPart] = parts;\n return publicPart.startsWith('key_') && !!rawPart && rawPart.length > 0;\n }\n\n /** Build authentication headers */\n private _buildAuthHeaders(includeContentType: boolean = true): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this._isNebulaApiKey()) {\n headers['X-API-Key'] = this.apiKey;\n } else {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (includeContentType) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n }\n\n /** Make an HTTP request to the Nebula API */\n private async _makeRequest(\n method: string,\n endpoint: string,\n jsonData?: any, // Can be object, array, or primitive for JSON body\n params?: Record<string, any>\n ): Promise<any> {\n const url = new URL(endpoint, this.baseUrl);\n\n if (params) {\n console.log('SDK: _makeRequest params before processing:', params);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n // Handle array parameters (e.g., collection_ids)\n if (Array.isArray(value)) {\n console.log(`SDK: Adding array param ${key}:`, value);\n value.forEach((item) => {\n url.searchParams.append(key, String(item));\n console.log(`SDK: Appended ${key}=${item} to URL`);\n });\n } else {\n console.log(`SDK: Adding single param ${key}:`, value);\n url.searchParams.append(key, String(value));\n }\n }\n });\n }\n\n console.log('SDK: Final URL being requested:', url.toString());\n\n const headers = this._buildAuthHeaders(true);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: jsonData ? JSON.stringify(jsonData) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200 || response.status === 202) {\n return await response.json();\n } else if (response.status === 401) {\n throw new NebulaAuthenticationException('Invalid API key');\n } else if (response.status === 429) {\n throw new NebulaRateLimitException('Rate limit exceeded');\n } else if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaValidationException(errorData.message || 'Validation error', errorData.details);\n } else if (response.status === 422) {\n const errorData = await response.json().catch(() => ({}));\n console.error('[SDK] 422 Validation error - Full details:');\n console.error(' Status:', response.status);\n console.error(' Error data:', JSON.stringify(errorData, null, 2));\n console.error(' Message:', errorData.message);\n console.error(' Detail:', errorData.detail);\n throw new NebulaValidationException(\n errorData.message || (typeof errorData.detail === 'string' ? errorData.detail : JSON.stringify(errorData.detail)) || 'Validation error',\n errorData\n );\n } else {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(errorData.message || `API error: ${response.status}`, response.status, errorData);\n }\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof NebulaException) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new NebulaClientException(`Request timed out after ${this.timeout} milliseconds`);\n }\n\n if (error instanceof Error) {\n throw new NebulaClientException(`Request failed: ${error.message}`, error);\n }\n\n throw new NebulaClientException(`Request failed: ${String(error)}`);\n }\n }\n\n // Collection Management Methods\n\n /** Create a new collection */\n async createCollection(options: {\n name: string;\n description?: string;\n metadata?: Record<string, any>;\n }): Promise<Collection> {\n const data: Record<string, any> = { name: options.name };\n if (options.description) data.description = options.description;\n if (options.metadata) data.metadata = options.metadata;\n\n const response = await this._makeRequest('POST', '/v1/collections', data);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get a specific collection by ID */\n async getCollection(collectionId: string): Promise<Collection> {\n const response = await this._makeRequest('GET', `/v1/collections/${collectionId}`);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get a specific collection by name */\n async getCollectionByName(name: string): Promise<Collection> {\n const response = await this._makeRequest('GET', `/v1/collections/name/${name}`);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Get all collections */\n async listCollections(options?: {\n limit?: number;\n offset?: number;\n }): Promise<Collection[]> {\n const params = {\n limit: options?.limit ?? 100,\n offset: options?.offset ?? 0\n };\n const response = await this._makeRequest('GET', '/v1/collections', undefined, params);\n\n let collections: any[];\n if (response.results) {\n collections = response.results;\n } else if (Array.isArray(response)) {\n collections = response;\n } else {\n collections = [response];\n }\n\n return collections.map((collection) => this._collectionFromDict(collection));\n }\n\n // Conversations Methods\n\n /**\n * List conversations for the authenticated user with optional metadata filtering\n *\n * @param options - Configuration for listing conversations\n * @param options.limit - Maximum number of conversations to return (default: 100)\n * @param options.offset - Number of conversations to skip for pagination (default: 0)\n * @param options.collection_ids - Optional list of collection IDs to filter conversations by\n * @param options.metadata_filters - Optional metadata filters using MongoDB-like operators.\n * Supported operators: $eq, $ne, $in, $nin, $exists, $and, $or\n *\n * @returns Promise resolving to array of conversation objects with fields: id, created_at, user_id, name, collection_ids\n *\n * @example\n * // Get all playground conversations\n * const conversations = await client.listConversations({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * 'metadata.playground': { $eq: true }\n * }\n * });\n *\n * @example\n * // Filter by session ID\n * const conversations = await client.listConversations({\n * metadata_filters: {\n * 'metadata.session_id': { $eq: 'session-123' }\n * }\n * });\n */\n async listConversations(options?: {\n limit?: number;\n offset?: number;\n collection_ids?: string[];\n metadata_filters?: Record<string, any>;\n }): Promise<any[]> {\n const params: Record<string, any> = {\n limit: options?.limit ?? 100,\n offset: options?.offset ?? 0\n };\n // Convert collection_ids to collection_ids for the API\n if (options?.collection_ids && options.collection_ids.length > 0) {\n params.collection_ids = options.collection_ids;\n }\n // Add metadata_filters if provided (serialize to JSON string for query parameter)\n if (options?.metadata_filters) {\n params.metadata_filters = JSON.stringify(options.metadata_filters);\n }\n const response = await this._makeRequest('GET', '/v1/memories', undefined, params);\n\n let conversations: any[];\n if (response && response.results) {\n conversations = response.results;\n } else if (Array.isArray(response)) {\n conversations = response;\n } else {\n conversations = response ? [response] : [];\n }\n\n return conversations;\n }\n\n /** Get conversation messages directly from the conversations API */\n async getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;\n async getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;\n async getConversationMessages(conversationIdOrIds: string | string[]): Promise<MemoryResponse[] | Record<string, MemoryResponse[]>> {\n // Handle single conversation ID (backward compatibility)\n if (typeof conversationIdOrIds === 'string') {\n const response = await this._makeRequest('GET', `/v1/memories/${conversationIdOrIds}`);\n\n if (!response || !response.results) {\n return [];\n }\n\n return this._transformConversationMessages(response.results);\n }\n\n // Handle multiple conversation IDs\n if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {\n return {};\n }\n\n // Use GET request with ids query parameter for batch retrieval\n // This performs a single SQL query with IN clause for optimal performance\n const params = { ids: conversationIdOrIds };\n const response = await this._makeRequest('GET', '/v1/memories', undefined, params);\n\n console.log('🔍 SDK: Raw batch response:', response);\n console.log('🔍 SDK: Response has results?', !!response?.results);\n if (response?.results) {\n console.log('🔍 SDK: Results keys:', Object.keys(response.results));\n console.log('🔍 SDK: Sample result:', Object.keys(response.results)[0], ':', response.results[Object.keys(response.results)[0]]);\n }\n\n const results: Record<string, MemoryResponse[]> = {};\n\n if (response && response.results) {\n // Backend returns { \"results\": { \"results\": { conversation_id: MessageResponse[] } } } format (double-nested)\n const batchResults = response.results.results || response.results;\n console.log('🔍 SDK: Processing', Object.keys(batchResults).length, 'conversations');\n for (const [conversationId, messages] of Object.entries(batchResults)) {\n if (Array.isArray(messages)) {\n const transformed = this._transformConversationMessages(messages as any[]);\n results[conversationId] = transformed;\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: ${messages.length} raw -> ${transformed.length} transformed`);\n } else {\n results[conversationId] = [];\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: not array, setting empty`);\n }\n }\n }\n\n // Ensure all requested conversation IDs are present in results (even if empty)\n for (const conversationId of conversationIdOrIds) {\n if (!(conversationId in results)) {\n results[conversationId] = [];\n }\n }\n\n return results;\n }\n\n /** Helper method to transform conversation messages to MemoryResponse format */\n private _transformConversationMessages(messageResponses: any[]): MemoryResponse[] {\n return messageResponses.map((msgResp: any) => {\n const msgId = String(msgResp.id || '');\n const msg = msgResp.message || {}; // The actual Message object\n const metadata = msgResp.metadata || {};\n\n // Normalize content to a string - could be string or object\n let text: string = '';\n const rawContent = msg.content;\n if (typeof rawContent === 'string') {\n text = rawContent;\n } else if (rawContent && typeof rawContent === 'object') {\n // Handle structured content\n text = String(rawContent.content || rawContent.text || JSON.stringify(rawContent));\n } else if (rawContent != null) {\n text = String(rawContent);\n }\n\n // Get role from the Message object\n const role = msg.role || metadata.role || 'user';\n\n // Merge message metadata with response metadata\n const combinedMetadata = {\n ...metadata,\n role, // Ensure role is in metadata for UI compatibility\n };\n\n return {\n id: msgId,\n content: text,\n metadata: combinedMetadata,\n created_at: msgResp.created_at,\n collection_ids: msgResp.collection_ids || [],\n } as MemoryResponse;\n });\n }\n\n /** Update a collection */\n async updateCollection(options: {\n collectionId: string;\n name?: string;\n description?: string;\n metadata?: Record<string, any>;\n }): Promise<Collection> {\n const data: Record<string, any> = {};\n if (options.name !== undefined) data.name = options.name;\n if (options.description !== undefined) data.description = options.description;\n if (options.metadata !== undefined) data.metadata = options.metadata;\n\n const response = await this._makeRequest('POST', `/v1/collections/${options.collectionId}`, data);\n const result = response.results || response;\n return this._collectionFromDict(result);\n }\n\n /** Delete a collection */\n async deleteCollection(collectionId: string): Promise<boolean> {\n await this._makeRequest('DELETE', `/v1/collections/${collectionId}`);\n return true;\n }\n\n // Memory Management Methods\n\n /**\n * Legacy convenience: store raw text content into a collection as a document\n */\n async store(content: string, collectionId: string, metadata: Record<string, any> = {}): Promise<MemoryResponse> {\n const docMetadata = {\n ...metadata,\n memory_type: 'memory',\n timestamp: new Date().toISOString(),\n } as Record<string, any>;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([collectionId]),\n raw_text: String(content || ''),\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create engram: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n const id = respData?.results?.engram_id || respData?.results?.id || respData?.id || '';\n\n const result: MemoryResponse = {\n id: String(id),\n content: String(content || ''),\n metadata: docMetadata,\n collection_ids: [collectionId],\n created_at: docMetadata.timestamp,\n updated_at: docMetadata.timestamp,\n };\n return result;\n }\n\n /**\n * Store a single memory using the unified engrams API.\n *\n * Automatically infers memory type:\n * - If role is present, creates a conversation\n * - Otherwise, creates a document\n */\n async storeMemory(\n memory: Memory | Record<string, any>,\n name?: string\n ): Promise<string> {\n let mem: Memory;\n\n if ('collection_id' in memory) {\n mem = memory as Memory;\n } else {\n mem = {\n collection_id: (memory as any).collection_id,\n content: (memory as any).content || '',\n role: (memory as any).role,\n memory_id: (memory as any).memory_id,\n metadata: (memory as any).metadata || {},\n };\n }\n\n // If memory_id is present, append to existing memory\n if (mem.memory_id) {\n return await this._appendToMemory(mem.memory_id, mem);\n }\n\n // Automatically infer memory type from role presence\n const memoryType = mem.role ? 'conversation' : 'document';\n\n // Handle conversation creation\n if (memoryType === 'conversation') {\n // Use new unified POST /v1/memories endpoint\n const docMetadata = { ...mem.metadata };\n const data = {\n engram_type: 'conversation',\n name: name || 'Conversation',\n metadata: JSON.stringify(docMetadata),\n collection_ids: JSON.stringify([mem.collection_id]),\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create conversation: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n const convId = respData.results.engram_id || respData.results.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n\n // If content and role provided, append initial message\n if (mem.content && mem.role) {\n const appendMem: Memory = {\n collection_id: mem.collection_id,\n content: [\n {\n content: String(mem.content),\n role: mem.role,\n metadata: mem.metadata,\n ...(typeof (mem as any).authority === 'number' ? { authority: Number((mem as any).authority) } : {})\n },\n ],\n memory_id: convId,\n metadata: {},\n };\n await this._appendToMemory(convId, appendMem);\n }\n\n return String(convId);\n }\n throw new NebulaClientException('Failed to create conversation: invalid response format');\n }\n\n // Handle document/text memory\n const contentText = String(mem.content || '');\n if (!contentText) {\n throw new NebulaClientException('Content is required for document memories');\n }\n\n const contentHash = await this._sha256(contentText);\n const docMetadata = { ...mem.metadata } as Record<string, any>;\n docMetadata.memory_type = 'memory';\n docMetadata.content_hash = contentHash;\n // If authority provided for document, persist in metadata for ranking\n if (typeof (mem as any).authority === 'number') {\n const v = Number((mem as any).authority);\n if (!Number.isNaN(v) && v >= 0 && v <= 1) {\n (docMetadata as any).authority = v;\n }\n }\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([mem.collection_id]),\n raw_text: contentText,\n } as const;\n\n const url = `${this.baseUrl}/v1/memories`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create engram: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n if (respData.results.engram_id) return String(respData.results.engram_id);\n if (respData.results.id) return String(respData.results.id);\n }\n return '';\n }\n\n /**\n * Internal method to append content to an existing engram\n *\n * @throws NebulaNotFoundException if engram_id doesn't exist\n */\n private async _appendToMemory(memoryId: string, memory: Memory): Promise<string> {\n const collectionId = memory.collection_id;\n const content = memory.content;\n const metadata = memory.metadata;\n\n if (!collectionId) {\n throw new NebulaClientException('collection_id is required');\n }\n\n const payload: Record<string, any> = {\n collection_id: collectionId,\n };\n\n // Determine content type and set appropriate field\n if (Array.isArray(content)) {\n if (content.length > 0 && typeof content[0] === 'object' && 'content' in content[0]) {\n // Array of message objects (conversation)\n payload.messages = content;\n } else {\n // Array of strings (chunks)\n payload.chunks = content;\n }\n } else if (typeof content === 'string') {\n // Raw text string\n payload.raw_text = content;\n } else {\n throw new NebulaClientException(\n 'content must be a string, array of strings, or array of message objects'\n );\n }\n\n if (metadata) {\n payload.metadata = metadata;\n }\n\n try {\n await this._makeRequest('POST', `/v1/memories/${memoryId}/append`, payload);\n return memoryId;\n } catch (error) {\n // Convert 404 errors to NebulaNotFoundException\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(memoryId, 'Memory');\n }\n throw error;\n }\n }\n\n /** Store multiple memories using the unified engrams API */\n async storeMemories(memories: Memory[]): Promise<string[]> {\n const results: string[] = [];\n const convGroups: Record<string, Memory[]> = {};\n const others: Memory[] = [];\n\n for (const m of memories) {\n if (m.role) {\n const key = m.memory_id || `__new__::${m.collection_id}`;\n if (!convGroups[key]) convGroups[key] = [];\n convGroups[key].push(m);\n } else {\n others.push(m);\n }\n }\n\n // Process conversation groups using new unified API\n for (const [key, group] of Object.entries(convGroups)) {\n const collectionId = group[0].collection_id;\n let convId: string;\n\n // Create conversation if needed\n if (key.startsWith('__new__::')) {\n // Pass a placeholder role to trigger conversation creation\n convId = await this.storeMemory(\n {\n collection_id: collectionId,\n content: '',\n role: 'assistant', // Placeholder role to infer conversation type\n metadata: {},\n },\n 'Conversation'\n );\n } else {\n convId = key;\n }\n\n // Append messages using new unified API\n const messages = group.map((m) => ({\n content: String(m.content || ''),\n role: m.role!,\n metadata: m.metadata || {},\n }));\n\n const appendMem: Memory = {\n collection_id: collectionId,\n content: messages,\n memory_id: convId,\n metadata: {},\n };\n await this._appendToMemory(convId, appendMem);\n\n results.push(...Array(group.length).fill(String(convId)));\n }\n\n // Process others (text/json) individually\n for (const m of others) {\n results.push(await this.storeMemory(m));\n }\n\n return results;\n }\n\n /** Delete one or more memories */\n async delete(memoryIds: string | string[]): Promise<boolean | {\n message: string;\n results: {\n successful: string[];\n failed: Array<{ id: string; error: string }>;\n summary: {\n total: number;\n succeeded: number;\n failed: number;\n };\n };\n }> {\n try {\n console.log('[SDK] delete() called with:', { memoryIds, type: typeof memoryIds, isArray: Array.isArray(memoryIds) });\n\n // Handle single ID vs array\n if (typeof memoryIds === 'string') {\n console.log('[SDK] Single deletion path for ID:', memoryIds);\n // Single deletion - try existing endpoint first for backward compatibility\n try {\n await this._makeRequest('DELETE', `/v1/memories/${memoryIds}`);\n return true;\n } catch {\n // Fall back to new unified endpoint\n try {\n console.log('[SDK] Falling back to POST /v1/memories/delete with single ID');\n // Send the UUID string directly as body (not wrapped in {ids: ...})\n const response = await this._makeRequest('POST', '/v1/memories/delete', memoryIds);\n return typeof response === 'object' && response.success !== undefined\n ? response.success\n : true;\n } catch (error) {\n throw error;\n }\n }\n } else {\n console.log('[SDK] Batch deletion path for IDs:', memoryIds);\n console.log('[SDK] Sending POST request with body:', memoryIds);\n // Batch deletion - send array directly as body (not wrapped in {ids: ...})\n // FastAPI Body() without embed=True expects the value directly\n const response = await this._makeRequest('POST', '/v1/memories/delete', memoryIds);\n console.log('[SDK] Batch deletion response:', response);\n return response;\n }\n } catch (error) {\n console.error('[SDK] Delete error:', error);\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Delete a specific chunk or message within a memory */\n async deleteChunk(chunkId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/chunks/${chunkId}`);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(chunkId, 'Chunk');\n }\n throw error;\n }\n }\n\n /** Update a specific chunk or message within a memory */\n async updateChunk(\n chunkId: string,\n content: string,\n metadata?: Record<string, any>\n ): Promise<boolean> {\n const payload: any = { content };\n if (metadata !== undefined) {\n payload.metadata = metadata;\n }\n\n try {\n await this._makeRequest('PATCH', `/v1/chunks/${chunkId}`, payload);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(chunkId, 'Chunk');\n }\n throw error;\n }\n }\n\n /**\n * Update memory-level properties including name, metadata, and collection associations.\n *\n * This method allows updating properties of an entire memory (document or conversation)\n * without modifying its content. For updating individual chunks or messages within a memory,\n * use updateChunk(). For updating content, use storeMemory() to append.\n *\n * @param options - Update configuration\n * @param options.memoryId - The ID of the memory to update\n * @param options.name - New name for the memory (useful for conversations and documents)\n * @param options.metadata - Metadata to set. By default, replaces existing metadata.\n * Set mergeMetadata=true to merge with existing metadata instead.\n * @param options.collectionIds - New collection associations. Must specify at least one valid collection.\n * @param options.mergeMetadata - If true, merges provided metadata with existing metadata.\n * If false (default), replaces existing metadata entirely.\n *\n * @returns Promise resolving to true if successful\n *\n * @throws NebulaNotFoundException if memory_id doesn't exist\n * @throws NebulaValidationException if validation fails (e.g., no fields provided)\n * @throws NebulaAuthenticationException if user doesn't have permission to update this memory\n */\n async updateMemory(options: {\n memoryId: string;\n name?: string;\n metadata?: Record<string, any>;\n collectionIds?: string[];\n mergeMetadata?: boolean;\n }): Promise<boolean> {\n const payload: any = {};\n\n if (options.name !== undefined) {\n payload.name = options.name;\n }\n if (options.metadata !== undefined) {\n payload.metadata = options.metadata;\n payload.merge_metadata = options.mergeMetadata ?? false;\n }\n if (options.collectionIds !== undefined) {\n payload.collection_ids = options.collectionIds;\n }\n\n if (Object.keys(payload).length === 0) {\n throw new NebulaValidationException(\n 'At least one field (name, metadata, or collectionIds) must be provided to update'\n );\n }\n\n try {\n await this._makeRequest('PATCH', `/v1/memories/${options.memoryId}`, payload);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(options.memoryId, 'Memory');\n }\n throw error;\n }\n }\n\n /** Delete a conversation and all its messages */\n async deleteConversation(conversationId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/memories/${conversationId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /**\n * Get all memories from specific collections with optional metadata filtering\n *\n * @param options - Configuration for listing memories\n * @param options.collection_ids - One or more collection IDs to retrieve memories from\n * @param options.limit - Maximum number of memories to return (default: 100)\n * @param options.offset - Number of memories to skip for pagination (default: 0)\n * @param options.metadata_filters - Optional metadata filters using MongoDB-like operators.\n * Supported operators: $eq, $ne, $in, $nin, $exists, $and, $or\n *\n * @returns Promise resolving to array of MemoryResponse objects\n *\n * @example\n * // Get all playground memories excluding conversations\n * const memories = await client.listMemories({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * 'metadata.content_type': { $ne: 'conversation' }\n * }\n * });\n *\n * @example\n * // Complex filter with multiple conditions\n * const memories = await client.listMemories({\n * collection_ids: ['collection-id'],\n * metadata_filters: {\n * $and: [\n * { 'metadata.playground': { $eq: true } },\n * { 'metadata.session_id': { $exists: true } }\n * ]\n * }\n * });\n */\n async listMemories(options: {\n collection_ids: string | string[];\n limit?: number;\n offset?: number;\n metadata_filters?: Record<string, any>;\n }): Promise<MemoryResponse[]> {\n const ids = Array.isArray(options.collection_ids) ? options.collection_ids : [options.collection_ids];\n if (!ids.length) {\n throw new NebulaClientException('collection_ids must be provided to list_memories().');\n }\n\n const params: Record<string, any> = {\n limit: options.limit ?? 100,\n offset: options.offset ?? 0,\n collection_ids: ids\n };\n\n // Add metadata_filters if provided (serialize to JSON string for query parameter)\n if (options.metadata_filters) {\n params.metadata_filters = JSON.stringify(options.metadata_filters);\n }\n\n const response = await this._makeRequest('GET', '/v1/memories', undefined, params);\n\n let documents: any[];\n if (response.results) {\n documents = response.results;\n } else if (Array.isArray(response)) {\n documents = response;\n } else {\n documents = [response];\n }\n\n return documents.map((doc) => this._memoryResponseFromDict(doc, ids));\n }\n\n /** Get a specific memory by engram ID */\n async getMemory(memoryId: string): Promise<MemoryResponse> {\n const response = await this._makeRequest('GET', `/v1/memories/${memoryId}`);\n\n const content = response.text || response.content;\n const chunks = Array.isArray(response.chunks) ? response.chunks : undefined;\n\n const memoryData = {\n id: response.id,\n content,\n chunks,\n metadata: response.metadata || {},\n collection_ids: response.collection_ids || [],\n };\n\n return this._memoryResponseFromDict(memoryData, []);\n }\n\n // Search Methods\n\n /**\n * Search within specific collections with optional metadata filtering.\n *\n * @param options - Search configuration\n * @param options.query - Search query string\n * @param options.collection_ids - One or more collection IDs to search within\n * @param options.limit - Maximum number of results to return (default: 10)\n * @param options.retrieval_type - Retrieval strategy (default: ADVANCED)\n * @param options.filters - Optional filters to apply to the search. Supports comprehensive metadata filtering\n * with MongoDB-like operators for both vector/chunk search and graph search.\n * @param options.searchSettings - Optional search configuration\n *\n * @returns Promise resolving to array of SearchResult objects containing both vector/chunk and graph search results\n *\n * @example\n * // Basic equality filter\n * await client.search({\n * query: \"machine learning\",\n * collection_ids: [\"research-collection\"],\n * filters: {\n * \"metadata.category\": { $eq: \"research\" },\n * \"metadata.verified\": true // Shorthand for $eq\n * }\n * });\n *\n * @example\n * // Numeric comparisons\n * await client.search({\n * query: \"high priority\",\n * collection_ids: [\"tasks\"],\n * filters: {\n * \"metadata.priority\": { $gte: 8 },\n * \"metadata.score\": { $lt: 100 }\n * }\n * });\n *\n * @example\n * // String matching\n * await client.search({\n * query: \"employees\",\n * collection_ids: [\"team\"],\n * filters: {\n * \"metadata.email\": { $ilike: \"%@company.com\" } // Case-insensitive\n * }\n * });\n *\n * @example\n * // Array operations\n * await client.search({\n * query: \"developers\",\n * collection_ids: [\"team\"],\n * filters: {\n * \"metadata.skills\": { $overlap: [\"python\", \"typescript\"] } // Has any\n * }\n * });\n *\n * @example\n * // Nested paths\n * await client.search({\n * query: \"users\",\n * collection_ids: [\"profiles\"],\n * filters: {\n * \"metadata.user.preferences.theme\": { $eq: \"dark\" }\n * }\n * });\n *\n * @example\n * // Complex logical combinations\n * await client.search({\n * query: \"candidates\",\n * collection_ids: [\"hiring\"],\n * filters: {\n * $and: [\n * { \"metadata.verified\": true },\n * { \"metadata.level\": { $gte: 5 } },\n * {\n * $or: [\n * { \"metadata.skills\": { $overlap: [\"python\", \"go\"] } },\n * { \"metadata.years_experience\": { $gte: 8 } }\n * ]\n * }\n * ]\n * }\n * });\n *\n * @remarks\n * Supported Operators:\n * - Comparison: $eq, $ne, $lt, $lte, $gt, $gte\n * - String: $like (case-sensitive), $ilike (case-insensitive)\n * - Array: $in, $nin, $overlap, $contains\n * - JSONB: $json_contains\n * - Logical: $and, $or\n *\n * For comprehensive filtering documentation, see the Metadata Filtering Guide:\n * https://docs.nebulacloud.app/guides/metadata-filtering\n */\n async search(options: {\n query: string;\n collection_ids: string | string[];\n limit?: number;\n filters?: Record<string, any>;\n search_mode?: 'fast' | 'super';\n searchSettings?: Record<string, any>;\n }): Promise<SearchResult[]> {\n const collectionIds = Array.isArray(options.collection_ids) ? options.collection_ids : [options.collection_ids];\n // Filter out empty/invalid collection IDs\n const validCollectionIds = collectionIds.filter(id => id && id.trim() !== '');\n if (!validCollectionIds.length) {\n throw new NebulaClientException('collection_ids must be provided to search().');\n }\n\n const limit = options.limit ?? 10;\n const searchMode = options.search_mode ?? 'super';\n\n // Build effective search settings with simplified structure\n const effectiveSettings: Record<string, any> = {\n ...options.searchSettings\n };\n effectiveSettings.limit = limit;\n\n const userFilters = { ...effectiveSettings.filters } as Record<string, any>;\n if (options.filters) {\n Object.assign(userFilters, options.filters);\n }\n userFilters.collection_ids = { $overlap: validCollectionIds };\n effectiveSettings.filters = userFilters;\n\n const data = {\n query: options.query,\n search_mode: searchMode,\n search_settings: effectiveSettings,\n };\n\n const response = await this._makeRequest('POST', '/v1/retrieval/search', data);\n\n let chunkResults: any[] = [];\n let graphResults: any[] = [];\n\n if (response.results) {\n chunkResults = response.results.chunk_search_results || [];\n graphResults = response.results.graph_search_results || [];\n }\n\n const out: SearchResult[] = [];\n out.push(...chunkResults.map((result) => this._searchResultFromDict(result)));\n for (const g of graphResults) {\n out.push(this._searchResultFromGraphDict(g));\n }\n\n return out;\n }\n\n /**\n * Legacy wrapper: store a two-message conversation turn as a document\n */\n async storeConversation(\n userMessage: string,\n assistantMessage: string,\n collectionId: string,\n sessionId: string\n ): Promise<MemoryResponse> {\n const content = `User: ${String(userMessage || '')}\\nAssistant: ${String(assistantMessage || '')}`;\n const metadata = { session_id: sessionId, content_type: 'conversation' } as Record<string, any>;\n return this.store(content, collectionId, metadata);\n }\n\n /**\n * Legacy wrapper: search conversations optionally scoped by session\n */\n async searchConversations(\n query: string,\n collectionId: string,\n sessionId?: string,\n includeAllSessions: boolean = true\n ): Promise<SearchResult[]> {\n const filters: Record<string, any> = { 'metadata.content_type': 'conversation' };\n if (sessionId && !includeAllSessions) {\n (filters as any)['metadata.session_id'] = sessionId;\n }\n return this.search({\n query,\n collection_ids: [collectionId],\n limit: 10,\n filters\n });\n }\n\n // Health Check\n async healthCheck(): Promise<Record<string, any>> {\n return this._makeRequest('GET', '/health');\n }\n\n // Helpers\n\n private _collectionFromDict(data: any): Collection {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const collectionId = String(data.id || '');\n const collectionName = data.name || '';\n const collectionDescription = data.description;\n const collectionOwnerId = data.owner_id ? String(data.owner_id) : undefined;\n const memoryCount = data.document_count || 0;\n\n const metadata = {\n graph_collection_status: data.graph_collection_status || '',\n graph_sync_status: data.graph_sync_status || '',\n user_count: data.user_count || 0,\n document_count: data.document_count || 0,\n };\n\n return {\n id: collectionId,\n name: collectionName,\n description: collectionDescription,\n metadata,\n created_at: createdAt,\n updated_at: updatedAt,\n memory_count: memoryCount,\n owner_id: collectionOwnerId,\n } as Collection;\n }\n\n private _memoryResponseFromDict(data: any, collectionIds: string[]): MemoryResponse {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const engramId = String(data.id || '');\n const content = data.content || data.text;\n let chunks: string[] | undefined;\n\n if (data.chunks && Array.isArray(data.chunks)) {\n if (data.chunks.every((x: any) => typeof x === 'string')) {\n chunks = data.chunks;\n } else {\n chunks = data.chunks\n .filter((item: any) => item && typeof item === 'object' && 'text' in item)\n .map((item: any) => item.text);\n }\n }\n\n const metadata = { ...data.metadata };\n if (data.engram_id) {\n (metadata as any).engram_id = data.engram_id;\n }\n\n let finalId = engramId;\n if (data.engram_id && !engramId) {\n finalId = data.engram_id;\n }\n\n if (data.document_metadata) {\n Object.assign(metadata, data.document_metadata);\n }\n\n return {\n id: finalId,\n content,\n chunks,\n metadata,\n collection_ids: data.collection_ids || collectionIds,\n created_at: createdAt,\n updated_at: updatedAt,\n } as MemoryResponse;\n }\n\n private _searchResultFromDict(data: any): SearchResult {\n const content = data.content || data.text || '';\n const resultId = data.id || data.chunk_id || '';\n\n return {\n id: String(resultId),\n content: String(content),\n score: Number(data.score || 0.0),\n metadata: data.metadata || {},\n source: data.source,\n };\n }\n\n private _searchResultFromGraphDict(data: any): SearchResult {\n const rid = data.id ? String(data.id) : '';\n const rtype =\n GraphSearchResultType[(data.result_type || 'entity').toUpperCase() as keyof typeof GraphSearchResultType] ||\n GraphSearchResultType.ENTITY;\n const content = data.content || {};\n const score = data.score !== undefined ? Number(data.score) : 0.0;\n const metadata = data.metadata || {};\n const chunkIds = Array.isArray(data.chunk_ids) ? data.chunk_ids : undefined;\n let timestamp: string | undefined;\n if (data.timestamp) {\n if (typeof data.timestamp === 'string') {\n timestamp = data.timestamp;\n } else if (data.timestamp instanceof Date) {\n timestamp = data.timestamp.toISOString();\n } else {\n const parsed = new Date(data.timestamp);\n if (!Number.isNaN(parsed.valueOf())) {\n timestamp = parsed.toISOString();\n }\n }\n }\n\n const displayName = typeof data.display_name === 'string' ? data.display_name : undefined;\n const sourceRole = typeof data.source_role === 'string' ? data.source_role : undefined;\n const engramId = data.engram_id ? String(data.engram_id) : undefined;\n const ownerId = data.owner_id ? String(data.owner_id) : undefined;\n\n let entity: GraphEntityResult | undefined;\n let rel: GraphRelationshipResult | undefined;\n let comm: GraphCommunityResult | undefined;\n\n if (rtype === GraphSearchResultType.ENTITY) {\n entity = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n description: content.description || '',\n metadata: content.metadata || {},\n };\n } else if (rtype === GraphSearchResultType.RELATIONSHIP) {\n rel = {\n id: content.id ? String(content.id) : undefined,\n subject: content.subject || '',\n predicate: content.predicate || '',\n object: content.object || '',\n subject_id: content.subject_id ? String(content.subject_id) : undefined,\n object_id: content.object_id ? String(content.object_id) : undefined,\n description: content.description,\n metadata: content.metadata || {},\n };\n } else {\n comm = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n summary: content.summary || '',\n metadata: content.metadata || {},\n };\n }\n\n return {\n id: rid,\n score,\n metadata,\n source: 'graph',\n content: undefined,\n graph_result_type: rtype,\n graph_entity: entity,\n graph_relationship: rel,\n graph_community: comm,\n chunk_ids: chunkIds,\n timestamp,\n display_name: displayName,\n source_role: sourceRole,\n engram_id: engramId,\n owner_id: ownerId,\n } as SearchResult;\n }\n\n private async _sha256(message: string): Promise<string> {\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private _formDataFromObject(obj: Record<string, any>): FormData {\n const formData = new FormData();\n Object.entries(obj).forEach(([key, value]) => {\n formData.append(key, value as any);\n });\n return formData;\n }\n}\n"]}
|