@nebula-ai/sdk 0.0.21 → 0.0.24
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/README.md +0 -13
- package/dist/index.d.mts +46 -81
- package/dist/index.d.ts +46 -81
- package/dist/index.js +0 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +0 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,18 +6,6 @@ Official JavaScript/TypeScript SDK for Nebula - Memory, Search, and AI-powered c
|
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
[](https://www.typescriptlang.org/)
|
|
8
8
|
|
|
9
|
-
## Features
|
|
10
|
-
|
|
11
|
-
- 🚀 **Full API Parity** - Mirrors the exact Nebula Python SDK client.py implementation
|
|
12
|
-
- 🔐 **Flexible Authentication** - Supports both API keys and Bearer tokens
|
|
13
|
-
- 🌐 **Browser & Node.js Ready** - Works in browsers and Node.js environments
|
|
14
|
-
- 📱 **TypeScript First** - Full type safety with comprehensive interfaces
|
|
15
|
-
- 🎯 **Unified Memory Model** - Store text, conversations, and structured data
|
|
16
|
-
- 🔍 **Advanced Search** - Vector search with graph results (entities, relationships, communities)
|
|
17
|
-
- 💬 **Conversation Support** - Built-in conversation tracking and management
|
|
18
|
-
- ⚡ **Performance Optimized** - Configurable timeouts and error handling
|
|
19
|
-
- 🧠 **Graph Intelligence** - Leverage knowledge graphs for enhanced search
|
|
20
|
-
|
|
21
9
|
## Installation
|
|
22
10
|
|
|
23
11
|
```bash
|
|
@@ -244,7 +232,6 @@ const results = await client.search(
|
|
|
244
232
|
bfs_enabled: true,
|
|
245
233
|
bfs_max_depth: 2
|
|
246
234
|
},
|
|
247
|
-
search_strategy: 'rag_fusion',
|
|
248
235
|
num_sub_queries: 3
|
|
249
236
|
}
|
|
250
237
|
);
|
package/dist/index.d.mts
CHANGED
|
@@ -80,15 +80,15 @@ interface SearchOptions {
|
|
|
80
80
|
filters?: Record<string, any>;
|
|
81
81
|
retrieval_type: RetrievalType;
|
|
82
82
|
}
|
|
83
|
-
interface
|
|
83
|
+
interface NebulaClientConfig {
|
|
84
84
|
apiKey: string;
|
|
85
85
|
baseUrl?: string;
|
|
86
86
|
timeout?: number;
|
|
87
87
|
}
|
|
88
88
|
declare class NebulaException extends Error {
|
|
89
89
|
statusCode?: number | undefined;
|
|
90
|
-
details?: any;
|
|
91
|
-
constructor(message: string, statusCode?: number | undefined, details?: any);
|
|
90
|
+
details?: any | undefined;
|
|
91
|
+
constructor(message: string, statusCode?: number | undefined, details?: any | undefined);
|
|
92
92
|
}
|
|
93
93
|
declare class NebulaClientException extends NebulaException {
|
|
94
94
|
cause?: Error | undefined;
|
|
@@ -101,122 +101,87 @@ declare class NebulaRateLimitException extends NebulaException {
|
|
|
101
101
|
constructor(message?: string);
|
|
102
102
|
}
|
|
103
103
|
declare class NebulaValidationException extends NebulaException {
|
|
104
|
-
details?: any;
|
|
105
|
-
constructor(message?: string, details?: any);
|
|
104
|
+
details?: any | undefined;
|
|
105
|
+
constructor(message?: string, details?: any | undefined);
|
|
106
106
|
}
|
|
107
107
|
declare class NebulaClusterNotFoundException extends NebulaException {
|
|
108
108
|
constructor(message?: string);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/**
|
|
112
|
-
* Official Nebula
|
|
112
|
+
* Official Nebula JavaScript/TypeScript SDK
|
|
113
113
|
* Mirrors the exact Nebula Python SDK client.py implementation
|
|
114
114
|
*/
|
|
115
|
-
declare class
|
|
115
|
+
declare class NebulaClient {
|
|
116
116
|
private apiKey;
|
|
117
117
|
private baseUrl;
|
|
118
118
|
private timeout;
|
|
119
|
-
constructor(config:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
119
|
+
constructor(config: NebulaClientConfig);
|
|
120
|
+
setApiKey(next: string): void;
|
|
121
|
+
setBaseUrl(next: string): void;
|
|
122
|
+
setCorsProxy(_next: string): void;
|
|
123
|
+
/** Check if API key is set */
|
|
123
124
|
isApiKeySet(): boolean;
|
|
124
|
-
/**
|
|
125
|
-
* Detect if a token looks like a Nebula API key (public.raw)
|
|
126
|
-
*/
|
|
125
|
+
/** Detect if a token looks like a Nebula API key (public.raw) */
|
|
127
126
|
private _isNebulaApiKey;
|
|
128
|
-
/**
|
|
129
|
-
* Build authentication headers
|
|
130
|
-
*/
|
|
127
|
+
/** Build authentication headers */
|
|
131
128
|
private _buildAuthHeaders;
|
|
132
|
-
/**
|
|
133
|
-
* Make an HTTP request to the Nebula API
|
|
134
|
-
*/
|
|
129
|
+
/** Make an HTTP request to the Nebula API */
|
|
135
130
|
private _makeRequest;
|
|
136
|
-
/**
|
|
137
|
-
* Create a new cluster
|
|
138
|
-
*/
|
|
131
|
+
/** Create a new cluster */
|
|
139
132
|
createCluster(name: string, description?: string, metadata?: Record<string, any>): Promise<Cluster>;
|
|
140
|
-
/**
|
|
141
|
-
* Get a specific cluster by ID
|
|
142
|
-
*/
|
|
133
|
+
/** Get a specific cluster by ID */
|
|
143
134
|
getCluster(clusterId: string): Promise<Cluster>;
|
|
144
|
-
/**
|
|
145
|
-
* Get a specific cluster by name
|
|
146
|
-
*/
|
|
135
|
+
/** Get a specific cluster by name */
|
|
147
136
|
getClusterByName(name: string): Promise<Cluster>;
|
|
148
|
-
/**
|
|
149
|
-
* Get all clusters
|
|
150
|
-
*/
|
|
137
|
+
/** Get all clusters */
|
|
151
138
|
listClusters(limit?: number, offset?: number): Promise<Cluster[]>;
|
|
152
|
-
/**
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
139
|
+
/** List conversations for the authenticated user */
|
|
140
|
+
listConversations(limit?: number, offset?: number, cluster_ids?: string[]): Promise<any[]>;
|
|
141
|
+
/** Get conversation messages directly from the conversations API */
|
|
142
|
+
getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;
|
|
143
|
+
getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;
|
|
144
|
+
/** Helper method to transform conversation messages to MemoryResponse format */
|
|
145
|
+
private _transformConversationMessages;
|
|
146
|
+
/** Update a cluster */
|
|
159
147
|
updateCluster(clusterId: string, name?: string, description?: string, metadata?: Record<string, any>): Promise<Cluster>;
|
|
160
|
-
/**
|
|
161
|
-
* Delete a cluster
|
|
162
|
-
*/
|
|
148
|
+
/** Delete a cluster */
|
|
163
149
|
deleteCluster(clusterId: string): Promise<boolean>;
|
|
164
150
|
/**
|
|
165
|
-
*
|
|
151
|
+
* Legacy convenience: store raw text content into a cluster as a document
|
|
166
152
|
*/
|
|
153
|
+
store(content: string, clusterId: string, metadata?: Record<string, any>): Promise<MemoryResponse>;
|
|
154
|
+
/** Store a single memory */
|
|
167
155
|
storeMemory(memory: Memory | Record<string, any>): Promise<string>;
|
|
168
|
-
/**
|
|
169
|
-
* Store multiple memories
|
|
170
|
-
*/
|
|
156
|
+
/** Store multiple memories */
|
|
171
157
|
storeMemories(memories: Memory[]): Promise<string[]>;
|
|
172
|
-
/**
|
|
173
|
-
* Delete a specific memory
|
|
174
|
-
*/
|
|
158
|
+
/** Delete a specific memory */
|
|
175
159
|
delete(memoryId: string): Promise<boolean>;
|
|
176
|
-
/**
|
|
177
|
-
* Delete a conversation and all its messages
|
|
178
|
-
*/
|
|
160
|
+
/** Delete a conversation and all its messages */
|
|
179
161
|
deleteConversation(conversationId: string): Promise<boolean>;
|
|
180
|
-
/**
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
listMemories(clusterIds: string[], limit?: number, offset?: number): Promise<MemoryResponse[]>;
|
|
184
|
-
/**
|
|
185
|
-
* Get a specific memory by ID
|
|
186
|
-
*/
|
|
162
|
+
/** Get all memories from specific clusters */
|
|
163
|
+
listMemories(clusterIds: string | string[], limit?: number, offset?: number): Promise<MemoryResponse[]>;
|
|
164
|
+
/** Get a specific memory by ID */
|
|
187
165
|
getMemory(memoryId: string): Promise<MemoryResponse>;
|
|
166
|
+
/** Search within specific clusters */
|
|
167
|
+
search(query: string, clusters: string | string[], limitOrOptions?: number | {
|
|
168
|
+
limit?: number;
|
|
169
|
+
}, retrievalType?: RetrievalType | string, filters?: Record<string, any>, searchSettings?: Record<string, any>): Promise<SearchResult[]>;
|
|
188
170
|
/**
|
|
189
|
-
*
|
|
171
|
+
* Legacy wrapper: store a two-message conversation turn as a document
|
|
190
172
|
*/
|
|
191
|
-
|
|
173
|
+
storeConversation(userMessage: string, assistantMessage: string, clusterId: string, sessionId: string): Promise<MemoryResponse>;
|
|
192
174
|
/**
|
|
193
|
-
*
|
|
175
|
+
* Legacy wrapper: search conversations optionally scoped by session
|
|
194
176
|
*/
|
|
177
|
+
searchConversations(query: string, clusterId: string, sessionId?: string, includeAllSessions?: boolean): Promise<SearchResult[]>;
|
|
195
178
|
healthCheck(): Promise<Record<string, any>>;
|
|
196
|
-
/**
|
|
197
|
-
* Convert cluster dict to Cluster object
|
|
198
|
-
*/
|
|
199
179
|
private _clusterFromDict;
|
|
200
|
-
/**
|
|
201
|
-
* Convert memory dict to MemoryResponse object
|
|
202
|
-
*/
|
|
203
180
|
private _memoryResponseFromDict;
|
|
204
|
-
/**
|
|
205
|
-
* Convert search result dict to SearchResult object
|
|
206
|
-
*/
|
|
207
181
|
private _searchResultFromDict;
|
|
208
|
-
/**
|
|
209
|
-
* Convert graph search result dict to SearchResult object
|
|
210
|
-
*/
|
|
211
182
|
private _searchResultFromGraphDict;
|
|
212
|
-
/**
|
|
213
|
-
* SHA-256 hash function
|
|
214
|
-
*/
|
|
215
183
|
private _sha256;
|
|
216
|
-
/**
|
|
217
|
-
* Convert object to FormData
|
|
218
|
-
*/
|
|
219
184
|
private _formDataFromObject;
|
|
220
185
|
}
|
|
221
186
|
|
|
222
|
-
export { type AgentResponse, type Cluster, type GraphCommunityResult, type GraphEntityResult, type GraphRelationshipResult, GraphSearchResultType, type Memory, type MemoryResponse, NebulaAuthenticationException, NebulaClientException, NebulaClusterNotFoundException, NebulaException, NebulaRateLimitException,
|
|
187
|
+
export { type AgentResponse, type Cluster, type GraphCommunityResult, type GraphEntityResult, type GraphRelationshipResult, GraphSearchResultType, type Memory, type MemoryResponse, NebulaAuthenticationException, NebulaClient, type NebulaClientConfig, NebulaClientException, NebulaClusterNotFoundException, NebulaException, NebulaRateLimitException, NebulaValidationException, RetrievalType, type SearchOptions, type SearchResult };
|
package/dist/index.d.ts
CHANGED
|
@@ -80,15 +80,15 @@ interface SearchOptions {
|
|
|
80
80
|
filters?: Record<string, any>;
|
|
81
81
|
retrieval_type: RetrievalType;
|
|
82
82
|
}
|
|
83
|
-
interface
|
|
83
|
+
interface NebulaClientConfig {
|
|
84
84
|
apiKey: string;
|
|
85
85
|
baseUrl?: string;
|
|
86
86
|
timeout?: number;
|
|
87
87
|
}
|
|
88
88
|
declare class NebulaException extends Error {
|
|
89
89
|
statusCode?: number | undefined;
|
|
90
|
-
details?: any;
|
|
91
|
-
constructor(message: string, statusCode?: number | undefined, details?: any);
|
|
90
|
+
details?: any | undefined;
|
|
91
|
+
constructor(message: string, statusCode?: number | undefined, details?: any | undefined);
|
|
92
92
|
}
|
|
93
93
|
declare class NebulaClientException extends NebulaException {
|
|
94
94
|
cause?: Error | undefined;
|
|
@@ -101,122 +101,87 @@ declare class NebulaRateLimitException extends NebulaException {
|
|
|
101
101
|
constructor(message?: string);
|
|
102
102
|
}
|
|
103
103
|
declare class NebulaValidationException extends NebulaException {
|
|
104
|
-
details?: any;
|
|
105
|
-
constructor(message?: string, details?: any);
|
|
104
|
+
details?: any | undefined;
|
|
105
|
+
constructor(message?: string, details?: any | undefined);
|
|
106
106
|
}
|
|
107
107
|
declare class NebulaClusterNotFoundException extends NebulaException {
|
|
108
108
|
constructor(message?: string);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/**
|
|
112
|
-
* Official Nebula
|
|
112
|
+
* Official Nebula JavaScript/TypeScript SDK
|
|
113
113
|
* Mirrors the exact Nebula Python SDK client.py implementation
|
|
114
114
|
*/
|
|
115
|
-
declare class
|
|
115
|
+
declare class NebulaClient {
|
|
116
116
|
private apiKey;
|
|
117
117
|
private baseUrl;
|
|
118
118
|
private timeout;
|
|
119
|
-
constructor(config:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
119
|
+
constructor(config: NebulaClientConfig);
|
|
120
|
+
setApiKey(next: string): void;
|
|
121
|
+
setBaseUrl(next: string): void;
|
|
122
|
+
setCorsProxy(_next: string): void;
|
|
123
|
+
/** Check if API key is set */
|
|
123
124
|
isApiKeySet(): boolean;
|
|
124
|
-
/**
|
|
125
|
-
* Detect if a token looks like a Nebula API key (public.raw)
|
|
126
|
-
*/
|
|
125
|
+
/** Detect if a token looks like a Nebula API key (public.raw) */
|
|
127
126
|
private _isNebulaApiKey;
|
|
128
|
-
/**
|
|
129
|
-
* Build authentication headers
|
|
130
|
-
*/
|
|
127
|
+
/** Build authentication headers */
|
|
131
128
|
private _buildAuthHeaders;
|
|
132
|
-
/**
|
|
133
|
-
* Make an HTTP request to the Nebula API
|
|
134
|
-
*/
|
|
129
|
+
/** Make an HTTP request to the Nebula API */
|
|
135
130
|
private _makeRequest;
|
|
136
|
-
/**
|
|
137
|
-
* Create a new cluster
|
|
138
|
-
*/
|
|
131
|
+
/** Create a new cluster */
|
|
139
132
|
createCluster(name: string, description?: string, metadata?: Record<string, any>): Promise<Cluster>;
|
|
140
|
-
/**
|
|
141
|
-
* Get a specific cluster by ID
|
|
142
|
-
*/
|
|
133
|
+
/** Get a specific cluster by ID */
|
|
143
134
|
getCluster(clusterId: string): Promise<Cluster>;
|
|
144
|
-
/**
|
|
145
|
-
* Get a specific cluster by name
|
|
146
|
-
*/
|
|
135
|
+
/** Get a specific cluster by name */
|
|
147
136
|
getClusterByName(name: string): Promise<Cluster>;
|
|
148
|
-
/**
|
|
149
|
-
* Get all clusters
|
|
150
|
-
*/
|
|
137
|
+
/** Get all clusters */
|
|
151
138
|
listClusters(limit?: number, offset?: number): Promise<Cluster[]>;
|
|
152
|
-
/**
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
139
|
+
/** List conversations for the authenticated user */
|
|
140
|
+
listConversations(limit?: number, offset?: number, cluster_ids?: string[]): Promise<any[]>;
|
|
141
|
+
/** Get conversation messages directly from the conversations API */
|
|
142
|
+
getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;
|
|
143
|
+
getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;
|
|
144
|
+
/** Helper method to transform conversation messages to MemoryResponse format */
|
|
145
|
+
private _transformConversationMessages;
|
|
146
|
+
/** Update a cluster */
|
|
159
147
|
updateCluster(clusterId: string, name?: string, description?: string, metadata?: Record<string, any>): Promise<Cluster>;
|
|
160
|
-
/**
|
|
161
|
-
* Delete a cluster
|
|
162
|
-
*/
|
|
148
|
+
/** Delete a cluster */
|
|
163
149
|
deleteCluster(clusterId: string): Promise<boolean>;
|
|
164
150
|
/**
|
|
165
|
-
*
|
|
151
|
+
* Legacy convenience: store raw text content into a cluster as a document
|
|
166
152
|
*/
|
|
153
|
+
store(content: string, clusterId: string, metadata?: Record<string, any>): Promise<MemoryResponse>;
|
|
154
|
+
/** Store a single memory */
|
|
167
155
|
storeMemory(memory: Memory | Record<string, any>): Promise<string>;
|
|
168
|
-
/**
|
|
169
|
-
* Store multiple memories
|
|
170
|
-
*/
|
|
156
|
+
/** Store multiple memories */
|
|
171
157
|
storeMemories(memories: Memory[]): Promise<string[]>;
|
|
172
|
-
/**
|
|
173
|
-
* Delete a specific memory
|
|
174
|
-
*/
|
|
158
|
+
/** Delete a specific memory */
|
|
175
159
|
delete(memoryId: string): Promise<boolean>;
|
|
176
|
-
/**
|
|
177
|
-
* Delete a conversation and all its messages
|
|
178
|
-
*/
|
|
160
|
+
/** Delete a conversation and all its messages */
|
|
179
161
|
deleteConversation(conversationId: string): Promise<boolean>;
|
|
180
|
-
/**
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
listMemories(clusterIds: string[], limit?: number, offset?: number): Promise<MemoryResponse[]>;
|
|
184
|
-
/**
|
|
185
|
-
* Get a specific memory by ID
|
|
186
|
-
*/
|
|
162
|
+
/** Get all memories from specific clusters */
|
|
163
|
+
listMemories(clusterIds: string | string[], limit?: number, offset?: number): Promise<MemoryResponse[]>;
|
|
164
|
+
/** Get a specific memory by ID */
|
|
187
165
|
getMemory(memoryId: string): Promise<MemoryResponse>;
|
|
166
|
+
/** Search within specific clusters */
|
|
167
|
+
search(query: string, clusters: string | string[], limitOrOptions?: number | {
|
|
168
|
+
limit?: number;
|
|
169
|
+
}, retrievalType?: RetrievalType | string, filters?: Record<string, any>, searchSettings?: Record<string, any>): Promise<SearchResult[]>;
|
|
188
170
|
/**
|
|
189
|
-
*
|
|
171
|
+
* Legacy wrapper: store a two-message conversation turn as a document
|
|
190
172
|
*/
|
|
191
|
-
|
|
173
|
+
storeConversation(userMessage: string, assistantMessage: string, clusterId: string, sessionId: string): Promise<MemoryResponse>;
|
|
192
174
|
/**
|
|
193
|
-
*
|
|
175
|
+
* Legacy wrapper: search conversations optionally scoped by session
|
|
194
176
|
*/
|
|
177
|
+
searchConversations(query: string, clusterId: string, sessionId?: string, includeAllSessions?: boolean): Promise<SearchResult[]>;
|
|
195
178
|
healthCheck(): Promise<Record<string, any>>;
|
|
196
|
-
/**
|
|
197
|
-
* Convert cluster dict to Cluster object
|
|
198
|
-
*/
|
|
199
179
|
private _clusterFromDict;
|
|
200
|
-
/**
|
|
201
|
-
* Convert memory dict to MemoryResponse object
|
|
202
|
-
*/
|
|
203
180
|
private _memoryResponseFromDict;
|
|
204
|
-
/**
|
|
205
|
-
* Convert search result dict to SearchResult object
|
|
206
|
-
*/
|
|
207
181
|
private _searchResultFromDict;
|
|
208
|
-
/**
|
|
209
|
-
* Convert graph search result dict to SearchResult object
|
|
210
|
-
*/
|
|
211
182
|
private _searchResultFromGraphDict;
|
|
212
|
-
/**
|
|
213
|
-
* SHA-256 hash function
|
|
214
|
-
*/
|
|
215
183
|
private _sha256;
|
|
216
|
-
/**
|
|
217
|
-
* Convert object to FormData
|
|
218
|
-
*/
|
|
219
184
|
private _formDataFromObject;
|
|
220
185
|
}
|
|
221
186
|
|
|
222
|
-
export { type AgentResponse, type Cluster, type GraphCommunityResult, type GraphEntityResult, type GraphRelationshipResult, GraphSearchResultType, type Memory, type MemoryResponse, NebulaAuthenticationException, NebulaClientException, NebulaClusterNotFoundException, NebulaException, NebulaRateLimitException,
|
|
187
|
+
export { type AgentResponse, type Cluster, type GraphCommunityResult, type GraphEntityResult, type GraphRelationshipResult, GraphSearchResultType, type Memory, type MemoryResponse, NebulaAuthenticationException, NebulaClient, type NebulaClientConfig, NebulaClientException, NebulaClusterNotFoundException, NebulaException, NebulaRateLimitException, NebulaValidationException, RetrievalType, type SearchOptions, type SearchResult };
|
package/dist/index.js
CHANGED
|
@@ -530,23 +530,6 @@ var NebulaClient = class {
|
|
|
530
530
|
}
|
|
531
531
|
const effectiveSettings = { ...searchSettings };
|
|
532
532
|
effectiveSettings.limit = limit;
|
|
533
|
-
effectiveSettings.use_semantic_search = false;
|
|
534
|
-
effectiveSettings.use_fulltext_search = false;
|
|
535
|
-
effectiveSettings.use_hybrid_search = false;
|
|
536
|
-
effectiveSettings.chunk_settings = {
|
|
537
|
-
...effectiveSettings.chunk_settings || {},
|
|
538
|
-
enabled: false
|
|
539
|
-
};
|
|
540
|
-
effectiveSettings.search_strategy = "rag_fusion";
|
|
541
|
-
effectiveSettings.num_sub_queries = 3;
|
|
542
|
-
const gs = { ...effectiveSettings.graph_settings };
|
|
543
|
-
gs.enabled = true;
|
|
544
|
-
gs.bfs_enabled = true;
|
|
545
|
-
gs.bfs_max_depth = 2;
|
|
546
|
-
effectiveSettings.graph_settings = gs;
|
|
547
|
-
if (retrievalType !== "advanced" /* ADVANCED */) {
|
|
548
|
-
effectiveSettings.retrieval_type = retrievalType;
|
|
549
|
-
}
|
|
550
533
|
const userFilters = { ...effectiveSettings.filters };
|
|
551
534
|
if (filters) {
|
|
552
535
|
Object.assign(userFilters, filters);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":["RetrievalType","GraphSearchResultType","response"],"mappings":"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","file":"index.js","sourcesContent":["// Data models matching the actual Nebula Python SDK exactly\n\n// Enums\nexport enum RetrievalType {\n BASIC = \"basic\",\n ADVANCED = \"advanced\",\n CUSTOM = \"custom\"\n}\n\nexport enum GraphSearchResultType {\n ENTITY = \"entity\",\n RELATIONSHIP = \"relationship\",\n COMMUNITY = \"community\"\n}\n\n// Core interfaces matching Python SDK exactly\nexport interface MemoryResponse {\n id: string;\n content?: string;\n chunks?: string[];\n metadata: Record<string, any>;\n cluster_ids: string[];\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Memory {\n cluster_id: string;\n content: string;\n role?: string; // user, assistant, or custom\n parent_id?: string;\n metadata: Record<string, any>;\n}\n\nexport interface Cluster {\n id: string;\n name: string;\n description?: string;\n metadata: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n memory_count: number;\n owner_id?: string;\n}\n\nexport interface SearchResult {\n id: string;\n score: number;\n metadata: Record<string, any>;\n source?: string;\n\n // Chunk fields\n content?: string;\n\n // Graph variant discriminator and payload\n graph_result_type?: GraphSearchResultType;\n graph_entity?: GraphEntityResult;\n graph_relationship?: GraphRelationshipResult;\n graph_community?: GraphCommunityResult;\n chunk_ids?: string[];\n}\n\nexport interface GraphEntityResult {\n id?: string;\n name: string;\n description: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphRelationshipResult {\n id?: string;\n subject: string;\n predicate: string;\n object: string;\n subject_id?: string;\n object_id?: string;\n description?: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphCommunityResult {\n id?: string;\n name: string;\n summary: string;\n metadata: Record<string, any>;\n}\n\nexport interface AgentResponse {\n content: string;\n agent_id: string;\n conversation_id?: string;\n metadata: Record<string, any>;\n citations: Record<string, any>[];\n}\n\nexport interface SearchOptions {\n limit: number;\n filters?: Record<string, any>;\n retrieval_type: RetrievalType;\n}\n\n// Configuration interface\nexport interface NebulaClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n}\n\n// Error types matching Python SDK\nexport class NebulaException extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'NebulaException';\n }\n}\n\nexport class NebulaClientException extends NebulaException {\n constructor(message: string, public cause?: Error) {\n super(message);\n this.name = 'NebulaClientException';\n }\n}\n\nexport class NebulaAuthenticationException extends NebulaException {\n constructor(message: string = 'Invalid API key') {\n super(message, 401);\n this.name = 'NebulaAuthenticationException';\n }\n}\n\nexport class NebulaRateLimitException extends NebulaException {\n constructor(message: string = 'Rate limit exceeded') {\n super(message, 429);\n this.name = 'NebulaRateLimitException';\n }\n}\n\nexport class NebulaValidationException extends NebulaException {\n constructor(message: string = 'Validation error', public details?: any) {\n super(message, 400);\n this.name = 'NebulaValidationException';\n }\n}\n\nexport class NebulaClusterNotFoundException extends NebulaException {\n constructor(message: string = 'Cluster not found') {\n super(message, 404);\n this.name = 'NebulaClusterNotFoundException';\n }\n}\n","import {\n Memory,\n MemoryResponse,\n Cluster,\n SearchResult,\n RetrievalType,\n GraphSearchResultType,\n GraphEntityResult,\n GraphRelationshipResult,\n GraphCommunityResult,\n NebulaClientConfig,\n NebulaException,\n NebulaClientException,\n NebulaAuthenticationException,\n NebulaRateLimitException,\n NebulaValidationException,\n} from './types';\n\n/**\n * Official Nebula JavaScript/TypeScript SDK\n * Mirrors the exact Nebula Python SDK client.py implementation\n */\nexport class NebulaClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(config: NebulaClientConfig) {\n this.apiKey = config.apiKey;\n if (!this.apiKey) {\n throw new NebulaClientException(\n 'API key is required. Pass it to the constructor or set NEBULA_API_KEY environment variable.'\n );\n }\n\n this.baseUrl = (config.baseUrl || 'https://api.nebulacloud.app').replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n }\n\n // Public mutators used by tests\n setApiKey(next: string) {\n this.apiKey = next;\n }\n setBaseUrl(next: string) {\n this.baseUrl = (next || this.baseUrl).replace(/\\/$/, '');\n }\n // Kept for backwards-compat tests; no-op in current implementation\n setCorsProxy(_next: string) {\n // no-op\n }\n\n /** Check if API key is set */\n isApiKeySet(): boolean {\n return !!(this.apiKey && this.apiKey.trim() !== '');\n }\n\n /** Detect if a token looks like a Nebula API key (public.raw) */\n private _isNebulaApiKey(token?: string): boolean {\n const candidate = token || this.apiKey;\n if (!candidate) return false;\n const parts = candidate.split('.');\n if (parts.length !== 2) return false;\n const [publicPart, rawPart] = parts;\n return publicPart.startsWith('key_') && !!rawPart && rawPart.length > 0;\n }\n\n /** Build authentication headers */\n private _buildAuthHeaders(includeContentType: boolean = true): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this._isNebulaApiKey()) {\n headers['X-API-Key'] = this.apiKey;\n } else {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (includeContentType) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n }\n\n /** Make an HTTP request to the Nebula API */\n private async _makeRequest(\n method: string,\n endpoint: string,\n jsonData?: Record<string, any>,\n params?: Record<string, any>\n ): Promise<any> {\n const url = new URL(endpoint, this.baseUrl);\n\n if (params) {\n console.log('SDK: _makeRequest params before processing:', params);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n // Handle array parameters (e.g., collection_ids)\n if (Array.isArray(value)) {\n console.log(`SDK: Adding array param ${key}:`, value);\n value.forEach((item) => {\n url.searchParams.append(key, String(item));\n console.log(`SDK: Appended ${key}=${item} to URL`);\n });\n } else {\n console.log(`SDK: Adding single param ${key}:`, value);\n url.searchParams.append(key, String(value));\n }\n }\n });\n }\n\n console.log('SDK: Final URL being requested:', url.toString());\n\n const headers = this._buildAuthHeaders(true);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: jsonData ? JSON.stringify(jsonData) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n return await response.json();\n } else if (response.status === 401) {\n throw new NebulaAuthenticationException('Invalid API key');\n } else if (response.status === 429) {\n throw new NebulaRateLimitException('Rate limit exceeded');\n } else if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaValidationException(errorData.message || 'Validation error', errorData.details);\n } else {\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 // Cluster Management Methods\n\n /** Create a new cluster */\n async createCluster(\n name: string,\n description?: string,\n metadata?: Record<string, any>\n ): Promise<Cluster> {\n const data: Record<string, any> = { name };\n if (description) data.description = description;\n if (metadata) data.metadata = metadata;\n\n const response = await this._makeRequest('POST', '/v1/collections', data);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get a specific cluster by ID */\n async getCluster(clusterId: string): Promise<Cluster> {\n const response = await this._makeRequest('GET', `/v1/collections/${clusterId}`);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get a specific cluster by name */\n async getClusterByName(name: string): Promise<Cluster> {\n const response = await this._makeRequest('GET', `/v1/collections/name/${name}`);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get all clusters */\n async listClusters(limit: number = 100, offset: number = 0): Promise<Cluster[]> {\n const params = { limit, offset };\n const response = await this._makeRequest('GET', '/v1/collections', undefined, params);\n\n let clusters: any[];\n if (response.results) {\n clusters = response.results;\n } else if (Array.isArray(response)) {\n clusters = response;\n } else {\n clusters = [response];\n }\n\n return clusters.map((cluster) => this._clusterFromDict(cluster));\n }\n\n // Conversations Methods\n\n /** List conversations for the authenticated user */\n async listConversations(limit: number = 100, offset: number = 0, cluster_ids?: string[]): Promise<any[]> {\n const params: Record<string, any> = { limit, offset };\n // Convert cluster_ids to collection_ids for the API\n if (cluster_ids && cluster_ids.length > 0) {\n params.collection_ids = cluster_ids;\n }\n const response = await this._makeRequest('GET', '/v1/conversations', undefined, params);\n\n let conversations: any[];\n if (response && response.results) {\n conversations = response.results;\n } else if (Array.isArray(response)) {\n conversations = response;\n } else {\n conversations = response ? [response] : [];\n }\n\n return conversations;\n }\n\n /** Get conversation messages directly from the conversations API */\n async getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;\n async getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;\n async getConversationMessages(conversationIdOrIds: string | string[]): Promise<MemoryResponse[] | Record<string, MemoryResponse[]>> {\n // Handle single conversation ID (backward compatibility)\n if (typeof conversationIdOrIds === 'string') {\n const response = await this._makeRequest('GET', `/v1/conversations/${conversationIdOrIds}`);\n\n if (!response || !response.results) {\n return [];\n }\n\n return this._transformConversationMessages(response.results);\n }\n\n // Handle multiple conversation IDs\n if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {\n return {};\n }\n\n // Use POST request with conversation IDs in body for batch retrieval\n // This performs a single SQL query with IN clause for optimal performance\n const response = await this._makeRequest('POST', '/v1/conversations/batch', {\n conversation_ids: conversationIdOrIds\n });\n\n console.log('🔍 SDK: Raw batch response:', response);\n console.log('🔍 SDK: Response has results?', !!response?.results);\n if (response?.results) {\n console.log('🔍 SDK: Results keys:', Object.keys(response.results));\n console.log('🔍 SDK: Sample result:', Object.keys(response.results)[0], ':', response.results[Object.keys(response.results)[0]]);\n }\n\n const results: Record<string, MemoryResponse[]> = {};\n\n if (response && response.results) {\n // Backend returns { \"results\": { \"results\": { conversation_id: MessageResponse[] } } } format (double-nested)\n const batchResults = response.results.results || response.results;\n console.log('🔍 SDK: Processing', Object.keys(batchResults).length, 'conversations');\n for (const [conversationId, messages] of Object.entries(batchResults)) {\n if (Array.isArray(messages)) {\n const transformed = this._transformConversationMessages(messages as any[]);\n results[conversationId] = transformed;\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: ${messages.length} raw -> ${transformed.length} transformed`);\n } else {\n results[conversationId] = [];\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: not array, setting empty`);\n }\n }\n }\n\n // Ensure all requested conversation IDs are present in results (even if empty)\n for (const conversationId of conversationIdOrIds) {\n if (!(conversationId in results)) {\n results[conversationId] = [];\n }\n }\n\n return results;\n }\n\n /** Helper method to transform conversation messages to MemoryResponse format */\n private _transformConversationMessages(messageResponses: any[]): MemoryResponse[] {\n return messageResponses.map((msgResp: any) => {\n const msgId = String(msgResp.id || '');\n const msg = msgResp.message || {}; // The actual Message object\n const metadata = msgResp.metadata || {};\n\n // Normalize content to a string - could be string or object\n let text: string = '';\n const rawContent = msg.content;\n if (typeof rawContent === 'string') {\n text = rawContent;\n } else if (rawContent && typeof rawContent === 'object') {\n // Handle structured content\n text = String(rawContent.content || rawContent.text || JSON.stringify(rawContent));\n } else if (rawContent != null) {\n text = String(rawContent);\n }\n\n // Get role from the Message object\n const role = msg.role || metadata.role || 'user';\n\n // Merge message metadata with response metadata\n const combinedMetadata = {\n ...metadata,\n role, // Ensure role is in metadata for UI compatibility\n };\n\n return {\n id: msgId,\n content: text,\n metadata: combinedMetadata,\n created_at: msgResp.created_at,\n cluster_ids: msgResp.collection_ids || [],\n } as MemoryResponse;\n });\n }\n\n /** Update a cluster */\n async updateCluster(\n clusterId: string,\n name?: string,\n description?: string,\n metadata?: Record<string, any>\n ): Promise<Cluster> {\n const data: Record<string, any> = {};\n if (name !== undefined) data.name = name;\n if (description !== undefined) data.description = description;\n if (metadata !== undefined) data.metadata = metadata;\n\n const response = await this._makeRequest('POST', `/v1/collections/${clusterId}`, data);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Delete a cluster */\n async deleteCluster(clusterId: string): Promise<boolean> {\n await this._makeRequest('DELETE', `/v1/collections/${clusterId}`);\n return true;\n }\n\n // Memory Management Methods\n\n /**\n * Legacy convenience: store raw text content into a cluster as a document\n */\n async store(content: string, clusterId: string, metadata: Record<string, any> = {}): Promise<MemoryResponse> {\n const docMetadata = {\n ...metadata,\n memory_type: 'memory',\n timestamp: new Date().toISOString(),\n } as Record<string, any>;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([clusterId]),\n raw_text: String(content || ''),\n } as const;\n\n const url = `${this.baseUrl}/v1/documents`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create document: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n const id = respData?.results?.document_id || respData?.results?.id || respData?.id || '';\n\n const result: MemoryResponse = {\n id: String(id),\n content: String(content || ''),\n metadata: docMetadata,\n cluster_ids: [clusterId],\n created_at: docMetadata.timestamp,\n updated_at: docMetadata.timestamp,\n };\n return result;\n }\n\n /** Store a single memory */\n async storeMemory(memory: Memory | Record<string, any>): Promise<string> {\n let mem: Memory;\n\n if ('cluster_id' in memory) {\n mem = memory as Memory;\n } else {\n mem = {\n cluster_id: (memory as any).cluster_id,\n content: (memory as any).content,\n role: (memory as any).role,\n parent_id: (memory as any).parent_id,\n metadata: (memory as any).metadata || {},\n };\n }\n\n // Conversation mode\n if (mem.role) {\n let convId = mem.parent_id;\n if (!convId) {\n const created = await this._makeRequest('POST', '/v1/conversations', {});\n const conv = created.results || created;\n convId = conv.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n }\n\n const payload = {\n messages: [\n {\n content: String(mem.content),\n role: mem.role,\n metadata: mem.metadata,\n },\n ],\n collection_id: mem.cluster_id,\n } as const;\n\n await this._makeRequest('POST', `/v1/conversations/${convId}/messages`, payload);\n return String(convId);\n }\n\n // Text/JSON memory mode\n const contentText = String(mem.content || '');\n const contentHash = await this._sha256(contentText);\n const docMetadata = { ...mem.metadata } as Record<string, any>;\n docMetadata.memory_type = 'memory';\n docMetadata.content_hash = contentHash;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([mem.cluster_id]),\n raw_text: contentText,\n } as const;\n\n const url = `${this.baseUrl}/v1/documents`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create document: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n if (respData.results.document_id) return String(respData.results.document_id);\n if (respData.results.id) return String(respData.results.id);\n }\n return '';\n }\n\n /** Store multiple memories */\n async storeMemories(memories: Memory[]): Promise<string[]> {\n const results: string[] = [];\n const convGroups: Record<string, Memory[]> = {};\n const others: Memory[] = [];\n\n for (const m of memories) {\n if (m.role) {\n const key = m.parent_id || `__new__::${m.cluster_id}`;\n if (!convGroups[key]) convGroups[key] = [];\n convGroups[key].push(m);\n } else {\n others.push(m);\n }\n }\n\n for (const [key, group] of Object.entries(convGroups)) {\n const clusterId = group[0].cluster_id;\n let convId: string;\n\n if (key.startsWith('__new__::')) {\n const created = await this._makeRequest('POST', '/v1/conversations', {});\n const conv = created.results || created;\n convId = conv.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n } else {\n convId = key;\n }\n\n const messages = group.map((m) => ({\n content: String(m.content || ''),\n role: m.role,\n metadata: m.metadata || {},\n }));\n\n const payload = { messages, collection_id: clusterId };\n await this._makeRequest('POST', `/v1/conversations/${convId}/messages`, payload);\n\n results.push(...Array(group.length).fill(String(convId)));\n }\n\n for (const m of others) {\n results.push(await this.storeMemory(m));\n }\n\n return results;\n }\n\n /** Delete a specific memory */\n async delete(memoryId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/documents/${memoryId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Delete a conversation and all its messages */\n async deleteConversation(conversationId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/conversations/${conversationId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Get all memories from specific clusters */\n async listMemories(\n clusterIds: string | string[],\n limit: number = 100,\n offset: number = 0\n ): Promise<MemoryResponse[]> {\n const ids = Array.isArray(clusterIds) ? clusterIds : [clusterIds];\n if (!ids.length) {\n throw new NebulaClientException('cluster_ids must be provided to list_memories().');\n }\n\n const params = { limit, offset, collection_ids: ids };\n const response = await this._makeRequest('GET', '/v1/documents', undefined, params);\n\n let documents: any[];\n if (response.results) {\n documents = response.results;\n } else if (Array.isArray(response)) {\n documents = response;\n } else {\n documents = [response];\n }\n\n return documents.map((doc) => this._memoryResponseFromDict(doc, ids));\n }\n\n /** Get a specific memory by ID */\n async getMemory(memoryId: string): Promise<MemoryResponse> {\n const response = await this._makeRequest('GET', `/v1/documents/${memoryId}`);\n\n const content = response.text || response.content;\n const chunks = Array.isArray(response.chunks) ? response.chunks : undefined;\n\n const memoryData = {\n id: response.id,\n content,\n chunks,\n metadata: response.metadata || {},\n collection_ids: response.collection_ids || [],\n };\n\n return this._memoryResponseFromDict(memoryData, []);\n }\n\n // Search Methods\n\n /** Search within specific clusters */\n async search(\n query: string,\n clusters: string | string[],\n limitOrOptions?: number | { limit?: number },\n retrievalType: RetrievalType | string = RetrievalType.ADVANCED,\n filters?: Record<string, any>,\n searchSettings?: Record<string, any>\n ): Promise<SearchResult[]> {\n const clusterIds = Array.isArray(clusters) ? clusters : [clusters];\n if (!clusterIds.length) {\n throw new NebulaClientException('cluster_ids must be provided to search().');\n }\n\n // Support legacy call shape: (query, clusterId, {limit})\n let limit = 10;\n if (typeof limitOrOptions === 'number') {\n limit = limitOrOptions;\n } else if (typeof limitOrOptions === 'object' && limitOrOptions) {\n if (typeof limitOrOptions.limit === 'number') limit = limitOrOptions.limit;\n }\n\n if (typeof retrievalType === 'string') {\n retrievalType = (RetrievalType as any)[retrievalType.toUpperCase()] || RetrievalType.ADVANCED;\n }\n\n const effectiveSettings: Record<string, any> = { ...searchSettings };\n effectiveSettings.limit = limit;\n effectiveSettings.use_semantic_search = false;\n effectiveSettings.use_fulltext_search = false;\n effectiveSettings.use_hybrid_search = false;\n effectiveSettings.chunk_settings = {\n ...(effectiveSettings.chunk_settings || {}),\n enabled: false,\n };\n effectiveSettings.search_strategy = 'rag_fusion';\n effectiveSettings.num_sub_queries = 3;\n\n const gs = { ...effectiveSettings.graph_settings };\n gs.enabled = true;\n gs.bfs_enabled = true;\n gs.bfs_max_depth = 2;\n effectiveSettings.graph_settings = gs;\n\n if (retrievalType !== RetrievalType.ADVANCED) {\n (effectiveSettings as any).retrieval_type = retrievalType;\n }\n\n const userFilters = { ...effectiveSettings.filters } as Record<string, any>;\n if (filters) {\n Object.assign(userFilters, filters);\n }\n userFilters.collection_ids = { $overlap: clusterIds };\n effectiveSettings.filters = userFilters;\n\n const data = {\n query,\n search_mode: 'custom',\n search_settings: effectiveSettings,\n };\n\n const response = await this._makeRequest('POST', '/v1/retrieval/search', data);\n\n let chunkResults: any[] = [];\n let graphResults: any[] = [];\n\n if (response.results) {\n chunkResults = response.results.chunk_search_results || [];\n graphResults = response.results.graph_search_results || [];\n }\n\n const out: SearchResult[] = [];\n out.push(...chunkResults.map((result) => this._searchResultFromDict(result)));\n for (const g of graphResults) {\n out.push(this._searchResultFromGraphDict(g));\n }\n\n return out;\n }\n\n /**\n * Legacy wrapper: store a two-message conversation turn as a document\n */\n async storeConversation(\n userMessage: string,\n assistantMessage: string,\n clusterId: string,\n sessionId: string\n ): Promise<MemoryResponse> {\n const content = `User: ${String(userMessage || '')}\\nAssistant: ${String(assistantMessage || '')}`;\n const metadata = { session_id: sessionId, content_type: 'conversation' } as Record<string, any>;\n return this.store(content, clusterId, metadata);\n }\n\n /**\n * Legacy wrapper: search conversations optionally scoped by session\n */\n async searchConversations(\n query: string,\n clusterId: string,\n sessionId?: string,\n includeAllSessions: boolean = true\n ): Promise<SearchResult[]> {\n const filters: Record<string, any> = { 'metadata.content_type': 'conversation' };\n if (sessionId && !includeAllSessions) {\n (filters as any)['metadata.session_id'] = sessionId;\n }\n return this.search(query, [clusterId], { limit: 10 }, RetrievalType.ADVANCED, filters);\n }\n\n // Health Check\n async healthCheck(): Promise<Record<string, any>> {\n return this._makeRequest('GET', '/health');\n }\n\n // Helpers\n\n private _clusterFromDict(data: any): Cluster {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const clusterId = String(data.id || '');\n const clusterName = data.name || '';\n const clusterDescription = data.description;\n const clusterOwnerId = data.owner_id ? String(data.owner_id) : undefined;\n const memoryCount = data.document_count || 0;\n\n const metadata = {\n graph_cluster_status: data.graph_cluster_status || '',\n graph_sync_status: data.graph_sync_status || '',\n user_count: data.user_count || 0,\n document_count: data.document_count || 0,\n };\n\n return {\n id: clusterId,\n name: clusterName,\n description: clusterDescription,\n metadata,\n created_at: createdAt,\n updated_at: updatedAt,\n memory_count: memoryCount,\n owner_id: clusterOwnerId,\n } as Cluster;\n }\n\n private _memoryResponseFromDict(data: any, clusterIds: string[]): MemoryResponse {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const memoryId = String(data.id || '');\n const content = data.content || data.text;\n let chunks: string[] | undefined;\n\n if (data.chunks && Array.isArray(data.chunks)) {\n if (data.chunks.every((x: any) => typeof x === 'string')) {\n chunks = data.chunks;\n } else {\n chunks = data.chunks\n .filter((item: any) => item && typeof item === 'object' && 'text' in item)\n .map((item: any) => item.text);\n }\n }\n\n const metadata = { ...data.metadata };\n if (data.document_id) {\n (metadata as any).document_id = data.document_id;\n }\n\n let finalId = memoryId;\n if (data.document_id && !memoryId) {\n finalId = data.document_id;\n }\n\n if (data.document_metadata) {\n Object.assign(metadata, data.document_metadata);\n }\n\n return {\n id: finalId,\n content,\n chunks,\n metadata,\n cluster_ids: data.collection_ids || clusterIds,\n created_at: createdAt,\n updated_at: updatedAt,\n } as MemoryResponse;\n }\n\n private _searchResultFromDict(data: any): SearchResult {\n const content = data.content || data.text || '';\n const resultId = data.id || data.chunk_id || '';\n\n return {\n id: String(resultId),\n content: String(content),\n score: Number(data.score || 0.0),\n metadata: data.metadata || {},\n source: data.source,\n };\n }\n\n private _searchResultFromGraphDict(data: any): SearchResult {\n const rid = data.id ? String(data.id) : '';\n const rtype =\n GraphSearchResultType[(data.result_type || 'entity').toUpperCase() as keyof typeof GraphSearchResultType] ||\n GraphSearchResultType.ENTITY;\n const content = data.content || {};\n const score = data.score !== undefined ? Number(data.score) : 0.0;\n const metadata = data.metadata || {};\n const chunkIds = Array.isArray(data.chunk_ids) ? data.chunk_ids : undefined;\n\n let entity: GraphEntityResult | undefined;\n let rel: GraphRelationshipResult | undefined;\n let comm: GraphCommunityResult | undefined;\n\n if (rtype === GraphSearchResultType.ENTITY) {\n entity = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n description: content.description || '',\n metadata: content.metadata || {},\n };\n } else if (rtype === GraphSearchResultType.RELATIONSHIP) {\n rel = {\n id: content.id ? String(content.id) : undefined,\n subject: content.subject || '',\n predicate: content.predicate || '',\n object: content.object || '',\n subject_id: content.subject_id ? String(content.subject_id) : undefined,\n object_id: content.object_id ? String(content.object_id) : undefined,\n description: content.description,\n metadata: content.metadata || {},\n };\n } else {\n comm = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n summary: content.summary || '',\n metadata: content.metadata || {},\n };\n }\n\n return {\n id: rid,\n score,\n metadata,\n source: 'graph',\n content: undefined,\n graph_result_type: rtype,\n graph_entity: entity,\n graph_relationship: rel,\n graph_community: comm,\n chunk_ids: chunkIds,\n } as SearchResult;\n }\n\n private async _sha256(message: string): Promise<string> {\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private _formDataFromObject(obj: Record<string, any>): FormData {\n const formData = new FormData();\n Object.entries(obj).forEach(([key, value]) => {\n formData.append(key, value as any);\n });\n return formData;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":["RetrievalType","GraphSearchResultType","response"],"mappings":"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","file":"index.js","sourcesContent":["// Data models matching the actual Nebula Python SDK exactly\n\n// Enums\nexport enum RetrievalType {\n BASIC = \"basic\",\n ADVANCED = \"advanced\",\n CUSTOM = \"custom\"\n}\n\nexport enum GraphSearchResultType {\n ENTITY = \"entity\",\n RELATIONSHIP = \"relationship\",\n COMMUNITY = \"community\"\n}\n\n// Core interfaces matching Python SDK exactly\nexport interface MemoryResponse {\n id: string;\n content?: string;\n chunks?: string[];\n metadata: Record<string, any>;\n cluster_ids: string[];\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Memory {\n cluster_id: string;\n content: string;\n role?: string; // user, assistant, or custom\n parent_id?: string;\n metadata: Record<string, any>;\n}\n\nexport interface Cluster {\n id: string;\n name: string;\n description?: string;\n metadata: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n memory_count: number;\n owner_id?: string;\n}\n\nexport interface SearchResult {\n id: string;\n score: number;\n metadata: Record<string, any>;\n source?: string;\n\n // Chunk fields\n content?: string;\n\n // Graph variant discriminator and payload\n graph_result_type?: GraphSearchResultType;\n graph_entity?: GraphEntityResult;\n graph_relationship?: GraphRelationshipResult;\n graph_community?: GraphCommunityResult;\n chunk_ids?: string[];\n}\n\nexport interface GraphEntityResult {\n id?: string;\n name: string;\n description: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphRelationshipResult {\n id?: string;\n subject: string;\n predicate: string;\n object: string;\n subject_id?: string;\n object_id?: string;\n description?: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphCommunityResult {\n id?: string;\n name: string;\n summary: string;\n metadata: Record<string, any>;\n}\n\nexport interface AgentResponse {\n content: string;\n agent_id: string;\n conversation_id?: string;\n metadata: Record<string, any>;\n citations: Record<string, any>[];\n}\n\nexport interface SearchOptions {\n limit: number;\n filters?: Record<string, any>;\n retrieval_type: RetrievalType;\n}\n\n// Configuration interface\nexport interface NebulaClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n}\n\n// Error types matching Python SDK\nexport class NebulaException extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'NebulaException';\n }\n}\n\nexport class NebulaClientException extends NebulaException {\n constructor(message: string, public cause?: Error) {\n super(message);\n this.name = 'NebulaClientException';\n }\n}\n\nexport class NebulaAuthenticationException extends NebulaException {\n constructor(message: string = 'Invalid API key') {\n super(message, 401);\n this.name = 'NebulaAuthenticationException';\n }\n}\n\nexport class NebulaRateLimitException extends NebulaException {\n constructor(message: string = 'Rate limit exceeded') {\n super(message, 429);\n this.name = 'NebulaRateLimitException';\n }\n}\n\nexport class NebulaValidationException extends NebulaException {\n constructor(message: string = 'Validation error', public details?: any) {\n super(message, 400);\n this.name = 'NebulaValidationException';\n }\n}\n\nexport class NebulaClusterNotFoundException extends NebulaException {\n constructor(message: string = 'Cluster not found') {\n super(message, 404);\n this.name = 'NebulaClusterNotFoundException';\n }\n}\n","import {\n Memory,\n MemoryResponse,\n Cluster,\n SearchResult,\n RetrievalType,\n GraphSearchResultType,\n GraphEntityResult,\n GraphRelationshipResult,\n GraphCommunityResult,\n NebulaClientConfig,\n NebulaException,\n NebulaClientException,\n NebulaAuthenticationException,\n NebulaRateLimitException,\n NebulaValidationException,\n} from './types';\n\n/**\n * Official Nebula JavaScript/TypeScript SDK\n * Mirrors the exact Nebula Python SDK client.py implementation\n */\nexport class NebulaClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(config: NebulaClientConfig) {\n this.apiKey = config.apiKey;\n if (!this.apiKey) {\n throw new NebulaClientException(\n 'API key is required. Pass it to the constructor or set NEBULA_API_KEY environment variable.'\n );\n }\n\n this.baseUrl = (config.baseUrl || 'https://api.nebulacloud.app').replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n }\n\n // Public mutators used by tests\n setApiKey(next: string) {\n this.apiKey = next;\n }\n setBaseUrl(next: string) {\n this.baseUrl = (next || this.baseUrl).replace(/\\/$/, '');\n }\n // Kept for backwards-compat tests; no-op in current implementation\n setCorsProxy(_next: string) {\n // no-op\n }\n\n /** Check if API key is set */\n isApiKeySet(): boolean {\n return !!(this.apiKey && this.apiKey.trim() !== '');\n }\n\n /** Detect if a token looks like a Nebula API key (public.raw) */\n private _isNebulaApiKey(token?: string): boolean {\n const candidate = token || this.apiKey;\n if (!candidate) return false;\n const parts = candidate.split('.');\n if (parts.length !== 2) return false;\n const [publicPart, rawPart] = parts;\n return publicPart.startsWith('key_') && !!rawPart && rawPart.length > 0;\n }\n\n /** Build authentication headers */\n private _buildAuthHeaders(includeContentType: boolean = true): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this._isNebulaApiKey()) {\n headers['X-API-Key'] = this.apiKey;\n } else {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (includeContentType) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n }\n\n /** Make an HTTP request to the Nebula API */\n private async _makeRequest(\n method: string,\n endpoint: string,\n jsonData?: Record<string, any>,\n params?: Record<string, any>\n ): Promise<any> {\n const url = new URL(endpoint, this.baseUrl);\n\n if (params) {\n console.log('SDK: _makeRequest params before processing:', params);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n // Handle array parameters (e.g., collection_ids)\n if (Array.isArray(value)) {\n console.log(`SDK: Adding array param ${key}:`, value);\n value.forEach((item) => {\n url.searchParams.append(key, String(item));\n console.log(`SDK: Appended ${key}=${item} to URL`);\n });\n } else {\n console.log(`SDK: Adding single param ${key}:`, value);\n url.searchParams.append(key, String(value));\n }\n }\n });\n }\n\n console.log('SDK: Final URL being requested:', url.toString());\n\n const headers = this._buildAuthHeaders(true);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: jsonData ? JSON.stringify(jsonData) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n return await response.json();\n } else if (response.status === 401) {\n throw new NebulaAuthenticationException('Invalid API key');\n } else if (response.status === 429) {\n throw new NebulaRateLimitException('Rate limit exceeded');\n } else if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaValidationException(errorData.message || 'Validation error', errorData.details);\n } else {\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 // Cluster Management Methods\n\n /** Create a new cluster */\n async createCluster(\n name: string,\n description?: string,\n metadata?: Record<string, any>\n ): Promise<Cluster> {\n const data: Record<string, any> = { name };\n if (description) data.description = description;\n if (metadata) data.metadata = metadata;\n\n const response = await this._makeRequest('POST', '/v1/collections', data);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get a specific cluster by ID */\n async getCluster(clusterId: string): Promise<Cluster> {\n const response = await this._makeRequest('GET', `/v1/collections/${clusterId}`);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get a specific cluster by name */\n async getClusterByName(name: string): Promise<Cluster> {\n const response = await this._makeRequest('GET', `/v1/collections/name/${name}`);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get all clusters */\n async listClusters(limit: number = 100, offset: number = 0): Promise<Cluster[]> {\n const params = { limit, offset };\n const response = await this._makeRequest('GET', '/v1/collections', undefined, params);\n\n let clusters: any[];\n if (response.results) {\n clusters = response.results;\n } else if (Array.isArray(response)) {\n clusters = response;\n } else {\n clusters = [response];\n }\n\n return clusters.map((cluster) => this._clusterFromDict(cluster));\n }\n\n // Conversations Methods\n\n /** List conversations for the authenticated user */\n async listConversations(limit: number = 100, offset: number = 0, cluster_ids?: string[]): Promise<any[]> {\n const params: Record<string, any> = { limit, offset };\n // Convert cluster_ids to collection_ids for the API\n if (cluster_ids && cluster_ids.length > 0) {\n params.collection_ids = cluster_ids;\n }\n const response = await this._makeRequest('GET', '/v1/conversations', undefined, params);\n\n let conversations: any[];\n if (response && response.results) {\n conversations = response.results;\n } else if (Array.isArray(response)) {\n conversations = response;\n } else {\n conversations = response ? [response] : [];\n }\n\n return conversations;\n }\n\n /** Get conversation messages directly from the conversations API */\n async getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;\n async getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;\n async getConversationMessages(conversationIdOrIds: string | string[]): Promise<MemoryResponse[] | Record<string, MemoryResponse[]>> {\n // Handle single conversation ID (backward compatibility)\n if (typeof conversationIdOrIds === 'string') {\n const response = await this._makeRequest('GET', `/v1/conversations/${conversationIdOrIds}`);\n\n if (!response || !response.results) {\n return [];\n }\n\n return this._transformConversationMessages(response.results);\n }\n\n // Handle multiple conversation IDs\n if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {\n return {};\n }\n\n // Use POST request with conversation IDs in body for batch retrieval\n // This performs a single SQL query with IN clause for optimal performance\n const response = await this._makeRequest('POST', '/v1/conversations/batch', {\n conversation_ids: conversationIdOrIds\n });\n\n console.log('🔍 SDK: Raw batch response:', response);\n console.log('🔍 SDK: Response has results?', !!response?.results);\n if (response?.results) {\n console.log('🔍 SDK: Results keys:', Object.keys(response.results));\n console.log('🔍 SDK: Sample result:', Object.keys(response.results)[0], ':', response.results[Object.keys(response.results)[0]]);\n }\n\n const results: Record<string, MemoryResponse[]> = {};\n\n if (response && response.results) {\n // Backend returns { \"results\": { \"results\": { conversation_id: MessageResponse[] } } } format (double-nested)\n const batchResults = response.results.results || response.results;\n console.log('🔍 SDK: Processing', Object.keys(batchResults).length, 'conversations');\n for (const [conversationId, messages] of Object.entries(batchResults)) {\n if (Array.isArray(messages)) {\n const transformed = this._transformConversationMessages(messages as any[]);\n results[conversationId] = transformed;\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: ${messages.length} raw -> ${transformed.length} transformed`);\n } else {\n results[conversationId] = [];\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: not array, setting empty`);\n }\n }\n }\n\n // Ensure all requested conversation IDs are present in results (even if empty)\n for (const conversationId of conversationIdOrIds) {\n if (!(conversationId in results)) {\n results[conversationId] = [];\n }\n }\n\n return results;\n }\n\n /** Helper method to transform conversation messages to MemoryResponse format */\n private _transformConversationMessages(messageResponses: any[]): MemoryResponse[] {\n return messageResponses.map((msgResp: any) => {\n const msgId = String(msgResp.id || '');\n const msg = msgResp.message || {}; // The actual Message object\n const metadata = msgResp.metadata || {};\n\n // Normalize content to a string - could be string or object\n let text: string = '';\n const rawContent = msg.content;\n if (typeof rawContent === 'string') {\n text = rawContent;\n } else if (rawContent && typeof rawContent === 'object') {\n // Handle structured content\n text = String(rawContent.content || rawContent.text || JSON.stringify(rawContent));\n } else if (rawContent != null) {\n text = String(rawContent);\n }\n\n // Get role from the Message object\n const role = msg.role || metadata.role || 'user';\n\n // Merge message metadata with response metadata\n const combinedMetadata = {\n ...metadata,\n role, // Ensure role is in metadata for UI compatibility\n };\n\n return {\n id: msgId,\n content: text,\n metadata: combinedMetadata,\n created_at: msgResp.created_at,\n cluster_ids: msgResp.collection_ids || [],\n } as MemoryResponse;\n });\n }\n\n /** Update a cluster */\n async updateCluster(\n clusterId: string,\n name?: string,\n description?: string,\n metadata?: Record<string, any>\n ): Promise<Cluster> {\n const data: Record<string, any> = {};\n if (name !== undefined) data.name = name;\n if (description !== undefined) data.description = description;\n if (metadata !== undefined) data.metadata = metadata;\n\n const response = await this._makeRequest('POST', `/v1/collections/${clusterId}`, data);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Delete a cluster */\n async deleteCluster(clusterId: string): Promise<boolean> {\n await this._makeRequest('DELETE', `/v1/collections/${clusterId}`);\n return true;\n }\n\n // Memory Management Methods\n\n /**\n * Legacy convenience: store raw text content into a cluster as a document\n */\n async store(content: string, clusterId: string, metadata: Record<string, any> = {}): Promise<MemoryResponse> {\n const docMetadata = {\n ...metadata,\n memory_type: 'memory',\n timestamp: new Date().toISOString(),\n } as Record<string, any>;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([clusterId]),\n raw_text: String(content || ''),\n } as const;\n\n const url = `${this.baseUrl}/v1/documents`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create document: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n const id = respData?.results?.document_id || respData?.results?.id || respData?.id || '';\n\n const result: MemoryResponse = {\n id: String(id),\n content: String(content || ''),\n metadata: docMetadata,\n cluster_ids: [clusterId],\n created_at: docMetadata.timestamp,\n updated_at: docMetadata.timestamp,\n };\n return result;\n }\n\n /** Store a single memory */\n async storeMemory(memory: Memory | Record<string, any>): Promise<string> {\n let mem: Memory;\n\n if ('cluster_id' in memory) {\n mem = memory as Memory;\n } else {\n mem = {\n cluster_id: (memory as any).cluster_id,\n content: (memory as any).content,\n role: (memory as any).role,\n parent_id: (memory as any).parent_id,\n metadata: (memory as any).metadata || {},\n };\n }\n\n // Conversation mode\n if (mem.role) {\n let convId = mem.parent_id;\n if (!convId) {\n const created = await this._makeRequest('POST', '/v1/conversations', {});\n const conv = created.results || created;\n convId = conv.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n }\n\n const payload = {\n messages: [\n {\n content: String(mem.content),\n role: mem.role,\n metadata: mem.metadata,\n },\n ],\n collection_id: mem.cluster_id,\n } as const;\n\n await this._makeRequest('POST', `/v1/conversations/${convId}/messages`, payload);\n return String(convId);\n }\n\n // Text/JSON memory mode\n const contentText = String(mem.content || '');\n const contentHash = await this._sha256(contentText);\n const docMetadata = { ...mem.metadata } as Record<string, any>;\n docMetadata.memory_type = 'memory';\n docMetadata.content_hash = contentHash;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([mem.cluster_id]),\n raw_text: contentText,\n } as const;\n\n const url = `${this.baseUrl}/v1/documents`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create document: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n if (respData.results.document_id) return String(respData.results.document_id);\n if (respData.results.id) return String(respData.results.id);\n }\n return '';\n }\n\n /** Store multiple memories */\n async storeMemories(memories: Memory[]): Promise<string[]> {\n const results: string[] = [];\n const convGroups: Record<string, Memory[]> = {};\n const others: Memory[] = [];\n\n for (const m of memories) {\n if (m.role) {\n const key = m.parent_id || `__new__::${m.cluster_id}`;\n if (!convGroups[key]) convGroups[key] = [];\n convGroups[key].push(m);\n } else {\n others.push(m);\n }\n }\n\n for (const [key, group] of Object.entries(convGroups)) {\n const clusterId = group[0].cluster_id;\n let convId: string;\n\n if (key.startsWith('__new__::')) {\n const created = await this._makeRequest('POST', '/v1/conversations', {});\n const conv = created.results || created;\n convId = conv.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n } else {\n convId = key;\n }\n\n const messages = group.map((m) => ({\n content: String(m.content || ''),\n role: m.role,\n metadata: m.metadata || {},\n }));\n\n const payload = { messages, collection_id: clusterId };\n await this._makeRequest('POST', `/v1/conversations/${convId}/messages`, payload);\n\n results.push(...Array(group.length).fill(String(convId)));\n }\n\n for (const m of others) {\n results.push(await this.storeMemory(m));\n }\n\n return results;\n }\n\n /** Delete a specific memory */\n async delete(memoryId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/documents/${memoryId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Delete a conversation and all its messages */\n async deleteConversation(conversationId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/conversations/${conversationId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Get all memories from specific clusters */\n async listMemories(\n clusterIds: string | string[],\n limit: number = 100,\n offset: number = 0\n ): Promise<MemoryResponse[]> {\n const ids = Array.isArray(clusterIds) ? clusterIds : [clusterIds];\n if (!ids.length) {\n throw new NebulaClientException('cluster_ids must be provided to list_memories().');\n }\n\n const params = { limit, offset, collection_ids: ids };\n const response = await this._makeRequest('GET', '/v1/documents', undefined, params);\n\n let documents: any[];\n if (response.results) {\n documents = response.results;\n } else if (Array.isArray(response)) {\n documents = response;\n } else {\n documents = [response];\n }\n\n return documents.map((doc) => this._memoryResponseFromDict(doc, ids));\n }\n\n /** Get a specific memory by ID */\n async getMemory(memoryId: string): Promise<MemoryResponse> {\n const response = await this._makeRequest('GET', `/v1/documents/${memoryId}`);\n\n const content = response.text || response.content;\n const chunks = Array.isArray(response.chunks) ? response.chunks : undefined;\n\n const memoryData = {\n id: response.id,\n content,\n chunks,\n metadata: response.metadata || {},\n collection_ids: response.collection_ids || [],\n };\n\n return this._memoryResponseFromDict(memoryData, []);\n }\n\n // Search Methods\n\n /** Search within specific clusters */\n async search(\n query: string,\n clusters: string | string[],\n limitOrOptions?: number | { limit?: number },\n retrievalType: RetrievalType | string = RetrievalType.ADVANCED,\n filters?: Record<string, any>,\n searchSettings?: Record<string, any>\n ): Promise<SearchResult[]> {\n const clusterIds = Array.isArray(clusters) ? clusters : [clusters];\n if (!clusterIds.length) {\n throw new NebulaClientException('cluster_ids must be provided to search().');\n }\n\n // Support legacy call shape: (query, clusterId, {limit})\n let limit = 10;\n if (typeof limitOrOptions === 'number') {\n limit = limitOrOptions;\n } else if (typeof limitOrOptions === 'object' && limitOrOptions) {\n if (typeof limitOrOptions.limit === 'number') limit = limitOrOptions.limit;\n }\n\n if (typeof retrievalType === 'string') {\n retrievalType = (RetrievalType as any)[retrievalType.toUpperCase()] || RetrievalType.ADVANCED;\n }\n\n // Build effective search settings with simplified structure\n const effectiveSettings: Record<string, any> = { ...searchSettings };\n effectiveSettings.limit = limit;\n // Retrieval type is now handled internally by the backend\n\n const userFilters = { ...effectiveSettings.filters } as Record<string, any>;\n if (filters) {\n Object.assign(userFilters, filters);\n }\n userFilters.collection_ids = { $overlap: clusterIds };\n effectiveSettings.filters = userFilters;\n\n const data = {\n query,\n search_mode: 'custom',\n search_settings: effectiveSettings,\n };\n\n const response = await this._makeRequest('POST', '/v1/retrieval/search', data);\n\n let chunkResults: any[] = [];\n let graphResults: any[] = [];\n\n if (response.results) {\n chunkResults = response.results.chunk_search_results || [];\n graphResults = response.results.graph_search_results || [];\n }\n\n const out: SearchResult[] = [];\n out.push(...chunkResults.map((result) => this._searchResultFromDict(result)));\n for (const g of graphResults) {\n out.push(this._searchResultFromGraphDict(g));\n }\n\n return out;\n }\n\n /**\n * Legacy wrapper: store a two-message conversation turn as a document\n */\n async storeConversation(\n userMessage: string,\n assistantMessage: string,\n clusterId: string,\n sessionId: string\n ): Promise<MemoryResponse> {\n const content = `User: ${String(userMessage || '')}\\nAssistant: ${String(assistantMessage || '')}`;\n const metadata = { session_id: sessionId, content_type: 'conversation' } as Record<string, any>;\n return this.store(content, clusterId, metadata);\n }\n\n /**\n * Legacy wrapper: search conversations optionally scoped by session\n */\n async searchConversations(\n query: string,\n clusterId: string,\n sessionId?: string,\n includeAllSessions: boolean = true\n ): Promise<SearchResult[]> {\n const filters: Record<string, any> = { 'metadata.content_type': 'conversation' };\n if (sessionId && !includeAllSessions) {\n (filters as any)['metadata.session_id'] = sessionId;\n }\n return this.search(query, [clusterId], { limit: 10 }, RetrievalType.ADVANCED, filters);\n }\n\n // Health Check\n async healthCheck(): Promise<Record<string, any>> {\n return this._makeRequest('GET', '/health');\n }\n\n // Helpers\n\n private _clusterFromDict(data: any): Cluster {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const clusterId = String(data.id || '');\n const clusterName = data.name || '';\n const clusterDescription = data.description;\n const clusterOwnerId = data.owner_id ? String(data.owner_id) : undefined;\n const memoryCount = data.document_count || 0;\n\n const metadata = {\n graph_cluster_status: data.graph_cluster_status || '',\n graph_sync_status: data.graph_sync_status || '',\n user_count: data.user_count || 0,\n document_count: data.document_count || 0,\n };\n\n return {\n id: clusterId,\n name: clusterName,\n description: clusterDescription,\n metadata,\n created_at: createdAt,\n updated_at: updatedAt,\n memory_count: memoryCount,\n owner_id: clusterOwnerId,\n } as Cluster;\n }\n\n private _memoryResponseFromDict(data: any, clusterIds: string[]): MemoryResponse {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const memoryId = String(data.id || '');\n const content = data.content || data.text;\n let chunks: string[] | undefined;\n\n if (data.chunks && Array.isArray(data.chunks)) {\n if (data.chunks.every((x: any) => typeof x === 'string')) {\n chunks = data.chunks;\n } else {\n chunks = data.chunks\n .filter((item: any) => item && typeof item === 'object' && 'text' in item)\n .map((item: any) => item.text);\n }\n }\n\n const metadata = { ...data.metadata };\n if (data.document_id) {\n (metadata as any).document_id = data.document_id;\n }\n\n let finalId = memoryId;\n if (data.document_id && !memoryId) {\n finalId = data.document_id;\n }\n\n if (data.document_metadata) {\n Object.assign(metadata, data.document_metadata);\n }\n\n return {\n id: finalId,\n content,\n chunks,\n metadata,\n cluster_ids: data.collection_ids || clusterIds,\n created_at: createdAt,\n updated_at: updatedAt,\n } as MemoryResponse;\n }\n\n private _searchResultFromDict(data: any): SearchResult {\n const content = data.content || data.text || '';\n const resultId = data.id || data.chunk_id || '';\n\n return {\n id: String(resultId),\n content: String(content),\n score: Number(data.score || 0.0),\n metadata: data.metadata || {},\n source: data.source,\n };\n }\n\n private _searchResultFromGraphDict(data: any): SearchResult {\n const rid = data.id ? String(data.id) : '';\n const rtype =\n GraphSearchResultType[(data.result_type || 'entity').toUpperCase() as keyof typeof GraphSearchResultType] ||\n GraphSearchResultType.ENTITY;\n const content = data.content || {};\n const score = data.score !== undefined ? Number(data.score) : 0.0;\n const metadata = data.metadata || {};\n const chunkIds = Array.isArray(data.chunk_ids) ? data.chunk_ids : undefined;\n\n let entity: GraphEntityResult | undefined;\n let rel: GraphRelationshipResult | undefined;\n let comm: GraphCommunityResult | undefined;\n\n if (rtype === GraphSearchResultType.ENTITY) {\n entity = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n description: content.description || '',\n metadata: content.metadata || {},\n };\n } else if (rtype === GraphSearchResultType.RELATIONSHIP) {\n rel = {\n id: content.id ? String(content.id) : undefined,\n subject: content.subject || '',\n predicate: content.predicate || '',\n object: content.object || '',\n subject_id: content.subject_id ? String(content.subject_id) : undefined,\n object_id: content.object_id ? String(content.object_id) : undefined,\n description: content.description,\n metadata: content.metadata || {},\n };\n } else {\n comm = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n summary: content.summary || '',\n metadata: content.metadata || {},\n };\n }\n\n return {\n id: rid,\n score,\n metadata,\n source: 'graph',\n content: undefined,\n graph_result_type: rtype,\n graph_entity: entity,\n graph_relationship: rel,\n graph_community: comm,\n chunk_ids: chunkIds,\n } as SearchResult;\n }\n\n private async _sha256(message: string): Promise<string> {\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private _formDataFromObject(obj: Record<string, any>): FormData {\n const formData = new FormData();\n Object.entries(obj).forEach(([key, value]) => {\n formData.append(key, value as any);\n });\n return formData;\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -528,23 +528,6 @@ var NebulaClient = class {
|
|
|
528
528
|
}
|
|
529
529
|
const effectiveSettings = { ...searchSettings };
|
|
530
530
|
effectiveSettings.limit = limit;
|
|
531
|
-
effectiveSettings.use_semantic_search = false;
|
|
532
|
-
effectiveSettings.use_fulltext_search = false;
|
|
533
|
-
effectiveSettings.use_hybrid_search = false;
|
|
534
|
-
effectiveSettings.chunk_settings = {
|
|
535
|
-
...effectiveSettings.chunk_settings || {},
|
|
536
|
-
enabled: false
|
|
537
|
-
};
|
|
538
|
-
effectiveSettings.search_strategy = "rag_fusion";
|
|
539
|
-
effectiveSettings.num_sub_queries = 3;
|
|
540
|
-
const gs = { ...effectiveSettings.graph_settings };
|
|
541
|
-
gs.enabled = true;
|
|
542
|
-
gs.bfs_enabled = true;
|
|
543
|
-
gs.bfs_max_depth = 2;
|
|
544
|
-
effectiveSettings.graph_settings = gs;
|
|
545
|
-
if (retrievalType !== "advanced" /* ADVANCED */) {
|
|
546
|
-
effectiveSettings.retrieval_type = retrievalType;
|
|
547
|
-
}
|
|
548
531
|
const userFilters = { ...effectiveSettings.filters };
|
|
549
532
|
if (filters) {
|
|
550
533
|
Object.assign(userFilters, filters);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":["RetrievalType","GraphSearchResultType","response"],"mappings":"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","file":"index.mjs","sourcesContent":["// Data models matching the actual Nebula Python SDK exactly\n\n// Enums\nexport enum RetrievalType {\n BASIC = \"basic\",\n ADVANCED = \"advanced\",\n CUSTOM = \"custom\"\n}\n\nexport enum GraphSearchResultType {\n ENTITY = \"entity\",\n RELATIONSHIP = \"relationship\",\n COMMUNITY = \"community\"\n}\n\n// Core interfaces matching Python SDK exactly\nexport interface MemoryResponse {\n id: string;\n content?: string;\n chunks?: string[];\n metadata: Record<string, any>;\n cluster_ids: string[];\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Memory {\n cluster_id: string;\n content: string;\n role?: string; // user, assistant, or custom\n parent_id?: string;\n metadata: Record<string, any>;\n}\n\nexport interface Cluster {\n id: string;\n name: string;\n description?: string;\n metadata: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n memory_count: number;\n owner_id?: string;\n}\n\nexport interface SearchResult {\n id: string;\n score: number;\n metadata: Record<string, any>;\n source?: string;\n\n // Chunk fields\n content?: string;\n\n // Graph variant discriminator and payload\n graph_result_type?: GraphSearchResultType;\n graph_entity?: GraphEntityResult;\n graph_relationship?: GraphRelationshipResult;\n graph_community?: GraphCommunityResult;\n chunk_ids?: string[];\n}\n\nexport interface GraphEntityResult {\n id?: string;\n name: string;\n description: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphRelationshipResult {\n id?: string;\n subject: string;\n predicate: string;\n object: string;\n subject_id?: string;\n object_id?: string;\n description?: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphCommunityResult {\n id?: string;\n name: string;\n summary: string;\n metadata: Record<string, any>;\n}\n\nexport interface AgentResponse {\n content: string;\n agent_id: string;\n conversation_id?: string;\n metadata: Record<string, any>;\n citations: Record<string, any>[];\n}\n\nexport interface SearchOptions {\n limit: number;\n filters?: Record<string, any>;\n retrieval_type: RetrievalType;\n}\n\n// Configuration interface\nexport interface NebulaClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n}\n\n// Error types matching Python SDK\nexport class NebulaException extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'NebulaException';\n }\n}\n\nexport class NebulaClientException extends NebulaException {\n constructor(message: string, public cause?: Error) {\n super(message);\n this.name = 'NebulaClientException';\n }\n}\n\nexport class NebulaAuthenticationException extends NebulaException {\n constructor(message: string = 'Invalid API key') {\n super(message, 401);\n this.name = 'NebulaAuthenticationException';\n }\n}\n\nexport class NebulaRateLimitException extends NebulaException {\n constructor(message: string = 'Rate limit exceeded') {\n super(message, 429);\n this.name = 'NebulaRateLimitException';\n }\n}\n\nexport class NebulaValidationException extends NebulaException {\n constructor(message: string = 'Validation error', public details?: any) {\n super(message, 400);\n this.name = 'NebulaValidationException';\n }\n}\n\nexport class NebulaClusterNotFoundException extends NebulaException {\n constructor(message: string = 'Cluster not found') {\n super(message, 404);\n this.name = 'NebulaClusterNotFoundException';\n }\n}\n","import {\n Memory,\n MemoryResponse,\n Cluster,\n SearchResult,\n RetrievalType,\n GraphSearchResultType,\n GraphEntityResult,\n GraphRelationshipResult,\n GraphCommunityResult,\n NebulaClientConfig,\n NebulaException,\n NebulaClientException,\n NebulaAuthenticationException,\n NebulaRateLimitException,\n NebulaValidationException,\n} from './types';\n\n/**\n * Official Nebula JavaScript/TypeScript SDK\n * Mirrors the exact Nebula Python SDK client.py implementation\n */\nexport class NebulaClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(config: NebulaClientConfig) {\n this.apiKey = config.apiKey;\n if (!this.apiKey) {\n throw new NebulaClientException(\n 'API key is required. Pass it to the constructor or set NEBULA_API_KEY environment variable.'\n );\n }\n\n this.baseUrl = (config.baseUrl || 'https://api.nebulacloud.app').replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n }\n\n // Public mutators used by tests\n setApiKey(next: string) {\n this.apiKey = next;\n }\n setBaseUrl(next: string) {\n this.baseUrl = (next || this.baseUrl).replace(/\\/$/, '');\n }\n // Kept for backwards-compat tests; no-op in current implementation\n setCorsProxy(_next: string) {\n // no-op\n }\n\n /** Check if API key is set */\n isApiKeySet(): boolean {\n return !!(this.apiKey && this.apiKey.trim() !== '');\n }\n\n /** Detect if a token looks like a Nebula API key (public.raw) */\n private _isNebulaApiKey(token?: string): boolean {\n const candidate = token || this.apiKey;\n if (!candidate) return false;\n const parts = candidate.split('.');\n if (parts.length !== 2) return false;\n const [publicPart, rawPart] = parts;\n return publicPart.startsWith('key_') && !!rawPart && rawPart.length > 0;\n }\n\n /** Build authentication headers */\n private _buildAuthHeaders(includeContentType: boolean = true): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this._isNebulaApiKey()) {\n headers['X-API-Key'] = this.apiKey;\n } else {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (includeContentType) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n }\n\n /** Make an HTTP request to the Nebula API */\n private async _makeRequest(\n method: string,\n endpoint: string,\n jsonData?: Record<string, any>,\n params?: Record<string, any>\n ): Promise<any> {\n const url = new URL(endpoint, this.baseUrl);\n\n if (params) {\n console.log('SDK: _makeRequest params before processing:', params);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n // Handle array parameters (e.g., collection_ids)\n if (Array.isArray(value)) {\n console.log(`SDK: Adding array param ${key}:`, value);\n value.forEach((item) => {\n url.searchParams.append(key, String(item));\n console.log(`SDK: Appended ${key}=${item} to URL`);\n });\n } else {\n console.log(`SDK: Adding single param ${key}:`, value);\n url.searchParams.append(key, String(value));\n }\n }\n });\n }\n\n console.log('SDK: Final URL being requested:', url.toString());\n\n const headers = this._buildAuthHeaders(true);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: jsonData ? JSON.stringify(jsonData) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n return await response.json();\n } else if (response.status === 401) {\n throw new NebulaAuthenticationException('Invalid API key');\n } else if (response.status === 429) {\n throw new NebulaRateLimitException('Rate limit exceeded');\n } else if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaValidationException(errorData.message || 'Validation error', errorData.details);\n } else {\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 // Cluster Management Methods\n\n /** Create a new cluster */\n async createCluster(\n name: string,\n description?: string,\n metadata?: Record<string, any>\n ): Promise<Cluster> {\n const data: Record<string, any> = { name };\n if (description) data.description = description;\n if (metadata) data.metadata = metadata;\n\n const response = await this._makeRequest('POST', '/v1/collections', data);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get a specific cluster by ID */\n async getCluster(clusterId: string): Promise<Cluster> {\n const response = await this._makeRequest('GET', `/v1/collections/${clusterId}`);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get a specific cluster by name */\n async getClusterByName(name: string): Promise<Cluster> {\n const response = await this._makeRequest('GET', `/v1/collections/name/${name}`);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get all clusters */\n async listClusters(limit: number = 100, offset: number = 0): Promise<Cluster[]> {\n const params = { limit, offset };\n const response = await this._makeRequest('GET', '/v1/collections', undefined, params);\n\n let clusters: any[];\n if (response.results) {\n clusters = response.results;\n } else if (Array.isArray(response)) {\n clusters = response;\n } else {\n clusters = [response];\n }\n\n return clusters.map((cluster) => this._clusterFromDict(cluster));\n }\n\n // Conversations Methods\n\n /** List conversations for the authenticated user */\n async listConversations(limit: number = 100, offset: number = 0, cluster_ids?: string[]): Promise<any[]> {\n const params: Record<string, any> = { limit, offset };\n // Convert cluster_ids to collection_ids for the API\n if (cluster_ids && cluster_ids.length > 0) {\n params.collection_ids = cluster_ids;\n }\n const response = await this._makeRequest('GET', '/v1/conversations', undefined, params);\n\n let conversations: any[];\n if (response && response.results) {\n conversations = response.results;\n } else if (Array.isArray(response)) {\n conversations = response;\n } else {\n conversations = response ? [response] : [];\n }\n\n return conversations;\n }\n\n /** Get conversation messages directly from the conversations API */\n async getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;\n async getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;\n async getConversationMessages(conversationIdOrIds: string | string[]): Promise<MemoryResponse[] | Record<string, MemoryResponse[]>> {\n // Handle single conversation ID (backward compatibility)\n if (typeof conversationIdOrIds === 'string') {\n const response = await this._makeRequest('GET', `/v1/conversations/${conversationIdOrIds}`);\n\n if (!response || !response.results) {\n return [];\n }\n\n return this._transformConversationMessages(response.results);\n }\n\n // Handle multiple conversation IDs\n if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {\n return {};\n }\n\n // Use POST request with conversation IDs in body for batch retrieval\n // This performs a single SQL query with IN clause for optimal performance\n const response = await this._makeRequest('POST', '/v1/conversations/batch', {\n conversation_ids: conversationIdOrIds\n });\n\n console.log('🔍 SDK: Raw batch response:', response);\n console.log('🔍 SDK: Response has results?', !!response?.results);\n if (response?.results) {\n console.log('🔍 SDK: Results keys:', Object.keys(response.results));\n console.log('🔍 SDK: Sample result:', Object.keys(response.results)[0], ':', response.results[Object.keys(response.results)[0]]);\n }\n\n const results: Record<string, MemoryResponse[]> = {};\n\n if (response && response.results) {\n // Backend returns { \"results\": { \"results\": { conversation_id: MessageResponse[] } } } format (double-nested)\n const batchResults = response.results.results || response.results;\n console.log('🔍 SDK: Processing', Object.keys(batchResults).length, 'conversations');\n for (const [conversationId, messages] of Object.entries(batchResults)) {\n if (Array.isArray(messages)) {\n const transformed = this._transformConversationMessages(messages as any[]);\n results[conversationId] = transformed;\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: ${messages.length} raw -> ${transformed.length} transformed`);\n } else {\n results[conversationId] = [];\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: not array, setting empty`);\n }\n }\n }\n\n // Ensure all requested conversation IDs are present in results (even if empty)\n for (const conversationId of conversationIdOrIds) {\n if (!(conversationId in results)) {\n results[conversationId] = [];\n }\n }\n\n return results;\n }\n\n /** Helper method to transform conversation messages to MemoryResponse format */\n private _transformConversationMessages(messageResponses: any[]): MemoryResponse[] {\n return messageResponses.map((msgResp: any) => {\n const msgId = String(msgResp.id || '');\n const msg = msgResp.message || {}; // The actual Message object\n const metadata = msgResp.metadata || {};\n\n // Normalize content to a string - could be string or object\n let text: string = '';\n const rawContent = msg.content;\n if (typeof rawContent === 'string') {\n text = rawContent;\n } else if (rawContent && typeof rawContent === 'object') {\n // Handle structured content\n text = String(rawContent.content || rawContent.text || JSON.stringify(rawContent));\n } else if (rawContent != null) {\n text = String(rawContent);\n }\n\n // Get role from the Message object\n const role = msg.role || metadata.role || 'user';\n\n // Merge message metadata with response metadata\n const combinedMetadata = {\n ...metadata,\n role, // Ensure role is in metadata for UI compatibility\n };\n\n return {\n id: msgId,\n content: text,\n metadata: combinedMetadata,\n created_at: msgResp.created_at,\n cluster_ids: msgResp.collection_ids || [],\n } as MemoryResponse;\n });\n }\n\n /** Update a cluster */\n async updateCluster(\n clusterId: string,\n name?: string,\n description?: string,\n metadata?: Record<string, any>\n ): Promise<Cluster> {\n const data: Record<string, any> = {};\n if (name !== undefined) data.name = name;\n if (description !== undefined) data.description = description;\n if (metadata !== undefined) data.metadata = metadata;\n\n const response = await this._makeRequest('POST', `/v1/collections/${clusterId}`, data);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Delete a cluster */\n async deleteCluster(clusterId: string): Promise<boolean> {\n await this._makeRequest('DELETE', `/v1/collections/${clusterId}`);\n return true;\n }\n\n // Memory Management Methods\n\n /**\n * Legacy convenience: store raw text content into a cluster as a document\n */\n async store(content: string, clusterId: string, metadata: Record<string, any> = {}): Promise<MemoryResponse> {\n const docMetadata = {\n ...metadata,\n memory_type: 'memory',\n timestamp: new Date().toISOString(),\n } as Record<string, any>;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([clusterId]),\n raw_text: String(content || ''),\n } as const;\n\n const url = `${this.baseUrl}/v1/documents`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create document: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n const id = respData?.results?.document_id || respData?.results?.id || respData?.id || '';\n\n const result: MemoryResponse = {\n id: String(id),\n content: String(content || ''),\n metadata: docMetadata,\n cluster_ids: [clusterId],\n created_at: docMetadata.timestamp,\n updated_at: docMetadata.timestamp,\n };\n return result;\n }\n\n /** Store a single memory */\n async storeMemory(memory: Memory | Record<string, any>): Promise<string> {\n let mem: Memory;\n\n if ('cluster_id' in memory) {\n mem = memory as Memory;\n } else {\n mem = {\n cluster_id: (memory as any).cluster_id,\n content: (memory as any).content,\n role: (memory as any).role,\n parent_id: (memory as any).parent_id,\n metadata: (memory as any).metadata || {},\n };\n }\n\n // Conversation mode\n if (mem.role) {\n let convId = mem.parent_id;\n if (!convId) {\n const created = await this._makeRequest('POST', '/v1/conversations', {});\n const conv = created.results || created;\n convId = conv.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n }\n\n const payload = {\n messages: [\n {\n content: String(mem.content),\n role: mem.role,\n metadata: mem.metadata,\n },\n ],\n collection_id: mem.cluster_id,\n } as const;\n\n await this._makeRequest('POST', `/v1/conversations/${convId}/messages`, payload);\n return String(convId);\n }\n\n // Text/JSON memory mode\n const contentText = String(mem.content || '');\n const contentHash = await this._sha256(contentText);\n const docMetadata = { ...mem.metadata } as Record<string, any>;\n docMetadata.memory_type = 'memory';\n docMetadata.content_hash = contentHash;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([mem.cluster_id]),\n raw_text: contentText,\n } as const;\n\n const url = `${this.baseUrl}/v1/documents`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create document: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n if (respData.results.document_id) return String(respData.results.document_id);\n if (respData.results.id) return String(respData.results.id);\n }\n return '';\n }\n\n /** Store multiple memories */\n async storeMemories(memories: Memory[]): Promise<string[]> {\n const results: string[] = [];\n const convGroups: Record<string, Memory[]> = {};\n const others: Memory[] = [];\n\n for (const m of memories) {\n if (m.role) {\n const key = m.parent_id || `__new__::${m.cluster_id}`;\n if (!convGroups[key]) convGroups[key] = [];\n convGroups[key].push(m);\n } else {\n others.push(m);\n }\n }\n\n for (const [key, group] of Object.entries(convGroups)) {\n const clusterId = group[0].cluster_id;\n let convId: string;\n\n if (key.startsWith('__new__::')) {\n const created = await this._makeRequest('POST', '/v1/conversations', {});\n const conv = created.results || created;\n convId = conv.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n } else {\n convId = key;\n }\n\n const messages = group.map((m) => ({\n content: String(m.content || ''),\n role: m.role,\n metadata: m.metadata || {},\n }));\n\n const payload = { messages, collection_id: clusterId };\n await this._makeRequest('POST', `/v1/conversations/${convId}/messages`, payload);\n\n results.push(...Array(group.length).fill(String(convId)));\n }\n\n for (const m of others) {\n results.push(await this.storeMemory(m));\n }\n\n return results;\n }\n\n /** Delete a specific memory */\n async delete(memoryId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/documents/${memoryId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Delete a conversation and all its messages */\n async deleteConversation(conversationId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/conversations/${conversationId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Get all memories from specific clusters */\n async listMemories(\n clusterIds: string | string[],\n limit: number = 100,\n offset: number = 0\n ): Promise<MemoryResponse[]> {\n const ids = Array.isArray(clusterIds) ? clusterIds : [clusterIds];\n if (!ids.length) {\n throw new NebulaClientException('cluster_ids must be provided to list_memories().');\n }\n\n const params = { limit, offset, collection_ids: ids };\n const response = await this._makeRequest('GET', '/v1/documents', undefined, params);\n\n let documents: any[];\n if (response.results) {\n documents = response.results;\n } else if (Array.isArray(response)) {\n documents = response;\n } else {\n documents = [response];\n }\n\n return documents.map((doc) => this._memoryResponseFromDict(doc, ids));\n }\n\n /** Get a specific memory by ID */\n async getMemory(memoryId: string): Promise<MemoryResponse> {\n const response = await this._makeRequest('GET', `/v1/documents/${memoryId}`);\n\n const content = response.text || response.content;\n const chunks = Array.isArray(response.chunks) ? response.chunks : undefined;\n\n const memoryData = {\n id: response.id,\n content,\n chunks,\n metadata: response.metadata || {},\n collection_ids: response.collection_ids || [],\n };\n\n return this._memoryResponseFromDict(memoryData, []);\n }\n\n // Search Methods\n\n /** Search within specific clusters */\n async search(\n query: string,\n clusters: string | string[],\n limitOrOptions?: number | { limit?: number },\n retrievalType: RetrievalType | string = RetrievalType.ADVANCED,\n filters?: Record<string, any>,\n searchSettings?: Record<string, any>\n ): Promise<SearchResult[]> {\n const clusterIds = Array.isArray(clusters) ? clusters : [clusters];\n if (!clusterIds.length) {\n throw new NebulaClientException('cluster_ids must be provided to search().');\n }\n\n // Support legacy call shape: (query, clusterId, {limit})\n let limit = 10;\n if (typeof limitOrOptions === 'number') {\n limit = limitOrOptions;\n } else if (typeof limitOrOptions === 'object' && limitOrOptions) {\n if (typeof limitOrOptions.limit === 'number') limit = limitOrOptions.limit;\n }\n\n if (typeof retrievalType === 'string') {\n retrievalType = (RetrievalType as any)[retrievalType.toUpperCase()] || RetrievalType.ADVANCED;\n }\n\n const effectiveSettings: Record<string, any> = { ...searchSettings };\n effectiveSettings.limit = limit;\n effectiveSettings.use_semantic_search = false;\n effectiveSettings.use_fulltext_search = false;\n effectiveSettings.use_hybrid_search = false;\n effectiveSettings.chunk_settings = {\n ...(effectiveSettings.chunk_settings || {}),\n enabled: false,\n };\n effectiveSettings.search_strategy = 'rag_fusion';\n effectiveSettings.num_sub_queries = 3;\n\n const gs = { ...effectiveSettings.graph_settings };\n gs.enabled = true;\n gs.bfs_enabled = true;\n gs.bfs_max_depth = 2;\n effectiveSettings.graph_settings = gs;\n\n if (retrievalType !== RetrievalType.ADVANCED) {\n (effectiveSettings as any).retrieval_type = retrievalType;\n }\n\n const userFilters = { ...effectiveSettings.filters } as Record<string, any>;\n if (filters) {\n Object.assign(userFilters, filters);\n }\n userFilters.collection_ids = { $overlap: clusterIds };\n effectiveSettings.filters = userFilters;\n\n const data = {\n query,\n search_mode: 'custom',\n search_settings: effectiveSettings,\n };\n\n const response = await this._makeRequest('POST', '/v1/retrieval/search', data);\n\n let chunkResults: any[] = [];\n let graphResults: any[] = [];\n\n if (response.results) {\n chunkResults = response.results.chunk_search_results || [];\n graphResults = response.results.graph_search_results || [];\n }\n\n const out: SearchResult[] = [];\n out.push(...chunkResults.map((result) => this._searchResultFromDict(result)));\n for (const g of graphResults) {\n out.push(this._searchResultFromGraphDict(g));\n }\n\n return out;\n }\n\n /**\n * Legacy wrapper: store a two-message conversation turn as a document\n */\n async storeConversation(\n userMessage: string,\n assistantMessage: string,\n clusterId: string,\n sessionId: string\n ): Promise<MemoryResponse> {\n const content = `User: ${String(userMessage || '')}\\nAssistant: ${String(assistantMessage || '')}`;\n const metadata = { session_id: sessionId, content_type: 'conversation' } as Record<string, any>;\n return this.store(content, clusterId, metadata);\n }\n\n /**\n * Legacy wrapper: search conversations optionally scoped by session\n */\n async searchConversations(\n query: string,\n clusterId: string,\n sessionId?: string,\n includeAllSessions: boolean = true\n ): Promise<SearchResult[]> {\n const filters: Record<string, any> = { 'metadata.content_type': 'conversation' };\n if (sessionId && !includeAllSessions) {\n (filters as any)['metadata.session_id'] = sessionId;\n }\n return this.search(query, [clusterId], { limit: 10 }, RetrievalType.ADVANCED, filters);\n }\n\n // Health Check\n async healthCheck(): Promise<Record<string, any>> {\n return this._makeRequest('GET', '/health');\n }\n\n // Helpers\n\n private _clusterFromDict(data: any): Cluster {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const clusterId = String(data.id || '');\n const clusterName = data.name || '';\n const clusterDescription = data.description;\n const clusterOwnerId = data.owner_id ? String(data.owner_id) : undefined;\n const memoryCount = data.document_count || 0;\n\n const metadata = {\n graph_cluster_status: data.graph_cluster_status || '',\n graph_sync_status: data.graph_sync_status || '',\n user_count: data.user_count || 0,\n document_count: data.document_count || 0,\n };\n\n return {\n id: clusterId,\n name: clusterName,\n description: clusterDescription,\n metadata,\n created_at: createdAt,\n updated_at: updatedAt,\n memory_count: memoryCount,\n owner_id: clusterOwnerId,\n } as Cluster;\n }\n\n private _memoryResponseFromDict(data: any, clusterIds: string[]): MemoryResponse {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const memoryId = String(data.id || '');\n const content = data.content || data.text;\n let chunks: string[] | undefined;\n\n if (data.chunks && Array.isArray(data.chunks)) {\n if (data.chunks.every((x: any) => typeof x === 'string')) {\n chunks = data.chunks;\n } else {\n chunks = data.chunks\n .filter((item: any) => item && typeof item === 'object' && 'text' in item)\n .map((item: any) => item.text);\n }\n }\n\n const metadata = { ...data.metadata };\n if (data.document_id) {\n (metadata as any).document_id = data.document_id;\n }\n\n let finalId = memoryId;\n if (data.document_id && !memoryId) {\n finalId = data.document_id;\n }\n\n if (data.document_metadata) {\n Object.assign(metadata, data.document_metadata);\n }\n\n return {\n id: finalId,\n content,\n chunks,\n metadata,\n cluster_ids: data.collection_ids || clusterIds,\n created_at: createdAt,\n updated_at: updatedAt,\n } as MemoryResponse;\n }\n\n private _searchResultFromDict(data: any): SearchResult {\n const content = data.content || data.text || '';\n const resultId = data.id || data.chunk_id || '';\n\n return {\n id: String(resultId),\n content: String(content),\n score: Number(data.score || 0.0),\n metadata: data.metadata || {},\n source: data.source,\n };\n }\n\n private _searchResultFromGraphDict(data: any): SearchResult {\n const rid = data.id ? String(data.id) : '';\n const rtype =\n GraphSearchResultType[(data.result_type || 'entity').toUpperCase() as keyof typeof GraphSearchResultType] ||\n GraphSearchResultType.ENTITY;\n const content = data.content || {};\n const score = data.score !== undefined ? Number(data.score) : 0.0;\n const metadata = data.metadata || {};\n const chunkIds = Array.isArray(data.chunk_ids) ? data.chunk_ids : undefined;\n\n let entity: GraphEntityResult | undefined;\n let rel: GraphRelationshipResult | undefined;\n let comm: GraphCommunityResult | undefined;\n\n if (rtype === GraphSearchResultType.ENTITY) {\n entity = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n description: content.description || '',\n metadata: content.metadata || {},\n };\n } else if (rtype === GraphSearchResultType.RELATIONSHIP) {\n rel = {\n id: content.id ? String(content.id) : undefined,\n subject: content.subject || '',\n predicate: content.predicate || '',\n object: content.object || '',\n subject_id: content.subject_id ? String(content.subject_id) : undefined,\n object_id: content.object_id ? String(content.object_id) : undefined,\n description: content.description,\n metadata: content.metadata || {},\n };\n } else {\n comm = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n summary: content.summary || '',\n metadata: content.metadata || {},\n };\n }\n\n return {\n id: rid,\n score,\n metadata,\n source: 'graph',\n content: undefined,\n graph_result_type: rtype,\n graph_entity: entity,\n graph_relationship: rel,\n graph_community: comm,\n chunk_ids: chunkIds,\n } as SearchResult;\n }\n\n private async _sha256(message: string): Promise<string> {\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private _formDataFromObject(obj: Record<string, any>): FormData {\n const formData = new FormData();\n Object.entries(obj).forEach(([key, value]) => {\n formData.append(key, value as any);\n });\n return formData;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/client.ts"],"names":["RetrievalType","GraphSearchResultType","response"],"mappings":"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","file":"index.mjs","sourcesContent":["// Data models matching the actual Nebula Python SDK exactly\n\n// Enums\nexport enum RetrievalType {\n BASIC = \"basic\",\n ADVANCED = \"advanced\",\n CUSTOM = \"custom\"\n}\n\nexport enum GraphSearchResultType {\n ENTITY = \"entity\",\n RELATIONSHIP = \"relationship\",\n COMMUNITY = \"community\"\n}\n\n// Core interfaces matching Python SDK exactly\nexport interface MemoryResponse {\n id: string;\n content?: string;\n chunks?: string[];\n metadata: Record<string, any>;\n cluster_ids: string[];\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Memory {\n cluster_id: string;\n content: string;\n role?: string; // user, assistant, or custom\n parent_id?: string;\n metadata: Record<string, any>;\n}\n\nexport interface Cluster {\n id: string;\n name: string;\n description?: string;\n metadata: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n memory_count: number;\n owner_id?: string;\n}\n\nexport interface SearchResult {\n id: string;\n score: number;\n metadata: Record<string, any>;\n source?: string;\n\n // Chunk fields\n content?: string;\n\n // Graph variant discriminator and payload\n graph_result_type?: GraphSearchResultType;\n graph_entity?: GraphEntityResult;\n graph_relationship?: GraphRelationshipResult;\n graph_community?: GraphCommunityResult;\n chunk_ids?: string[];\n}\n\nexport interface GraphEntityResult {\n id?: string;\n name: string;\n description: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphRelationshipResult {\n id?: string;\n subject: string;\n predicate: string;\n object: string;\n subject_id?: string;\n object_id?: string;\n description?: string;\n metadata: Record<string, any>;\n}\n\nexport interface GraphCommunityResult {\n id?: string;\n name: string;\n summary: string;\n metadata: Record<string, any>;\n}\n\nexport interface AgentResponse {\n content: string;\n agent_id: string;\n conversation_id?: string;\n metadata: Record<string, any>;\n citations: Record<string, any>[];\n}\n\nexport interface SearchOptions {\n limit: number;\n filters?: Record<string, any>;\n retrieval_type: RetrievalType;\n}\n\n// Configuration interface\nexport interface NebulaClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n}\n\n// Error types matching Python SDK\nexport class NebulaException extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'NebulaException';\n }\n}\n\nexport class NebulaClientException extends NebulaException {\n constructor(message: string, public cause?: Error) {\n super(message);\n this.name = 'NebulaClientException';\n }\n}\n\nexport class NebulaAuthenticationException extends NebulaException {\n constructor(message: string = 'Invalid API key') {\n super(message, 401);\n this.name = 'NebulaAuthenticationException';\n }\n}\n\nexport class NebulaRateLimitException extends NebulaException {\n constructor(message: string = 'Rate limit exceeded') {\n super(message, 429);\n this.name = 'NebulaRateLimitException';\n }\n}\n\nexport class NebulaValidationException extends NebulaException {\n constructor(message: string = 'Validation error', public details?: any) {\n super(message, 400);\n this.name = 'NebulaValidationException';\n }\n}\n\nexport class NebulaClusterNotFoundException extends NebulaException {\n constructor(message: string = 'Cluster not found') {\n super(message, 404);\n this.name = 'NebulaClusterNotFoundException';\n }\n}\n","import {\n Memory,\n MemoryResponse,\n Cluster,\n SearchResult,\n RetrievalType,\n GraphSearchResultType,\n GraphEntityResult,\n GraphRelationshipResult,\n GraphCommunityResult,\n NebulaClientConfig,\n NebulaException,\n NebulaClientException,\n NebulaAuthenticationException,\n NebulaRateLimitException,\n NebulaValidationException,\n} from './types';\n\n/**\n * Official Nebula JavaScript/TypeScript SDK\n * Mirrors the exact Nebula Python SDK client.py implementation\n */\nexport class NebulaClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(config: NebulaClientConfig) {\n this.apiKey = config.apiKey;\n if (!this.apiKey) {\n throw new NebulaClientException(\n 'API key is required. Pass it to the constructor or set NEBULA_API_KEY environment variable.'\n );\n }\n\n this.baseUrl = (config.baseUrl || 'https://api.nebulacloud.app').replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n }\n\n // Public mutators used by tests\n setApiKey(next: string) {\n this.apiKey = next;\n }\n setBaseUrl(next: string) {\n this.baseUrl = (next || this.baseUrl).replace(/\\/$/, '');\n }\n // Kept for backwards-compat tests; no-op in current implementation\n setCorsProxy(_next: string) {\n // no-op\n }\n\n /** Check if API key is set */\n isApiKeySet(): boolean {\n return !!(this.apiKey && this.apiKey.trim() !== '');\n }\n\n /** Detect if a token looks like a Nebula API key (public.raw) */\n private _isNebulaApiKey(token?: string): boolean {\n const candidate = token || this.apiKey;\n if (!candidate) return false;\n const parts = candidate.split('.');\n if (parts.length !== 2) return false;\n const [publicPart, rawPart] = parts;\n return publicPart.startsWith('key_') && !!rawPart && rawPart.length > 0;\n }\n\n /** Build authentication headers */\n private _buildAuthHeaders(includeContentType: boolean = true): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this._isNebulaApiKey()) {\n headers['X-API-Key'] = this.apiKey;\n } else {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (includeContentType) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n }\n\n /** Make an HTTP request to the Nebula API */\n private async _makeRequest(\n method: string,\n endpoint: string,\n jsonData?: Record<string, any>,\n params?: Record<string, any>\n ): Promise<any> {\n const url = new URL(endpoint, this.baseUrl);\n\n if (params) {\n console.log('SDK: _makeRequest params before processing:', params);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n // Handle array parameters (e.g., collection_ids)\n if (Array.isArray(value)) {\n console.log(`SDK: Adding array param ${key}:`, value);\n value.forEach((item) => {\n url.searchParams.append(key, String(item));\n console.log(`SDK: Appended ${key}=${item} to URL`);\n });\n } else {\n console.log(`SDK: Adding single param ${key}:`, value);\n url.searchParams.append(key, String(value));\n }\n }\n });\n }\n\n console.log('SDK: Final URL being requested:', url.toString());\n\n const headers = this._buildAuthHeaders(true);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: jsonData ? JSON.stringify(jsonData) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n return await response.json();\n } else if (response.status === 401) {\n throw new NebulaAuthenticationException('Invalid API key');\n } else if (response.status === 429) {\n throw new NebulaRateLimitException('Rate limit exceeded');\n } else if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaValidationException(errorData.message || 'Validation error', errorData.details);\n } else {\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 // Cluster Management Methods\n\n /** Create a new cluster */\n async createCluster(\n name: string,\n description?: string,\n metadata?: Record<string, any>\n ): Promise<Cluster> {\n const data: Record<string, any> = { name };\n if (description) data.description = description;\n if (metadata) data.metadata = metadata;\n\n const response = await this._makeRequest('POST', '/v1/collections', data);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get a specific cluster by ID */\n async getCluster(clusterId: string): Promise<Cluster> {\n const response = await this._makeRequest('GET', `/v1/collections/${clusterId}`);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get a specific cluster by name */\n async getClusterByName(name: string): Promise<Cluster> {\n const response = await this._makeRequest('GET', `/v1/collections/name/${name}`);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Get all clusters */\n async listClusters(limit: number = 100, offset: number = 0): Promise<Cluster[]> {\n const params = { limit, offset };\n const response = await this._makeRequest('GET', '/v1/collections', undefined, params);\n\n let clusters: any[];\n if (response.results) {\n clusters = response.results;\n } else if (Array.isArray(response)) {\n clusters = response;\n } else {\n clusters = [response];\n }\n\n return clusters.map((cluster) => this._clusterFromDict(cluster));\n }\n\n // Conversations Methods\n\n /** List conversations for the authenticated user */\n async listConversations(limit: number = 100, offset: number = 0, cluster_ids?: string[]): Promise<any[]> {\n const params: Record<string, any> = { limit, offset };\n // Convert cluster_ids to collection_ids for the API\n if (cluster_ids && cluster_ids.length > 0) {\n params.collection_ids = cluster_ids;\n }\n const response = await this._makeRequest('GET', '/v1/conversations', undefined, params);\n\n let conversations: any[];\n if (response && response.results) {\n conversations = response.results;\n } else if (Array.isArray(response)) {\n conversations = response;\n } else {\n conversations = response ? [response] : [];\n }\n\n return conversations;\n }\n\n /** Get conversation messages directly from the conversations API */\n async getConversationMessages(conversationId: string): Promise<MemoryResponse[]>;\n async getConversationMessages(conversationIds: string[]): Promise<Record<string, MemoryResponse[]>>;\n async getConversationMessages(conversationIdOrIds: string | string[]): Promise<MemoryResponse[] | Record<string, MemoryResponse[]>> {\n // Handle single conversation ID (backward compatibility)\n if (typeof conversationIdOrIds === 'string') {\n const response = await this._makeRequest('GET', `/v1/conversations/${conversationIdOrIds}`);\n\n if (!response || !response.results) {\n return [];\n }\n\n return this._transformConversationMessages(response.results);\n }\n\n // Handle multiple conversation IDs\n if (!Array.isArray(conversationIdOrIds) || conversationIdOrIds.length === 0) {\n return {};\n }\n\n // Use POST request with conversation IDs in body for batch retrieval\n // This performs a single SQL query with IN clause for optimal performance\n const response = await this._makeRequest('POST', '/v1/conversations/batch', {\n conversation_ids: conversationIdOrIds\n });\n\n console.log('🔍 SDK: Raw batch response:', response);\n console.log('🔍 SDK: Response has results?', !!response?.results);\n if (response?.results) {\n console.log('🔍 SDK: Results keys:', Object.keys(response.results));\n console.log('🔍 SDK: Sample result:', Object.keys(response.results)[0], ':', response.results[Object.keys(response.results)[0]]);\n }\n\n const results: Record<string, MemoryResponse[]> = {};\n\n if (response && response.results) {\n // Backend returns { \"results\": { \"results\": { conversation_id: MessageResponse[] } } } format (double-nested)\n const batchResults = response.results.results || response.results;\n console.log('🔍 SDK: Processing', Object.keys(batchResults).length, 'conversations');\n for (const [conversationId, messages] of Object.entries(batchResults)) {\n if (Array.isArray(messages)) {\n const transformed = this._transformConversationMessages(messages as any[]);\n results[conversationId] = transformed;\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: ${messages.length} raw -> ${transformed.length} transformed`);\n } else {\n results[conversationId] = [];\n console.log(`🔍 SDK: Conversation ${conversationId.slice(-8)}: not array, setting empty`);\n }\n }\n }\n\n // Ensure all requested conversation IDs are present in results (even if empty)\n for (const conversationId of conversationIdOrIds) {\n if (!(conversationId in results)) {\n results[conversationId] = [];\n }\n }\n\n return results;\n }\n\n /** Helper method to transform conversation messages to MemoryResponse format */\n private _transformConversationMessages(messageResponses: any[]): MemoryResponse[] {\n return messageResponses.map((msgResp: any) => {\n const msgId = String(msgResp.id || '');\n const msg = msgResp.message || {}; // The actual Message object\n const metadata = msgResp.metadata || {};\n\n // Normalize content to a string - could be string or object\n let text: string = '';\n const rawContent = msg.content;\n if (typeof rawContent === 'string') {\n text = rawContent;\n } else if (rawContent && typeof rawContent === 'object') {\n // Handle structured content\n text = String(rawContent.content || rawContent.text || JSON.stringify(rawContent));\n } else if (rawContent != null) {\n text = String(rawContent);\n }\n\n // Get role from the Message object\n const role = msg.role || metadata.role || 'user';\n\n // Merge message metadata with response metadata\n const combinedMetadata = {\n ...metadata,\n role, // Ensure role is in metadata for UI compatibility\n };\n\n return {\n id: msgId,\n content: text,\n metadata: combinedMetadata,\n created_at: msgResp.created_at,\n cluster_ids: msgResp.collection_ids || [],\n } as MemoryResponse;\n });\n }\n\n /** Update a cluster */\n async updateCluster(\n clusterId: string,\n name?: string,\n description?: string,\n metadata?: Record<string, any>\n ): Promise<Cluster> {\n const data: Record<string, any> = {};\n if (name !== undefined) data.name = name;\n if (description !== undefined) data.description = description;\n if (metadata !== undefined) data.metadata = metadata;\n\n const response = await this._makeRequest('POST', `/v1/collections/${clusterId}`, data);\n const result = response.results || response;\n return this._clusterFromDict(result);\n }\n\n /** Delete a cluster */\n async deleteCluster(clusterId: string): Promise<boolean> {\n await this._makeRequest('DELETE', `/v1/collections/${clusterId}`);\n return true;\n }\n\n // Memory Management Methods\n\n /**\n * Legacy convenience: store raw text content into a cluster as a document\n */\n async store(content: string, clusterId: string, metadata: Record<string, any> = {}): Promise<MemoryResponse> {\n const docMetadata = {\n ...metadata,\n memory_type: 'memory',\n timestamp: new Date().toISOString(),\n } as Record<string, any>;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([clusterId]),\n raw_text: String(content || ''),\n } as const;\n\n const url = `${this.baseUrl}/v1/documents`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create document: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n const id = respData?.results?.document_id || respData?.results?.id || respData?.id || '';\n\n const result: MemoryResponse = {\n id: String(id),\n content: String(content || ''),\n metadata: docMetadata,\n cluster_ids: [clusterId],\n created_at: docMetadata.timestamp,\n updated_at: docMetadata.timestamp,\n };\n return result;\n }\n\n /** Store a single memory */\n async storeMemory(memory: Memory | Record<string, any>): Promise<string> {\n let mem: Memory;\n\n if ('cluster_id' in memory) {\n mem = memory as Memory;\n } else {\n mem = {\n cluster_id: (memory as any).cluster_id,\n content: (memory as any).content,\n role: (memory as any).role,\n parent_id: (memory as any).parent_id,\n metadata: (memory as any).metadata || {},\n };\n }\n\n // Conversation mode\n if (mem.role) {\n let convId = mem.parent_id;\n if (!convId) {\n const created = await this._makeRequest('POST', '/v1/conversations', {});\n const conv = created.results || created;\n convId = conv.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n }\n\n const payload = {\n messages: [\n {\n content: String(mem.content),\n role: mem.role,\n metadata: mem.metadata,\n },\n ],\n collection_id: mem.cluster_id,\n } as const;\n\n await this._makeRequest('POST', `/v1/conversations/${convId}/messages`, payload);\n return String(convId);\n }\n\n // Text/JSON memory mode\n const contentText = String(mem.content || '');\n const contentHash = await this._sha256(contentText);\n const docMetadata = { ...mem.metadata } as Record<string, any>;\n docMetadata.memory_type = 'memory';\n docMetadata.content_hash = contentHash;\n\n const data = {\n metadata: JSON.stringify(docMetadata),\n ingestion_mode: 'fast',\n collection_ids: JSON.stringify([mem.cluster_id]),\n raw_text: contentText,\n } as const;\n\n const url = `${this.baseUrl}/v1/documents`;\n const headers = this._buildAuthHeaders(false);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: this._formDataFromObject(data as any),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new NebulaException(\n errorData.message || `Failed to create document: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n const respData = await response.json();\n if (respData.results) {\n if (respData.results.document_id) return String(respData.results.document_id);\n if (respData.results.id) return String(respData.results.id);\n }\n return '';\n }\n\n /** Store multiple memories */\n async storeMemories(memories: Memory[]): Promise<string[]> {\n const results: string[] = [];\n const convGroups: Record<string, Memory[]> = {};\n const others: Memory[] = [];\n\n for (const m of memories) {\n if (m.role) {\n const key = m.parent_id || `__new__::${m.cluster_id}`;\n if (!convGroups[key]) convGroups[key] = [];\n convGroups[key].push(m);\n } else {\n others.push(m);\n }\n }\n\n for (const [key, group] of Object.entries(convGroups)) {\n const clusterId = group[0].cluster_id;\n let convId: string;\n\n if (key.startsWith('__new__::')) {\n const created = await this._makeRequest('POST', '/v1/conversations', {});\n const conv = created.results || created;\n convId = conv.id;\n if (!convId) {\n throw new NebulaClientException('Failed to create conversation: no id returned');\n }\n } else {\n convId = key;\n }\n\n const messages = group.map((m) => ({\n content: String(m.content || ''),\n role: m.role,\n metadata: m.metadata || {},\n }));\n\n const payload = { messages, collection_id: clusterId };\n await this._makeRequest('POST', `/v1/conversations/${convId}/messages`, payload);\n\n results.push(...Array(group.length).fill(String(convId)));\n }\n\n for (const m of others) {\n results.push(await this.storeMemory(m));\n }\n\n return results;\n }\n\n /** Delete a specific memory */\n async delete(memoryId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/documents/${memoryId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Delete a conversation and all its messages */\n async deleteConversation(conversationId: string): Promise<boolean> {\n try {\n await this._makeRequest('DELETE', `/v1/conversations/${conversationId}`);\n return true;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new NebulaClientException(`Unknown error: ${String(error)}`);\n }\n }\n\n /** Get all memories from specific clusters */\n async listMemories(\n clusterIds: string | string[],\n limit: number = 100,\n offset: number = 0\n ): Promise<MemoryResponse[]> {\n const ids = Array.isArray(clusterIds) ? clusterIds : [clusterIds];\n if (!ids.length) {\n throw new NebulaClientException('cluster_ids must be provided to list_memories().');\n }\n\n const params = { limit, offset, collection_ids: ids };\n const response = await this._makeRequest('GET', '/v1/documents', undefined, params);\n\n let documents: any[];\n if (response.results) {\n documents = response.results;\n } else if (Array.isArray(response)) {\n documents = response;\n } else {\n documents = [response];\n }\n\n return documents.map((doc) => this._memoryResponseFromDict(doc, ids));\n }\n\n /** Get a specific memory by ID */\n async getMemory(memoryId: string): Promise<MemoryResponse> {\n const response = await this._makeRequest('GET', `/v1/documents/${memoryId}`);\n\n const content = response.text || response.content;\n const chunks = Array.isArray(response.chunks) ? response.chunks : undefined;\n\n const memoryData = {\n id: response.id,\n content,\n chunks,\n metadata: response.metadata || {},\n collection_ids: response.collection_ids || [],\n };\n\n return this._memoryResponseFromDict(memoryData, []);\n }\n\n // Search Methods\n\n /** Search within specific clusters */\n async search(\n query: string,\n clusters: string | string[],\n limitOrOptions?: number | { limit?: number },\n retrievalType: RetrievalType | string = RetrievalType.ADVANCED,\n filters?: Record<string, any>,\n searchSettings?: Record<string, any>\n ): Promise<SearchResult[]> {\n const clusterIds = Array.isArray(clusters) ? clusters : [clusters];\n if (!clusterIds.length) {\n throw new NebulaClientException('cluster_ids must be provided to search().');\n }\n\n // Support legacy call shape: (query, clusterId, {limit})\n let limit = 10;\n if (typeof limitOrOptions === 'number') {\n limit = limitOrOptions;\n } else if (typeof limitOrOptions === 'object' && limitOrOptions) {\n if (typeof limitOrOptions.limit === 'number') limit = limitOrOptions.limit;\n }\n\n if (typeof retrievalType === 'string') {\n retrievalType = (RetrievalType as any)[retrievalType.toUpperCase()] || RetrievalType.ADVANCED;\n }\n\n // Build effective search settings with simplified structure\n const effectiveSettings: Record<string, any> = { ...searchSettings };\n effectiveSettings.limit = limit;\n // Retrieval type is now handled internally by the backend\n\n const userFilters = { ...effectiveSettings.filters } as Record<string, any>;\n if (filters) {\n Object.assign(userFilters, filters);\n }\n userFilters.collection_ids = { $overlap: clusterIds };\n effectiveSettings.filters = userFilters;\n\n const data = {\n query,\n search_mode: 'custom',\n search_settings: effectiveSettings,\n };\n\n const response = await this._makeRequest('POST', '/v1/retrieval/search', data);\n\n let chunkResults: any[] = [];\n let graphResults: any[] = [];\n\n if (response.results) {\n chunkResults = response.results.chunk_search_results || [];\n graphResults = response.results.graph_search_results || [];\n }\n\n const out: SearchResult[] = [];\n out.push(...chunkResults.map((result) => this._searchResultFromDict(result)));\n for (const g of graphResults) {\n out.push(this._searchResultFromGraphDict(g));\n }\n\n return out;\n }\n\n /**\n * Legacy wrapper: store a two-message conversation turn as a document\n */\n async storeConversation(\n userMessage: string,\n assistantMessage: string,\n clusterId: string,\n sessionId: string\n ): Promise<MemoryResponse> {\n const content = `User: ${String(userMessage || '')}\\nAssistant: ${String(assistantMessage || '')}`;\n const metadata = { session_id: sessionId, content_type: 'conversation' } as Record<string, any>;\n return this.store(content, clusterId, metadata);\n }\n\n /**\n * Legacy wrapper: search conversations optionally scoped by session\n */\n async searchConversations(\n query: string,\n clusterId: string,\n sessionId?: string,\n includeAllSessions: boolean = true\n ): Promise<SearchResult[]> {\n const filters: Record<string, any> = { 'metadata.content_type': 'conversation' };\n if (sessionId && !includeAllSessions) {\n (filters as any)['metadata.session_id'] = sessionId;\n }\n return this.search(query, [clusterId], { limit: 10 }, RetrievalType.ADVANCED, filters);\n }\n\n // Health Check\n async healthCheck(): Promise<Record<string, any>> {\n return this._makeRequest('GET', '/health');\n }\n\n // Helpers\n\n private _clusterFromDict(data: any): Cluster {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const clusterId = String(data.id || '');\n const clusterName = data.name || '';\n const clusterDescription = data.description;\n const clusterOwnerId = data.owner_id ? String(data.owner_id) : undefined;\n const memoryCount = data.document_count || 0;\n\n const metadata = {\n graph_cluster_status: data.graph_cluster_status || '',\n graph_sync_status: data.graph_sync_status || '',\n user_count: data.user_count || 0,\n document_count: data.document_count || 0,\n };\n\n return {\n id: clusterId,\n name: clusterName,\n description: clusterDescription,\n metadata,\n created_at: createdAt,\n updated_at: updatedAt,\n memory_count: memoryCount,\n owner_id: clusterOwnerId,\n } as Cluster;\n }\n\n private _memoryResponseFromDict(data: any, clusterIds: string[]): MemoryResponse {\n let createdAt: string | undefined;\n if (data.created_at) {\n createdAt = typeof data.created_at === 'string' ? data.created_at : data.created_at.toISOString();\n }\n\n let updatedAt: string | undefined;\n if (data.updated_at) {\n updatedAt = typeof data.updated_at === 'string' ? data.updated_at : data.updated_at.toISOString();\n }\n\n const memoryId = String(data.id || '');\n const content = data.content || data.text;\n let chunks: string[] | undefined;\n\n if (data.chunks && Array.isArray(data.chunks)) {\n if (data.chunks.every((x: any) => typeof x === 'string')) {\n chunks = data.chunks;\n } else {\n chunks = data.chunks\n .filter((item: any) => item && typeof item === 'object' && 'text' in item)\n .map((item: any) => item.text);\n }\n }\n\n const metadata = { ...data.metadata };\n if (data.document_id) {\n (metadata as any).document_id = data.document_id;\n }\n\n let finalId = memoryId;\n if (data.document_id && !memoryId) {\n finalId = data.document_id;\n }\n\n if (data.document_metadata) {\n Object.assign(metadata, data.document_metadata);\n }\n\n return {\n id: finalId,\n content,\n chunks,\n metadata,\n cluster_ids: data.collection_ids || clusterIds,\n created_at: createdAt,\n updated_at: updatedAt,\n } as MemoryResponse;\n }\n\n private _searchResultFromDict(data: any): SearchResult {\n const content = data.content || data.text || '';\n const resultId = data.id || data.chunk_id || '';\n\n return {\n id: String(resultId),\n content: String(content),\n score: Number(data.score || 0.0),\n metadata: data.metadata || {},\n source: data.source,\n };\n }\n\n private _searchResultFromGraphDict(data: any): SearchResult {\n const rid = data.id ? String(data.id) : '';\n const rtype =\n GraphSearchResultType[(data.result_type || 'entity').toUpperCase() as keyof typeof GraphSearchResultType] ||\n GraphSearchResultType.ENTITY;\n const content = data.content || {};\n const score = data.score !== undefined ? Number(data.score) : 0.0;\n const metadata = data.metadata || {};\n const chunkIds = Array.isArray(data.chunk_ids) ? data.chunk_ids : undefined;\n\n let entity: GraphEntityResult | undefined;\n let rel: GraphRelationshipResult | undefined;\n let comm: GraphCommunityResult | undefined;\n\n if (rtype === GraphSearchResultType.ENTITY) {\n entity = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n description: content.description || '',\n metadata: content.metadata || {},\n };\n } else if (rtype === GraphSearchResultType.RELATIONSHIP) {\n rel = {\n id: content.id ? String(content.id) : undefined,\n subject: content.subject || '',\n predicate: content.predicate || '',\n object: content.object || '',\n subject_id: content.subject_id ? String(content.subject_id) : undefined,\n object_id: content.object_id ? String(content.object_id) : undefined,\n description: content.description,\n metadata: content.metadata || {},\n };\n } else {\n comm = {\n id: content.id ? String(content.id) : undefined,\n name: content.name || '',\n summary: content.summary || '',\n metadata: content.metadata || {},\n };\n }\n\n return {\n id: rid,\n score,\n metadata,\n source: 'graph',\n content: undefined,\n graph_result_type: rtype,\n graph_entity: entity,\n graph_relationship: rel,\n graph_community: comm,\n chunk_ids: chunkIds,\n } as SearchResult;\n }\n\n private async _sha256(message: string): Promise<string> {\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private _formDataFromObject(obj: Record<string, any>): FormData {\n const formData = new FormData();\n Object.entries(obj).forEach(([key, value]) => {\n formData.append(key, value as any);\n });\n return formData;\n }\n}\n"]}
|