@arbidocs/sdk 0.3.9 → 0.3.10
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 +74 -239
- package/dist/browser.cjs +1369 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +2 -0
- package/dist/browser.d.ts +2 -0
- package/dist/browser.js +1327 -0
- package/dist/browser.js.map +1 -0
- package/dist/index.cjs +1455 -1073
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2940 -7582
- package/dist/index.d.ts +2940 -7582
- package/dist/index.js +1413 -1030
- package/dist/index.js.map +1 -1
- package/package.json +20 -10
- package/LICENSE +0 -21
package/dist/browser.cjs
ADDED
|
@@ -0,0 +1,1369 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var client = require('@arbidocs/client');
|
|
4
|
+
var fs = require('fs');
|
|
5
|
+
var path = require('path');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
10
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
11
|
+
|
|
12
|
+
var __defProp = Object.defineProperty;
|
|
13
|
+
var __export = (target, all) => {
|
|
14
|
+
for (var name in all)
|
|
15
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// src/errors.ts
|
|
19
|
+
var ArbiError = class extends Error {
|
|
20
|
+
constructor(message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = "ArbiError";
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
var ArbiApiError = class extends ArbiError {
|
|
26
|
+
apiError;
|
|
27
|
+
constructor(message, apiError) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = "ArbiApiError";
|
|
30
|
+
this.apiError = apiError;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
function requireData(result, message) {
|
|
34
|
+
if (result.error || !result.data) {
|
|
35
|
+
throw new ArbiApiError(message, result.error);
|
|
36
|
+
}
|
|
37
|
+
return result.data;
|
|
38
|
+
}
|
|
39
|
+
function requireOk(result, message) {
|
|
40
|
+
if (result.error) {
|
|
41
|
+
throw new ArbiApiError(message, result.error);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function getErrorMessage(err) {
|
|
45
|
+
return err instanceof Error ? err.message : String(err);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/fetch.ts
|
|
49
|
+
var STATUS_MESSAGES = {
|
|
50
|
+
401: "Token has expired. Please run: arbi login",
|
|
51
|
+
503: "The selected LLM is not responding. Please retry or select another model."
|
|
52
|
+
};
|
|
53
|
+
async function authenticatedFetch(options) {
|
|
54
|
+
const { baseUrl, accessToken, workspaceKeyHeader, path: path2, method, body, headers } = options;
|
|
55
|
+
const res = await fetch(`${baseUrl}${path2}`, {
|
|
56
|
+
method: method ?? (body ? "POST" : "GET"),
|
|
57
|
+
headers: {
|
|
58
|
+
Authorization: `Bearer ${accessToken}`,
|
|
59
|
+
"workspace-key": workspaceKeyHeader,
|
|
60
|
+
...headers
|
|
61
|
+
},
|
|
62
|
+
body
|
|
63
|
+
});
|
|
64
|
+
if (!res.ok) {
|
|
65
|
+
const knownMessage = STATUS_MESSAGES[res.status];
|
|
66
|
+
if (knownMessage) throw new Error(knownMessage);
|
|
67
|
+
const text = await res.text().catch(() => "");
|
|
68
|
+
throw new Error(`Request failed: ${res.status} ${text}`);
|
|
69
|
+
}
|
|
70
|
+
return res;
|
|
71
|
+
}
|
|
72
|
+
function formatWorkspaceChoices(wsList) {
|
|
73
|
+
return wsList.map((ws) => {
|
|
74
|
+
const totalDocs = ws.shared_document_count + ws.private_document_count;
|
|
75
|
+
return {
|
|
76
|
+
name: `${ws.name} (${totalDocs} docs)`,
|
|
77
|
+
value: ws.external_id,
|
|
78
|
+
description: ws.external_id
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async function createAuthenticatedClient(config, creds, store) {
|
|
83
|
+
const arbi = client.createArbiClient({
|
|
84
|
+
baseUrl: config.baseUrl,
|
|
85
|
+
deploymentDomain: config.deploymentDomain,
|
|
86
|
+
credentials: "omit"
|
|
87
|
+
});
|
|
88
|
+
await arbi.crypto.initSodium();
|
|
89
|
+
const signingPrivateKey = client.base64ToBytes(creds.signingPrivateKeyBase64);
|
|
90
|
+
const loginResult = await arbi.auth.loginWithKey({
|
|
91
|
+
email: creds.email,
|
|
92
|
+
signingPrivateKey
|
|
93
|
+
});
|
|
94
|
+
store.saveCredentials({
|
|
95
|
+
...creds,
|
|
96
|
+
serverSessionKeyBase64: arbi.crypto.bytesToBase64(loginResult.serverSessionKey)
|
|
97
|
+
});
|
|
98
|
+
return { arbi, loginResult };
|
|
99
|
+
}
|
|
100
|
+
async function performPasswordLogin(config, email, password, store) {
|
|
101
|
+
const arbi = client.createArbiClient({
|
|
102
|
+
baseUrl: config.baseUrl,
|
|
103
|
+
deploymentDomain: config.deploymentDomain,
|
|
104
|
+
credentials: "omit"
|
|
105
|
+
});
|
|
106
|
+
await arbi.crypto.initSodium();
|
|
107
|
+
const loginResult = await arbi.auth.login({ email, password });
|
|
108
|
+
store.saveCredentials({
|
|
109
|
+
email,
|
|
110
|
+
signingPrivateKeyBase64: arbi.crypto.bytesToBase64(loginResult.signingPrivateKey),
|
|
111
|
+
serverSessionKeyBase64: arbi.crypto.bytesToBase64(loginResult.serverSessionKey)
|
|
112
|
+
});
|
|
113
|
+
return { arbi, loginResult, config };
|
|
114
|
+
}
|
|
115
|
+
async function selectWorkspace(arbi, workspaceId, wrappedKey, serverSessionKey, signingPrivateKeyBase64) {
|
|
116
|
+
const signingPrivateKey = client.base64ToBytes(signingPrivateKeyBase64);
|
|
117
|
+
const ed25519PublicKey = signingPrivateKey.slice(32, 64);
|
|
118
|
+
const encryptionKeyPair = client.deriveEncryptionKeypairFromSigning({
|
|
119
|
+
publicKey: ed25519PublicKey,
|
|
120
|
+
secretKey: signingPrivateKey
|
|
121
|
+
});
|
|
122
|
+
const workspaceKey = client.sealedBoxDecrypt(wrappedKey, encryptionKeyPair.secretKey);
|
|
123
|
+
const header = await client.createWorkspaceKeyHeader(workspaceKey, serverSessionKey);
|
|
124
|
+
arbi.session.setSelectedWorkspace(workspaceId);
|
|
125
|
+
arbi.session.setCachedWorkspaceHeader(workspaceId, header);
|
|
126
|
+
}
|
|
127
|
+
async function selectWorkspaceById(arbi, workspaceId, serverSessionKey, signingPrivateKeyBase64) {
|
|
128
|
+
const { data: workspaces, error } = await arbi.fetch.GET("/v1/user/workspaces");
|
|
129
|
+
if (error || !workspaces) {
|
|
130
|
+
throw new ArbiError("Failed to fetch workspaces");
|
|
131
|
+
}
|
|
132
|
+
const ws = workspaces.find((w) => w.external_id === workspaceId);
|
|
133
|
+
if (!ws || !ws.wrapped_key) {
|
|
134
|
+
throw new ArbiError(`Workspace ${workspaceId} not found or has no encryption key`);
|
|
135
|
+
}
|
|
136
|
+
await selectWorkspace(
|
|
137
|
+
arbi,
|
|
138
|
+
ws.external_id,
|
|
139
|
+
ws.wrapped_key,
|
|
140
|
+
serverSessionKey,
|
|
141
|
+
signingPrivateKeyBase64
|
|
142
|
+
);
|
|
143
|
+
const workspaceKeyHeader = arbi.session.getWorkspaceKeyHeader();
|
|
144
|
+
if (workspaceKeyHeader) {
|
|
145
|
+
const { data: openResult, error: openError } = await arbi.fetch.POST(
|
|
146
|
+
"/v1/workspace/{workspace_ext_id}/open",
|
|
147
|
+
{
|
|
148
|
+
params: { path: { workspace_ext_id: ws.external_id } },
|
|
149
|
+
body: { workspace_key: workspaceKeyHeader }
|
|
150
|
+
}
|
|
151
|
+
);
|
|
152
|
+
if (!openError && openResult?.access_token) {
|
|
153
|
+
arbi.session.setAccessToken(openResult.access_token);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return { external_id: ws.external_id, name: ws.name, wrapped_key: ws.wrapped_key };
|
|
157
|
+
}
|
|
158
|
+
async function resolveAuth(store) {
|
|
159
|
+
const config = store.requireConfig();
|
|
160
|
+
const creds = store.requireCredentials();
|
|
161
|
+
const { arbi, loginResult } = await createAuthenticatedClient(config, creds, store);
|
|
162
|
+
return { arbi, loginResult, config };
|
|
163
|
+
}
|
|
164
|
+
async function resolveWorkspace(store, workspaceOpt) {
|
|
165
|
+
const config = store.requireConfig();
|
|
166
|
+
const creds = store.requireCredentials();
|
|
167
|
+
const workspaceId = workspaceOpt || config.selectedWorkspaceId;
|
|
168
|
+
if (!workspaceId) {
|
|
169
|
+
throw new ArbiError("No workspace selected. Run: arbi workspace select <id>");
|
|
170
|
+
}
|
|
171
|
+
const { arbi, loginResult } = await createAuthenticatedClient(config, creds, store);
|
|
172
|
+
await selectWorkspaceById(
|
|
173
|
+
arbi,
|
|
174
|
+
workspaceId,
|
|
175
|
+
loginResult.serverSessionKey,
|
|
176
|
+
creds.signingPrivateKeyBase64
|
|
177
|
+
);
|
|
178
|
+
const accessToken = arbi.session.getState().accessToken;
|
|
179
|
+
const workspaceKeyHeader = arbi.session.getWorkspaceKeyHeader();
|
|
180
|
+
if (!accessToken || !workspaceKeyHeader) {
|
|
181
|
+
throw new ArbiError("Authentication error \u2014 missing token or workspace key");
|
|
182
|
+
}
|
|
183
|
+
return { arbi, loginResult, config, workspaceId, accessToken, workspaceKeyHeader };
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// src/sse.ts
|
|
187
|
+
function parseSSEEvents(chunk, buffer) {
|
|
188
|
+
const combined = buffer + chunk;
|
|
189
|
+
const events = [];
|
|
190
|
+
const parts = combined.split("\n\n");
|
|
191
|
+
const remaining = parts.pop() || "";
|
|
192
|
+
for (const part of parts) {
|
|
193
|
+
if (!part.trim()) continue;
|
|
194
|
+
let eventType = "";
|
|
195
|
+
let eventData = "";
|
|
196
|
+
for (const line of part.split("\n")) {
|
|
197
|
+
if (line.startsWith("event: ")) eventType = line.slice(7).trim();
|
|
198
|
+
else if (line.startsWith("data: ")) eventData = line.slice(6);
|
|
199
|
+
}
|
|
200
|
+
if (eventType && eventData) events.push({ event: eventType, data: eventData });
|
|
201
|
+
}
|
|
202
|
+
return { events, remaining };
|
|
203
|
+
}
|
|
204
|
+
async function streamSSE(response, callbacks = {}) {
|
|
205
|
+
if (!response.body) {
|
|
206
|
+
throw new Error("No response body");
|
|
207
|
+
}
|
|
208
|
+
const reader = response.body.getReader();
|
|
209
|
+
const decoder = new TextDecoder("utf-8");
|
|
210
|
+
let sseBuffer = "";
|
|
211
|
+
let text = "";
|
|
212
|
+
let assistantMessageExtId = null;
|
|
213
|
+
const agentSteps = [];
|
|
214
|
+
const errors = [];
|
|
215
|
+
const artifacts = [];
|
|
216
|
+
let userMessage = null;
|
|
217
|
+
let metadata = null;
|
|
218
|
+
let usage = null;
|
|
219
|
+
const eventHandlers = {
|
|
220
|
+
// OpenAI Responses API events (dot-separated names from server)
|
|
221
|
+
"response.created": (raw) => {
|
|
222
|
+
const data = JSON.parse(raw);
|
|
223
|
+
const id = data.response?.id;
|
|
224
|
+
if (id) assistantMessageExtId = id;
|
|
225
|
+
callbacks.onStreamStart?.({ assistant_message_ext_id: id });
|
|
226
|
+
if (data.t != null) callbacks.onElapsedTime?.(data.t);
|
|
227
|
+
},
|
|
228
|
+
"response.output_item.added": (raw) => {
|
|
229
|
+
const data = JSON.parse(raw);
|
|
230
|
+
callbacks.onOutputItemAdded?.(data);
|
|
231
|
+
},
|
|
232
|
+
"response.content_part.added": (raw) => {
|
|
233
|
+
const data = JSON.parse(raw);
|
|
234
|
+
callbacks.onContentPartAdded?.(data);
|
|
235
|
+
},
|
|
236
|
+
"response.output_text.delta": (raw) => {
|
|
237
|
+
const data = JSON.parse(raw);
|
|
238
|
+
if (data.delta) {
|
|
239
|
+
text += data.delta;
|
|
240
|
+
callbacks.onToken?.(data.delta);
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"response.output_text.done": (raw) => {
|
|
244
|
+
const data = JSON.parse(raw);
|
|
245
|
+
callbacks.onTextDone?.(data.text);
|
|
246
|
+
},
|
|
247
|
+
"response.output_item.done": (raw) => {
|
|
248
|
+
const data = JSON.parse(raw);
|
|
249
|
+
callbacks.onOutputItemDone?.(data);
|
|
250
|
+
},
|
|
251
|
+
"response.completed": (raw) => {
|
|
252
|
+
const data = JSON.parse(raw);
|
|
253
|
+
if (data.response?.usage) {
|
|
254
|
+
usage = data.response.usage;
|
|
255
|
+
callbacks.onUsage?.(data.response.usage);
|
|
256
|
+
}
|
|
257
|
+
if (data.t != null) callbacks.onElapsedTime?.(data.t);
|
|
258
|
+
callbacks.onComplete?.();
|
|
259
|
+
},
|
|
260
|
+
"response.failed": (raw) => {
|
|
261
|
+
const data = JSON.parse(raw);
|
|
262
|
+
const message = data.response?.error?.message || "Unknown streaming error";
|
|
263
|
+
errors.push(message);
|
|
264
|
+
callbacks.onError?.(message);
|
|
265
|
+
},
|
|
266
|
+
// ARBI-specific events (dot-prefixed from server)
|
|
267
|
+
"arbi.agent_step": (raw) => {
|
|
268
|
+
const data = JSON.parse(raw);
|
|
269
|
+
const focus = data.focus || data.step || "";
|
|
270
|
+
if (focus) agentSteps.push(focus);
|
|
271
|
+
callbacks.onAgentStep?.(data);
|
|
272
|
+
if (data.t != null) callbacks.onElapsedTime?.(data.t);
|
|
273
|
+
},
|
|
274
|
+
"arbi.user_message": (raw) => {
|
|
275
|
+
const data = JSON.parse(raw);
|
|
276
|
+
userMessage = data;
|
|
277
|
+
callbacks.onUserMessage?.(data);
|
|
278
|
+
},
|
|
279
|
+
"arbi.message_metadata": (raw) => {
|
|
280
|
+
const data = JSON.parse(raw);
|
|
281
|
+
metadata = data;
|
|
282
|
+
callbacks.onMetadata?.(data);
|
|
283
|
+
},
|
|
284
|
+
"arbi.user_input_request": (raw) => {
|
|
285
|
+
const data = JSON.parse(raw);
|
|
286
|
+
callbacks.onUserInputRequest?.(data);
|
|
287
|
+
},
|
|
288
|
+
"arbi.artifact": (raw) => {
|
|
289
|
+
const data = JSON.parse(raw);
|
|
290
|
+
artifacts.push(data);
|
|
291
|
+
callbacks.onArtifact?.(data);
|
|
292
|
+
},
|
|
293
|
+
"response.complete": () => {
|
|
294
|
+
callbacks.onComplete?.();
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
const processEvents = (events) => {
|
|
298
|
+
for (const { event, data } of events) {
|
|
299
|
+
try {
|
|
300
|
+
const handler = eventHandlers[event];
|
|
301
|
+
if (handler) handler(data);
|
|
302
|
+
} catch {
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
while (true) {
|
|
307
|
+
const { done, value } = await reader.read();
|
|
308
|
+
if (done) break;
|
|
309
|
+
const { events, remaining } = parseSSEEvents(decoder.decode(value, { stream: true }), sseBuffer);
|
|
310
|
+
sseBuffer = remaining;
|
|
311
|
+
processEvents(events);
|
|
312
|
+
}
|
|
313
|
+
if (sseBuffer.trim()) {
|
|
314
|
+
const { events } = parseSSEEvents(sseBuffer + "\n\n", "");
|
|
315
|
+
processEvents(events);
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
text,
|
|
319
|
+
assistantMessageExtId,
|
|
320
|
+
agentSteps,
|
|
321
|
+
errors,
|
|
322
|
+
userMessage,
|
|
323
|
+
metadata,
|
|
324
|
+
artifacts,
|
|
325
|
+
usage
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
var consumeSSEStream = streamSSE;
|
|
329
|
+
var AUTH_TIMEOUT_MS = 1e4;
|
|
330
|
+
var MAX_BACKOFF_MS = 3e4;
|
|
331
|
+
function connectWebSocket(options) {
|
|
332
|
+
const { baseUrl, accessToken, onMessage, onClose } = options;
|
|
333
|
+
const url = client.buildWebSocketUrl(baseUrl);
|
|
334
|
+
return new Promise((resolve, reject) => {
|
|
335
|
+
const ws = new WebSocket(url);
|
|
336
|
+
let authenticated = false;
|
|
337
|
+
const timeout = setTimeout(() => {
|
|
338
|
+
if (!authenticated) {
|
|
339
|
+
ws.close();
|
|
340
|
+
reject(new Error("WebSocket auth timed out"));
|
|
341
|
+
}
|
|
342
|
+
}, AUTH_TIMEOUT_MS);
|
|
343
|
+
ws.addEventListener("open", () => {
|
|
344
|
+
ws.send(client.createAuthMessage(accessToken));
|
|
345
|
+
});
|
|
346
|
+
ws.addEventListener("message", (event) => {
|
|
347
|
+
const data = typeof event.data === "string" ? event.data : String(event.data);
|
|
348
|
+
const msg = client.parseServerMessage(data);
|
|
349
|
+
if (!msg) return;
|
|
350
|
+
if (!authenticated) {
|
|
351
|
+
if (client.isMessageType(msg, "auth_result")) {
|
|
352
|
+
clearTimeout(timeout);
|
|
353
|
+
if (msg.success) {
|
|
354
|
+
authenticated = true;
|
|
355
|
+
resolve({ close: () => ws.close() });
|
|
356
|
+
} else {
|
|
357
|
+
ws.close();
|
|
358
|
+
reject(new Error(`WebSocket auth failed: ${msg.reason || "unknown"}`));
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
onMessage(msg);
|
|
364
|
+
});
|
|
365
|
+
ws.addEventListener("close", (event) => {
|
|
366
|
+
clearTimeout(timeout);
|
|
367
|
+
if (!authenticated) {
|
|
368
|
+
reject(new Error(`WebSocket closed before auth (code ${event.code})`));
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
onClose?.(event.code, event.reason);
|
|
372
|
+
});
|
|
373
|
+
ws.addEventListener("error", () => {
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
async function connectWithReconnect(options) {
|
|
378
|
+
const {
|
|
379
|
+
maxRetries = 10,
|
|
380
|
+
initialDelayMs = 1e3,
|
|
381
|
+
onReconnecting,
|
|
382
|
+
onReconnected,
|
|
383
|
+
onReconnectFailed,
|
|
384
|
+
onClose,
|
|
385
|
+
...connectOpts
|
|
386
|
+
} = options;
|
|
387
|
+
let closed = false;
|
|
388
|
+
let reconnectTimer = null;
|
|
389
|
+
let currentConnection = null;
|
|
390
|
+
const scheduleReconnect = async () => {
|
|
391
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
392
|
+
if (closed) return;
|
|
393
|
+
const delay = Math.min(initialDelayMs * Math.pow(2, attempt - 1), MAX_BACKOFF_MS);
|
|
394
|
+
onReconnecting?.(attempt, maxRetries);
|
|
395
|
+
await new Promise((resolve) => {
|
|
396
|
+
reconnectTimer = setTimeout(resolve, delay);
|
|
397
|
+
});
|
|
398
|
+
if (closed) return;
|
|
399
|
+
try {
|
|
400
|
+
currentConnection = await connectWebSocket({
|
|
401
|
+
...connectOpts,
|
|
402
|
+
onClose: (code, reason) => {
|
|
403
|
+
currentConnection = null;
|
|
404
|
+
onClose?.(code, reason);
|
|
405
|
+
if (!closed) scheduleReconnect();
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
onReconnected?.();
|
|
409
|
+
return;
|
|
410
|
+
} catch {
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
if (!closed) onReconnectFailed?.();
|
|
414
|
+
};
|
|
415
|
+
currentConnection = await connectWebSocket({
|
|
416
|
+
...connectOpts,
|
|
417
|
+
onClose: (code, reason) => {
|
|
418
|
+
currentConnection = null;
|
|
419
|
+
onClose?.(code, reason);
|
|
420
|
+
if (!closed) scheduleReconnect();
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
return {
|
|
424
|
+
close: () => {
|
|
425
|
+
closed = true;
|
|
426
|
+
if (reconnectTimer) clearTimeout(reconnectTimer);
|
|
427
|
+
currentConnection?.close();
|
|
428
|
+
currentConnection = null;
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// src/format.ts
|
|
434
|
+
function formatFileSize(bytes, fallback = "N/A") {
|
|
435
|
+
if (bytes === null || bytes === void 0) return fallback;
|
|
436
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
437
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
438
|
+
if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
439
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
|
|
440
|
+
}
|
|
441
|
+
function formatUserName(user) {
|
|
442
|
+
if (!user) return "";
|
|
443
|
+
return [user.given_name, user.family_name].filter(Boolean).join(" ");
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// src/operations/documents.ts
|
|
447
|
+
var documents_exports = {};
|
|
448
|
+
__export(documents_exports, {
|
|
449
|
+
deleteDocuments: () => deleteDocuments,
|
|
450
|
+
downloadDocument: () => downloadDocument,
|
|
451
|
+
getDocuments: () => getDocuments,
|
|
452
|
+
getParsedContent: () => getParsedContent,
|
|
453
|
+
listDocuments: () => listDocuments,
|
|
454
|
+
updateDocuments: () => updateDocuments,
|
|
455
|
+
uploadFile: () => uploadFile,
|
|
456
|
+
uploadLocalFile: () => uploadLocalFile,
|
|
457
|
+
uploadUrl: () => uploadUrl
|
|
458
|
+
});
|
|
459
|
+
async function listDocuments(arbi) {
|
|
460
|
+
return requireData(await arbi.fetch.GET("/v1/document/list"), "Failed to fetch documents");
|
|
461
|
+
}
|
|
462
|
+
async function getDocuments(arbi, externalIds) {
|
|
463
|
+
return requireData(
|
|
464
|
+
await arbi.fetch.GET("/v1/document/", { params: { query: { external_ids: externalIds } } }),
|
|
465
|
+
"Failed to fetch documents"
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
async function deleteDocuments(arbi, externalIds) {
|
|
469
|
+
requireOk(
|
|
470
|
+
await arbi.fetch.DELETE("/v1/document/", { body: { external_ids: externalIds } }),
|
|
471
|
+
"Failed to delete documents"
|
|
472
|
+
);
|
|
473
|
+
}
|
|
474
|
+
async function updateDocuments(arbi, documents) {
|
|
475
|
+
return requireData(
|
|
476
|
+
await arbi.fetch.PATCH("/v1/document/", { body: { documents } }),
|
|
477
|
+
"Failed to update documents"
|
|
478
|
+
);
|
|
479
|
+
}
|
|
480
|
+
async function uploadUrl(arbi, urls, workspaceId, shared = false) {
|
|
481
|
+
return requireData(
|
|
482
|
+
await arbi.fetch.POST("/v1/document/upload-url", {
|
|
483
|
+
params: {
|
|
484
|
+
query: { urls, workspace_ext_id: workspaceId, shared }
|
|
485
|
+
}
|
|
486
|
+
}),
|
|
487
|
+
"Failed to upload from URLs"
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
async function getParsedContent(auth, docId, stage) {
|
|
491
|
+
const res = await authenticatedFetch({
|
|
492
|
+
...auth,
|
|
493
|
+
path: `/v1/document/${docId}/parsed-${stage}`
|
|
494
|
+
});
|
|
495
|
+
return res.json();
|
|
496
|
+
}
|
|
497
|
+
async function uploadFile(auth, workspaceId, fileData, fileName) {
|
|
498
|
+
const formData = new FormData();
|
|
499
|
+
formData.append("files", fileData, fileName);
|
|
500
|
+
const res = await authenticatedFetch({
|
|
501
|
+
...auth,
|
|
502
|
+
path: `/v1/document/upload?workspace_ext_id=${workspaceId}`,
|
|
503
|
+
method: "POST",
|
|
504
|
+
body: formData
|
|
505
|
+
});
|
|
506
|
+
return res.json();
|
|
507
|
+
}
|
|
508
|
+
async function uploadLocalFile(auth, workspaceId, filePath) {
|
|
509
|
+
const fileBuffer = fs__default.default.readFileSync(filePath);
|
|
510
|
+
const fileName = path__default.default.basename(filePath);
|
|
511
|
+
const result = await uploadFile(auth, workspaceId, new Blob([fileBuffer]), fileName);
|
|
512
|
+
return { ...result, fileName };
|
|
513
|
+
}
|
|
514
|
+
async function downloadDocument(auth, docId) {
|
|
515
|
+
return authenticatedFetch({
|
|
516
|
+
...auth,
|
|
517
|
+
path: `/v1/document/${docId}/download`
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// src/operations/workspaces.ts
|
|
522
|
+
var workspaces_exports = {};
|
|
523
|
+
__export(workspaces_exports, {
|
|
524
|
+
addWorkspaceUsers: () => addWorkspaceUsers,
|
|
525
|
+
copyDocuments: () => copyDocuments,
|
|
526
|
+
createWorkspace: () => createWorkspace,
|
|
527
|
+
deleteWorkspaces: () => deleteWorkspaces,
|
|
528
|
+
listWorkspaceUsers: () => listWorkspaceUsers,
|
|
529
|
+
listWorkspaces: () => listWorkspaces,
|
|
530
|
+
removeWorkspaceUsers: () => removeWorkspaceUsers,
|
|
531
|
+
setUserRole: () => setUserRole,
|
|
532
|
+
updateWorkspace: () => updateWorkspace
|
|
533
|
+
});
|
|
534
|
+
async function listWorkspaces(arbi) {
|
|
535
|
+
return requireData(await arbi.fetch.GET("/v1/user/workspaces"), "Failed to fetch workspaces");
|
|
536
|
+
}
|
|
537
|
+
async function createWorkspace(arbi, name, description, isPublic = false) {
|
|
538
|
+
return requireData(
|
|
539
|
+
await arbi.fetch.POST("/v1/workspace/create_protected", {
|
|
540
|
+
body: { name, description: description ?? null, is_public: isPublic }
|
|
541
|
+
}),
|
|
542
|
+
"Failed to create workspace"
|
|
543
|
+
);
|
|
544
|
+
}
|
|
545
|
+
async function deleteWorkspaces(arbi, workspaceIds) {
|
|
546
|
+
requireOk(
|
|
547
|
+
await arbi.fetch.DELETE("/v1/workspace/", {
|
|
548
|
+
body: { external_ids: workspaceIds }
|
|
549
|
+
}),
|
|
550
|
+
"Failed to delete workspace(s)"
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
async function updateWorkspace(arbi, body) {
|
|
554
|
+
return requireData(
|
|
555
|
+
await arbi.fetch.PATCH("/v1/workspace/", { body }),
|
|
556
|
+
"Failed to update workspace"
|
|
557
|
+
);
|
|
558
|
+
}
|
|
559
|
+
async function listWorkspaceUsers(arbi) {
|
|
560
|
+
return requireData(await arbi.fetch.GET("/v1/workspace/users"), "Failed to fetch workspace users");
|
|
561
|
+
}
|
|
562
|
+
async function addWorkspaceUsers(arbi, emails, role = "collaborator") {
|
|
563
|
+
return requireData(
|
|
564
|
+
await arbi.fetch.POST("/v1/workspace/users", {
|
|
565
|
+
body: { emails, role }
|
|
566
|
+
}),
|
|
567
|
+
"Failed to add users"
|
|
568
|
+
);
|
|
569
|
+
}
|
|
570
|
+
async function removeWorkspaceUsers(arbi, userIds) {
|
|
571
|
+
requireOk(
|
|
572
|
+
await arbi.fetch.DELETE("/v1/workspace/users", {
|
|
573
|
+
body: { users: userIds.map((id) => ({ user_ext_id: id })) }
|
|
574
|
+
}),
|
|
575
|
+
"Failed to remove users"
|
|
576
|
+
);
|
|
577
|
+
}
|
|
578
|
+
async function setUserRole(arbi, userIds, role) {
|
|
579
|
+
return requireData(
|
|
580
|
+
await arbi.fetch.PATCH("/v1/workspace/users", {
|
|
581
|
+
body: { user_ext_ids: userIds, role }
|
|
582
|
+
}),
|
|
583
|
+
"Failed to update roles"
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
async function copyDocuments(arbi, targetWorkspaceId, docIds, targetWorkspaceKey) {
|
|
587
|
+
return requireData(
|
|
588
|
+
await arbi.fetch.POST("/v1/workspace/copy", {
|
|
589
|
+
body: {
|
|
590
|
+
target_workspace_ext_id: targetWorkspaceId,
|
|
591
|
+
target_workspace_key: targetWorkspaceKey,
|
|
592
|
+
items: docIds
|
|
593
|
+
}
|
|
594
|
+
}),
|
|
595
|
+
"Failed to copy documents"
|
|
596
|
+
);
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// src/operations/conversations.ts
|
|
600
|
+
var conversations_exports = {};
|
|
601
|
+
__export(conversations_exports, {
|
|
602
|
+
deleteConversation: () => deleteConversation,
|
|
603
|
+
deleteMessage: () => deleteMessage,
|
|
604
|
+
getConversationThreads: () => getConversationThreads,
|
|
605
|
+
getMessage: () => getMessage,
|
|
606
|
+
listConversations: () => listConversations,
|
|
607
|
+
shareConversation: () => shareConversation,
|
|
608
|
+
updateConversationTitle: () => updateConversationTitle
|
|
609
|
+
});
|
|
610
|
+
async function listConversations(arbi) {
|
|
611
|
+
return requireData(await arbi.fetch.GET("/v1/conversation/list"), "Failed to fetch conversations");
|
|
612
|
+
}
|
|
613
|
+
async function getConversationThreads(arbi, conversationId) {
|
|
614
|
+
return requireData(
|
|
615
|
+
await arbi.fetch.GET("/v1/conversation/{conversation_ext_id}/threads", {
|
|
616
|
+
params: { path: { conversation_ext_id: conversationId } }
|
|
617
|
+
}),
|
|
618
|
+
"Failed to fetch threads"
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
async function deleteConversation(arbi, conversationId) {
|
|
622
|
+
return requireData(
|
|
623
|
+
await arbi.fetch.DELETE("/v1/conversation/{conversation_ext_id}", {
|
|
624
|
+
params: { path: { conversation_ext_id: conversationId } }
|
|
625
|
+
}),
|
|
626
|
+
"Failed to delete conversation"
|
|
627
|
+
);
|
|
628
|
+
}
|
|
629
|
+
async function shareConversation(arbi, conversationId) {
|
|
630
|
+
return requireData(
|
|
631
|
+
await arbi.fetch.POST("/v1/conversation/{conversation_ext_id}/share", {
|
|
632
|
+
params: { path: { conversation_ext_id: conversationId } }
|
|
633
|
+
}),
|
|
634
|
+
"Failed to share conversation"
|
|
635
|
+
);
|
|
636
|
+
}
|
|
637
|
+
async function updateConversationTitle(arbi, conversationId, title) {
|
|
638
|
+
return requireData(
|
|
639
|
+
await arbi.fetch.PATCH("/v1/conversation/{conversation_ext_id}/title", {
|
|
640
|
+
params: { path: { conversation_ext_id: conversationId } },
|
|
641
|
+
body: { title }
|
|
642
|
+
}),
|
|
643
|
+
"Failed to update title"
|
|
644
|
+
);
|
|
645
|
+
}
|
|
646
|
+
async function getMessage(arbi, messageId) {
|
|
647
|
+
return requireData(
|
|
648
|
+
await arbi.fetch.GET("/v1/conversation/message/{message_ext_id}", {
|
|
649
|
+
params: { path: { message_ext_id: messageId } }
|
|
650
|
+
}),
|
|
651
|
+
"Failed to fetch message"
|
|
652
|
+
);
|
|
653
|
+
}
|
|
654
|
+
async function deleteMessage(arbi, messageId) {
|
|
655
|
+
return requireData(
|
|
656
|
+
await arbi.fetch.DELETE("/v1/conversation/message/{message_ext_id}", {
|
|
657
|
+
params: { path: { message_ext_id: messageId } }
|
|
658
|
+
}),
|
|
659
|
+
"Failed to delete message"
|
|
660
|
+
);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// src/operations/assistant.ts
|
|
664
|
+
var assistant_exports = {};
|
|
665
|
+
__export(assistant_exports, {
|
|
666
|
+
buildRetrievalChunkTool: () => buildRetrievalChunkTool,
|
|
667
|
+
buildRetrievalFullContextTool: () => buildRetrievalFullContextTool,
|
|
668
|
+
buildRetrievalTocTool: () => buildRetrievalTocTool,
|
|
669
|
+
queryAssistant: () => queryAssistant,
|
|
670
|
+
respondToAgent: () => respondToAgent,
|
|
671
|
+
retrieve: () => retrieve
|
|
672
|
+
});
|
|
673
|
+
function buildRetrievalChunkTool(docIds, searchMode) {
|
|
674
|
+
return {
|
|
675
|
+
name: "retrieval_chunk",
|
|
676
|
+
description: "retrieval chunk",
|
|
677
|
+
tool_args: { doc_ext_ids: docIds, ...searchMode ? { search_mode: searchMode } : {} },
|
|
678
|
+
tool_responses: {}
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
function buildRetrievalFullContextTool(docIds) {
|
|
682
|
+
return {
|
|
683
|
+
name: "retrieval_full_context",
|
|
684
|
+
description: "retrieval full context",
|
|
685
|
+
tool_args: { doc_ext_ids: docIds },
|
|
686
|
+
tool_responses: {}
|
|
687
|
+
};
|
|
688
|
+
}
|
|
689
|
+
function buildRetrievalTocTool(docIds) {
|
|
690
|
+
return {
|
|
691
|
+
name: "retrieval_toc",
|
|
692
|
+
description: "retrieval toc",
|
|
693
|
+
tool_args: { doc_ext_ids: docIds },
|
|
694
|
+
tool_responses: {}
|
|
695
|
+
};
|
|
696
|
+
}
|
|
697
|
+
async function retrieve(options) {
|
|
698
|
+
const { arbi, workspaceId, query, docIds, searchMode, fullContextDocIds, tocDocIds, model } = options;
|
|
699
|
+
const tools = {
|
|
700
|
+
retrieval_chunk: buildRetrievalChunkTool(docIds, searchMode)
|
|
701
|
+
};
|
|
702
|
+
if (fullContextDocIds && fullContextDocIds.length > 0) {
|
|
703
|
+
tools.retrieval_full_context = buildRetrievalFullContextTool(fullContextDocIds);
|
|
704
|
+
}
|
|
705
|
+
if (tocDocIds && tocDocIds.length > 0) {
|
|
706
|
+
tools.retrieval_toc = buildRetrievalTocTool(tocDocIds);
|
|
707
|
+
}
|
|
708
|
+
const body = {
|
|
709
|
+
input: query,
|
|
710
|
+
workspace_ext_id: workspaceId,
|
|
711
|
+
stream: false,
|
|
712
|
+
tools,
|
|
713
|
+
...model ? { model } : {}
|
|
714
|
+
};
|
|
715
|
+
const { data, error } = await arbi.fetch.POST("/v1/assistant/retrieve", { body });
|
|
716
|
+
if (error) {
|
|
717
|
+
throw new Error(`Retrieve failed: ${JSON.stringify(error)}`);
|
|
718
|
+
}
|
|
719
|
+
return data;
|
|
720
|
+
}
|
|
721
|
+
async function queryAssistant(options) {
|
|
722
|
+
const { workspaceId, question, docIds, previousResponseId, model, ...auth } = options;
|
|
723
|
+
const body = {
|
|
724
|
+
input: question,
|
|
725
|
+
workspace_ext_id: workspaceId,
|
|
726
|
+
stream: true,
|
|
727
|
+
tools: {
|
|
728
|
+
retrieval_chunk: buildRetrievalChunkTool(docIds),
|
|
729
|
+
retrieval_full_context: buildRetrievalFullContextTool([])
|
|
730
|
+
},
|
|
731
|
+
...previousResponseId ? { previous_response_id: previousResponseId } : {},
|
|
732
|
+
...model ? { model } : {}
|
|
733
|
+
};
|
|
734
|
+
return authenticatedFetch({
|
|
735
|
+
...auth,
|
|
736
|
+
path: "/v1/assistant/query",
|
|
737
|
+
method: "POST",
|
|
738
|
+
body: JSON.stringify(body),
|
|
739
|
+
headers: { "Content-Type": "application/json" }
|
|
740
|
+
});
|
|
741
|
+
}
|
|
742
|
+
async function respondToAgent(arbi, assistantMessageExtId, answer) {
|
|
743
|
+
return requireData(
|
|
744
|
+
await arbi.fetch.POST("/v1/assistant/respond", {
|
|
745
|
+
body: { assistant_message_ext_id: assistantMessageExtId, answer }
|
|
746
|
+
}),
|
|
747
|
+
"Failed to respond to agent"
|
|
748
|
+
);
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
// src/operations/tags.ts
|
|
752
|
+
var tags_exports = {};
|
|
753
|
+
__export(tags_exports, {
|
|
754
|
+
createTag: () => createTag,
|
|
755
|
+
deleteTag: () => deleteTag,
|
|
756
|
+
listTags: () => listTags,
|
|
757
|
+
updateTag: () => updateTag
|
|
758
|
+
});
|
|
759
|
+
async function listTags(arbi) {
|
|
760
|
+
return requireData(await arbi.fetch.GET("/v1/tag/list"), "Failed to fetch tags");
|
|
761
|
+
}
|
|
762
|
+
async function createTag(arbi, options) {
|
|
763
|
+
return requireData(
|
|
764
|
+
await arbi.fetch.POST("/v1/tag/", {
|
|
765
|
+
body: {
|
|
766
|
+
name: options.name,
|
|
767
|
+
tag_type: options.tagType ?? { type: "checkbox", options: [] },
|
|
768
|
+
instruction: options.instruction ?? null,
|
|
769
|
+
shared: options.shared ?? false
|
|
770
|
+
}
|
|
771
|
+
}),
|
|
772
|
+
"Failed to create tag"
|
|
773
|
+
);
|
|
774
|
+
}
|
|
775
|
+
async function deleteTag(arbi, tagId) {
|
|
776
|
+
return requireData(
|
|
777
|
+
await arbi.fetch.DELETE("/v1/tag/{tag_ext_id}", {
|
|
778
|
+
params: { path: { tag_ext_id: tagId } }
|
|
779
|
+
}),
|
|
780
|
+
"Failed to delete tag"
|
|
781
|
+
);
|
|
782
|
+
}
|
|
783
|
+
async function updateTag(arbi, tagId, body) {
|
|
784
|
+
return requireData(
|
|
785
|
+
await arbi.fetch.PATCH("/v1/tag/{tag_ext_id}", {
|
|
786
|
+
params: { path: { tag_ext_id: tagId } },
|
|
787
|
+
body
|
|
788
|
+
}),
|
|
789
|
+
"Failed to update tag"
|
|
790
|
+
);
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
// src/operations/contacts.ts
|
|
794
|
+
var contacts_exports = {};
|
|
795
|
+
__export(contacts_exports, {
|
|
796
|
+
addContacts: () => addContacts,
|
|
797
|
+
groupContactsByStatus: () => groupContactsByStatus,
|
|
798
|
+
listContacts: () => listContacts,
|
|
799
|
+
removeContacts: () => removeContacts
|
|
800
|
+
});
|
|
801
|
+
async function listContacts(arbi) {
|
|
802
|
+
return requireData(await arbi.fetch.GET("/v1/user/contacts"), "Failed to fetch contacts");
|
|
803
|
+
}
|
|
804
|
+
async function addContacts(arbi, emails) {
|
|
805
|
+
return requireData(
|
|
806
|
+
await arbi.fetch.POST("/v1/user/contacts", { body: { emails } }),
|
|
807
|
+
"Failed to add contacts"
|
|
808
|
+
);
|
|
809
|
+
}
|
|
810
|
+
async function removeContacts(arbi, contactIds) {
|
|
811
|
+
requireOk(
|
|
812
|
+
await arbi.fetch.DELETE("/v1/user/contacts", { body: { contact_ids: contactIds } }),
|
|
813
|
+
"Failed to remove contacts"
|
|
814
|
+
);
|
|
815
|
+
}
|
|
816
|
+
function groupContactsByStatus(contactList) {
|
|
817
|
+
const registered = [];
|
|
818
|
+
const pending = [];
|
|
819
|
+
for (const c of contactList) {
|
|
820
|
+
if (c.status === "registered") {
|
|
821
|
+
registered.push(c);
|
|
822
|
+
} else {
|
|
823
|
+
pending.push(c);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
return { registered, pending };
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
// src/operations/doctags.ts
|
|
830
|
+
var doctags_exports = {};
|
|
831
|
+
__export(doctags_exports, {
|
|
832
|
+
assignDocTags: () => assignDocTags,
|
|
833
|
+
generateDocTags: () => generateDocTags,
|
|
834
|
+
removeDocTags: () => removeDocTags,
|
|
835
|
+
updateDocTag: () => updateDocTag
|
|
836
|
+
});
|
|
837
|
+
async function assignDocTags(arbi, tagId, docIds, note) {
|
|
838
|
+
return requireData(
|
|
839
|
+
await arbi.fetch.POST("/v1/document/doctag", {
|
|
840
|
+
body: { tag_ext_id: tagId, doc_ext_ids: docIds, note: note ?? null }
|
|
841
|
+
}),
|
|
842
|
+
"Failed to create doctags"
|
|
843
|
+
);
|
|
844
|
+
}
|
|
845
|
+
async function removeDocTags(arbi, tagId, docIds) {
|
|
846
|
+
requireOk(
|
|
847
|
+
await arbi.fetch.DELETE("/v1/document/doctag", {
|
|
848
|
+
body: { tag_ext_id: tagId, doc_ext_ids: docIds }
|
|
849
|
+
}),
|
|
850
|
+
"Failed to delete doctags"
|
|
851
|
+
);
|
|
852
|
+
}
|
|
853
|
+
async function updateDocTag(arbi, tagId, docId, updates) {
|
|
854
|
+
return requireData(
|
|
855
|
+
await arbi.fetch.PATCH("/v1/document/doctag", {
|
|
856
|
+
body: { tag_ext_id: tagId, doc_ext_id: docId, ...updates }
|
|
857
|
+
}),
|
|
858
|
+
"Failed to update doctag"
|
|
859
|
+
);
|
|
860
|
+
}
|
|
861
|
+
async function generateDocTags(arbi, tagIds, docIds) {
|
|
862
|
+
return requireData(
|
|
863
|
+
await arbi.fetch.POST("/v1/document/doctag/generate", {
|
|
864
|
+
body: { tag_ext_ids: tagIds, doc_ext_ids: docIds }
|
|
865
|
+
}),
|
|
866
|
+
"Failed to generate doctags"
|
|
867
|
+
);
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
// src/operations/dm.ts
|
|
871
|
+
var dm_exports = {};
|
|
872
|
+
__export(dm_exports, {
|
|
873
|
+
deleteDMs: () => deleteDMs,
|
|
874
|
+
listDMs: () => listDMs,
|
|
875
|
+
markRead: () => markRead,
|
|
876
|
+
sendDM: () => sendDM
|
|
877
|
+
});
|
|
878
|
+
async function listDMs(arbi) {
|
|
879
|
+
return requireData(await arbi.fetch.GET("/v1/notifications/"), "Failed to fetch messages");
|
|
880
|
+
}
|
|
881
|
+
async function sendDM(arbi, messages) {
|
|
882
|
+
return requireData(
|
|
883
|
+
await arbi.fetch.POST("/v1/notifications/", {
|
|
884
|
+
body: { messages }
|
|
885
|
+
}),
|
|
886
|
+
"Failed to send message"
|
|
887
|
+
);
|
|
888
|
+
}
|
|
889
|
+
async function markRead(arbi, messageIds) {
|
|
890
|
+
return requireData(
|
|
891
|
+
await arbi.fetch.PATCH("/v1/notifications/", {
|
|
892
|
+
body: { updates: messageIds.map((id) => ({ external_id: id, read: true })) }
|
|
893
|
+
}),
|
|
894
|
+
"Failed to update messages"
|
|
895
|
+
);
|
|
896
|
+
}
|
|
897
|
+
async function deleteDMs(arbi, messageIds) {
|
|
898
|
+
requireOk(
|
|
899
|
+
await arbi.fetch.DELETE("/v1/notifications/", { body: { external_ids: messageIds } }),
|
|
900
|
+
"Failed to delete messages"
|
|
901
|
+
);
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
// src/operations/settings.ts
|
|
905
|
+
var settings_exports = {};
|
|
906
|
+
__export(settings_exports, {
|
|
907
|
+
getSettings: () => getSettings,
|
|
908
|
+
updateSettings: () => updateSettings
|
|
909
|
+
});
|
|
910
|
+
async function getSettings(arbi) {
|
|
911
|
+
return requireData(await arbi.fetch.GET("/v1/user/settings"), "Failed to fetch settings");
|
|
912
|
+
}
|
|
913
|
+
async function updateSettings(arbi, body) {
|
|
914
|
+
requireOk(await arbi.fetch.PATCH("/v1/user/settings", { body }), "Failed to update settings");
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
// src/operations/agentconfig.ts
|
|
918
|
+
var agentconfig_exports = {};
|
|
919
|
+
__export(agentconfig_exports, {
|
|
920
|
+
deleteConfig: () => deleteConfig,
|
|
921
|
+
getConfig: () => getConfig,
|
|
922
|
+
getModels: () => getModels,
|
|
923
|
+
getSchema: () => getSchema,
|
|
924
|
+
listConfigs: () => listConfigs,
|
|
925
|
+
saveConfig: () => saveConfig
|
|
926
|
+
});
|
|
927
|
+
async function listConfigs(arbi) {
|
|
928
|
+
return requireData(
|
|
929
|
+
await arbi.fetch.GET("/v1/configs/versions"),
|
|
930
|
+
"Failed to fetch config versions"
|
|
931
|
+
);
|
|
932
|
+
}
|
|
933
|
+
async function getConfig(arbi, configId) {
|
|
934
|
+
return requireData(
|
|
935
|
+
await arbi.fetch.GET("/v1/configs/{config_ext_id}", {
|
|
936
|
+
params: { path: { config_ext_id: configId } }
|
|
937
|
+
}),
|
|
938
|
+
"Failed to fetch configuration"
|
|
939
|
+
);
|
|
940
|
+
}
|
|
941
|
+
async function saveConfig(arbi, body) {
|
|
942
|
+
return requireData(
|
|
943
|
+
await arbi.fetch.POST("/v1/configs/", { body }),
|
|
944
|
+
"Failed to save configuration"
|
|
945
|
+
);
|
|
946
|
+
}
|
|
947
|
+
async function deleteConfig(arbi, configId) {
|
|
948
|
+
return requireData(
|
|
949
|
+
await arbi.fetch.DELETE("/v1/configs/{config_ext_id}", {
|
|
950
|
+
params: { path: { config_ext_id: configId } }
|
|
951
|
+
}),
|
|
952
|
+
"Failed to delete configuration"
|
|
953
|
+
);
|
|
954
|
+
}
|
|
955
|
+
async function getSchema(arbi) {
|
|
956
|
+
return requireData(await arbi.fetch.GET("/v1/configs/schema"), "Failed to fetch config schema");
|
|
957
|
+
}
|
|
958
|
+
async function getModels(arbi) {
|
|
959
|
+
return requireData(await arbi.fetch.GET("/v1/health/models"), "Failed to fetch models");
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
// src/operations/health.ts
|
|
963
|
+
var health_exports = {};
|
|
964
|
+
__export(health_exports, {
|
|
965
|
+
getHealth: () => getHealth,
|
|
966
|
+
getHealthModels: () => getHealthModels,
|
|
967
|
+
getMcpTools: () => getMcpTools,
|
|
968
|
+
getRemoteModels: () => getRemoteModels
|
|
969
|
+
});
|
|
970
|
+
async function getHealth(arbi) {
|
|
971
|
+
return requireData(await arbi.fetch.GET("/v1/health/"), "Failed to fetch health status");
|
|
972
|
+
}
|
|
973
|
+
async function getHealthModels(arbi) {
|
|
974
|
+
return requireData(await arbi.fetch.GET("/v1/health/models"), "Failed to fetch models");
|
|
975
|
+
}
|
|
976
|
+
async function getRemoteModels(arbi) {
|
|
977
|
+
return requireData(
|
|
978
|
+
await arbi.fetch.GET("/v1/health/remote-models"),
|
|
979
|
+
"Failed to fetch remote models"
|
|
980
|
+
);
|
|
981
|
+
}
|
|
982
|
+
async function getMcpTools(arbi) {
|
|
983
|
+
return requireData(await arbi.fetch.GET("/v1/health/mcp-tools"), "Failed to fetch MCP tools");
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
// src/operations/files.ts
|
|
987
|
+
var files_exports = {};
|
|
988
|
+
__export(files_exports, {
|
|
989
|
+
deleteFile: () => deleteFile,
|
|
990
|
+
getFile: () => getFile,
|
|
991
|
+
getFileContent: () => getFileContent,
|
|
992
|
+
listFiles: () => listFiles,
|
|
993
|
+
uploadFile: () => uploadFile2
|
|
994
|
+
});
|
|
995
|
+
async function listFiles(arbi, options) {
|
|
996
|
+
return requireData(
|
|
997
|
+
await arbi.fetch.GET("/v1/files", {
|
|
998
|
+
params: { query: options ?? {} }
|
|
999
|
+
}),
|
|
1000
|
+
"Failed to list files"
|
|
1001
|
+
);
|
|
1002
|
+
}
|
|
1003
|
+
async function getFile(arbi, fileId) {
|
|
1004
|
+
return requireData(
|
|
1005
|
+
await arbi.fetch.GET("/v1/files/{file_id}", {
|
|
1006
|
+
params: { path: { file_id: fileId } }
|
|
1007
|
+
}),
|
|
1008
|
+
"Failed to get file"
|
|
1009
|
+
);
|
|
1010
|
+
}
|
|
1011
|
+
async function deleteFile(arbi, fileId) {
|
|
1012
|
+
return requireData(
|
|
1013
|
+
await arbi.fetch.DELETE("/v1/files/{file_id}", {
|
|
1014
|
+
params: { path: { file_id: fileId } }
|
|
1015
|
+
}),
|
|
1016
|
+
"Failed to delete file"
|
|
1017
|
+
);
|
|
1018
|
+
}
|
|
1019
|
+
async function uploadFile2(auth, fileData, fileName, purpose = "assistants") {
|
|
1020
|
+
const formData = new FormData();
|
|
1021
|
+
formData.append("file", fileData, fileName);
|
|
1022
|
+
formData.append("purpose", purpose);
|
|
1023
|
+
const res = await authenticatedFetch({
|
|
1024
|
+
...auth,
|
|
1025
|
+
path: "/v1/files",
|
|
1026
|
+
method: "POST",
|
|
1027
|
+
body: formData
|
|
1028
|
+
});
|
|
1029
|
+
return res.json();
|
|
1030
|
+
}
|
|
1031
|
+
async function getFileContent(auth, fileId) {
|
|
1032
|
+
return authenticatedFetch({
|
|
1033
|
+
...auth,
|
|
1034
|
+
path: `/v1/files/${fileId}/content`
|
|
1035
|
+
});
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
// src/arbi.ts
|
|
1039
|
+
var Arbi = class {
|
|
1040
|
+
client = null;
|
|
1041
|
+
loginResult = null;
|
|
1042
|
+
currentWorkspaceId = null;
|
|
1043
|
+
options;
|
|
1044
|
+
constructor(options) {
|
|
1045
|
+
this.options = options;
|
|
1046
|
+
}
|
|
1047
|
+
// ── Lifecycle ───────────────────────────────────────────────────────────
|
|
1048
|
+
/** Initialize the SDK client and sodium crypto. Called automatically by login(). */
|
|
1049
|
+
async init() {
|
|
1050
|
+
if (this.client) return this.client;
|
|
1051
|
+
const domain = this.options.deploymentDomain ?? new URL(this.options.url).hostname;
|
|
1052
|
+
this.client = client.createArbiClient({
|
|
1053
|
+
baseUrl: this.options.url,
|
|
1054
|
+
deploymentDomain: domain,
|
|
1055
|
+
credentials: this.options.credentials ?? "omit"
|
|
1056
|
+
});
|
|
1057
|
+
await this.client.crypto.initSodium();
|
|
1058
|
+
return this.client;
|
|
1059
|
+
}
|
|
1060
|
+
/**
|
|
1061
|
+
* Request a verification email for registration.
|
|
1062
|
+
* The user will receive an email with a 3-word verification code.
|
|
1063
|
+
*/
|
|
1064
|
+
async requestVerification(email) {
|
|
1065
|
+
const client = await this.init();
|
|
1066
|
+
await client.fetch.POST("/v1/user/verify-email", { body: { email } });
|
|
1067
|
+
}
|
|
1068
|
+
/**
|
|
1069
|
+
* Register a new account using the verification code received by email.
|
|
1070
|
+
*/
|
|
1071
|
+
async register(params) {
|
|
1072
|
+
const client = await this.init();
|
|
1073
|
+
await client.auth.register(params);
|
|
1074
|
+
}
|
|
1075
|
+
/**
|
|
1076
|
+
* Log in with email and password.
|
|
1077
|
+
* Initializes the SDK client if not already done.
|
|
1078
|
+
*/
|
|
1079
|
+
async login(email, password) {
|
|
1080
|
+
const client = await this.init();
|
|
1081
|
+
this.loginResult = await client.auth.login({ email, password });
|
|
1082
|
+
}
|
|
1083
|
+
/**
|
|
1084
|
+
* Recover a session using a stored signing private key (base64).
|
|
1085
|
+
* Useful for session recovery without re-entering the password.
|
|
1086
|
+
*/
|
|
1087
|
+
async loginWithKey(email, signingPrivateKeyBase64) {
|
|
1088
|
+
const client = await this.init();
|
|
1089
|
+
const signingPrivateKey = client.crypto.base64ToBytes(signingPrivateKeyBase64);
|
|
1090
|
+
this.loginResult = await client.auth.loginWithKey({ email, signingPrivateKey });
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* Select a workspace by ID. Fetches the workspace list, finds the matching
|
|
1094
|
+
* workspace, decrypts the wrapped key, and sets up auth headers.
|
|
1095
|
+
*/
|
|
1096
|
+
async selectWorkspace(workspaceId) {
|
|
1097
|
+
const client = this.requireClient();
|
|
1098
|
+
const lr = this.requireLogin();
|
|
1099
|
+
const allWorkspaces = await listWorkspaces(client);
|
|
1100
|
+
const ws = allWorkspaces.find((w) => w.external_id === workspaceId);
|
|
1101
|
+
if (!ws || !ws.wrapped_key) {
|
|
1102
|
+
throw new ArbiError(`Workspace ${workspaceId} not found or has no encryption key`);
|
|
1103
|
+
}
|
|
1104
|
+
const signingPrivateKeyBase64 = client.crypto.bytesToBase64(lr.signingPrivateKey);
|
|
1105
|
+
await selectWorkspace(
|
|
1106
|
+
client,
|
|
1107
|
+
ws.external_id,
|
|
1108
|
+
ws.wrapped_key,
|
|
1109
|
+
lr.serverSessionKey,
|
|
1110
|
+
signingPrivateKeyBase64
|
|
1111
|
+
);
|
|
1112
|
+
this.currentWorkspaceId = ws.external_id;
|
|
1113
|
+
}
|
|
1114
|
+
/** Log out and clear internal state. */
|
|
1115
|
+
async logout() {
|
|
1116
|
+
if (this.client) {
|
|
1117
|
+
await this.client.auth.logout();
|
|
1118
|
+
}
|
|
1119
|
+
if (this.loginResult) {
|
|
1120
|
+
this.loginResult.signingPrivateKey.fill(0);
|
|
1121
|
+
this.loginResult.serverSessionKey.fill(0);
|
|
1122
|
+
}
|
|
1123
|
+
this.loginResult = null;
|
|
1124
|
+
this.currentWorkspaceId = null;
|
|
1125
|
+
}
|
|
1126
|
+
// ── Accessors ─────────────────────────────────────────────────────────
|
|
1127
|
+
/** Get the underlying ArbiClient (throws if not initialized). */
|
|
1128
|
+
getClient() {
|
|
1129
|
+
return this.requireClient();
|
|
1130
|
+
}
|
|
1131
|
+
/** Get the current workspace ID (throws if none selected). */
|
|
1132
|
+
getWorkspaceId() {
|
|
1133
|
+
return this.requireWorkspace();
|
|
1134
|
+
}
|
|
1135
|
+
/** Check if the user is logged in. */
|
|
1136
|
+
get isLoggedIn() {
|
|
1137
|
+
return this.loginResult !== null;
|
|
1138
|
+
}
|
|
1139
|
+
/** Check if a workspace is selected. */
|
|
1140
|
+
get hasWorkspace() {
|
|
1141
|
+
return this.currentWorkspaceId !== null;
|
|
1142
|
+
}
|
|
1143
|
+
// ── Auth headers (for raw fetch operations) ───────────────────────────
|
|
1144
|
+
getAuthHeaders() {
|
|
1145
|
+
const client = this.requireClient();
|
|
1146
|
+
const accessToken = client.session.getState().accessToken;
|
|
1147
|
+
const workspaceKeyHeader = client.session.getWorkspaceKeyHeader();
|
|
1148
|
+
if (!accessToken || !workspaceKeyHeader) {
|
|
1149
|
+
throw new ArbiError("Missing access token or workspace key header");
|
|
1150
|
+
}
|
|
1151
|
+
return {
|
|
1152
|
+
baseUrl: this.options.url,
|
|
1153
|
+
accessToken,
|
|
1154
|
+
workspaceKeyHeader
|
|
1155
|
+
};
|
|
1156
|
+
}
|
|
1157
|
+
// ── Workspaces ────────────────────────────────────────────────────────
|
|
1158
|
+
workspaces = {
|
|
1159
|
+
list: () => listWorkspaces(this.requireClient()),
|
|
1160
|
+
create: (name, description, isPublic) => createWorkspace(this.requireClient(), name, description, isPublic),
|
|
1161
|
+
delete: (workspaceIds) => deleteWorkspaces(this.requireClient(), workspaceIds),
|
|
1162
|
+
update: (body) => updateWorkspace(this.requireClient(), body),
|
|
1163
|
+
listUsers: () => listWorkspaceUsers(this.requireClient()),
|
|
1164
|
+
addUsers: (emails, role) => addWorkspaceUsers(this.requireClient(), emails, role),
|
|
1165
|
+
removeUsers: (userIds) => removeWorkspaceUsers(this.requireClient(), userIds),
|
|
1166
|
+
setUserRole: (userIds, role) => setUserRole(this.requireClient(), userIds, role),
|
|
1167
|
+
copyDocuments: (targetWorkspaceId, docIds, targetWorkspaceKey) => copyDocuments(
|
|
1168
|
+
this.requireClient(),
|
|
1169
|
+
targetWorkspaceId,
|
|
1170
|
+
docIds,
|
|
1171
|
+
targetWorkspaceKey
|
|
1172
|
+
)
|
|
1173
|
+
};
|
|
1174
|
+
// ── Documents ─────────────────────────────────────────────────────────
|
|
1175
|
+
documents = {
|
|
1176
|
+
list: () => listDocuments(this.requireClient()),
|
|
1177
|
+
get: (externalIds) => getDocuments(this.requireClient(), externalIds),
|
|
1178
|
+
delete: (externalIds) => deleteDocuments(this.requireClient(), externalIds),
|
|
1179
|
+
update: (documents) => updateDocuments(this.requireClient(), documents),
|
|
1180
|
+
uploadUrl: (urls, shared, workspaceId) => uploadUrl(
|
|
1181
|
+
this.requireClient(),
|
|
1182
|
+
urls,
|
|
1183
|
+
workspaceId ?? this.requireWorkspace(),
|
|
1184
|
+
shared
|
|
1185
|
+
),
|
|
1186
|
+
uploadFile: (fileData, fileName, workspaceId) => uploadFile(
|
|
1187
|
+
this.getAuthHeaders(),
|
|
1188
|
+
workspaceId ?? this.requireWorkspace(),
|
|
1189
|
+
fileData,
|
|
1190
|
+
fileName
|
|
1191
|
+
),
|
|
1192
|
+
download: (docId) => downloadDocument(this.getAuthHeaders(), docId),
|
|
1193
|
+
getParsedContent: (docId, stage) => getParsedContent(this.getAuthHeaders(), docId, stage)
|
|
1194
|
+
};
|
|
1195
|
+
// ── Conversations ─────────────────────────────────────────────────────
|
|
1196
|
+
conversations = {
|
|
1197
|
+
list: () => listConversations(this.requireClient()),
|
|
1198
|
+
getThreads: (conversationId) => getConversationThreads(this.requireClient(), conversationId),
|
|
1199
|
+
delete: (conversationId) => deleteConversation(this.requireClient(), conversationId),
|
|
1200
|
+
share: (conversationId) => shareConversation(this.requireClient(), conversationId),
|
|
1201
|
+
updateTitle: (conversationId, title) => updateConversationTitle(this.requireClient(), conversationId, title),
|
|
1202
|
+
getMessage: (messageId) => getMessage(this.requireClient(), messageId),
|
|
1203
|
+
deleteMessage: (messageId) => deleteMessage(this.requireClient(), messageId)
|
|
1204
|
+
};
|
|
1205
|
+
// ── Assistant ─────────────────────────────────────────────────────────
|
|
1206
|
+
assistant = {
|
|
1207
|
+
/**
|
|
1208
|
+
* Send a question to the RAG assistant with streaming support.
|
|
1209
|
+
* Returns the accumulated result after the stream completes.
|
|
1210
|
+
*/
|
|
1211
|
+
query: async (question, options) => {
|
|
1212
|
+
const auth = this.getAuthHeaders();
|
|
1213
|
+
const workspaceId = this.requireWorkspace();
|
|
1214
|
+
const response = await queryAssistant({
|
|
1215
|
+
...auth,
|
|
1216
|
+
workspaceId,
|
|
1217
|
+
question,
|
|
1218
|
+
docIds: options.docIds,
|
|
1219
|
+
previousResponseId: options.previousResponseId,
|
|
1220
|
+
model: options.model
|
|
1221
|
+
});
|
|
1222
|
+
const callbacks = {
|
|
1223
|
+
onToken: options.onToken,
|
|
1224
|
+
onStreamStart: options.onStreamStart,
|
|
1225
|
+
onAgentStep: options.onAgentStep,
|
|
1226
|
+
onError: options.onError,
|
|
1227
|
+
onUserMessage: options.onUserMessage,
|
|
1228
|
+
onMetadata: options.onMetadata,
|
|
1229
|
+
onUserInputRequest: options.onUserInputRequest,
|
|
1230
|
+
onArtifact: options.onArtifact,
|
|
1231
|
+
onElapsedTime: options.onElapsedTime,
|
|
1232
|
+
onComplete: options.onComplete
|
|
1233
|
+
};
|
|
1234
|
+
return streamSSE(response, callbacks);
|
|
1235
|
+
},
|
|
1236
|
+
/**
|
|
1237
|
+
* Respond to an agent's question during a human-in-the-loop workflow.
|
|
1238
|
+
*/
|
|
1239
|
+
respond: (assistantMessageExtId, answer) => respondToAgent(this.requireClient(), assistantMessageExtId, answer),
|
|
1240
|
+
/**
|
|
1241
|
+
* Search documents without LLM generation (retrieval only).
|
|
1242
|
+
*/
|
|
1243
|
+
retrieve: (query, docIds, options) => retrieve({
|
|
1244
|
+
arbi: this.requireClient(),
|
|
1245
|
+
workspaceId: this.requireWorkspace(),
|
|
1246
|
+
query,
|
|
1247
|
+
docIds,
|
|
1248
|
+
...options
|
|
1249
|
+
})
|
|
1250
|
+
};
|
|
1251
|
+
// ── Tags ──────────────────────────────────────────────────────────────
|
|
1252
|
+
tags = {
|
|
1253
|
+
list: () => listTags(this.requireClient()),
|
|
1254
|
+
create: (options) => createTag(this.requireClient(), {
|
|
1255
|
+
...options,
|
|
1256
|
+
workspaceId: options.workspaceId ?? this.requireWorkspace()
|
|
1257
|
+
}),
|
|
1258
|
+
delete: (tagId) => deleteTag(this.requireClient(), tagId),
|
|
1259
|
+
update: (tagId, body) => updateTag(this.requireClient(), tagId, body)
|
|
1260
|
+
};
|
|
1261
|
+
// ── Document Tags ─────────────────────────────────────────────────────
|
|
1262
|
+
doctags = {
|
|
1263
|
+
assign: (tagId, docIds, note) => assignDocTags(this.requireClient(), tagId, docIds, note),
|
|
1264
|
+
remove: (tagId, docIds) => removeDocTags(this.requireClient(), tagId, docIds),
|
|
1265
|
+
update: (tagId, docId, updates) => updateDocTag(this.requireClient(), tagId, docId, updates),
|
|
1266
|
+
generate: (tagIds, docIds) => generateDocTags(this.requireClient(), tagIds, docIds)
|
|
1267
|
+
};
|
|
1268
|
+
// ── Contacts ──────────────────────────────────────────────────────────
|
|
1269
|
+
contacts = {
|
|
1270
|
+
list: () => listContacts(this.requireClient()),
|
|
1271
|
+
add: (emails) => addContacts(this.requireClient(), emails),
|
|
1272
|
+
remove: (contactIds) => removeContacts(this.requireClient(), contactIds),
|
|
1273
|
+
groupByStatus: groupContactsByStatus
|
|
1274
|
+
};
|
|
1275
|
+
// ── Direct Messages ───────────────────────────────────────────────────
|
|
1276
|
+
dm = {
|
|
1277
|
+
list: () => listDMs(this.requireClient()),
|
|
1278
|
+
send: (messages) => sendDM(this.requireClient(), messages),
|
|
1279
|
+
markRead: (messageIds) => markRead(this.requireClient(), messageIds),
|
|
1280
|
+
delete: (messageIds) => deleteDMs(this.requireClient(), messageIds)
|
|
1281
|
+
};
|
|
1282
|
+
// ── Settings ──────────────────────────────────────────────────────────
|
|
1283
|
+
settings = {
|
|
1284
|
+
get: () => getSettings(this.requireClient()),
|
|
1285
|
+
update: (body) => updateSettings(this.requireClient(), body)
|
|
1286
|
+
};
|
|
1287
|
+
// ── Agent Configuration ───────────────────────────────────────────────
|
|
1288
|
+
agentConfig = {
|
|
1289
|
+
list: () => listConfigs(this.requireClient()),
|
|
1290
|
+
get: (configId) => getConfig(this.requireClient(), configId),
|
|
1291
|
+
save: (body) => saveConfig(this.requireClient(), body),
|
|
1292
|
+
delete: (configId) => deleteConfig(this.requireClient(), configId),
|
|
1293
|
+
getSchema: () => getSchema(this.requireClient()),
|
|
1294
|
+
getModels: () => getModels(this.requireClient())
|
|
1295
|
+
};
|
|
1296
|
+
// ── Health ────────────────────────────────────────────────────────────
|
|
1297
|
+
health = {
|
|
1298
|
+
check: () => getHealth(this.requireClient()),
|
|
1299
|
+
models: () => getHealthModels(this.requireClient()),
|
|
1300
|
+
remoteModels: () => getRemoteModels(this.requireClient()),
|
|
1301
|
+
mcpTools: () => getMcpTools(this.requireClient())
|
|
1302
|
+
};
|
|
1303
|
+
// ── Files (OpenAI-compatible) ────────────────────────────────────────
|
|
1304
|
+
files = {
|
|
1305
|
+
list: (options) => listFiles(this.requireClient(), options),
|
|
1306
|
+
get: (fileId) => getFile(this.requireClient(), fileId),
|
|
1307
|
+
delete: (fileId) => deleteFile(this.requireClient(), fileId),
|
|
1308
|
+
upload: (fileData, fileName, purpose) => uploadFile2(this.getAuthHeaders(), fileData, fileName, purpose),
|
|
1309
|
+
getContent: (fileId) => getFileContent(this.getAuthHeaders(), fileId)
|
|
1310
|
+
};
|
|
1311
|
+
// ── Internal guards ───────────────────────────────────────────────────
|
|
1312
|
+
requireClient() {
|
|
1313
|
+
if (!this.client) {
|
|
1314
|
+
throw new ArbiError("Not initialized. Call login() or init() first.");
|
|
1315
|
+
}
|
|
1316
|
+
return this.client;
|
|
1317
|
+
}
|
|
1318
|
+
requireLogin() {
|
|
1319
|
+
if (!this.loginResult) {
|
|
1320
|
+
throw new ArbiError("Not logged in. Call login() first.");
|
|
1321
|
+
}
|
|
1322
|
+
return this.loginResult;
|
|
1323
|
+
}
|
|
1324
|
+
requireWorkspace() {
|
|
1325
|
+
if (!this.currentWorkspaceId) {
|
|
1326
|
+
throw new ArbiError("No workspace selected. Call selectWorkspace() first.");
|
|
1327
|
+
}
|
|
1328
|
+
return this.currentWorkspaceId;
|
|
1329
|
+
}
|
|
1330
|
+
};
|
|
1331
|
+
|
|
1332
|
+
exports.Arbi = Arbi;
|
|
1333
|
+
exports.ArbiApiError = ArbiApiError;
|
|
1334
|
+
exports.ArbiError = ArbiError;
|
|
1335
|
+
exports.agentconfig = agentconfig_exports;
|
|
1336
|
+
exports.assistant = assistant_exports;
|
|
1337
|
+
exports.authenticatedFetch = authenticatedFetch;
|
|
1338
|
+
exports.buildRetrievalChunkTool = buildRetrievalChunkTool;
|
|
1339
|
+
exports.buildRetrievalFullContextTool = buildRetrievalFullContextTool;
|
|
1340
|
+
exports.buildRetrievalTocTool = buildRetrievalTocTool;
|
|
1341
|
+
exports.connectWebSocket = connectWebSocket;
|
|
1342
|
+
exports.connectWithReconnect = connectWithReconnect;
|
|
1343
|
+
exports.consumeSSEStream = consumeSSEStream;
|
|
1344
|
+
exports.contacts = contacts_exports;
|
|
1345
|
+
exports.conversations = conversations_exports;
|
|
1346
|
+
exports.createAuthenticatedClient = createAuthenticatedClient;
|
|
1347
|
+
exports.dm = dm_exports;
|
|
1348
|
+
exports.doctags = doctags_exports;
|
|
1349
|
+
exports.documents = documents_exports;
|
|
1350
|
+
exports.files = files_exports;
|
|
1351
|
+
exports.formatFileSize = formatFileSize;
|
|
1352
|
+
exports.formatUserName = formatUserName;
|
|
1353
|
+
exports.formatWorkspaceChoices = formatWorkspaceChoices;
|
|
1354
|
+
exports.getErrorMessage = getErrorMessage;
|
|
1355
|
+
exports.health = health_exports;
|
|
1356
|
+
exports.parseSSEEvents = parseSSEEvents;
|
|
1357
|
+
exports.performPasswordLogin = performPasswordLogin;
|
|
1358
|
+
exports.requireData = requireData;
|
|
1359
|
+
exports.requireOk = requireOk;
|
|
1360
|
+
exports.resolveAuth = resolveAuth;
|
|
1361
|
+
exports.resolveWorkspace = resolveWorkspace;
|
|
1362
|
+
exports.selectWorkspace = selectWorkspace;
|
|
1363
|
+
exports.selectWorkspaceById = selectWorkspaceById;
|
|
1364
|
+
exports.settings = settings_exports;
|
|
1365
|
+
exports.streamSSE = streamSSE;
|
|
1366
|
+
exports.tags = tags_exports;
|
|
1367
|
+
exports.workspaces = workspaces_exports;
|
|
1368
|
+
//# sourceMappingURL=browser.cjs.map
|
|
1369
|
+
//# sourceMappingURL=browser.cjs.map
|