@nebula-ai/sdk 1.2.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/client.ts","../src/content.ts","../src/index.ts"],"names":["GraphSearchResultType","memRecord","payload","response","multimodalParts","memoryResponseData","collectionIds","Memory"],"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, unknown>;\n role?: string; // For conversation messages\n}\n\n/**\n * Structured chunk format returned by backend for conversation messages.\n * Contains message text and role metadata inline.\n */\nexport interface StructuredChunk {\n text: string;\n role: 'user' | 'assistant' | 'system';\n}\n\n\n\n// Multimodal content part types\nexport interface TextContentPart {\n type: 'text';\n text: string;\n}\n\nexport interface FileContentPart {\n type?: 'image' | 'audio' | 'document' | 'file';\n data: string; // Base64 encoded data\n media_type: string; // MIME type\n filename?: string;\n duration_seconds?: number; // Specific to audio\n}\n\nexport interface S3FileReferencePart {\n type: 's3_ref';\n s3_key: string;\n bucket?: string;\n media_type: string;\n filename?: string;\n size_bytes?: number;\n}\n\nexport type MultimodalContentPart =\n | TextContentPart\n | FileContentPart\n | S3FileReferencePart;\n\nexport interface Memory {\n collection_id?: string;\n content?: string | string[] | MultimodalContentPart[] | Array<{ content: string | MultimodalContentPart[]; role: string; metadata?: Record<string, unknown>; authority?: number }>;\n role?: string; // user, assistant, or custom\n id?: string; // Memory/Engram UUID\n memory_id?: string; // Alias for id, for backward compatibility\n metadata: Record<string, unknown>;\n authority?: number; // Optional authority score (0.0 - 1.0)\n snapshot?: Record<string, unknown>; // Device-memory snapshot envelope for stateless mode\n\n // Read-only fields (populated from server response)\n chunks?: Chunk[];\n collection_ids?: string[];\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Collection {\n id: string;\n name: string;\n description?: string;\n metadata: Record<string, unknown>;\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, unknown>;\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 engram_id?: string; // Engram ID for graph results\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, unknown>;\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, unknown>;\n}\n\nexport interface GraphCommunityResult {\n id?: string;\n name: string;\n summary: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface SearchOptions {\n filters?: Record<string, unknown>;\n}\n\n// Hierarchical Memory Recall types (matches backend MemoryRecall structure)\nexport interface ActivatedEntity {\n id?: string;\n name: string;\n category?: string;\n activation_score: number;\n activation_reason?: string;\n description?: string;\n profile?: any;\n facets?: ActivatedFacet[];\n}\n\nexport interface ActivatedFacet {\n facet_id: string;\n facet_name: string;\n relevance_score: number;\n facts: ActivatedSemantic[];\n coherence_score?: number;\n is_noise: boolean;\n}\n\nexport interface ActivatedSemantic {\n id?: string;\n category?: string; // \"fact\" | \"inference\" | \"task\"\n description?: string;\n entity_id?: string;\n entity_name?: string;\n facet_name?: string;\n subject?: string;\n predicate?: string;\n value?: string;\n activation_score: number;\n extraction_confidence?: number;\n corroboration_count?: number;\n confidence?: number;\n source_chunk_ids?: string[];\n reasoning?: string; // inference-specific\n resolved_at?: string; // task-specific\n source_nodegroup_ids?: string[]; // inference-specific\n}\n\nexport interface GroundedSource {\n id?: string;\n text: string;\n activation_score: number;\n timestamp?: string;\n source_role?: string;\n speaker?: string;\n display_name?: string;\n engram_id?: string;\n owner_id?: string;\n supporting_fact_ids?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ActivatedEpisode {\n id?: string;\n name?: string;\n description?: string;\n activation_score: number;\n status?: string;\n t_start?: number; // unix epoch float\n t_last?: number; // unix epoch float\n n_facts?: number;\n member_semantic_ids?: string[];\n source_chunk_ids?: string[];\n entity_names?: string[];\n}\n\nexport interface ActivatedProcedure {\n statement: string;\n activation_score: number;\n confidence: number;\n is_negated?: boolean;\n}\n\nexport interface MemoryResponse {\n query: string;\n semantics: ActivatedSemantic[];\n procedures?: ActivatedProcedure[];\n episodes?: ActivatedEpisode[];\n sources: GroundedSource[];\n entities: ActivatedEntity[];\n total_traversal_time_ms?: number;\n token_count?: number;\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?: unknown\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?: unknown) {\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\n// Device Memory types\n\n/** Portable graph state envelope returned by export and consumed by compute/query. */\nexport interface SnapshotEnvelope {\n collection_id: string;\n graph: GraphPayload;\n root_hash: string;\n [key: string]: unknown;\n}\n\nexport interface GraphPayload {\n entities: Record<string, unknown>[];\n relationships: Record<string, unknown>[];\n entity_embeddings?: EmbeddingBlock;\n relationship_desc_embeddings?: EmbeddingBlock;\n relationship_rel_embeddings?: EmbeddingBlock;\n [key: string]: unknown;\n}\n\nexport interface EmbeddingBlock {\n dimension: number;\n matrix_b64: string;\n present_mask: boolean[];\n}\n\n/** Full-value diff produced by compute. */\nexport interface PatchEnvelope {\n collection_id: string;\n previous_root_hash: string;\n next_root_hash: string;\n put_entities: Record<string, unknown>[];\n delete_entities: string[];\n put_relationships: Record<string, unknown>[];\n delete_relationships: string[];\n events: Record<string, unknown>[];\n [key: string]: unknown;\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 Chunk,\n MultimodalContentPart,\n FileContentPart,\n SnapshotEnvelope,\n} from './types';\n\ntype ApiEnvelope<T> = { results: T };\n\n/**\n * Official Nebula JavaScript/TypeScript SDK\n * Mirrors the exact Nebula Python SDK client.py implementation\n */\nexport class Nebula {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n // Files larger than 5MB are automatically uploaded to S3\n private static readonly MAX_INLINE_SIZE = 5 * 1024 * 1024; // 5MB\n\n constructor(config: NebulaClientConfig = {} as 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.trynebula.ai').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_') || publicPart.startsWith('neb_')) && !!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 private _isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private _unwrapResults<T>(value: unknown): T {\n if (this._isRecord(value) && 'results' in value) {\n return (value as ApiEnvelope<T>).results;\n }\n return value as T;\n }\n\n private _unwrapResultsArray<T>(value: unknown): T[] {\n const unwrapped = this._unwrapResults<unknown>(value);\n if (Array.isArray(unwrapped)) {\n return unwrapped as T[];\n }\n if (unwrapped === undefined || unwrapped === null) {\n return [];\n }\n return [unwrapped as T];\n }\n\n private _looksLikeMultimodalContent(content: unknown): content is unknown[] {\n if (!Array.isArray(content)) return false;\n return content.some((part) => {\n if (!this._isRecord(part)) return false;\n if (typeof part.type === 'string') return true;\n if ('data' in part || 's3_key' in part || 'url' in part) return true;\n return false;\n });\n }\n\n private _normalizeContentParts(contentParts: unknown[]): MultimodalContentPart[] {\n return contentParts.map((part) => {\n if (typeof part === 'string') {\n return { type: 'text', text: part } satisfies MultimodalContentPart;\n }\n\n if (!this._isRecord(part)) {\n return { type: 'text', text: String(part) } satisfies MultimodalContentPart;\n }\n\n if (typeof part.type === 'string') {\n return part as unknown as MultimodalContentPart;\n }\n\n if ('s3_key' in part && typeof part.s3_key === 'string') {\n return {\n type: 's3_ref',\n s3_key: part.s3_key,\n bucket: typeof part.bucket === 'string' ? part.bucket : undefined,\n media_type: typeof part.media_type === 'string' ? part.media_type : 'application/octet-stream',\n filename: typeof part.filename === 'string' ? part.filename : undefined,\n size_bytes: typeof part.size_bytes === 'number' ? part.size_bytes : undefined,\n } satisfies MultimodalContentPart;\n }\n\n if ('data' in part && typeof part.data === 'string') {\n return {\n type: 'file',\n data: part.data,\n media_type: typeof part.media_type === 'string' ? part.media_type : 'application/octet-stream',\n filename: typeof part.filename === 'string' ? part.filename : undefined,\n duration_seconds: typeof part.duration_seconds === 'number' ? part.duration_seconds : undefined,\n } satisfies MultimodalContentPart;\n }\n\n return { type: 'text', text: String(part) } satisfies MultimodalContentPart;\n });\n }\n\n private async _serializeContentAsText(content: unknown): Promise<string> {\n if (this._looksLikeMultimodalContent(content)) {\n const normalized = this._normalizeContentParts(content);\n const processed = await this._processContentParts(normalized);\n return JSON.stringify(processed);\n }\n if (typeof content === 'object' && content !== null) {\n return JSON.stringify(content);\n }\n return String(content ?? '');\n }\n\n private async _serializeContentAsParts(content: unknown): Promise<MultimodalContentPart[] | null> {\n if (!this._looksLikeMultimodalContent(content)) return null;\n const normalized = this._normalizeContentParts(content as unknown[]);\n return await this._processContentParts(normalized);\n }\n\n /** Make an HTTP request to the Nebula API */\n private async _makeRequest(\n method: string,\n endpoint: string,\n jsonData?: unknown, // Can be object, array, or primitive for JSON body\n params?: Record<string, unknown>,\n extraHeaders?: Record<string, string>\n ): Promise<unknown> {\n const url = new URL(endpoint, this.baseUrl);\n\n if (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 value.forEach((item) => {\n url.searchParams.append(key, String(item));\n });\n } else {\n url.searchParams.append(key, String(value));\n }\n }\n });\n }\n\n const headers = { ...this._buildAuthHeaders(true), ...extraHeaders };\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, unknown>;\n }): Promise<Collection> {\n const data: Record<string, unknown> = { 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) as { results?: Record<string, unknown> } | Record<string, unknown>;\n const result = (response as { results?: Record<string, unknown> }).results || response as Record<string, unknown>;\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}`) as { results?: Record<string, unknown> } | Record<string, unknown>;\n const result = (response as { results?: Record<string, unknown> }).results || response as Record<string, unknown>;\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}`) as { results?: Record<string, unknown> } | Record<string, unknown>;\n const result = (response as { results?: Record<string, unknown> }).results || response as Record<string, unknown>;\n return this._collectionFromDict(result);\n }\n\n /** Get all collections */\n async listCollections(options?: {\n limit?: number;\n offset?: number;\n name?: string;\n }): Promise<Collection[]> {\n const params: Record<string, unknown> = {\n limit: options?.limit ?? 100,\n offset: options?.offset ?? 0\n };\n if (options?.name !== undefined) {\n params.name = options.name;\n }\n const response = await this._makeRequest('GET', '/v1/collections', undefined, params) as { results?: unknown[] } | unknown[] | unknown;\n\n let collections: unknown[];\n if (typeof response === 'object' && response !== null && 'results' in response) {\n collections = (response as { results: unknown[] }).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 as Record<string, unknown>));\n }\n\n /** Update a collection */\n async updateCollection(options: {\n collectionId: string;\n name?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n }): Promise<Collection> {\n const data: Record<string, unknown> = {};\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) as { results?: Record<string, unknown> } | Record<string, unknown>;\n const result = (response as { results?: Record<string, unknown> }).results || response as Record<string, unknown>;\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, unknown> = {}): Promise<Memory> {\n const docMetadata = {\n ...metadata,\n memory_type: 'memory',\n timestamp: new Date().toISOString(),\n } as Record<string, unknown>;\n\n const payload = {\n collection_id: collectionId,\n raw_text: String(content || ''),\n metadata: docMetadata,\n ingestion_mode: 'fast',\n } as const;\n\n const response = await this._makeRequest('POST', '/v1/memories', payload) as { results?: { engram_id?: string; id?: string }; id?: string };\n const id = response?.results?.engram_id || response?.results?.id || response?.id || '';\n\n const timestamp = docMetadata.timestamp as string | undefined;\n const result: Memory = {\n id: String(id),\n memory_id: String(id),\n content: String(content || ''),\n metadata: docMetadata,\n collection_ids: [collectionId],\n created_at: timestamp,\n updated_at: 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, unknown>,\n name?: string\n ): Promise<string | Record<string, unknown>> {\n let mem: Memory;\n\n if ('collection_id' in memory || 'snapshot' in memory) {\n mem = memory as Memory;\n } else {\n // Support both camelCase (collectionId) and snake_case (collection_id)\n const memRecord = memory as Record<string, unknown>;\n mem = {\n collection_id: (memRecord.collection_id as string) || (memRecord.collectionId as string) || '',\n content: (memRecord.content as Memory['content']) || '',\n role: memRecord.role as string | undefined,\n memory_id: (memRecord.memory_id as string) || (memRecord.memoryId as string) || undefined,\n metadata: (memRecord.metadata as Record<string, unknown>) || {},\n snapshot: memRecord.snapshot as Record<string, unknown> | undefined,\n };\n }\n\n // Device-memory snapshot mode: POST to /v1/memories with snapshot + raw_text\n if (mem.snapshot) {\n const contentText = await this._serializeContentAsText(mem.content);\n const payload: Record<string, unknown> = {\n snapshot: mem.snapshot,\n raw_text: contentText,\n };\n // Note: backend rejects metadata in snapshot mode; do not send it.\n const response = await this._makeRequest('POST', '/v1/memories', payload) as {\n results?: { snapshot?: Record<string, unknown> };\n };\n const snapshot = response?.results?.snapshot;\n if (snapshot) {\n return snapshot;\n }\n return response?.results ?? {};\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 with JSON body\n const messages = [];\n\n // If content and role provided, include as initial message\n if (mem.content && mem.role) {\n const multimodalParts = await this._serializeContentAsParts(mem.content);\n const msgContent = multimodalParts ?? await this._serializeContentAsText(mem.content);\n\n const memRecord = mem as Memory & { authority?: number };\n messages.push({\n content: msgContent,\n role: mem.role,\n metadata: mem.metadata || {},\n ...(typeof memRecord.authority === 'number' ? { authority: Number(memRecord.authority) } : {})\n });\n }\n\n // Backend requires at least one message for conversation creation\n if (messages.length === 0) {\n throw new NebulaClientException('Cannot create conversation without messages. Provide content and role.');\n }\n\n const data = {\n collection_id: mem.collection_id,\n name: name || 'Conversation',\n messages: messages,\n metadata: mem.metadata || {},\n };\n\n const response = await this._makeRequest('POST', '/v1/memories', data) as { results?: { memory_id?: string; id?: string } };\n\n if (response.results) {\n const convId = response.results.memory_id || response.results.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\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 docMetadata = { ...mem.metadata } as Record<string, unknown>;\n docMetadata.memory_type = 'memory';\n\n // If authority provided for document, persist in metadata for ranking\n const memRecord = mem as Memory & { authority?: number };\n if (typeof memRecord.authority === 'number') {\n const v = Number(memRecord.authority);\n if (!Number.isNaN(v) && v >= 0 && v <= 1) {\n docMetadata.authority = v;\n }\n }\n\n // If content is multimodal, send content_parts so the backend can run OCR/transcription.\n // If content is an array of strings, send `chunks` (backend supports both raw_text and chunks).\n let payload: Record<string, unknown>;\n const multimodalParts = await this._serializeContentAsParts(mem.content);\n if (multimodalParts) {\n payload = {\n collection_id: mem.collection_id,\n content_parts: multimodalParts,\n metadata: docMetadata,\n ingestion_mode: 'fast',\n };\n } else if (Array.isArray(mem.content) && mem.content.every((x) => typeof x === 'string')) {\n payload = {\n collection_id: mem.collection_id,\n chunks: mem.content,\n metadata: docMetadata,\n ingestion_mode: 'fast',\n };\n } else {\n const contentText = await this._serializeContentAsText(mem.content);\n if (!contentText || contentText === '\"\"' || contentText === '[]' || contentText === '{}') {\n throw new NebulaClientException('Content is required for document memories');\n }\n payload = {\n collection_id: mem.collection_id,\n raw_text: contentText,\n metadata: docMetadata,\n ingestion_mode: 'fast',\n };\n }\n\n const response = await this._makeRequest('POST', '/v1/memories', payload) as { results?: { engram_id?: string; id?: string }; id?: string };\n const id = response?.results?.engram_id || response?.results?.id || response?.id || '';\n return String(id || '');\n }\n\n /**\n * Internal method to append content to an existing memory\n *\n * @throws NebulaNotFoundException if memory_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, unknown> = {\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 * @param memories - List of Memory objects to store.\n * @param metadata - Optional memory-level metadata for conversation groups.\n * Each Memory's own metadata is used as per-message metadata.\n */\n async storeMemories(memories: Memory[], metadata?: Record<string, unknown>): 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 // Prepare messages for the conversation\n const messages: Array<{ content: string | MultimodalContentPart[]; role: string; metadata?: Record<string, unknown>; authority?: number }> = [];\n for (const m of group) {\n const multimodalParts = await this._serializeContentAsParts(m.content);\n const msgContent = multimodalParts ?? await this._serializeContentAsText(m.content);\n if (typeof msgContent === 'string') {\n if (!msgContent.trim()) continue;\n } else if (msgContent.length === 0) {\n continue;\n }\n\n const mRecord = m as Memory & { authority?: number };\n messages.push({\n content: msgContent,\n role: m.role!,\n metadata: m.metadata || {},\n ...(typeof mRecord.authority === 'number' ? { authority: Number(mRecord.authority) } : {}),\n });\n }\n\n if (!messages.length) {\n throw new NebulaClientException(\n 'Cannot create/append conversation without messages. Provide non-empty content.'\n );\n }\n\n // Create conversation if needed\n if (key.startsWith('__new__::')) {\n // Create conversation with initial messages using JSON body\n const data = {\n collection_id: collectionId,\n name: 'Conversation',\n messages: messages,\n metadata: metadata ?? {},\n };\n\n const response = await this._makeRequest('POST', '/v1/memories', data) as { results?: { memory_id?: string; id?: string } };\n\n if (response.results) {\n convId = response.results.memory_id || response.results.id || '';\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n } else {\n throw new NebulaClientException('Failed to create conversation: invalid response format');\n }\n } else {\n // Append to existing conversation\n convId = key;\n\n const appendMem: Memory = {\n collection_id: collectionId,\n content: messages as Memory['content'],\n memory_id: convId,\n metadata: metadata ?? {},\n };\n await this._appendToMemory(convId, appendMem);\n }\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) as string);\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 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) as { success?: boolean } | boolean;\n return typeof response === 'object' && response.success !== undefined\n ? response.success\n : true;\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) as 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 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 source within a memory */\n async deleteSource(sourceId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/sources/${sourceId}`);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(sourceId, 'Source');\n }\n throw error;\n }\n }\n\n /** Update a specific source within a memory */\n async updateSource(\n sourceId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<boolean> {\n const payload: Record<string, unknown> = { content };\n if (metadata !== undefined) {\n payload.metadata = metadata;\n }\n\n try {\n await this._makeRequest('PATCH', `/v1/sources/${sourceId}`, payload);\n return true;\n } catch (error) {\n if (error instanceof NebulaException && error.statusCode === 404) {\n throw new NebulaNotFoundException(sourceId, 'Source');\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 sources within a memory,\n * use updateSource(). 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, unknown>;\n collectionIds?: string[];\n mergeMetadata?: boolean;\n }): Promise<boolean> {\n const payload: Record<string, unknown> = {};\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 /**\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, unknown>;\n }): Promise<Memory[]> {\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, unknown> = {\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) as { results?: unknown[] } | unknown[] | unknown;\n\n let documents: unknown[];\n if (typeof response === 'object' && response !== null && 'results' in response) {\n documents = (response as { results: unknown[] }).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 as Record<string, unknown>, ids));\n }\n\n /** Get a specific memory by engram ID */\n async getMemory(memoryId: string): Promise<Memory> {\n const response = await this._makeRequest('GET', `/v1/memories/${memoryId}`) as { text?: string; content?: string; chunks?: unknown[]; id?: string; metadata?: Record<string, unknown>; collection_ids?: string[] };\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.effort - Compute effort budget (auto/low/medium/high). Controls traversal compute, not MemoryResponse size.\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.trynebula.ai/guides/metadata-filtering\n */\n async search(options: {\n query: string;\n collection_ids?: string | string[];\n effort?: 'auto' | 'low' | 'medium' | 'high';\n filters?: Record<string, unknown>;\n searchSettings?: Record<string, unknown>;\n snapshot?: Record<string, unknown>;\n }): Promise<MemoryResponse> {\n // Device-memory snapshot mode: POST to /v1/memories/search with snapshot + query\n if (options.snapshot) {\n const snapshotData: Record<string, unknown> = {\n snapshot: options.snapshot,\n query: options.query,\n };\n if (options.effort) {\n snapshotData.effort = options.effort;\n }\n const response = await this._makeRequest('POST', '/v1/memories/search', snapshotData) as { results?: MemoryResponse };\n const memoryResponseData = response.results as MemoryResponse;\n return {\n query: memoryResponseData.query || options.query,\n semantics: (memoryResponseData as any).semantics || (memoryResponseData as any).knowledge || [],\n procedures: (memoryResponseData as any).procedures || [],\n episodes: (memoryResponseData as any).episodes || [],\n sources: memoryResponseData.sources || [],\n total_traversal_time_ms: memoryResponseData.total_traversal_time_ms,\n token_count: memoryResponseData.token_count,\n entities: (memoryResponseData as any).entities || [],\n };\n }\n\n // Build request data - pass params directly to API (no wrapping needed)\n const data: Record<string, unknown> = {\n query: options.query,\n };\n\n if (options.effort) {\n data.effort = options.effort;\n }\n\n // Add collection_ids if provided\n if (options.collection_ids) {\n const collectionIds = Array.isArray(options.collection_ids) ? options.collection_ids : [options.collection_ids];\n const validCollectionIds = collectionIds.filter(id => id && id.trim() !== '');\n if (validCollectionIds.length) {\n data.collection_ids = validCollectionIds;\n }\n }\n\n // Add filters if provided\n if (options.filters) {\n data.filters = options.filters;\n }\n\n // Add advanced search settings if provided\n if (options.searchSettings) {\n data.search_settings = options.searchSettings;\n }\n\n // Collection affinity: send header for consistent-hash routing.\n // Single-collection: send the ID directly. Multi-collection: send a stable\n // synthetic key (sorted + joined) so requests for the same set of collections\n // land on the same pod instead of all hashing on the empty string.\n const collectionIds = data.collection_ids as string[] | undefined;\n let extraHeaders: Record<string, string> | undefined;\n if (collectionIds && collectionIds.length === 1) {\n extraHeaders = { 'X-Nebula-Collection-Id': collectionIds[0] };\n } else if (collectionIds && collectionIds.length > 1) {\n extraHeaders = { 'X-Nebula-Collection-Id': [...collectionIds].sort().join(',') };\n }\n\n const response = await this._makeRequest('POST', '/v1/memories/search', data, undefined, extraHeaders) as { results?: MemoryResponse };\n\n // Backend returns MemoryRecall wrapped in { results: MemoryResponse }\n // The @base_endpoint decorator always wraps successful responses as {\"results\": MemoryResponse}\n const memoryResponseData = response.results as MemoryResponse;\n\n // Ensure we have a proper MemoryResponse structure with all fields\n // Dual-key fallback for staggered deploys\n const memoryResponse: MemoryResponse = {\n query: memoryResponseData.query || options.query,\n semantics: (memoryResponseData as any).semantics || (memoryResponseData as any).knowledge || [],\n procedures: (memoryResponseData as any).procedures || [],\n episodes: (memoryResponseData as any).episodes || [],\n sources: memoryResponseData.sources || [],\n total_traversal_time_ms: memoryResponseData.total_traversal_time_ms,\n token_count: memoryResponseData.token_count,\n entities: (memoryResponseData as any).entities || [],\n };\n\n return memoryResponse;\n }\n\n // Connector Methods\n\n /** List available connector providers */\n async listProviders(): Promise<string[]> {\n const response = await this._makeRequest('GET', '/v1/connectors/providers');\n return this._unwrapResultsArray<string>(response);\n }\n\n /** Start an OAuth connection flow */\n async connectProvider(\n provider: string,\n collectionId: string,\n config?: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n const body: Record<string, unknown> = { collection_id: collectionId };\n if (config !== undefined) body.config = config;\n const response = await this._makeRequest('POST', `/v1/connectors/${provider}/connect`, body);\n return this._unwrapResults<Record<string, unknown>>(response);\n }\n\n /** List active connections for a collection */\n async listConnections(collectionId: string): Promise<Record<string, unknown>[]> {\n const response = await this._makeRequest('GET', '/v1/connectors', undefined, { collection_id: collectionId });\n return this._unwrapResultsArray<Record<string, unknown>>(response);\n }\n\n /** Browse Google Drive folders for a connection */\n async listFolders(connectionId: string, parentId?: string): Promise<Record<string, unknown>[]> {\n const params: Record<string, unknown> = {};\n if (parentId !== undefined) params.parent_id = parentId;\n const response = await this._makeRequest('GET', `/v1/connectors/${connectionId}/folders`, undefined, Object.keys(params).length ? params : undefined);\n return this._unwrapResultsArray<Record<string, unknown>>(response);\n }\n\n /** List Slack channels for a connection */\n async listChannels(connectionId: string): Promise<Record<string, unknown>[]> {\n const response = await this._makeRequest('GET', `/v1/connectors/${connectionId}/channels`);\n return this._unwrapResultsArray<Record<string, unknown>>(response);\n }\n\n /** Get a single connection by ID */\n async getConnection(connectionId: string): Promise<Record<string, unknown>> {\n const response = await this._makeRequest('GET', `/v1/connectors/${connectionId}`);\n return this._unwrapResults<Record<string, unknown>>(response);\n }\n\n /** Manually trigger a sync for a connection */\n async triggerSync(connectionId: string): Promise<Record<string, unknown>> {\n const response = await this._makeRequest('POST', `/v1/connectors/${connectionId}/sync`);\n return this._unwrapResults<Record<string, unknown>>(response);\n }\n\n /** Update connection config (e.g., folder/channel selection) */\n async updateConnectionConfig(connectionId: string, config: Record<string, unknown>, apply: string = 'full_resync'): Promise<Record<string, unknown>> {\n const response = await this._makeRequest('PATCH', `/v1/connectors/${connectionId}/config`, { config, apply });\n return this._unwrapResults<Record<string, unknown>>(response);\n }\n\n /** Disconnect an external data source */\n async disconnect(connectionId: string, deleteMemories: boolean = false): Promise<Record<string, unknown>> {\n const params: Record<string, unknown> = {};\n if (deleteMemories) params.delete_memories = 'true';\n const response = await this._makeRequest('DELETE', `/v1/connectors/${connectionId}`, undefined, Object.keys(params).length ? params : undefined);\n return this._unwrapResults<Record<string, unknown>>(response);\n }\n\n // Health Check\n async healthCheck(): Promise<Record<string, unknown>> {\n return this._makeRequest('GET', '/v1/health') as Promise<Record<string, unknown>>;\n }\n\n // Helpers\n\n private _collectionFromDict(data: Record<string, unknown>): Collection {\n let createdAt: string | undefined;\n if (data.created_at) {\n if (typeof data.created_at === 'string') {\n createdAt = data.created_at;\n } else if (data.created_at instanceof Date) {\n createdAt = data.created_at.toISOString();\n }\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n if (typeof data.updated_at === 'string') {\n updatedAt = data.updated_at;\n } else if (data.updated_at instanceof Date) {\n updatedAt = data.updated_at.toISOString();\n }\n }\n\n const collectionId = String(data.id || '');\n const collectionName = String(data.name || '');\n const collectionDescription = typeof data.description === 'string' ? data.description : undefined;\n const collectionOwnerId = data.owner_id ? String(data.owner_id) : undefined;\n const memoryCount = typeof data.memory_count === 'number' ? data.memory_count : 0;\n\n const metadata: Record<string, unknown> = {\n graph_collection_status: String(data.graph_collection_status || ''),\n graph_sync_status: String(data.graph_sync_status || ''),\n user_count: typeof data.user_count === 'number' ? data.user_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 };\n }\n\n private _memoryResponseFromDict(data: Record<string, unknown>, collectionIds: string[]): Memory {\n let createdAt: string | undefined;\n if (data.created_at) {\n if (typeof data.created_at === 'string') {\n createdAt = data.created_at;\n } else if (data.created_at instanceof Date) {\n createdAt = data.created_at.toISOString();\n }\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n if (typeof data.updated_at === 'string') {\n updatedAt = data.updated_at;\n } else if (data.updated_at instanceof Date) {\n updatedAt = data.updated_at.toISOString();\n }\n }\n\n const engramId = String(data.id || '');\n const content = typeof data.content === 'string' ? data.content : (typeof data.text === 'string' ? data.text : undefined);\n let chunks: Chunk[] | undefined;\n\n if (data.chunks && Array.isArray(data.chunks)) {\n if (data.chunks.every((x: unknown) => typeof x === 'string')) {\n chunks = (data.chunks as string[]).map((text: string) => ({\n id: '',\n content: text,\n metadata: {},\n }));\n } else {\n chunks = (data.chunks as Array<Record<string, unknown>>)\n .filter((item: Record<string, unknown>) => item && typeof item === 'object' && ('text' in item || 'content' in item))\n .map((item: Record<string, unknown>) => ({\n id: String(item.id || ''),\n content: String(item.text || item.content || ''),\n metadata: typeof item.metadata === 'object' && item.metadata !== null ? item.metadata as Record<string, unknown> : {},\n role: typeof item.role === 'string' ? item.role : undefined,\n }));\n }\n }\n\n const metadata: Record<string, unknown> = { ...(typeof data.metadata === 'object' && data.metadata !== null ? data.metadata as Record<string, unknown> : {}) };\n if (data.engram_id) {\n metadata.engram_id = data.engram_id;\n }\n\n let finalId = engramId;\n if (data.engram_id && !engramId) {\n finalId = String(data.engram_id);\n }\n\n if (data.document_metadata && typeof data.document_metadata === 'object') {\n Object.assign(metadata, data.document_metadata as Record<string, unknown>);\n }\n\n return {\n id: finalId,\n memory_id: finalId,\n content,\n chunks,\n metadata,\n collection_ids: Array.isArray(data.collection_ids) ? data.collection_ids as string[] : collectionIds,\n created_at: createdAt,\n updated_at: updatedAt,\n };\n }\n\n private _searchResultFromDict(data: Record<string, unknown>): SearchResult {\n const content = typeof data.content === 'string' ? data.content : (typeof data.text === 'string' ? data.text : '');\n const resultId = String(data.id || data.chunk_id || '');\n\n return {\n id: String(resultId),\n content: String(content),\n score: typeof data.score === 'number' ? data.score : Number(data.score || 0.0),\n metadata: typeof data.metadata === 'object' && data.metadata !== null ? data.metadata as Record<string, unknown> : {},\n source: typeof data.source === 'string' ? data.source : undefined,\n };\n }\n\n private _searchResultFromGraphDict(data: Record<string, unknown>): SearchResult {\n const rid = data.id ? String(data.id) : '';\n const resultTypeStr = typeof data.result_type === 'string' ? data.result_type : 'entity';\n const rtype =\n GraphSearchResultType[resultTypeStr.toUpperCase() as keyof typeof GraphSearchResultType] ||\n GraphSearchResultType.ENTITY;\n const content = (typeof data.content === 'object' && data.content !== null ? data.content : {}) as Record<string, unknown>;\n const score = data.score !== undefined ? Number(data.score) : 0.0;\n const metadata: Record<string, unknown> = typeof data.metadata === 'object' && data.metadata !== null ? data.metadata as Record<string, unknown> : {};\n const chunkIds = Array.isArray(data.chunk_ids) ? data.chunk_ids as string[] : 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(String(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: String(content.name || ''),\n description: String(content.description || ''),\n metadata: typeof content.metadata === 'object' && content.metadata !== null ? content.metadata as Record<string, unknown> : {},\n };\n } else if (rtype === GraphSearchResultType.RELATIONSHIP) {\n rel = {\n id: content.id ? String(content.id) : undefined,\n subject: String(content.subject || ''),\n predicate: String(content.predicate || ''),\n object: String(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: typeof content.description === 'string' ? content.description : undefined,\n metadata: typeof content.metadata === 'object' && content.metadata !== null ? content.metadata as Record<string, unknown> : {},\n };\n } else {\n comm = {\n id: content.id ? String(content.id) : undefined,\n name: String(content.name || ''),\n summary: String(content.summary || ''),\n metadata: typeof content.metadata === 'object' && content.metadata !== null ? content.metadata as Record<string, unknown> : {},\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 };\n }\n\n private async _sha256(message: string): Promise<string> {\n const msgBuffer = new TextEncoder().encode(message);\n // Use Web Crypto API: prefer globalThis.crypto (browser/Node 18+), fallback to Node's crypto.webcrypto\n let crypto: Crypto;\n if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n crypto = globalThis.crypto;\n } else {\n // Node.js environment: use built-in crypto module's webcrypto\n const nodeCrypto = await import('crypto');\n crypto = nodeCrypto.webcrypto as Crypto;\n }\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, unknown>): FormData {\n const formData = new FormData();\n Object.entries(obj).forEach(([key, value]) => {\n formData.append(key, value as string | Blob);\n });\n return formData;\n }\n\n /**\n * Convert and process multimodal content parts, auto-uploading large base64 files to S3.\n *\n * - Binary parts (`image`/`audio`/`document` with `data`) larger than 5MB are uploaded to S3 and converted to `s3_ref`.\n */\n private async _processContentParts(contentParts: MultimodalContentPart[]): Promise<MultimodalContentPart[]> {\n const processed: MultimodalContentPart[] = [];\n\n for (const part of contentParts) {\n // Safe check for binary file content parts\n // We check if it is NOT a known non-binary type (text, s3_ref, url, image_url)\n // And explicitly check for 'data' property presence to satisfy TS\n if (\n part.type !== 'text' &&\n part.type !== 's3_ref' &&\n 'data' in part &&\n part.data\n ) {\n // Now TS knows 'part' has 'data'\n const filePart = part as FileContentPart;\n\n // Calculate decoded size (base64 is ~4/3 of original)\n const dataSize = Math.floor(String(filePart.data).length * 3 / 4);\n\n if (dataSize > Nebula.MAX_INLINE_SIZE) {\n const filename = filePart.filename || `file.bin`;\n const mediaType = filePart.media_type || 'application/octet-stream';\n\n const uploadInfo = await this.getUploadUrl({\n filename,\n content_type: mediaType,\n file_size: dataSize,\n });\n\n // Decode base64 and upload to S3\n let bytes: Uint8Array;\n const atobFn = (globalThis as unknown as { atob?: (data: string) => string }).atob;\n if (typeof atobFn === 'function') {\n const binaryString = atobFn(String(filePart.data));\n bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n } else {\n // Node.js fallback\n const { Buffer } = await import('buffer');\n bytes = Uint8Array.from(Buffer.from(String(filePart.data), 'base64'));\n }\n\n await fetch(uploadInfo.upload_url, {\n method: 'PUT',\n body: bytes as unknown as BodyInit,\n headers: { 'Content-Type': mediaType },\n });\n\n processed.push({\n type: 's3_ref',\n s3_key: uploadInfo.s3_key,\n media_type: mediaType,\n filename,\n });\n continue;\n }\n }\n\n processed.push(part);\n }\n\n return processed;\n }\n\n /**\n * Get a presigned URL for uploading large files to S3.\n */\n async getUploadUrl(options: {\n filename: string;\n content_type: string;\n file_size: number;\n }): Promise<{ upload_url: string; s3_key: string; bucket: string; expires_in: number }> {\n const response = await this._makeRequest('POST', '/v1/memories/upload', undefined, {\n filename: options.filename,\n content_type: options.content_type,\n file_size: options.file_size,\n }) as { results?: { upload_url: string; s3_key: string; bucket: string; expires_in: number }; upload_url?: string; s3_key?: string; bucket?: string; expires_in?: number };\n\n if (response.results) {\n return response.results;\n }\n return response as { upload_url: string; s3_key: string; bucket: string; expires_in: number };\n }\n\n // ------------------------------------------------------------------\n // Device Memory\n // ------------------------------------------------------------------\n\n /**\n * Export a collection's full graph state as a portable snapshot.\n */\n async exportSnapshot(collectionId: string): Promise<SnapshotEnvelope> {\n const response = await this._makeRequest('POST', '/v1/device-memory/snapshot/export', {\n collection_id: collectionId,\n }) as { results?: SnapshotEnvelope } & SnapshotEnvelope;\n return (response.results ?? response) as SnapshotEnvelope;\n }\n\n /**\n * Import a snapshot into an ephemeral server-side collection.\n * @returns The ephemeral collection ID.\n */\n async importSnapshot(snapshot: SnapshotEnvelope | Record<string, unknown>): Promise<string> {\n const response = await this._makeRequest('POST', '/v1/device-memory/snapshot/import', {\n snapshot,\n }) as { results?: { ephemeral_collection_id: string }; ephemeral_collection_id?: string };\n const result = response.results ?? response;\n return (result as { ephemeral_collection_id: string }).ephemeral_collection_id ?? '';\n }\n\n}\n","import {\n FileContentPart\n} from './types';\n\nconst MIME_TYPES: Record<string, string> = {\n // Images\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".png\": \"image/png\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".heic\": \"image/heic\",\n \".bmp\": \"image/bmp\",\n \".tiff\": \"image/tiff\",\n // Audio\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".m4a\": \"audio/m4a\",\n \".ogg\": \"audio/ogg\",\n \".flac\": \"audio/flac\",\n \".aac\": \"audio/aac\",\n \".webm\": \"audio/webm\",\n // Documents\n \".pdf\": \"application/pdf\",\n \".doc\": \"application/msword\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".ppt\": \"application/vnd.ms-powerpoint\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".rtf\": \"application/rtf\",\n \".epub\": \"application/epub+zip\",\n};\n\n/**\n * Utility for creating multimodal content from files.\n * Note: These methods only work in Node.js environments.\n */\nexport class NebulaContent {\n /**\n * Create a FileContentPart from a file path.\n * Automatically deduces media_type and the backend 'type' (image, audio, document).\n */\n static async fromFile(filePath: string, mediaType?: string): Promise<FileContentPart> {\n let fs: typeof import('fs/promises');\n let path: typeof import('path');\n\n try {\n fs = await import('fs/promises');\n path = await import('path');\n } catch (e) {\n throw new Error('File system operations are only supported in Node.js environments.');\n }\n\n const absolutePath = path.resolve(filePath);\n const fileName = path.basename(absolutePath);\n const ext = path.extname(absolutePath).toLowerCase();\n\n const detectedMime = mediaType || MIME_TYPES[ext] || \"application/octet-stream\";\n\n const buffer = await fs.readFile(absolutePath);\n const data = buffer.toString('base64');\n\n return {\n data,\n media_type: detectedMime,\n filename: fileName\n };\n }\n}\n","// Main Client\nexport { Nebula } from './client';\nexport { Nebula as default } from './client';\n\n// Content Helper (Legacy/Internal)\nexport { NebulaContent } from './content';\n\n// Import Types to Merge/Re-export\nimport { NebulaContent } from './content';\nimport { Memory as MemoryType } from './types';\n\n// 1. Export Memory Factory Function (Value) - Acts like Python's class constructor\n// Using Object.assign pattern to avoid @typescript-eslint/no-namespace error\n\ntype MemoryFactory = {\n (data: MemoryType): MemoryType;\n File: typeof NebulaContent.fromFile;\n fromFile: (\n filePath: string,\n collection_id: string,\n metadata?: Record<string, unknown>,\n role?: string\n ) => Promise<MemoryType>;\n};\n\nconst MemoryBase = (data: MemoryType): MemoryType => data;\n\nexport const Memory: MemoryFactory = Object.assign(MemoryBase, {\n /**\n * Helper to create a file content part from a file path.\n * Alias for NebulaContent.fromFile().\n */\n File: NebulaContent.fromFile,\n\n /**\n * Helper to create a complete Memory object from a single file.\n */\n async fromFile(\n filePath: string,\n collection_id: string,\n metadata?: Record<string, unknown>,\n role?: string\n ): Promise<MemoryType> {\n const path = await import('path');\n const filename = path.basename(filePath);\n return {\n collection_id,\n content: [await NebulaContent.fromFile(filePath)],\n metadata: { filename, ...metadata },\n role\n };\n }\n});\n\n// 3. Export Memory Interface (Type) - Merged with Value\nexport type Memory = MemoryType;\n\n// 4. Re-export all other types explicitly (excluding Memory to avoid conflict)\nexport {\n GraphSearchResultType,\n Chunk,\n StructuredChunk,\n MemoryResponse,\n TextContentPart,\n FileContentPart,\n S3FileReferencePart,\n MultimodalContentPart,\n // Memory is exported above\n Collection,\n SearchResult,\n GraphEntityResult,\n GraphRelationshipResult,\n GraphCommunityResult,\n SearchOptions,\n ActivatedEntity,\n ActivatedSemantic,\n ActivatedProcedure,\n ActivatedEpisode,\n ActivatedFacet,\n GroundedSource,\n NebulaClientConfig,\n NebulaException,\n NebulaClientException,\n NebulaAuthenticationException,\n NebulaRateLimitException,\n NebulaValidationException,\n NebulaCollectionNotFoundException,\n NebulaNotFoundException,\n // Device Memory types\n SnapshotEnvelope,\n GraphPayload,\n EmbeddingBlock,\n PatchEnvelope,\n} from './types';\n"]}
1
+ {"version":3,"file":"index.js","names":["unwrap"],"sources":["../src/runtime/errors.ts","../src/runtime/retry.ts","../src/runtime/client.ts","../src/resources/client.ts","../src/resources/collections.ts","../src/resources/connectors.ts","../src/resources/memories.ts","../src/resources/snapshots.ts","../src/client.ts","../src/lib/_dx_generated.ts","../src/lib/dx.ts"],"sourcesContent":["export class NebulaError extends Error {\n override readonly name: string = \"NebulaError\";\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n\nexport class NebulaConnectionError extends NebulaError {\n override readonly name = \"NebulaConnectionError\";\n}\n\nexport class NebulaTimeoutError extends NebulaError {\n override readonly name = \"NebulaTimeoutError\";\n}\n\n// Canonical Error envelope returned by every Nebula 4xx/5xx. The runtime\n// pulls these fields out of the response body and surfaces them as typed\n// accessors on NebulaAPIError so callers can branch on err.code without\n// digging into err.body.\n//\n// The optional fields are typed as `T | null` because the wire schema is\n// `anyOf [T, null]` — the server emits the keys with explicit `null` rather\n// than omitting them. The NebulaAPIError constructor coerces `null` to\n// `undefined` so the public accessor surface stays `T | undefined`.\nexport interface ErrorEnvelope {\n readonly type: string;\n readonly message: string;\n readonly code?: string | null;\n readonly request_id?: string | null;\n // `details` is intentionally `unknown`: the server emits arbitrary\n // JSON here. For validation errors it's an array of {loc, msg, type}\n // entries; for other classes it can be an object or null. Callers\n // should narrow at the read site (e.g. `Array.isArray(err.details)`).\n readonly details?: unknown;\n}\n\nexport interface APIErrorPayload {\n readonly status: number;\n readonly requestId?: string;\n readonly body: unknown;\n}\n\nfunction isEnvelope(body: unknown): body is ErrorEnvelope {\n return (\n typeof body === \"object\" &&\n body !== null &&\n typeof (body as { type?: unknown }).type === \"string\" &&\n typeof (body as { message?: unknown }).message === \"string\"\n );\n}\n\nexport class NebulaAPIError extends NebulaError {\n override readonly name: string = \"NebulaAPIError\";\n readonly status: number;\n readonly requestId?: string;\n readonly body: unknown;\n // Canonical envelope fields. `type` is always present when the server\n // returned the documented envelope; the rest are present when the server\n // populated them. All four are undefined when the response body wasn't\n // an envelope (e.g. an HTML error page from a misconfigured proxy).\n readonly type?: string;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(payload: APIErrorPayload, message?: string) {\n const envelope = isEnvelope(payload.body) ? payload.body : undefined;\n super(\n message ??\n envelope?.message ??\n `Nebula API error (status ${payload.status})`\n );\n this.status = payload.status;\n // Coerce `null` (wire-level) to `undefined` (idiomatic JS absence) so\n // every accessor's runtime value matches its declared T | undefined.\n const envCode =\n typeof envelope?.code === \"string\" ? envelope.code : undefined;\n const envRid =\n typeof envelope?.request_id === \"string\"\n ? envelope.request_id\n : undefined;\n // Prefer the envelope's request_id (server-stamped) over the header\n // we captured at the transport — they should match, but if they\n // diverge the envelope is authoritative.\n this.requestId = envRid ?? payload.requestId;\n this.body = payload.body;\n this.type = envelope?.type;\n this.code = envCode;\n this.details = envelope?.details ?? undefined;\n }\n}\n\nexport class NebulaBadRequestError extends NebulaAPIError {\n override readonly name = \"NebulaBadRequestError\";\n}\nexport class NebulaUnauthorizedError extends NebulaAPIError {\n override readonly name = \"NebulaUnauthorizedError\";\n}\nexport class NebulaForbiddenError extends NebulaAPIError {\n override readonly name = \"NebulaForbiddenError\";\n}\nexport class NebulaNotFoundError extends NebulaAPIError {\n override readonly name = \"NebulaNotFoundError\";\n}\nexport class NebulaConflictError extends NebulaAPIError {\n override readonly name = \"NebulaConflictError\";\n}\nexport class NebulaValidationError extends NebulaAPIError {\n override readonly name = \"NebulaValidationError\";\n}\nexport class NebulaRateLimitError extends NebulaAPIError {\n override readonly name = \"NebulaRateLimitError\";\n readonly retryAfter?: number;\n constructor(payload: APIErrorPayload, retryAfter?: number) {\n super(payload);\n this.retryAfter = retryAfter;\n }\n}\nexport class NebulaServerError extends NebulaAPIError {\n override readonly name = \"NebulaServerError\";\n}\n\ntype APIErrorCtor = new (payload: APIErrorPayload) => NebulaAPIError;\n\nconst STATUS_TO_CLASS: Record<number, APIErrorCtor> = {\n 400: NebulaBadRequestError,\n 401: NebulaUnauthorizedError,\n 403: NebulaForbiddenError,\n 404: NebulaNotFoundError,\n 409: NebulaConflictError,\n 422: NebulaValidationError,\n};\n\nexport function errorFromResponse(payload: APIErrorPayload, retryAfter?: number): NebulaAPIError {\n if (payload.status === 429) return new NebulaRateLimitError(payload, retryAfter);\n const cls = STATUS_TO_CLASS[payload.status];\n if (cls) return new cls(payload);\n if (payload.status >= 500) return new NebulaServerError(payload);\n return new NebulaAPIError(payload);\n}\n","export interface RetryPolicy {\n readonly maxRetries: number;\n readonly baseMs: number;\n readonly maxMs: number;\n}\n\nexport const DEFAULT_RETRY: RetryPolicy = {\n maxRetries: 2,\n baseMs: 250,\n maxMs: 8000,\n};\n\nconst RETRYABLE_STATUSES: ReadonlySet<number> = new Set([408, 429, 502, 503, 504]);\n\nexport function isRetryableStatus(status: number): boolean {\n return RETRYABLE_STATUSES.has(status);\n}\n\nexport function backoffMs(attempt: number, policy: RetryPolicy, retryAfterSec?: number): number {\n if (retryAfterSec != null && Number.isFinite(retryAfterSec)) {\n return Math.min(retryAfterSec * 1000, policy.maxMs);\n }\n const exp = Math.min(policy.baseMs * 2 ** attempt, policy.maxMs);\n return Math.floor(Math.random() * exp);\n}\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolveSleep, reject) => {\n const handle = setTimeout(resolveSleep, ms);\n if (signal) {\n const onAbort = () => {\n clearTimeout(handle);\n reject(signal.reason ?? new Error(\"aborted\"));\n };\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n}\n","import {\n errorFromResponse,\n NebulaAPIError,\n NebulaConnectionError,\n NebulaTimeoutError,\n} from \"./errors.ts\";\nimport { backoffMs, DEFAULT_RETRY, isRetryableStatus, sleep, type RetryPolicy } from \"./retry.ts\";\n\nexport interface ClientOptions {\n baseUrl?: string;\n apiKey?: string;\n bearerToken?: string;\n defaultHeaders?: Record<string, string>;\n fetchImpl?: typeof fetch;\n // Caller-supplied RequestInit fields applied to every outbound fetch.\n // Lets browser callers pass `credentials: \"include\"` for cookie auth,\n // or `mode`/`cache`/`referrer` for cross-origin tuning. Method, headers,\n // body, and signal are owned by the runtime and cannot be overridden\n // here (they're set per-request).\n fetchOptions?: Omit<RequestInit, \"method\" | \"headers\" | \"body\" | \"signal\">;\n timeoutMs?: number;\n retry?: Partial<RetryPolicy>;\n userAgent?: string;\n}\n\nexport interface RequestArgs {\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n path: string;\n pathParams?: Record<string, string | number>;\n query?: Record<string, unknown>;\n body?: unknown;\n headers?: Record<string, string>;\n idempotent?: boolean;\n signal?: AbortSignal;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.zeroset.com\";\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\nexport class NebulaCore {\n readonly baseUrl: string;\n readonly apiKey?: string;\n readonly bearerToken?: string;\n readonly defaultHeaders: Record<string, string>;\n readonly fetchImpl: typeof fetch;\n readonly fetchOptions: Omit<RequestInit, \"method\" | \"headers\" | \"body\" | \"signal\">;\n readonly timeoutMs: number;\n readonly retry: RetryPolicy;\n readonly userAgent: string;\n\n constructor(options: ClientOptions = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.bearerToken = options.bearerToken;\n // Filter null/undefined values. Callers (often using `as any` to\n // bypass the `Record<string, string>` type) pass nulls to suppress\n // a header — but `new Headers({k: null})` coerces null to the\n // literal string \"null\", which a backend that checks \"is this\n // header present\" treats as an explicit credential. Strip nulls\n // here so the Headers constructor sees only real string values.\n this.defaultHeaders = filterNullishHeaders(options.defaultHeaders);\n this.fetchImpl = options.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.fetchOptions = options.fetchOptions ?? {};\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.retry = { ...DEFAULT_RETRY, ...(options.retry ?? {}) };\n this.userAgent = options.userAgent ?? \"nebula-sdk-js/0.0.1\";\n }\n\n buildUrl(path: string, pathParams?: Record<string, string | number>, query?: Record<string, unknown>): string {\n let resolved = path;\n if (pathParams) {\n for (const [k, v] of Object.entries(pathParams)) {\n resolved = resolved.replace(`{${k}}`, encodeURIComponent(String(v)));\n }\n }\n const url = new URL(this.baseUrl + resolved);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n if (Array.isArray(v)) for (const item of v) url.searchParams.append(k, String(item));\n else url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(perRequest?: Record<string, string>, hasBody = false): Headers {\n const headers = new Headers(this.defaultHeaders);\n headers.set(\"User-Agent\", this.userAgent);\n headers.set(\"Accept\", \"application/json\");\n if (hasBody) headers.set(\"Content-Type\", \"application/json\");\n if (this.apiKey) headers.set(\"X-API-Key\", this.apiKey);\n if (this.bearerToken) headers.set(\"Authorization\", `Bearer ${this.bearerToken}`);\n if (perRequest) {\n for (const [k, v] of Object.entries(perRequest)) headers.set(k, v);\n }\n return headers;\n }\n\n async request<T>(args: RequestArgs): Promise<T> {\n const url = this.buildUrl(args.path, args.pathParams, args.query);\n const hasBody = args.body !== undefined && args.body !== null;\n const headers = this.buildHeaders(args.headers, hasBody);\n // Spread caller-supplied fetch options first so the runtime-owned\n // method/headers/body always win on key collision. The TS type for\n // `fetchOptions` already excludes those keys, so this is belt-and-\n // suspenders.\n const init: RequestInit = {\n ...this.fetchOptions,\n method: args.method,\n headers,\n body: hasBody ? JSON.stringify(args.body) : undefined,\n };\n\n const maxAttempts = (args.idempotent ?? false) ? this.retry.maxRetries + 1 : 1;\n let lastError: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(new Error(\"timeout\")), this.timeoutMs);\n const { signal: composedSignal, dispose: disposeAbort } = composeAbort(\n controller.signal,\n args.signal\n );\n try {\n const response = await this.fetchImpl(url, { ...init, signal: composedSignal });\n\n if (response.ok) {\n if (response.status === 204) return undefined as T;\n return (await response.json()) as T;\n }\n\n const text = await safeReadText(response);\n const parsed = safeParseJSON(text);\n const retryAfter = parseRetryAfter(response.headers.get(\"Retry-After\"));\n const err = errorFromResponse(\n {\n status: response.status,\n requestId: response.headers.get(\"X-Request-Id\") ?? undefined,\n body: parsed ?? text,\n },\n retryAfter\n );\n\n if (isRetryableStatus(response.status) && attempt + 1 < maxAttempts) {\n await sleep(backoffMs(attempt, this.retry, retryAfter), args.signal);\n lastError = err;\n continue;\n }\n throw err;\n } catch (rawError) {\n if (rawError instanceof Error && rawError.name === \"AbortError\") {\n if (args.signal?.aborted) throw rawError;\n throw new NebulaTimeoutError(`Request timed out after ${this.timeoutMs}ms`, { cause: rawError });\n }\n if (rawError instanceof NebulaAPIError || rawError instanceof NebulaConnectionError) {\n throw rawError;\n }\n if (attempt + 1 < maxAttempts) {\n await sleep(backoffMs(attempt, this.retry), args.signal);\n lastError = rawError;\n continue;\n }\n if (rawError instanceof Error) {\n throw new NebulaConnectionError(rawError.message, { cause: rawError });\n }\n throw rawError;\n } finally {\n clearTimeout(timeoutHandle);\n disposeAbort();\n }\n }\n throw lastError ?? new NebulaConnectionError(\"retry budget exhausted\");\n }\n}\n\nfunction composeAbort(\n timeoutSignal: AbortSignal,\n userSignal?: AbortSignal\n): { signal: AbortSignal; dispose: () => void } {\n if (!userSignal) return { signal: timeoutSignal, dispose: () => {} };\n const controller = new AbortController();\n // Hold one listener per source so dispose can detach exactly what we added.\n // Caller's signal can outlive the request (e.g. a long-lived request-scope\n // controller reused across many SDK calls); without dispose, each call's\n // closures would stay pinned on it until that signal eventually aborts.\n const onTimeoutAbort = () =>\n controller.abort(timeoutSignal.reason ?? new Error(\"aborted\"));\n const onUserAbort = () =>\n controller.abort(userSignal.reason ?? new Error(\"aborted\"));\n if (timeoutSignal.aborted) controller.abort(timeoutSignal.reason);\n if (userSignal.aborted) controller.abort(userSignal.reason);\n timeoutSignal.addEventListener(\"abort\", onTimeoutAbort, { once: true });\n userSignal.addEventListener(\"abort\", onUserAbort, { once: true });\n const dispose = () => {\n timeoutSignal.removeEventListener(\"abort\", onTimeoutAbort);\n userSignal.removeEventListener(\"abort\", onUserAbort);\n };\n return { signal: controller.signal, dispose };\n}\n\nasync function safeReadText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"\";\n }\n}\n\nfunction safeParseJSON(text: string): unknown {\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction filterNullishHeaders(\n headers: Record<string, string> | undefined\n): Record<string, string> {\n if (!headers) return {};\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n // Accept anything that survives the truthy guard; the type is\n // `Record<string, string>` but callers occasionally cast with\n // `as any` to slip nulls through.\n if (v !== null && v !== undefined) out[k] = v;\n }\n return out;\n}\n\nfunction parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined;\n const asNumber = Number.parseFloat(header);\n if (Number.isFinite(asNumber)) return asNumber;\n const asDate = Date.parse(header);\n if (Number.isFinite(asDate)) return Math.max(0, (asDate - Date.now()) / 1000);\n return undefined;\n}\n","// AUTOGENERATED by nebula-sdks/generator. Do not edit by hand.\n// Source: nebula-sdks/openapi/openapi.json\n\nimport type { components } from \"../types.ts\";\nimport type { NebulaCore } from \"../runtime/client.ts\";\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\n\nexport class ClientResource {\n constructor(private readonly core: NebulaCore) {}\n\n /**\n *\n * Health probe\n * \n * Lightweight liveness probe. Returns a 200 with a fixed message when the API process is up. Does not verify downstream dependencies (database, storage, workers) — use the internal status endpoints for those.\n * @operationId client.health\n * @endpoint GET /v1/health\n */\n async health(options?: RequestOptions): Promise<components[\"schemas\"][\"WrappedGenericMessageResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedGenericMessageResponse\"]>({\n method: \"GET\",\n path: \"/v1/health\",\n pathParams: {},\n query: undefined,\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n}","// AUTOGENERATED by nebula-sdks/generator. Do not edit by hand.\n// Source: nebula-sdks/openapi/openapi.json\n\nimport type { components } from \"../types.ts\";\nimport type { NebulaCore } from \"../runtime/client.ts\";\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\n\nexport class CollectionsResource {\n constructor(private readonly core: NebulaCore) {}\n\n /**\n *\n * Create a new collection\n * \n * Create a new collection and automatically add the creating user\n * to it.\n * \n * This endpoint allows authenticated users to create a new collection\n * with a specified name and optional description. The user creating\n * the collection is automatically added as a member.\n * @operationId collections.create\n * @endpoint POST /v1/collections\n */\n async create(\n params: {\n body: components[\"schemas\"][\"CreateCollectionRequest\"];\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedCollectionResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedCollectionResponse\"]>({\n method: \"POST\",\n path: \"/v1/collections\",\n pathParams: {},\n query: undefined,\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Delete collection\n * \n * Delete an existing collection.\n * \n * This endpoint allows deletion of a collection identified by its\n * UUID. The user must have appropriate permissions to delete the\n * collection. Deleting a collection removes all associations but does\n * not delete the engrams within it.\n * @operationId collections.delete\n * @endpoint DELETE /v1/collections/{id}\n */\n async delete(\n id: string,\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedGenericBooleanResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedGenericBooleanResponse\"]>({\n method: \"DELETE\",\n path: \"/v1/collections/{id}\",\n pathParams: { id: id },\n query: undefined,\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * List collections\n * \n * Returns a cursor-paginated list of collections the authenticated\n * user has access to.\n * \n * Results can be filtered by providing specific collection IDs.\n * Regular users will only see collections they own or have access to.\n * Superusers can see all collections.\n * \n * The collections are returned in order of last modification, with\n * most recent first.\n * @operationId collections.list\n * @endpoint GET /v1/collections\n */\n async list(\n params: {\n /** A list of collection IDs to retrieve. If not provided, all collections will be returned. */\n ids?: Array<string>;\n /** Filter collections by name (case-insensitive exact match). */\n name?: string | null;\n /** Opaque pagination cursor. Pass the ``next_cursor`` from a previous response to fetch the next page. */\n cursor?: string | null;\n /** Specifies a limit on the number of objects to return, ranging between 1 and 1000. Defaults to 100. */\n limit?: number;\n /** If true, only returns collections owned by the user, not all accessible collections. */\n ownerOnly?: boolean;\n /** Filter by workspace ID. Pass a UUID to scope to a workspace, or omit for all. */\n workspaceId?: string | null;\n} = {},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"PaginatedCollectionResponse\"]> {\n return this.core.request<components[\"schemas\"][\"PaginatedCollectionResponse\"]>({\n method: \"GET\",\n path: \"/v1/collections\",\n pathParams: {},\n query: { ids: params.ids, name: params.name, cursor: params.cursor, limit: params.limit, owner_only: params.ownerOnly, workspace_id: params.workspaceId },\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Get collection details\n * \n * Get details of a specific collection.\n * \n * This endpoint retrieves detailed information about a single\n * collection identified by its UUID. The user must have access to the\n * collection to view its details.\n * @operationId collections.retrieve\n * @endpoint GET /v1/collections/{id}\n */\n async retrieve(\n id: string,\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedCollectionResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedCollectionResponse\"]>({\n method: \"GET\",\n path: \"/v1/collections/{id}\",\n pathParams: { id: id },\n query: undefined,\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Get a collection by name\n * \n * Retrieve a collection by its (owner_id, name) combination.\n * \n * The authenticated user can only fetch collections they own, or, if\n * superuser, from anyone.\n * @operationId collections.retrieveByName\n * @endpoint GET /v1/collections/name/{collection_name}\n */\n async retrieveByName(\n params: {\n /** The name of the collection */\n collectionName: string;\n /** (Superuser only) Specify the owner_id to retrieve a collection by name */\n ownerId?: string | null;\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedCollectionResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedCollectionResponse\"]>({\n method: \"GET\",\n path: \"/v1/collections/name/{collection_name}\",\n pathParams: { collection_name: params.collectionName },\n query: { owner_id: params.ownerId },\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Update collection\n * \n * Update an existing collection's configuration.\n * \n * This endpoint allows updating the name, description, and access settings of an\n * existing collection. The user must have appropriate permissions to\n * modify the collection.\n * @operationId collections.update\n * @endpoint POST /v1/collections/{id}\n */\n async update(\n params: {\n /** The unique identifier of the collection to update */\n id: string;\n body: components[\"schemas\"][\"UpdateCollectionRequest\"];\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedCollectionResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedCollectionResponse\"]>({\n method: \"POST\",\n path: \"/v1/collections/{id}\",\n pathParams: { id: params.id },\n query: undefined,\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n}","// AUTOGENERATED by nebula-sdks/generator. Do not edit by hand.\n// Source: nebula-sdks/openapi/openapi.json\n\nimport type { components } from \"../types.ts\";\nimport type { NebulaCore } from \"../runtime/client.ts\";\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\n\nexport class ConnectorsResource {\n constructor(private readonly core: NebulaCore) {}\n\n /**\n *\n * Start OAuth connection flow\n * \n * Start the OAuth connection flow for the given external provider. Returns the authorization URL the user should visit to grant Nebula access. After consent the provider redirects back to Nebula and the connection becomes active.\n * @operationId connectors.connect\n * @endpoint POST /v1/connectors/{provider}/connect\n */\n async connect(\n params: {\n provider: string;\n body: components[\"schemas\"][\"ConnectRequest\"];\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedConnectorConnectResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedConnectorConnectResponse\"]>({\n method: \"POST\",\n path: \"/v1/connectors/{provider}/connect\",\n pathParams: { provider: params.provider },\n query: undefined,\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Disconnect an external data source\n * \n * Disconnect the named connection, revoking the stored OAuth credentials and stopping future syncs. Optionally pass `delete_memories=true` to also remove every memory this connection had ingested.\n * @operationId connectors.disconnect\n * @endpoint DELETE /v1/connectors/{connection_id}\n */\n async disconnect(\n params: {\n connectionId: string;\n deleteMemories?: boolean;\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedConnectorDisconnectResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedConnectorDisconnectResponse\"]>({\n method: \"DELETE\",\n path: \"/v1/connectors/{connection_id}\",\n pathParams: { connection_id: params.connectionId },\n query: { delete_memories: params.deleteMemories },\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * List active connections for a collection\n * \n * Return every connector connection associated with the given collection, with encrypted credentials redacted. Useful for showing the user which third-party data sources are wired up to a collection.\n * @operationId connectors.list\n * @endpoint GET /v1/connectors\n */\n async list(\n params: {\n collectionId: string;\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedListOfConnectorConnectionResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedListOfConnectorConnectionResponse\"]>({\n method: \"GET\",\n path: \"/v1/connectors\",\n pathParams: {},\n query: { collection_id: params.collectionId },\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * List available connector providers\n * \n * Return the set of connector provider identifiers (e.g. `google_drive`, `slack`) that this Nebula instance is configured to expose. Pass one of these to `POST /connectors/{provider}/connect` to start an OAuth flow.\n * @operationId connectors.listProviders\n * @endpoint GET /v1/connectors/providers\n */\n async listProviders(options?: RequestOptions): Promise<components[\"schemas\"][\"WrappedListOfStr\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedListOfStr\"]>({\n method: \"GET\",\n path: \"/v1/connectors/providers\",\n pathParams: {},\n query: undefined,\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Get a single connection by ID\n * \n * Fetch a single connector connection by its UUID. Returns the connection metadata plus whether the underlying subscription is active. Encrypted credentials are never returned to clients.\n * @operationId connectors.retrieve\n * @endpoint GET /v1/connectors/{connection_id}\n */\n async retrieve(\n connectionId: string,\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedConnectorConnectionResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedConnectorConnectionResponse\"]>({\n method: \"GET\",\n path: \"/v1/connectors/{connection_id}\",\n pathParams: { connection_id: connectionId },\n query: undefined,\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Manually trigger a sync\n * \n * Schedule an immediate sync for an active connection, bypassing the normal cadence. Returns 409 if a sync is already in progress and 400 if the connection isn't in the `active` state.\n * @operationId connectors.sync\n * @endpoint POST /v1/connectors/{connection_id}/sync\n */\n async sync(\n connectionId: string,\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedConnectorSyncResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedConnectorSyncResponse\"]>({\n method: \"POST\",\n path: \"/v1/connectors/{connection_id}/sync\",\n pathParams: { connection_id: connectionId },\n query: undefined,\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n}","// AUTOGENERATED by nebula-sdks/generator. Do not edit by hand.\n// Source: nebula-sdks/openapi/openapi.json\n\nimport type { components } from \"../types.ts\";\nimport type { NebulaCore } from \"../runtime/client.ts\";\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\n\nexport class MemoriesResource {\n constructor(private readonly core: NebulaCore) {}\n\n /**\n *\n * Append content to an engram\n * \n * Append content to an existing engram.\n * \n * **For conversation engrams:**\n * - Provide `messages` array with content, role, and optional metadata\n * - Works like `/conversations/{id}/messages` endpoint\n * \n * **For document engrams:**\n * - Provide either `raw_text` or `chunks` to append additional content\n * - Content will be processed and added to the engram\n * @operationId memories.append\n * @endpoint POST /v1/memories/{id}/append\n */\n async append(\n params: {\n /** The unique identifier of the engram */\n id: string;\n body: components[\"schemas\"][\"AppendMemoryRequest\"];\n},\n options?: RequestOptions,\n ): Promise<unknown> {\n return this.core.request<unknown>({\n method: \"POST\",\n path: \"/v1/memories/{id}/append\",\n pathParams: { id: params.id },\n query: undefined,\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Create a new memory (conversation or document)\n * \n * Create a new memory (conversation or document) using clean JSON body.\n * \n * - Use `collection_id` (UUID)\n * - `kind` is optional and inferred from payload shape:\n * - If `messages` present -> conversation\n * - Otherwise -> document\n * - For conversations: provide `messages` array\n * - For documents: provide `raw_text` or `chunks`\n * - Use `snapshot` for device-memory mode (mutually exclusive with collection_id)\n * @operationId memories.create\n * @endpoint POST /v1/memories\n */\n async create(\n params: {\n body: components[\"schemas\"][\"CreateMemoryRequest\"];\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"MemoryCreateResponse\"]> {\n return this.core.request<components[\"schemas\"][\"MemoryCreateResponse\"]>({\n method: \"POST\",\n path: \"/v1/memories\",\n pathParams: {},\n query: undefined,\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Get presigned URL for large file upload\n * \n * Get a presigned URL for uploading large files directly to S3.\n * \n * Use this for files larger than 5MB that cannot be sent inline as base64.\n * After uploading, reference the file in memory creation using S3FileReference.\n * \n * Args:\n * filename: Original filename (e.g., \"image.jpg\")\n * content_type: MIME type (e.g., \"image/jpeg\", \"application/pdf\")\n * file_size: Expected file size in bytes (max 100MB)\n * \n * Returns:\n * dict with:\n * - upload_url: Presigned URL for PUT request (expires in 1 hour)\n * - upload_headers: Headers that must be sent with the presigned PUT request\n * - s3_key: The S3 key to reference in memory creation\n * - bucket: S3 bucket name\n * - expires_in: Seconds until URL expires\n * - max_size: Maximum allowed file size\n * @operationId memories.createUpload\n * @endpoint POST /v1/memories/upload\n */\n async createUpload(\n params: {\n /** Original filename (e.g., 'image.jpg') */\n filename: string;\n /** MIME type (e.g., 'image/jpeg', 'application/pdf') */\n contentType: string;\n /** Expected file size in bytes (max 100MB) */\n fileSize: number;\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedPresignedUploadResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedPresignedUploadResponse\"]>({\n method: \"POST\",\n path: \"/v1/memories/upload\",\n pathParams: {},\n query: { filename: params.filename, content_type: params.contentType, file_size: params.fileSize },\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Delete an engram\n * \n * Delete a specific engram with graph awareness. All chunks corresponding to the\n * engram are deleted, and graph components (entities/relationships) are updated\n * or deleted based on remaining chunk references from other engrams.\n * \n * This method now properly handles graph components and maintains graph integrity\n * for search operations.\n * @operationId memories.delete\n * @endpoint DELETE /v1/memories/{id}\n */\n async delete(\n id: string,\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedGenericBooleanResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedGenericBooleanResponse\"]>({\n method: \"DELETE\",\n path: \"/v1/memories/{id}\",\n pathParams: { id: id },\n query: undefined,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Delete one or more engrams\n * \n * Delete one or more engrams.\n * \n * This endpoint efficiently handles both single and batch deletions.\n * When multiple IDs are provided, it uses optimized batch operations.\n * \n * Args:\n * ids: Either a single UUID or a list of UUIDs to delete\n * \n * Returns:\n * For single deletion: boolean success response\n * For batch deletion: detailed results with successful and failed deletions\n * @operationId memories.deleteMany\n * @endpoint POST /v1/memories/delete\n */\n async deleteMany(\n params: {\n body: components[\"schemas\"][\"DeleteMemoriesRequest\"];\n},\n options?: RequestOptions,\n ): Promise<unknown> {\n return this.core.request<unknown>({\n method: \"POST\",\n path: \"/v1/memories/delete\",\n pathParams: {},\n query: undefined,\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Delete a previously uploaded S3 file\n * \n * Delete a file from S3 that was uploaded via a presigned URL.\n * Verifies the caller owns the file via S3 object metadata.\n * @operationId memories.deleteUpload\n * @endpoint DELETE /v1/memories/upload\n */\n async deleteUpload(\n params: {\n /** S3 key of the file to delete (returned by POST /memories/upload) */\n s3Key: string;\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedGenericMessageResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedGenericMessageResponse\"]>({\n method: \"DELETE\",\n path: \"/v1/memories/upload\",\n pathParams: {},\n query: { s3_key: params.s3Key },\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * List engrams\n * \n * Returns a cursor-paginated list of engrams the authenticated user\n * has access to.\n * \n * Results can be filtered by providing specific engram IDs or collection IDs.\n * Regular users will only see engrams they own or have access to through\n * collections. Superusers can see all engrams.\n * \n * The engrams are returned in order of creation time, most recent\n * first. The response includes the engram's text field if available.\n * @operationId memories.list\n * @endpoint GET /v1/memories\n */\n async list(\n params: {\n /** A list of engram IDs to retrieve. If not provided, all engrams will be returned. */\n ids?: Array<string>;\n /** Opaque pagination cursor. Pass the ``next_cursor`` from a previous response to fetch the next page. */\n cursor?: string | null;\n /** Specifies a limit on the number of objects to return, ranging between 1 and 1000. Defaults to 100. */\n limit?: number;\n /** Maximum chunks to inline per engram. Defaults to all chunks for backwards compatibility; pass 0 to skip chunk hydration. */\n chunksLimit?: number | null;\n /** If true, only returns engrams owned by the user, not all accessible engrams. */\n ownerOnly?: boolean;\n /** Optional list of collection IDs to filter engrams by. If provided, exactly one collection ID must be specified. */\n collectionIds?: Array<string> | null;\n /** JSON string for metadata filtering. Example: '{\"metadata.source\": {\"$eq\": \"playground\"}}' */\n metadataFilters?: string | null;\n /** Read-your-writes assertion: the WAL-tail overlay path waits for at least this seq to be applied before serving (or returns 503 Unavailable on timeout). REQUIRES exactly one collection_ids entry — without a collection scope the request returns 422 (the per-WAL-shard scalar applied_wal_seq is meaningless across collections). When the served shard has not been migrated to wal_compaction_enabled, the field is accepted but the served path is the legacy overlay (the assertion has no effect — the response's applied_wal_seq will be 0). Pass back the value the matching upload response surfaced. */\n minAppliedWalSeq?: number | null;\n} = {},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"PaginatedListedEngram\"]> {\n return this.core.request<components[\"schemas\"][\"PaginatedListedEngram\"]>({\n method: \"GET\",\n path: \"/v1/memories\",\n pathParams: {},\n query: { ids: params.ids, cursor: params.cursor, limit: params.limit, chunks_limit: params.chunksLimit, owner_only: params.ownerOnly, collection_ids: params.collectionIds, metadata_filters: params.metadataFilters, min_applied_wal_seq: params.minAppliedWalSeq },\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Recall workflow patterns by intent\n * \n * Workflow-pattern recall over 5 intents.\n * \n * * ``cursor`` -- match the caller's anchor against pattern\n * canonical states, return ranked patterns + position.\n * * ``predict`` -- like cursor but include the predicted next\n * trace from each pattern's canonical instance.\n * * ``resume`` -- like cursor, biased toward longer patterns.\n * * ``evidence`` -- expand a specific pattern via\n * ``hydrate_pattern``.\n * * ``bootstrap`` -- top-K patterns by confidence with no anchor.\n * @operationId memories.recallWorkflow\n * @endpoint POST /v1/memories/workflow/recall\n */\n async recallWorkflow(\n params: {\n body: components[\"schemas\"][\"CursorRecallRequest\"] | components[\"schemas\"][\"PredictRecallRequest\"] | components[\"schemas\"][\"ResumeRecallRequest\"] | components[\"schemas\"][\"EvidenceRecallRequest\"] | components[\"schemas\"][\"BootstrapRecallRequest\"];\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WorkflowRecallResponse\"]> {\n return this.core.request<components[\"schemas\"][\"WorkflowRecallResponse\"]>({\n method: \"POST\",\n path: \"/v1/memories/workflow/recall\",\n pathParams: {},\n query: undefined,\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Retrieve an engram\n * \n * Retrieves detailed information about a specific engram by its\n * ID.\n * \n * This endpoint returns the engram's metadata, status, and system information. It does not\n * return the engram's content - use the `/engrams/{id}/download` endpoint for that.\n * \n * Users can only retrieve engrams they own or have access to through collections.\n * Superusers can retrieve any engram.\n * @operationId memories.retrieve\n * @endpoint GET /v1/memories/{id}\n */\n async retrieve(\n id: string,\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedEngram\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedEngram\"]>({\n method: \"GET\",\n path: \"/v1/memories/{id}\",\n pathParams: { id: id },\n query: undefined,\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Search memories\n * \n * Perform a search query across your memories.\n * \n * **Standard mode** (collection_ids or readable-scope search): returns hierarchical MemoryRecall\n * with semantics, episodes, procedures, and sources.\n * \n * **Snapshot mode** (snapshot field): returns graph-search results with\n * {entities, relationships} from stateless in-memory traversal.\n * @operationId memories.search\n * @endpoint POST /v1/memories/search\n */\n async search(\n params: {\n body: components[\"schemas\"][\"MemorySearchRequest\"];\n},\n options?: RequestOptions,\n ): Promise<unknown> {\n return this.core.request<unknown>({\n method: \"POST\",\n path: \"/v1/memories/search\",\n pathParams: {},\n query: undefined,\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Update a memory\n * \n * Update memory-level properties including name, metadata, and collection associations.\n * \n * This endpoint allows updating properties of an entire memory (document or conversation)\n * without modifying its content:\n * - **name**: Updates the authoritative engram title\n * - **metadata**: Can replace or merge with existing metadata\n * - **collection_ids**: Updates authoritative engram collection associations\n * \n * Users can only update memories they own or have access to through collections.\n * At least one collection association must be maintained.\n * \n * If collection_id is provided and the engram is shared across collections, a copy-on-write\n * will be performed to create a collection-specific copy before modification.\n * @operationId memories.update\n * @endpoint PATCH /v1/memories/{id}\n */\n async update(\n params: {\n /** The unique identifier of the memory */\n id: string;\n /** Collection context for copy-on-write. If provided and engram is shared, creates a copy before modification. */\n collectionId?: string | null;\n body: components[\"schemas\"][\"UpdateMemoryRequest\"];\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedEngram\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedEngram\"]>({\n method: \"PATCH\",\n path: \"/v1/memories/{id}\",\n pathParams: { id: params.id },\n query: { collection_id: params.collectionId },\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n}","// AUTOGENERATED by nebula-sdks/generator. Do not edit by hand.\n// Source: nebula-sdks/openapi/openapi.json\n\nimport type { components } from \"../types.ts\";\nimport type { NebulaCore } from \"../runtime/client.ts\";\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\n\nexport class SnapshotsResource {\n constructor(private readonly core: NebulaCore) {}\n\n /**\n *\n * Export a collection snapshot\n * \n * Export a collection's full graph state as a\n * portable SnapshotEnvelope.\n * @operationId snapshots.export\n * @endpoint POST /v1/device-memory/snapshot/export\n */\n async export(\n params: {\n body: components[\"schemas\"][\"SnapshotExportRequest\"];\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedSnapshotEnvelope\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedSnapshotEnvelope\"]>({\n method: \"POST\",\n path: \"/v1/device-memory/snapshot/export\",\n pathParams: {},\n query: undefined,\n body: params.body,\n idempotent: true,\n signal: options?.signal,\n });\n }\n\n /**\n *\n * Import a snapshot into an ephemeral collection\n * \n * Import a SnapshotEnvelope into an ephemeral\n * collection. Returns the ephemeral collection UUID.\n * @operationId snapshots.import\n * @endpoint POST /v1/device-memory/snapshot/import\n */\n async import(\n params: {\n body: components[\"schemas\"][\"SnapshotImportRequest\"];\n},\n options?: RequestOptions,\n ): Promise<components[\"schemas\"][\"WrappedSnapshotImportResult\"]> {\n return this.core.request<components[\"schemas\"][\"WrappedSnapshotImportResult\"]>({\n method: \"POST\",\n path: \"/v1/device-memory/snapshot/import\",\n pathParams: {},\n query: undefined,\n body: params.body,\n idempotent: false,\n signal: options?.signal,\n });\n }\n\n}","// AUTOGENERATED by nebula-sdks/generator. Do not edit by hand.\n// Source: nebula-sdks/openapi/openapi.json\n\nimport { NebulaCore, type ClientOptions } from \"./runtime/client.ts\";\nimport { ClientResource } from \"./resources/client.ts\";\nimport { CollectionsResource } from \"./resources/collections.ts\";\nimport { ConnectorsResource } from \"./resources/connectors.ts\";\nimport { MemoriesResource } from \"./resources/memories.ts\";\nimport { SnapshotsResource } from \"./resources/snapshots.ts\";\n\nexport class NebulaClient {\n protected readonly core: NebulaCore;\n readonly client: ClientResource;\n readonly collections: CollectionsResource;\n readonly connectors: ConnectorsResource;\n readonly memories: MemoriesResource;\n readonly snapshots: SnapshotsResource;\n\n constructor(options: ClientOptions = {}) {\n this.core = new NebulaCore(options);\n this.client = new ClientResource(this.core);\n this.collections = new CollectionsResource(this.core);\n this.connectors = new ConnectorsResource(this.core);\n this.memories = new MemoriesResource(this.core);\n this.snapshots = new SnapshotsResource(this.core);\n }\n}","// AUTOGENERATED by nebula-sdks/generator. Do not edit by hand.\n// Source: nebula-sdks/config/dx-extensions.yaml\n\nimport { NebulaClient } from \"../client.ts\";\n\n/**\n * Conditional type matching the runtime envelope-unwrap. If T has a\n * `results` field, narrow to it; otherwise pass through.\n */\ntype Unwrapped<T> = T extends { results: infer R } ? R : T;\n\n/** Strip a `results` envelope at runtime; matches `Unwrapped<>`. */\nfunction unwrap<T>(p: Promise<T>): Promise<Unwrapped<T>> {\n return p.then((r) => {\n if (r !== null && typeof r === \"object\" && \"results\" in r) {\n return (r as { results: unknown }).results as Unwrapped<T>;\n }\n return r as Unwrapped<T>;\n });\n}\n\n/**\n * Generated DX layer: simple unwrap/passthrough convenience methods.\n * Signatures are derived from the underlying resource methods so\n * callers see the same arg names + types in IDE hover.\n */\nexport class NebulaDX extends NebulaClient {\n /** Retrieve a single memory by id and return just the data. (generated from dx-extensions.yaml). */\n async getMemory(...args: Parameters<NebulaClient[\"memories\"][\"retrieve\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"memories\"][\"retrieve\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"memories\"][\"retrieve\"]>>>(this.memories.retrieve(...args));\n }\n\n /** Update a memory by id; returns the updated record. (generated from dx-extensions.yaml). */\n async updateMemory(...args: Parameters<NebulaClient[\"memories\"][\"update\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"memories\"][\"update\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"memories\"][\"update\"]>>>(this.memories.update(...args));\n }\n\n /** Liveness probe with the wire envelope unwrapped. (generated from dx-extensions.yaml). */\n async healthCheck(...args: Parameters<NebulaClient[\"client\"][\"health\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"client\"][\"health\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"client\"][\"health\"]>>>(this.client.health(...args));\n }\n\n /** unwrap → collections.create (generated from dx-extensions.yaml). */\n async createCollection(...args: Parameters<NebulaClient[\"collections\"][\"create\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"collections\"][\"create\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"collections\"][\"create\"]>>>(this.collections.create(...args));\n }\n\n /** unwrap → collections.retrieve (generated from dx-extensions.yaml). */\n async getCollection(...args: Parameters<NebulaClient[\"collections\"][\"retrieve\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"collections\"][\"retrieve\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"collections\"][\"retrieve\"]>>>(this.collections.retrieve(...args));\n }\n\n /** unwrap → collections.retrieveByName (generated from dx-extensions.yaml). */\n async getCollectionByName(...args: Parameters<NebulaClient[\"collections\"][\"retrieveByName\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"collections\"][\"retrieveByName\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"collections\"][\"retrieveByName\"]>>>(this.collections.retrieveByName(...args));\n }\n\n /** unwrap → collections.list (generated from dx-extensions.yaml). */\n async listCollections(...args: Parameters<NebulaClient[\"collections\"][\"list\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"collections\"][\"list\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"collections\"][\"list\"]>>>(this.collections.list(...args));\n }\n\n /** unwrap → collections.update (generated from dx-extensions.yaml). */\n async updateCollection(...args: Parameters<NebulaClient[\"collections\"][\"update\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"collections\"][\"update\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"collections\"][\"update\"]>>>(this.collections.update(...args));\n }\n\n /** unwrap → connectors.listProviders (generated from dx-extensions.yaml). */\n async listProviders(...args: Parameters<NebulaClient[\"connectors\"][\"listProviders\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"connectors\"][\"listProviders\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"connectors\"][\"listProviders\"]>>>(this.connectors.listProviders(...args));\n }\n\n /** unwrap → connectors.retrieve (generated from dx-extensions.yaml). */\n async getConnection(...args: Parameters<NebulaClient[\"connectors\"][\"retrieve\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"connectors\"][\"retrieve\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"connectors\"][\"retrieve\"]>>>(this.connectors.retrieve(...args));\n }\n\n /** unwrap → connectors.sync (generated from dx-extensions.yaml). */\n async triggerSync(...args: Parameters<NebulaClient[\"connectors\"][\"sync\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"connectors\"][\"sync\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"connectors\"][\"sync\"]>>>(this.connectors.sync(...args));\n }\n\n /** unwrap → memories.createUpload (generated from dx-extensions.yaml). */\n async getUploadUrl(...args: Parameters<NebulaClient[\"memories\"][\"createUpload\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"memories\"][\"createUpload\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"memories\"][\"createUpload\"]>>>(this.memories.createUpload(...args));\n }\n\n /** unwrap → snapshots.export (generated from dx-extensions.yaml). */\n async exportSnapshot(...args: Parameters<NebulaClient[\"snapshots\"][\"export\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"snapshots\"][\"export\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"snapshots\"][\"export\"]>>>(this.snapshots.export(...args));\n }\n\n /** unwrap → snapshots.import (generated from dx-extensions.yaml). */\n async importSnapshot(...args: Parameters<NebulaClient[\"snapshots\"][\"import\"]>): Promise<Unwrapped<Awaited<ReturnType<NebulaClient[\"snapshots\"][\"import\"]>>>> {\n return unwrap<Awaited<ReturnType<NebulaClient[\"snapshots\"][\"import\"]>>>(this.snapshots.import(...args));\n }\n\n}","// Handwritten Nebula DX layer.\n//\n// Carries only the methods that need real dispatch logic (storeMemory's\n// create-vs-append branch, polymorphic delete, search-affinity headers,\n// auth normalization, response-shape coercion to bool). The simple\n// unwrap/passthrough methods (getMemory, updateCollection, exportSnapshot,\n// listProviders, ...) are generated from\n// `nebula-sdks/config/dx-extensions.yaml` into `_dx_generated.ts`, which\n// this class extends via `NebulaDX`.\n//\n// Source of truth: nebula-sdks/custom/typescript/dx.ts\n// The generator copies this file into sdks/typescript/src/lib/dx.ts on every\n// `bun run generate`. Edit the source, not the copy.\n\nimport { NebulaDX } from \"./_dx_generated.ts\";\nimport {\n type ClientOptions,\n type components,\n} from \"../index.ts\";\n\ntype Schemas = components[\"schemas\"];\ntype SnapshotEnvelopeInput = Schemas[\"SnapshotEnvelope-Input\"];\ntype SnapshotEnvelopeOutput = Schemas[\"SnapshotEnvelope-Output\"];\n\ntype ResultsOf<T> = T extends { results: infer R } ? R : T;\ntype RequestPath = `/${string}` | `http://${string}` | `https://${string}`;\n\nexport type CompatClientOptions = ClientOptions & {\n api_key?: string | null;\n apiKey?: string | null;\n baseUrl?: string | null;\n // Stainless-shape alias with capital-URL casing. Existing frontend\n // callers (CollectionService, MemoryService, PlaygroundService, etc.)\n // pass `baseURL`; without this alias the value falls through unused\n // and the runtime defaults to api.zeroset.com.\n baseURL?: string | null;\n base_url?: string | null;\n // Stainless-shape alias for `timeoutMs`. Same compat reason.\n timeout?: number | null;\n accessToken?: string | null;\n bearerToken?: string | null;\n bearer_token?: string | null;\n access_token?: string | null;\n};\n\nexport interface MemoryCommonInput {\n collection_id?: string | null;\n collectionId?: string | null;\n content?: string | string[] | unknown[] | null;\n raw_text?: string | null;\n chunks?: Array<string> | null;\n messages?: unknown[] | null;\n metadata?: { [key: string]: unknown } | null;\n ingestion_config?: unknown;\n ingestion_mode?: string | null;\n}\n\nexport interface MemoryCreateInput extends MemoryCommonInput {\n name?: string | null;\n speaker_id?: string | null;\n speaker_name?: string | null;\n content_parts?: unknown[] | null;\n contents?: string[] | null;\n snapshot?: SnapshotEnvelopeInput | null;\n memory_id?: undefined | null;\n}\n\nexport interface MemoryAppendInput extends Omit<MemoryCommonInput, \"ingestion_mode\" | \"messages\"> {\n memory_id: string;\n ingestion_mode?: string | null;\n messages?: unknown[] | null;\n}\n\nexport type MemoryInput = MemoryCreateInput | MemoryAppendInput;\n\ntype MemoryCreateBody = Schemas[\"CreateMemoryRequest\"];\ntype MemoryAppendBody = Schemas[\"AppendMemoryRequest\"];\n\nexport class Nebula extends NebulaDX {\n constructor(options: CompatClientOptions = {}) {\n super(normalizeAuthOptions(normalizeClientOptions(options)));\n }\n\n /**\n * Polymorphic memory creator: dispatches to memories.create or memories.append\n * based on whether `memory_id` is set on the input. Returns the new memory's\n * id (string), or — when `snapshot` is set — the updated snapshot envelope.\n */\n async storeMemory(\n memory: MemoryInput,\n options?: { signal?: AbortSignal }\n ): Promise<string | SnapshotEnvelopeOutput> {\n if (\"memory_id\" in memory && memory.memory_id != null) {\n const memoryID = memory.memory_id;\n await this.memories.append(\n { id: memoryID, body: toMemoryAppendParams(memory) },\n options\n );\n return memoryID;\n }\n const response = await this.memories.create(\n { body: toMemoryCreateParams(memory as MemoryCreateInput) },\n options\n );\n const result = unwrapResults(response);\n if (isSnapshotResult(result)) {\n return (result.snapshot ?? result) as SnapshotEnvelopeOutput;\n }\n return extractID(result);\n }\n\n /**\n * Bulk parallel version of storeMemory with a concurrency cap.\n *\n * Default 8 concurrent in-flight requests matches the Python DX's\n * `asyncio.Semaphore(max_concurrency)` pattern. Use `maxConcurrency: 1`\n * for strictly serial submission; higher values risk overwhelming the\n * server when memories[] is large.\n */\n async storeMemories(\n memories: MemoryInput[],\n options?: { signal?: AbortSignal; maxConcurrency?: number }\n ): Promise<(string | SnapshotEnvelopeOutput)[]> {\n const cap = Math.max(1, options?.maxConcurrency ?? 8);\n const signal = options?.signal;\n const results: (string | SnapshotEnvelopeOutput)[] = new Array(memories.length);\n let nextIndex = 0;\n const worker = async (): Promise<void> => {\n while (true) {\n const i = nextIndex++;\n if (i >= memories.length) return;\n results[i] = await this.storeMemory(memories[i], { signal });\n }\n };\n await Promise.all(\n Array.from({ length: Math.min(cap, memories.length) }, () => worker())\n );\n return results;\n }\n\n /**\n * List memories scoped to one or more collection ids (string | string[])\n * or a full MemoryListParams object.\n */\n async listMemories(\n query: string | string[] | Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ): Promise<unknown> {\n const normalized: Record<string, unknown> =\n typeof query === \"string\" || Array.isArray(query)\n ? { collectionIds: arrayify(query) }\n : query;\n return unwrap(this.memories.list(normalized as never, options));\n }\n\n /**\n * Memory search shortcut: unwraps `results`. (Affinity-header injection\n * is a planned enhancement; currently delegates straight to the resource.)\n */\n async search(\n body: Schemas[\"MemorySearchRequest\"],\n options?: { signal?: AbortSignal }\n ): Promise<unknown> {\n return unwrap(this.memories.search({ body }, options));\n }\n\n /**\n * deleteCollection coerces the wire {success: bool} envelope into a Python-\n * style boolean return.\n */\n async deleteCollection(id: string, options?: { signal?: AbortSignal }): Promise<boolean> {\n const response = await this.collections.delete(id, options);\n const result = unwrapResults(response);\n return Boolean((result as { success?: boolean }).success);\n }\n\n // Legacy aliases — \"cluster\" was the old name for \"collection\".\n // Bound to inherited (generated) collection methods.\n createCluster = this.createCollection;\n getCluster = this.getCollection;\n getClusterByName = this.getCollectionByName;\n listClusters = this.listCollections;\n updateCluster = this.updateCollection;\n deleteCluster = this.deleteCollection;\n\n /**\n * Positional `connectProvider(provider, collectionID, config?)` — wraps the\n * generated `connectors.connect({provider, body})` to build the body shape.\n */\n async connectProvider(\n provider: string,\n collectionID: string,\n config?: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ): Promise<unknown> {\n const body: Schemas[\"ConnectRequest\"] = {\n collection_id: collectionID,\n ...(config !== undefined ? { config } : {}),\n } as Schemas[\"ConnectRequest\"];\n return unwrap(this.connectors.connect({ provider, body }, options));\n }\n\n /** Positional listConnections(collectionID) — wraps the query wrapper. */\n async listConnections(\n collectionID: string,\n options?: { signal?: AbortSignal }\n ): Promise<unknown> {\n return unwrap(\n this.connectors.list({ collectionId: collectionID } as never, options)\n );\n }\n\n /** Positional disconnect(connectionID, deleteMemories?). */\n async disconnectConnection(\n connectionID: string,\n deleteMemories = false,\n options?: { signal?: AbortSignal }\n ): Promise<unknown> {\n return unwrap(\n this.connectors.disconnect(\n { connectionId: connectionID, deleteMemories } as never,\n options\n )\n );\n }\n\n /** Alias for disconnectConnection (same arg shape). */\n async disconnect(\n connectionID: string,\n deleteMemories = false,\n options?: { signal?: AbortSignal }\n ): Promise<unknown> {\n return unwrap(\n this.connectors.disconnect(\n { connectionId: connectionID, deleteMemories } as never,\n options\n )\n );\n }\n\n /** Single-id delete; coerces 204 to boolean true. */\n async deleteMemory(memoryID: string, options?: { signal?: AbortSignal }): Promise<boolean> {\n await this.memories.delete(memoryID, options);\n return true;\n }\n\n /** Bulk delete by ids. */\n async deleteMemories(\n memoryIDs: string[],\n options?: { signal?: AbortSignal }\n ): Promise<unknown> {\n return this.memories.deleteMany({ body: memoryIDs }, options);\n }\n\n /**\n * Polymorphic delete: dispatches based on argument type.\n * - `delete(\"/some/path\")` -> raw HTTP DELETE (escape hatch; not implemented)\n * - `delete(\"memory-id\")` -> deleteMemory\n * - `delete([\"id1\", \"id2\"])` -> deleteMemories (bulk)\n */\n async delete(\n pathOrMemoryIDs: RequestPath | string | string[],\n options?: { signal?: AbortSignal }\n ): Promise<unknown> {\n if (Array.isArray(pathOrMemoryIDs)) {\n return this.deleteMemories(pathOrMemoryIDs, options);\n }\n if (isRequestPath(pathOrMemoryIDs)) {\n throw new Error(\n `delete(\"${pathOrMemoryIDs}\") raw-path escape hatch is not implemented in this SDK yet`\n );\n }\n return this.deleteMemory(pathOrMemoryIDs, options);\n }\n}\n\n// ---------- helpers ----------\n\nfunction normalizeAuthOptions(options: ClientOptions): ClientOptions {\n if (\n options.apiKey != null &&\n options.bearerToken == null &&\n !looksLikeNebulaAPIKey(options.apiKey)\n ) {\n return { ...options, apiKey: undefined, bearerToken: options.apiKey };\n }\n return options;\n}\n\nfunction normalizeClientOptions(options: CompatClientOptions): ClientOptions {\n const {\n api_key: apiKeyAlias,\n apiKey,\n baseUrl: baseUrlAlias,\n baseURL: baseURLCapAlias,\n base_url: baseUrlSnakeAlias,\n timeout: timeoutAlias,\n bearerToken,\n bearer_token: bearerTokenAlias,\n accessToken,\n access_token: accessTokenAlias,\n ...rest\n } = options;\n const restClientOptions: ClientOptions = rest;\n return {\n ...restClientOptions,\n apiKey: firstDefined(apiKey, apiKeyAlias) ?? undefined,\n bearerToken:\n firstDefined(bearerToken, bearerTokenAlias, accessToken, accessTokenAlias) ?? undefined,\n baseUrl:\n firstDefined(\n restClientOptions.baseUrl,\n baseUrlAlias,\n baseURLCapAlias,\n baseUrlSnakeAlias\n ) ?? undefined,\n timeoutMs:\n firstDefined(restClientOptions.timeoutMs, timeoutAlias) ?? undefined,\n };\n}\n\nfunction firstDefined<T>(...values: (T | null | undefined)[]): T | null | undefined {\n return values.find((value) => value !== undefined);\n}\n\nexport function looksLikeNebulaAPIKey(token: string): boolean {\n const parts = token.split(\".\");\n if (parts.length !== 2) return false;\n const [publicPart, rawPart] = parts;\n return Boolean(rawPart) && (publicPart.startsWith(\"key_\") || publicPart.startsWith(\"neb_\"));\n}\n\nfunction toMemoryCreateParams(memory: MemoryCreateInput): MemoryCreateBody {\n const collectionID = memory.collection_id ?? memory.collectionId ?? undefined;\n const { collectionId: _ignore, content, memory_id: _ignoreMemoryID, ...rest } = memory;\n const params: Record<string, unknown> = { ...rest };\n\n if (collectionID !== undefined) {\n params.collection_id = collectionID;\n }\n if (content != null) {\n if (typeof content === \"string\") {\n params.raw_text = content;\n } else {\n params.content_parts = content;\n }\n }\n if (params.messages != null && !params.engram_type) {\n params.engram_type = \"conversation\";\n }\n return params as MemoryCreateBody;\n}\n\nfunction toMemoryAppendParams(memory: MemoryAppendInput): MemoryAppendBody {\n const collectionID = memory.collection_id ?? memory.collectionId ?? undefined;\n if (!collectionID) {\n throw new Error(\"collection_id is required when appending to an existing memory\");\n }\n const params: Record<string, unknown> = { collection_id: collectionID };\n for (const key of [\"metadata\", \"ingestion_config\", \"ingestion_mode\", \"raw_text\", \"chunks\", \"messages\"] as const) {\n const value = memory[key as keyof MemoryAppendInput];\n if (value != null) params[key] = value;\n }\n const content = (memory as MemoryCommonInput).content;\n if (content != null) {\n if (typeof content === \"string\") {\n params.raw_text = content;\n } else if (Array.isArray(content) && content.every((item) => typeof item === \"string\")) {\n params.chunks = content;\n } else if (Array.isArray(content)) {\n params.messages = content;\n }\n }\n return params as MemoryAppendBody;\n}\n\nfunction unwrap<T>(promise: PromiseLike<T>): Promise<ResultsOf<T>> {\n return Promise.resolve(promise).then((response) => unwrapResults(response) as ResultsOf<T>);\n}\n\nfunction unwrapResults<T>(response: T): unknown {\n if (response !== null && typeof response === \"object\" && \"results\" in response) {\n return (response as { results: unknown }).results;\n }\n return response;\n}\n\nfunction extractID(value: unknown): string {\n if (typeof value === \"object\" && value !== null) {\n const record = value as Record<string, unknown>;\n const id =\n record[\"id\"] ?? record[\"memory_id\"] ?? record[\"engram_id\"] ?? record[\"ephemeral_collection_id\"];\n if (typeof id === \"string\") return id;\n }\n throw new Error(\"Nebula memory create response did not include an id\");\n}\n\nfunction isSnapshotResult(value: unknown): value is { snapshot?: SnapshotEnvelopeOutput } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"snapshot\" in (value as Record<string, unknown>)\n );\n}\n\nfunction arrayify(value: string | string[]): string[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction isRequestPath(value: string): boolean {\n return value.startsWith(\"/\") || /^https?:\\/\\//i.test(value);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,36 @@
1
1
  {
2
2
  "name": "@nebula-ai/sdk",
3
- "version": "1.2.2",
4
- "description": "Official JavaScript/TypeScript SDK for Nebula AI Memory",
5
- "main": "dist/index.js",
6
- "module": "dist/index.mjs",
7
- "types": "dist/index.d.ts",
3
+ "version": "1.4.0",
4
+ "description": "Official Nebula SDK for TypeScript (autogenerated).",
5
+ "license": "MIT",
6
+ "homepage": "https://github.com/zeroset-inc/nebula-typescript",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/zeroset-inc/nebula-typescript.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/zeroset-inc/nebula-typescript/issues"
13
+ },
14
+ "keywords": [
15
+ "nebula",
16
+ "memory",
17
+ "ai",
18
+ "sdk",
19
+ "openapi"
20
+ ],
21
+ "engines": {
22
+ "node": ">=18"
23
+ },
24
+ "sideEffects": false,
25
+ "type": "module",
26
+ "main": "./dist/index.cjs",
27
+ "module": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
8
29
  "exports": {
9
30
  ".": {
10
31
  "types": "./dist/index.d.ts",
11
- "import": "./dist/index.mjs",
12
- "require": "./dist/index.js"
32
+ "import": "./dist/index.js",
33
+ "require": "./dist/index.cjs"
13
34
  }
14
35
  },
15
36
  "files": [
@@ -18,50 +39,14 @@
18
39
  "LICENSE"
19
40
  ],
20
41
  "scripts": {
21
- "build": "tsup",
22
- "dev": "tsup --watch",
23
- "clean": "rm -rf dist",
24
- "prepare": "tsup",
25
- "test": "jest",
26
- "test:watch": "jest --watch",
27
- "lint": "eslint src --ext .ts --config .eslintrc.js",
28
- "type-check": "tsc --noEmit"
29
- },
30
- "keywords": [
31
- "nebula",
32
- "ai",
33
- "memory",
34
- "search",
35
- "vector",
36
- "embeddings",
37
- "conversation",
38
- "typescript",
39
- "javascript",
40
- "sdk"
41
- ],
42
- "author": "Nebula AI Inc <support@trynebula.ai>",
43
- "license": "MIT",
44
- "repository": {
45
- "type": "git",
46
- "url": "https://github.com/nebula-agi/nebula-sdks.git",
47
- "directory": "javascript"
48
- },
49
- "bugs": {
50
- "url": "https://github.com/nebula-agi/nebula-sdks/issues"
51
- },
52
- "homepage": "https://github.com/nebula-agi/nebula-sdks/tree/main/javascript#readme",
53
- "engines": {
54
- "node": ">=18.0.0"
42
+ "build": "tsdown src/index.ts --format esm,cjs --dts --sourcemap --clean --out-dir dist --platform neutral --target es2022",
43
+ "type-check": "tsc --noEmit",
44
+ "test": "bun test",
45
+ "prepack": "bun run build"
55
46
  },
56
47
  "devDependencies": {
57
- "@types/jest": "^30.0.0",
58
- "@types/node": "^20.0.0",
59
- "@typescript-eslint/eslint-plugin": "^6.0.0",
60
- "@typescript-eslint/parser": "^6.0.0",
61
- "eslint": "^8.0.0",
62
- "jest": "^29.0.0",
63
- "ts-jest": "^29.0.0",
64
- "tsup": "^8.0.0",
65
- "typescript": "^5.0.0"
48
+ "typescript": "^5.6.0",
49
+ "@types/bun": "^1.1.10",
50
+ "tsdown": "^0.22.0"
66
51
  }
67
52
  }