@arbidocs/sdk 0.3.16 → 0.3.18
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 +58 -81
- package/dist/{browser-DFRwcoc1.d.cts → browser-DUQ3Eyvd.d.cts} +91 -5
- package/dist/{browser-DFRwcoc1.d.ts → browser-DUQ3Eyvd.d.ts} +91 -5
- package/dist/browser.cjs +81 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +1 -1
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +78 -2
- package/dist/browser.js.map +1 -1
- package/dist/index.cjs +247 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +66 -3
- package/dist/index.d.ts +66 -3
- package/dist/index.js +241 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/fetch.ts","../src/config.ts","../src/auth.ts","../src/sse.ts","../src/websocket.ts","../src/format.ts","../src/operations/documents.ts","../src/operations/workspaces.ts","../src/operations/conversations.ts","../src/operations/assistant.ts","../src/operations/tags.ts","../src/operations/contacts.ts","../src/operations/doctags.ts","../src/operations/dm.ts","../src/operations/settings.ts","../src/operations/agentconfig.ts","../src/operations/health.ts","../src/operations/files.ts","../src/arbi.ts","../src/operations/documents-node.ts","../src/operations/responses.ts"],"names":["path","os","fs","config","createArbiClient","base64ToBytes","deriveEncryptionKeypairFromSigning","sealedBoxDecrypt","createWorkspaceKeyHeader","arbi","loginResult","buildWebSocketUrl","createAuthMessage","parseServerMessage","isMessageType","uploadFile"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Core error types and throwing error utilities.\n *\n * Unlike CLI helpers which call process.exit(1), these throw typed errors\n * that consumers (CLI, TUI) can catch and handle in their own way.\n */\n\nexport class ArbiError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ArbiError'\n }\n}\n\nexport class ArbiApiError extends ArbiError {\n public readonly apiError?: unknown\n\n constructor(message: string, apiError?: unknown) {\n super(message)\n this.name = 'ArbiApiError'\n this.apiError = apiError\n }\n}\n\n/**\n * Check API response and throw on error. Returns narrowed non-null data.\n */\nexport function requireData<T>(result: { data?: T; error?: unknown }, message: string): T {\n if (result.error || !result.data) {\n throw new ArbiApiError(message, result.error)\n }\n return result.data\n}\n\n/**\n * Check API response for delete/void operations (no data expected).\n */\nexport function requireOk(result: { error?: unknown }, message: string): void {\n if (result.error) {\n throw new ArbiApiError(message, result.error)\n }\n}\n\n/**\n * Extract a human-readable message from an unknown error value.\n * Centralises the `err instanceof Error ? err.message : String(err)` pattern.\n *\n * Unwraps `.cause` chains to surface the root error — critical for Node.js\n * fetch errors where TypeError(\"fetch failed\") wraps the real cause\n * (ECONNREFUSED, UNABLE_TO_VERIFY_LEAF_SIGNATURE, etc.).\n */\nexport function getErrorMessage(err: unknown): string {\n if (!(err instanceof Error)) return String(err)\n\n // Walk the cause chain to find the deepest meaningful error\n const rootCause = getDeepestCause(err)\n if (rootCause !== err) {\n const rootMsg = rootCause.message || String(rootCause)\n // Include both the top-level context and root cause\n if (err.message && !err.message.includes(rootMsg)) {\n return `${err.message}: ${rootMsg}`\n }\n }\n\n return err.message\n}\n\n/**\n * Walk the .cause chain to find the deepest Error.\n */\nfunction getDeepestCause(err: Error): Error {\n let current: Error = err\n const seen = new Set<Error>()\n while (current.cause instanceof Error && !seen.has(current.cause)) {\n seen.add(current)\n current = current.cause\n }\n return current\n}\n\n/**\n * Extract the Node.js error code (e.g. 'ECONNREFUSED', 'ENOTFOUND') from an\n * error or its cause chain. Returns undefined if no code is found.\n */\nexport function getErrorCode(err: unknown): string | undefined {\n if (!(err instanceof Error)) return undefined\n\n let current: Error | undefined = err\n const seen = new Set<Error>()\n while (current && !seen.has(current)) {\n seen.add(current)\n const code = (current as Error & { code?: string }).code\n if (typeof code === 'string') return code\n current = current.cause instanceof Error ? current.cause : undefined\n }\n return undefined\n}\n","/**\n * Authenticated fetch utility — eliminates repeated raw-fetch boilerplate\n * in operations that can't use the typed SDK client (streaming, multipart, etc.).\n */\n\nimport { ArbiApiError } from './errors.js'\n\ninterface AuthHeaders {\n baseUrl: string\n accessToken: string\n workspaceKeyHeader: string\n}\n\ninterface AuthFetchOptions extends AuthHeaders {\n /** URL path relative to baseUrl (e.g. '/v1/document/upload'). */\n path: string\n method?: string\n body?: string | FormData | ArrayBuffer | ReadableStream | Blob | null\n /** Extra headers to merge in. */\n headers?: Record<string, string>\n}\n\n/** Friendly fallbacks for status codes when the server body is empty or unparseable. */\nconst STATUS_FALLBACKS: Record<number, string> = {\n 401: 'Token has expired. Please run: arbi login',\n 403: 'Access denied. You may not have permission for this workspace.',\n 404: 'Resource not found.',\n 503: 'The selected LLM is not responding. Please retry or select another model.',\n}\n\n/**\n * Extract a human-readable error message from an HTTP response.\n *\n * Always tries to read the response body first — the server often includes\n * a specific `detail` string (e.g. \"Parent message not found\") that is more\n * useful than a generic status-code description. Falls back to well-known\n * status messages only when the body is empty or unparseable.\n */\nasync function extractErrorMessage(res: Response): Promise<string> {\n // Try to parse error details from response body\n let bodyDetail: string | undefined\n try {\n const text = await res.text()\n if (text) {\n try {\n const json = JSON.parse(text) as { detail?: string; message?: string; error?: string }\n bodyDetail = json.detail || json.message || json.error || undefined\n } catch {\n // Not JSON — use raw text if it's reasonably short\n if (text.length < 200) bodyDetail = text\n }\n }\n } catch {\n // Ignore read errors\n }\n\n if (bodyDetail) return `Request failed (${res.status}): ${bodyDetail}`\n\n const fallback = STATUS_FALLBACKS[res.status]\n if (fallback) return fallback\n\n return `Request failed: ${res.status} ${res.statusText}`\n}\n\n/**\n * Make an authenticated fetch request with standard error handling.\n * Automatically sets Authorization + workspace-key headers.\n * Throws on non-ok responses with a human-readable message including server error details.\n */\nexport async function authenticatedFetch(options: AuthFetchOptions): Promise<Response> {\n const { baseUrl, accessToken, workspaceKeyHeader, path, method, body, headers } = options\n\n const res = await fetch(`${baseUrl}${path}`, {\n method: method ?? (body ? 'POST' : 'GET'),\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'workspace-key': workspaceKeyHeader,\n ...headers,\n },\n body,\n })\n\n if (!res.ok) {\n const message = await extractErrorMessage(res)\n throw new ArbiApiError(message, { status: res.status, statusText: res.statusText })\n }\n\n return res\n}\n\nexport type { AuthHeaders }\n","/**\n * Configuration persistence — file-based implementation for Node.js environments.\n *\n * Browser consumers should import from './config-types.ts' directly.\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { ArbiError } from './errors.js'\nimport type { CliConfig, CliCredentials, ChatSession, ConfigStore } from './config-types.js'\n\n// Re-export types for backward compatibility\nexport type { CliConfig, CliCredentials, ChatSession, ConfigStore } from './config-types.js'\n\n// ── File-based implementation ────────────────────────────────────────────────\n\nconst DEFAULT_SESSION: ChatSession = {\n lastMessageExtId: null,\n conversationExtId: null,\n workspaceId: null,\n}\n\nexport class FileConfigStore implements ConfigStore {\n private readonly configDir: string\n private readonly configFile: string\n private readonly credentialsFile: string\n private readonly sessionFile: string\n\n constructor(configDir?: string) {\n this.configDir = configDir ?? process.env.ARBI_CONFIG_DIR ?? path.join(os.homedir(), '.arbi')\n this.configFile = path.join(this.configDir, 'config.json')\n this.credentialsFile = path.join(this.configDir, 'credentials.json')\n this.sessionFile = path.join(this.configDir, 'session.json')\n }\n\n private ensureConfigDir(): void {\n if (!fs.existsSync(this.configDir)) {\n fs.mkdirSync(this.configDir, { recursive: true, mode: 0o700 })\n }\n }\n\n private writeSecureFile(filePath: string, data: object): void {\n this.ensureConfigDir()\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', { mode: 0o600 })\n }\n\n private readJsonFile<T>(filePath: string): T | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as T\n } catch {\n return null\n }\n }\n\n // ── Config ──────────────────────────────────────────────────────────────\n\n getConfig(): CliConfig | null {\n return this.readJsonFile<CliConfig>(this.configFile)\n }\n\n saveConfig(config: CliConfig): void {\n this.writeSecureFile(this.configFile, config)\n }\n\n updateConfig(updates: Partial<CliConfig>): void {\n const existing = this.getConfig() || ({} as Partial<CliConfig>)\n this.saveConfig({ ...existing, ...updates } as CliConfig)\n }\n\n requireConfig(): CliConfig {\n const config = this.getConfig()\n if (!config?.baseUrl) {\n throw new ArbiError('Not configured. Run: arbi config set-url <url>')\n }\n return config\n }\n\n // ── Credentials ─────────────────────────────────────────────────────────\n\n getCredentials(): CliCredentials | null {\n return this.readJsonFile<CliCredentials>(this.credentialsFile)\n }\n\n saveCredentials(creds: CliCredentials): void {\n this.writeSecureFile(this.credentialsFile, creds)\n }\n\n deleteCredentials(): void {\n try {\n fs.unlinkSync(this.credentialsFile)\n } catch {\n // Already gone\n }\n }\n\n requireCredentials(): CliCredentials {\n const creds = this.getCredentials()\n if (!creds) {\n throw new ArbiError('Not logged in. Run: arbi login')\n }\n return creds\n }\n\n // ── Chat session ────────────────────────────────────────────────────────\n\n getChatSession(): ChatSession {\n return this.readJsonFile<ChatSession>(this.sessionFile) || { ...DEFAULT_SESSION }\n }\n\n saveChatSession(session: ChatSession): void {\n this.writeSecureFile(this.sessionFile, session)\n }\n\n updateChatSession(updates: Partial<ChatSession>): void {\n const existing = this.getChatSession()\n this.saveChatSession({ ...existing, ...updates })\n }\n\n clearChatSession(): void {\n this.saveChatSession({ ...DEFAULT_SESSION })\n }\n\n /**\n * Try to resolve config from multiple sources, in priority order:\n *\n * 1. Existing `~/.arbi/config.json` (highest priority)\n * 2. `ARBI_SERVER_URL` environment variable\n * 3. `.env` file in `searchDir` → read `VITE_DEPLOYMENT_DOMAIN`\n * 4. `public/config.json` in `searchDir` → read `deployment.domain`\n * 5. Default to `https://localhost`\n *\n * Returns `{ config, source }` where source describes where the config came from.\n * Saves auto-detected config to disk so subsequent calls use the fast path.\n */\n resolveConfigWithFallbacks(searchDir?: string): { config: CliConfig; source: string } {\n // 1. Existing config file\n const existing = this.getConfig()\n if (existing?.baseUrl) {\n return { config: existing, source: 'config' }\n }\n\n // 2. ARBI_SERVER_URL env var\n const envUrl = process.env.ARBI_SERVER_URL\n if (envUrl) {\n const domain = new URL(envUrl).hostname\n const config: CliConfig = { baseUrl: envUrl.replace(/\\/$/, ''), deploymentDomain: domain }\n this.saveConfig(config)\n return { config, source: 'ARBI_SERVER_URL env var' }\n }\n\n const dir = searchDir || process.cwd()\n\n // 3. .env file → VITE_DEPLOYMENT_DOMAIN\n const dotenvConfig = this.readDotEnvDomain(path.join(dir, '.env'))\n if (dotenvConfig) {\n this.saveConfig(dotenvConfig)\n return { config: dotenvConfig, source: '.env file' }\n }\n\n // 4. public/config.json → deployment.domain\n const publicConfig = this.readPublicConfigDomain(path.join(dir, 'public', 'config.json'))\n if (publicConfig) {\n this.saveConfig(publicConfig)\n return { config: publicConfig, source: 'public/config.json' }\n }\n\n // 5. Default to https://localhost\n const config: CliConfig = { baseUrl: 'https://localhost', deploymentDomain: 'localhost' }\n this.saveConfig(config)\n return { config, source: 'default (https://localhost)' }\n }\n\n /**\n * Read VITE_DEPLOYMENT_DOMAIN from a .env file.\n */\n private readDotEnvDomain(filePath: string): CliConfig | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n const match = content.match(/^VITE_DEPLOYMENT_DOMAIN\\s*=\\s*(.+)$/m)\n if (match) {\n const domain = match[1].trim().replace(/^[\"']|[\"']$/g, '')\n if (domain) {\n return { baseUrl: `https://${domain}`, deploymentDomain: domain }\n }\n }\n } catch {\n // File not found or unreadable\n }\n return null\n }\n\n /**\n * Read deployment.domain from a public/config.json file.\n */\n private readPublicConfigDomain(filePath: string): CliConfig | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n const json = JSON.parse(content) as { deployment?: { domain?: string } }\n const domain = json?.deployment?.domain\n if (domain) {\n return { baseUrl: `https://${domain}`, deploymentDomain: domain }\n }\n } catch {\n // File not found or unparseable\n }\n return null\n }\n}\n","/**\n * Parameterized authentication functions.\n *\n * Unlike CLI's client.ts, these take explicit params instead of reading from disk.\n * This allows both CLI and TUI to use them with their own config sources.\n */\n\nimport {\n createArbiClient,\n sealedBoxDecrypt,\n deriveEncryptionKeypairFromSigning,\n createWorkspaceKeyHeader,\n base64ToBytes,\n type ArbiClient,\n type LoginResult,\n} from '@arbidocs/client'\nimport { ArbiError } from './errors.js'\nimport type { CliConfig, CliCredentials, ConfigStore } from './config-types.js'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface AuthenticatedClient {\n arbi: ArbiClient\n loginResult: LoginResult\n}\n\nexport interface AuthContext {\n arbi: ArbiClient\n loginResult: LoginResult\n config: CliConfig\n}\n\nexport interface WorkspaceContext extends AuthContext {\n workspaceId: string\n accessToken: string\n workspaceKeyHeader: string\n}\n\n// ── Workspace choice formatting ──────────────────────────────────────────────\n\n/** Minimal workspace shape required by formatWorkspaceChoices. */\ninterface WorkspaceForChoice {\n name: string\n external_id: string\n shared_document_count: number\n private_document_count: number\n}\n\n/**\n * Format a list of workspaces into prompt-friendly choices.\n * Returns `{ name, value, description }` objects suitable for @inquirer/prompts\n * or any similar select component.\n */\nexport function formatWorkspaceChoices(\n wsList: WorkspaceForChoice[]\n): Array<{ name: string; value: string; description: string }> {\n return wsList.map((ws) => {\n const totalDocs = ws.shared_document_count + ws.private_document_count\n return {\n name: `${ws.name} (${totalDocs} docs)`,\n value: ws.external_id,\n description: ws.external_id,\n }\n })\n}\n\n// ── Functions ────────────────────────────────────────────────────────────────\n\n/**\n * Create an SDK client, init sodium, and log in with stored signing key.\n * Returns the client + login result (which includes serverSessionKey).\n */\nexport async function createAuthenticatedClient(\n config: CliConfig,\n creds: CliCredentials,\n store: ConfigStore\n): Promise<AuthenticatedClient> {\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n\n await arbi.crypto.initSodium()\n\n const signingPrivateKey = base64ToBytes(creds.signingPrivateKeyBase64)\n\n const loginResult = await arbi.auth.loginWithKey({\n email: creds.email,\n signingPrivateKey,\n })\n\n // Update stored server session key (it changes each login).\n // Clear cached workspace tokens — the old workspaceKeyHeader was derived from\n // the previous session key and is now invalid.\n store.saveCredentials({\n ...creds,\n serverSessionKeyBase64: arbi.crypto.bytesToBase64(loginResult.serverSessionKey),\n accessToken: undefined,\n workspaceKeyHeader: undefined,\n workspaceId: undefined,\n tokenTimestamp: undefined,\n })\n\n return { arbi, loginResult }\n}\n\n/**\n * Interactive (password-based) login flow.\n *\n * Creates an SDK client, initializes sodium, authenticates with email/password,\n * and persists the derived credentials to the config store.\n *\n * Use this for CLI/TUI login commands. For session recovery from stored keys,\n * use createAuthenticatedClient() instead.\n */\nexport async function performPasswordLogin(\n config: CliConfig,\n email: string,\n password: string,\n store: ConfigStore\n): Promise<AuthContext> {\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n\n await arbi.crypto.initSodium()\n\n const loginResult = await arbi.auth.login({ email, password })\n\n store.saveCredentials({\n email,\n signingPrivateKeyBase64: arbi.crypto.bytesToBase64(loginResult.signingPrivateKey),\n serverSessionKeyBase64: arbi.crypto.bytesToBase64(loginResult.serverSessionKey),\n // Clear any cached workspace tokens — new session key invalidates them\n accessToken: undefined,\n workspaceKeyHeader: undefined,\n workspaceId: undefined,\n tokenTimestamp: undefined,\n })\n\n return { arbi, loginResult, config }\n}\n\n/**\n * Decrypt wrapped workspace key and set it as the active workspace header.\n */\nexport async function selectWorkspace(\n arbi: ArbiClient,\n workspaceId: string,\n wrappedKey: string,\n serverSessionKey: Uint8Array,\n signingPrivateKeyBase64: string\n): Promise<void> {\n const signingPrivateKey = base64ToBytes(signingPrivateKeyBase64)\n\n // Ed25519 public key is the last 32 bytes of the 64-byte private key\n const ed25519PublicKey = signingPrivateKey.slice(32, 64)\n const encryptionKeyPair = deriveEncryptionKeypairFromSigning({\n publicKey: ed25519PublicKey,\n secretKey: signingPrivateKey,\n })\n\n const workspaceKey = sealedBoxDecrypt(wrappedKey, encryptionKeyPair.secretKey)\n const header = await createWorkspaceKeyHeader(workspaceKey, serverSessionKey)\n\n arbi.session.setSelectedWorkspace(workspaceId)\n arbi.session.setCachedWorkspaceHeader(workspaceId, header)\n}\n\n/**\n * Generate an encrypted workspace key for the given workspace.\n * Used for operations that need a key for a workspace other than the current one\n * (e.g., copy documents to a target workspace).\n */\nexport async function generateEncryptedWorkspaceKey(\n arbi: ArbiClient,\n wrappedKey: string,\n serverSessionKey: Uint8Array,\n signingPrivateKeyBase64: string\n): Promise<string> {\n const signingPrivateKey = base64ToBytes(signingPrivateKeyBase64)\n const ed25519PublicKey = signingPrivateKey.slice(32, 64)\n const encryptionKeyPair = deriveEncryptionKeypairFromSigning({\n publicKey: ed25519PublicKey,\n secretKey: signingPrivateKey,\n })\n\n const workspaceKey = sealedBoxDecrypt(wrappedKey, encryptionKeyPair.secretKey)\n return createWorkspaceKeyHeader(workspaceKey, serverSessionKey)\n}\n\n/**\n * Find a workspace by ID in the user's workspace list, select it, and return workspace info.\n */\nexport async function selectWorkspaceById(\n arbi: ArbiClient,\n workspaceId: string,\n serverSessionKey: Uint8Array,\n signingPrivateKeyBase64: string\n): Promise<{ external_id: string; name: string; wrapped_key: string }> {\n const { data: workspaces, error } = await arbi.fetch.GET('/v1/user/workspaces')\n if (error || !workspaces) {\n throw new ArbiError('Failed to fetch workspaces')\n }\n\n const ws = workspaces.find((w) => w.external_id === workspaceId)\n if (!ws || !ws.wrapped_key) {\n throw new ArbiError(`Workspace ${workspaceId} not found or has no encryption key`)\n }\n\n await selectWorkspace(\n arbi,\n ws.external_id,\n ws.wrapped_key,\n serverSessionKey,\n signingPrivateKeyBase64\n )\n\n // Exchange workspace key for a workspace-scoped JWT\n const workspaceKeyHeader = arbi.session.getWorkspaceKeyHeader()\n if (workspaceKeyHeader) {\n const { data: openResult, error: openError } = await arbi.fetch.POST(\n '/v1/workspace/{workspace_ext_id}/open',\n {\n params: { path: { workspace_ext_id: ws.external_id } },\n body: { workspace_key: workspaceKeyHeader },\n }\n )\n if (!openError && openResult?.access_token) {\n arbi.session.setAccessToken(openResult.access_token)\n }\n }\n\n return { external_id: ws.external_id, name: ws.name, wrapped_key: ws.wrapped_key }\n}\n\n/**\n * Authenticate and return the SDK client + config.\n * Throws ArbiError instead of calling process.exit.\n */\nexport async function resolveAuth(store: ConfigStore): Promise<AuthContext> {\n const config = store.requireConfig()\n const creds = store.requireCredentials()\n const { arbi, loginResult } = await createAuthenticatedClient(config, creds, store)\n return { arbi, loginResult, config }\n}\n\n/** Max age for cached tokens before re-login (50 minutes — JWTs typically expire at 60). */\nconst TOKEN_MAX_AGE_MS = 50 * 60 * 1000\n\n/**\n * Check if a cached token is still usable.\n */\nfunction isCachedTokenValid(\n creds: CliCredentials,\n workspaceId: string\n): creds is CliCredentials & {\n accessToken: string\n workspaceKeyHeader: string\n workspaceId: string\n tokenTimestamp: string\n} {\n return !!(\n creds.accessToken &&\n creds.workspaceKeyHeader &&\n creds.workspaceId === workspaceId &&\n creds.tokenTimestamp &&\n Date.now() - new Date(creds.tokenTimestamp).getTime() < TOKEN_MAX_AGE_MS\n )\n}\n\n/**\n * Authenticate, resolve workspace, and set up headers.\n * Uses cached JWT when available for the same workspace and not expired.\n * Throws ArbiError instead of calling process.exit.\n */\nexport async function resolveWorkspace(\n store: ConfigStore,\n workspaceOpt?: string\n): Promise<WorkspaceContext> {\n const config = store.requireConfig()\n const creds = store.requireCredentials()\n const workspaceId = workspaceOpt || config.selectedWorkspaceId\n\n if (!workspaceId) {\n throw new ArbiError('No workspace selected. Run: arbi workspace select <id>')\n }\n\n // Try cached token first — skip login entirely, use stored JWT + workspace key.\n // The session key stays valid until logout; only the workspace token changes on switch.\n if (isCachedTokenValid(creds, workspaceId)) {\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n await arbi.crypto.initSodium()\n\n // Set cached auth state directly — no login round-trip needed\n arbi.session.setSelectedWorkspace(workspaceId)\n arbi.session.setAccessToken(creds.accessToken)\n arbi.session.setCachedWorkspaceHeader(workspaceId, creds.workspaceKeyHeader)\n\n // Reconstruct loginResult from stored credentials\n const signingPrivateKey = base64ToBytes(creds.signingPrivateKeyBase64)\n const serverSessionKey = base64ToBytes(creds.serverSessionKeyBase64)\n const loginResult: LoginResult = {\n accessToken: creds.accessToken,\n signingPrivateKey,\n serverSessionKey,\n }\n\n return {\n arbi,\n loginResult,\n config,\n workspaceId,\n accessToken: creds.accessToken,\n workspaceKeyHeader: creds.workspaceKeyHeader,\n }\n }\n\n // Full re-login + workspace open\n const { arbi, loginResult } = await createAuthenticatedClient(config, creds, store)\n await selectWorkspaceById(\n arbi,\n workspaceId,\n loginResult.serverSessionKey,\n creds.signingPrivateKeyBase64\n )\n\n const accessToken = arbi.session.getState().accessToken\n const workspaceKeyHeader = arbi.session.getWorkspaceKeyHeader()\n\n if (!accessToken || !workspaceKeyHeader) {\n throw new ArbiError('Authentication error — missing token or workspace key')\n }\n\n // Cache the new token for subsequent commands\n store.saveCredentials({\n ...store.requireCredentials(),\n accessToken,\n workspaceKeyHeader,\n workspaceId,\n tokenTimestamp: new Date().toISOString(),\n })\n\n return { arbi, loginResult, config, workspaceId, accessToken, workspaceKeyHeader }\n}\n","/**\n * Server-Sent Events (SSE) parsing utilities.\n *\n * Extracted from CLI ask.ts for shared use by CLI and TUI.\n */\n\nimport type {\n SSEStreamStartData,\n AgentStepEvent,\n UserMessageEvent,\n MessageQueuedEvent,\n MessageMetadataPayload,\n UserInputRequestEvent,\n ArtifactEvent,\n ResponseCreatedEvent,\n ResponseOutputTextDeltaEvent,\n ResponseOutputTextDoneEvent,\n ResponseOutputItemAddedEvent,\n ResponseOutputItemDoneEvent,\n ResponseContentPartAddedEvent,\n ResponseCompletedEvent,\n ResponseFailedEvent,\n ResponseUsage,\n TokenBudgetContext,\n} from './sse-types.js'\n\nexport interface SSEEvent {\n event: string\n data: string\n}\n\nexport const TOOL_LABELS: Record<string, string> = {\n search_documents: 'Searching documents',\n get_document_passages: 'Reading document',\n get_table_of_contents: 'Getting table of contents',\n view_document_pages: 'Viewing document pages',\n get_full_document: 'Reading full document',\n web_search: 'Searching the web',\n read_url: 'Reading web pages',\n ask_user: 'Asking user',\n compaction: 'Compacting conversation',\n personal_agent: 'Running agent',\n create_artifact: 'Creating artifact',\n create_plan: 'Creating plan',\n save_skill: 'Saving skill',\n run_code: 'Running code',\n}\n\nexport const LIFECYCLE_LABELS: Record<string, string> = {\n evaluation: 'Evaluating results',\n answering: 'Writing answer',\n reviewing: 'Reviewing answer',\n planning: 'Planning',\n tool_progress: 'Working',\n}\n\n/**\n * Format an AgentStepEvent into a human-readable label.\n *\n * Priority:\n * 1. `focus` — the agent's descriptive sentence about what it's doing\n * 2. For `tool_progress` — tool-specific label + optional message\n * 3. Lifecycle label (planning, evaluation, etc.)\n * 4. Tool name from detail\n * 5. Fallback to step name or empty string\n */\nexport function formatAgentStepLabel(step: AgentStepEvent): string {\n if (step.focus) return step.focus\n\n const detail = step.detail as Array<{ tool?: string; message?: string }> | undefined\n\n if (step.step === 'tool_progress' && detail && detail.length > 0) {\n const toolName = detail[0].tool\n const label = (toolName && TOOL_LABELS[toolName]) || LIFECYCLE_LABELS.tool_progress\n const message = detail[0].message\n return message ? `${label}: ${message}` : label\n }\n\n if (step.step) {\n return LIFECYCLE_LABELS[step.step] || step.step\n }\n\n if (detail && detail.length > 0 && detail[0].tool) {\n return TOOL_LABELS[detail[0].tool] || detail[0].tool\n }\n\n return ''\n}\n\n/**\n * Parse SSE events from a chunk of text, combining with a buffer\n * of incomplete data from previous chunks.\n *\n * Returns parsed events and any remaining incomplete data.\n */\nexport function parseSSEEvents(\n chunk: string,\n buffer: string\n): { events: SSEEvent[]; remaining: string } {\n const combined = buffer + chunk\n const events: SSEEvent[] = []\n const parts = combined.split('\\n\\n')\n const remaining = parts.pop() || ''\n\n for (const part of parts) {\n if (!part.trim()) continue\n let eventType = ''\n let eventData = ''\n for (const line of part.split('\\n')) {\n if (line.startsWith('event: ')) eventType = line.slice(7).trim()\n else if (line.startsWith('data: ')) eventData = line.slice(6)\n }\n if (eventType && eventData) events.push({ event: eventType, data: eventData })\n }\n\n return { events, remaining }\n}\n\n/**\n * Callbacks for streaming SSE events. All callbacks are optional —\n * omitted callbacks simply ignore that event type.\n */\nexport interface SSEStreamCallbacks {\n onStreamStart?: (data: SSEStreamStartData) => void\n onToken?: (content: string) => void\n onTextDone?: (text: string) => void\n onOutputItemAdded?: (data: ResponseOutputItemAddedEvent) => void\n onOutputItemDone?: (data: ResponseOutputItemDoneEvent) => void\n onContentPartAdded?: (data: ResponseContentPartAddedEvent) => void\n onAgentStep?: (data: AgentStepEvent) => void\n onError?: (message: string) => void\n onMessageQueued?: (data: MessageQueuedEvent) => void\n onUserMessage?: (data: UserMessageEvent) => void\n onMetadata?: (data: MessageMetadataPayload) => void\n onUserInputRequest?: (data: UserInputRequestEvent) => void\n onArtifact?: (data: ArtifactEvent) => void\n onElapsedTime?: (t: number) => void\n onUsage?: (usage: ResponseUsage) => void\n onComplete?: () => void\n}\n\n/**\n * Result returned after the SSE stream is fully consumed.\n */\nexport interface SSEStreamResult {\n text: string\n assistantMessageExtId: string | null\n agentSteps: string[]\n /** Total number of tool calls across all agent steps. */\n toolCallCount: number\n errors: string[]\n userMessage: UserMessageEvent | null\n metadata: MessageMetadataPayload | null\n artifacts: ArtifactEvent[]\n usage: ResponseUsage | null\n /** Token budget context snapshot from response.completed. */\n context: TokenBudgetContext | null\n}\n\n/**\n * Stream SSE events from a Response, invoking callbacks as events arrive.\n *\n * This is the primary streaming function — use it when you need real-time\n * event handling (CLI streaming to stdout, TUI rendering, etc.).\n *\n * Also accumulates the full response and returns it, so callers can use\n * both the streaming callbacks and the final result.\n */\nexport async function streamSSE(\n response: Response,\n callbacks: SSEStreamCallbacks = {}\n): Promise<SSEStreamResult> {\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder('utf-8')\n let sseBuffer = ''\n let text = ''\n let assistantMessageExtId: string | null = null\n const agentSteps: string[] = []\n let toolCallCount = 0\n const errors: string[] = []\n const artifacts: ArtifactEvent[] = []\n let userMessage: UserMessageEvent | null = null\n let metadata: MessageMetadataPayload | null = null\n let usage: ResponseUsage | null = null\n let context: TokenBudgetContext | null = null\n\n // Each handler receives the raw JSON string and parses to the correct type.\n const eventHandlers: Record<string, (raw: string) => void> = {\n // OpenAI Responses API events (dot-separated names from server)\n 'response.created': (raw) => {\n const data: ResponseCreatedEvent = JSON.parse(raw)\n const id = data.response?.id\n if (id) assistantMessageExtId = id\n callbacks.onStreamStart?.({ assistant_message_ext_id: id })\n if (data.t != null) callbacks.onElapsedTime?.(data.t)\n },\n 'response.output_item.added': (raw) => {\n const data: ResponseOutputItemAddedEvent = JSON.parse(raw)\n callbacks.onOutputItemAdded?.(data)\n },\n 'response.content_part.added': (raw) => {\n const data: ResponseContentPartAddedEvent = JSON.parse(raw)\n callbacks.onContentPartAdded?.(data)\n },\n 'response.output_text.delta': (raw) => {\n const data: ResponseOutputTextDeltaEvent = JSON.parse(raw)\n if (data.delta) {\n text += data.delta\n callbacks.onToken?.(data.delta)\n }\n },\n 'response.output_text.done': (raw) => {\n const data: ResponseOutputTextDoneEvent = JSON.parse(raw)\n callbacks.onTextDone?.(data.text)\n },\n 'response.output_item.done': (raw) => {\n const data: ResponseOutputItemDoneEvent = JSON.parse(raw)\n callbacks.onOutputItemDone?.(data)\n },\n 'response.completed': (raw) => {\n const data: ResponseCompletedEvent = JSON.parse(raw)\n if (data.response?.usage) {\n usage = data.response.usage\n callbacks.onUsage?.(data.response.usage)\n }\n // Extract metadata from response.completed envelope (backend embeds it here)\n if (data.response?.metadata) {\n const meta = data.response.metadata as MessageMetadataPayload\n metadata = meta\n callbacks.onMetadata?.(meta)\n }\n // Capture token budget context snapshot\n if (data.context) {\n context = data.context\n }\n if (data.t != null) callbacks.onElapsedTime?.(data.t)\n callbacks.onComplete?.()\n },\n 'response.failed': (raw) => {\n const data: ResponseFailedEvent = JSON.parse(raw)\n const message = data.response?.error?.message || 'Unknown streaming error'\n errors.push(message)\n callbacks.onError?.(message)\n },\n // ARBI-specific events (dot-prefixed from server)\n 'arbi.message_queued': (raw) => {\n const data: MessageQueuedEvent = JSON.parse(raw)\n // For continuation queries, the queued event includes the full user message\n // with status=\"queued\" so the frontend can display it before the gate opens.\n if (data.user_message) {\n userMessage = data.user_message\n callbacks.onUserMessage?.(data.user_message)\n }\n callbacks.onMessageQueued?.(data)\n },\n 'arbi.agent_step': (raw) => {\n const data: AgentStepEvent = JSON.parse(raw)\n const label = formatAgentStepLabel(data)\n if (label) agentSteps.push(label)\n // Count tool calls from detail array (each entry = one tool call)\n const detail = data.detail as Array<{ tool?: string }> | undefined\n if (detail && Array.isArray(detail)) {\n toolCallCount += detail.filter((d) => d.tool).length\n }\n callbacks.onAgentStep?.(data)\n if (data.t != null) callbacks.onElapsedTime?.(data.t)\n },\n 'arbi.user_message': (raw) => {\n const data: UserMessageEvent = JSON.parse(raw)\n userMessage = data\n callbacks.onUserMessage?.(data)\n },\n 'arbi.message_metadata': (raw) => {\n const data: MessageMetadataPayload = JSON.parse(raw)\n metadata = data\n callbacks.onMetadata?.(data)\n },\n 'arbi.user_input_request': (raw) => {\n const data: UserInputRequestEvent = JSON.parse(raw)\n callbacks.onUserInputRequest?.(data)\n },\n 'arbi.artifact': (raw) => {\n const data: ArtifactEvent = JSON.parse(raw)\n artifacts.push(data)\n callbacks.onArtifact?.(data)\n },\n 'response.complete': () => {\n callbacks.onComplete?.()\n },\n }\n\n const processEvents = (events: SSEEvent[]) => {\n for (const { event, data } of events) {\n try {\n const handler = eventHandlers[event]\n if (handler) handler(data)\n } catch {\n /* skip unparseable events */\n }\n }\n }\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n const { events, remaining } = parseSSEEvents(decoder.decode(value, { stream: true }), sseBuffer)\n sseBuffer = remaining\n processEvents(events)\n }\n\n // Process any remaining buffered data\n if (sseBuffer.trim()) {\n const { events } = parseSSEEvents(sseBuffer + '\\n\\n', '')\n processEvents(events)\n }\n\n return {\n text,\n assistantMessageExtId,\n agentSteps,\n toolCallCount,\n errors,\n userMessage,\n metadata,\n artifacts,\n usage,\n context,\n }\n}\n\n/**\n * Consume an entire SSE stream without streaming callbacks.\n * Convenience alias for `streamSSE(response)`.\n */\nexport const consumeSSEStream = streamSSE\n","/**\n * WebSocket connection manager.\n *\n * Uses Node.js native WebSocket (available in Node 22+).\n * Authenticates via SDK helpers, routes typed messages to the consumer.\n */\n\nimport {\n buildWebSocketUrl,\n createAuthMessage,\n parseServerMessage,\n isMessageType,\n type WebSocketServerMessage,\n type WsAuthResultMessage,\n type WsTaskUpdateMessage,\n type WsBatchCompleteMessage,\n type WsErrorMessage,\n type WsPresenceUpdateMessage,\n type WsNotificationResponse,\n type WsResponseCompleteMessage,\n} from '@arbidocs/client'\n\nconst AUTH_TIMEOUT_MS = 10_000\nconst MAX_BACKOFF_MS = 30_000\n\nexport interface WsConnection {\n close: () => void\n}\n\nexport interface ConnectOptions {\n baseUrl: string\n accessToken: string\n onMessage: (msg: WebSocketServerMessage) => void\n onClose?: (code: number, reason: string) => void\n}\n\nexport interface ReconnectOptions extends ConnectOptions {\n maxRetries?: number\n initialDelayMs?: number\n onReconnecting?: (attempt: number, maxRetries: number) => void\n onReconnected?: () => void\n onReconnectFailed?: () => void\n}\n\nexport interface ReconnectableWsConnection {\n close: () => void\n}\n\n/**\n * Open a WebSocket, authenticate, and start routing messages.\n *\n * Resolves after a successful `auth_result`, rejects on auth failure or timeout.\n * Subsequent messages are dispatched to `onMessage`.\n */\nexport function connectWebSocket(options: ConnectOptions): Promise<WsConnection> {\n const { baseUrl, accessToken, onMessage, onClose } = options\n const url = buildWebSocketUrl(baseUrl)\n\n return new Promise<WsConnection>((resolve, reject) => {\n const ws = new WebSocket(url)\n let authenticated = false\n\n const timeout = setTimeout(() => {\n if (!authenticated) {\n ws.close()\n reject(new Error('WebSocket auth timed out'))\n }\n }, AUTH_TIMEOUT_MS)\n\n ws.addEventListener('open', () => {\n ws.send(createAuthMessage(accessToken))\n })\n\n ws.addEventListener('message', (event) => {\n const data = typeof event.data === 'string' ? event.data : String(event.data)\n const msg = parseServerMessage(data)\n if (!msg) return\n\n if (!authenticated) {\n if (isMessageType<WsAuthResultMessage>(msg, 'auth_result')) {\n clearTimeout(timeout)\n if (msg.success) {\n authenticated = true\n resolve({ close: () => ws.close() })\n } else {\n ws.close()\n reject(new Error(`WebSocket auth failed: ${msg.reason || 'unknown'}`))\n }\n }\n return\n }\n\n onMessage(msg)\n })\n\n ws.addEventListener('close', (event) => {\n clearTimeout(timeout)\n if (!authenticated) {\n reject(new Error(`WebSocket closed before auth (code ${event.code})`))\n return\n }\n onClose?.(event.code, event.reason)\n })\n\n ws.addEventListener('error', () => {\n // The close event will fire after error, so we handle rejection there.\n // This prevents unhandled rejection from the error event itself.\n })\n })\n}\n\n/**\n * Connect WebSocket with automatic reconnection on disconnect.\n *\n * Initial connection throws on failure (same as connectWebSocket).\n * After successful auth, disconnects trigger exponential backoff reconnection.\n * Call close() on the returned handle to stop reconnection attempts.\n */\nexport async function connectWithReconnect(\n options: ReconnectOptions\n): Promise<ReconnectableWsConnection> {\n const {\n maxRetries = 10,\n initialDelayMs = 1000,\n onReconnecting,\n onReconnected,\n onReconnectFailed,\n onClose,\n ...connectOpts\n } = options\n\n let closed = false\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null\n let currentConnection: WsConnection | null = null\n\n const scheduleReconnect = async () => {\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n if (closed) return\n\n const delay = Math.min(initialDelayMs * Math.pow(2, attempt - 1), MAX_BACKOFF_MS)\n onReconnecting?.(attempt, maxRetries)\n\n await new Promise<void>((resolve) => {\n reconnectTimer = setTimeout(resolve, delay)\n })\n\n if (closed) return\n\n try {\n currentConnection = await connectWebSocket({\n ...connectOpts,\n onClose: (code, reason) => {\n currentConnection = null\n onClose?.(code, reason)\n if (!closed) scheduleReconnect()\n },\n })\n onReconnected?.()\n return\n } catch {\n // Retry on next iteration\n }\n }\n\n if (!closed) onReconnectFailed?.()\n }\n\n // Initial connection — throws on failure (no retry)\n currentConnection = await connectWebSocket({\n ...connectOpts,\n onClose: (code, reason) => {\n currentConnection = null\n onClose?.(code, reason)\n if (!closed) scheduleReconnect()\n },\n })\n\n return {\n close: () => {\n closed = true\n if (reconnectTimer) clearTimeout(reconnectTimer)\n currentConnection?.close()\n currentConnection = null\n },\n }\n}\n\n// ── Document processing waiter ───────────────────────────────────────────────\n\nconst DOC_TERMINAL_STATUSES = new Set(['completed', 'failed', 'skipped'])\n\nexport interface DocumentWaiterOptions {\n /** Base URL of the ARBI server (e.g. \"https://app.arbi.city\"). */\n baseUrl: string\n /** JWT access token for WebSocket authentication. */\n accessToken: string\n /** Optional callback invoked for every task_update on tracked documents. */\n onStatus?: (msg: WsTaskUpdateMessage) => void\n}\n\nexport interface DocumentWaiter {\n /** Register document IDs to track. Can be called multiple times. */\n addDocIds(ids: string[]): void\n /** Block until all tracked documents reach terminal status. */\n waitUntilDone(timeoutMs?: number): Promise<Map<string, string>>\n /** Close the WebSocket without waiting. */\n close(): void\n}\n\n/**\n * Open a WebSocket and start collecting document status events.\n *\n * Call this BEFORE uploading so no events are missed. Then call `addDocIds()`\n * once you know the IDs, and `waitUntilDone()` to block until all reach a\n * terminal status (completed, failed, or skipped).\n *\n * Mirrors the backend SDK's `ArbiWebSocket.wait_for_docs()` pattern.\n *\n * @example\n * ```ts\n * const waiter = createDocumentWaiter({ baseUrl, accessToken })\n * const result = await uploadDocuments(...)\n * waiter.addDocIds(result.doc_ext_ids)\n * const statuses = await waiter.waitUntilDone(120_000)\n * ```\n */\nexport function createDocumentWaiter(options: DocumentWaiterOptions): DocumentWaiter {\n const { baseUrl, accessToken, onStatus } = options\n\n const tracked = new Set<string>()\n const results = new Map<string, string>()\n let resolveWait: ((results: Map<string, string>) => void) | null = null\n let authenticated = false\n\n const url = buildWebSocketUrl(baseUrl)\n const ws = new WebSocket(url)\n\n const checkDone = () => {\n if (resolveWait && [...tracked].every((id) => results.has(id))) {\n resolveWait(results)\n resolveWait = null\n }\n }\n\n ws.addEventListener('open', () => {\n ws.send(createAuthMessage(accessToken))\n })\n\n ws.addEventListener('message', (event) => {\n const data = typeof event.data === 'string' ? event.data : String(event.data)\n const msg = parseServerMessage(data)\n if (!msg) return\n\n if (!authenticated) {\n if (msg.type === 'auth_result') {\n authenticated = (msg as { success?: boolean }).success === true\n }\n return\n }\n\n if (isMessageType<WsTaskUpdateMessage>(msg, 'task_update')) {\n if (!tracked.has(msg.doc_ext_id)) return\n\n onStatus?.(msg)\n\n if (DOC_TERMINAL_STATUSES.has(msg.status)) {\n results.set(msg.doc_ext_id, msg.status)\n checkDone()\n }\n }\n })\n\n return {\n addDocIds(ids: string[]) {\n for (const id of ids) tracked.add(id)\n checkDone()\n },\n\n waitUntilDone(timeoutMs = 120_000): Promise<Map<string, string>> {\n if ([...tracked].every((id) => results.has(id))) {\n ws.close()\n return Promise.resolve(results)\n }\n\n return new Promise<Map<string, string>>((resolve, reject) => {\n resolveWait = (r) => {\n ws.close()\n resolve(r)\n }\n\n setTimeout(() => {\n const pending = [...tracked].filter((id) => !results.has(id))\n ws.close()\n reject(\n new Error(\n `waitForDocuments timed out after ${timeoutMs}ms. Still pending: ${pending.join(', ')}`\n )\n )\n }, timeoutMs)\n })\n },\n\n close() {\n ws.close()\n },\n }\n}\n\n// ── Message formatting (shared by TUI + CLI) ────────────────────────────────\n\nexport type MessageLevel = 'info' | 'success' | 'error' | 'warning'\n\nexport interface FormattedWsMessage {\n text: string\n level: MessageLevel\n}\n\n/** Check if a message is a notification (has sender/recipient, not a system message). */\nfunction isNotification(msg: WebSocketServerMessage): msg is WsNotificationResponse {\n return 'sender' in msg && 'recipient' in msg\n}\n\n/**\n * Format a WebSocket message into display text + severity level.\n * Shared by TUI (toasts) and CLI (stderr lines) — single source of truth.\n */\nexport function formatWsMessage(msg: WebSocketServerMessage): FormattedWsMessage {\n if (isMessageType<WsTaskUpdateMessage>(msg, 'task_update')) {\n const progress = msg.progress > 0 ? ` (${Math.round(msg.progress)}%)` : ''\n const text = `${msg.file_name} — ${msg.status}${progress}`\n\n if (msg.status === 'completed') return { text, level: 'success' }\n if (msg.status === 'failed') return { text, level: 'error' }\n return { text, level: 'info' }\n }\n\n if (isMessageType<WsBatchCompleteMessage>(msg, 'batch_complete')) {\n const count = msg.doc_ext_ids.length\n return {\n text: `Batch complete: ${msg.batch_type} — ${count} doc${count !== 1 ? 's' : ''}`,\n level: 'success',\n }\n }\n\n if (isMessageType<WsErrorMessage>(msg, 'error')) {\n return { text: msg.message, level: 'error' }\n }\n\n if (isMessageType<WsPresenceUpdateMessage>(msg, 'presence_update')) {\n return { text: `${msg.user_id} is ${msg.status}`, level: 'info' }\n }\n\n if (isMessageType<WsResponseCompleteMessage>(msg, 'response_complete')) {\n const icon = msg.status === 'completed' ? '✓' : '✗'\n return {\n text: `${icon} Task ${msg.response_id} ${msg.status}`,\n level: msg.status === 'completed' ? 'success' : 'error',\n }\n }\n\n if (isNotification(msg)) {\n const sender = msg.sender?.email || 'someone'\n const content = msg.content ?? msg.type\n return { text: `${sender}: ${content}`, level: 'info' }\n }\n\n return { text: `${msg.type}`, level: 'info' }\n}\n","/**\n * Shared formatting utilities.\n */\n\n/**\n * Converts file size in bytes to human-readable format.\n *\n * @param bytes File size in bytes\n * @param fallback String to return for null/undefined values (default: 'N/A')\n * @returns Formatted string (e.g., \"1.5 MB\", \"250 KB\")\n */\nexport function formatFileSize(bytes: number | null | undefined, fallback = 'N/A'): string {\n if (bytes === null || bytes === undefined) return fallback\n\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\n/** Minimal user shape used for display formatting. */\nexport type UserInfo = {\n external_id?: string\n email?: string\n given_name?: string\n family_name?: string\n}\n\n/**\n * Format a user's display name from given_name + family_name.\n * Returns empty string if no name parts are available.\n */\nexport function formatUserName(user: UserInfo | null | undefined): string {\n if (!user) return ''\n return [user.given_name, user.family_name].filter(Boolean).join(' ')\n}\n","/**\n * Document operations — browser-safe functions.\n *\n * For Node.js file system operations (uploadLocalFile, uploadDirectory, uploadZip),\n * import from './documents-node.js' instead.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\nimport { authenticatedFetch, type AuthHeaders } from '../fetch.js'\n\ntype DocUpdateRequest = components['schemas']['DocUpdateRequest']\n\n// ── Shared constants ────────────────────────────────────────────────────────\n\n/** File extensions supported for document upload. */\nexport const SUPPORTED_EXTENSIONS = new Set([\n '.pdf',\n '.txt',\n '.md',\n '.html',\n '.doc',\n '.docx',\n '.rtf',\n '.ppt',\n '.pptx',\n '.xls',\n '.xlsx',\n])\n\n// ── Shared utilities ────────────────────────────────────────────────────────\n\n/**\n * Sanitize a folder path to only contain characters allowed by the backend\n * pattern `^[a-zA-Z0-9_\\-\\/]*$`. Replaces disallowed characters with `_` and\n * collapses consecutive underscores.\n */\nexport function sanitizeFolderPath(folderPath: string): string {\n return folderPath.replace(/[^a-zA-Z0-9_\\-/]/g, '_').replace(/_{2,}/g, '_')\n}\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface UploadOptions {\n folder?: string\n}\n\nexport interface UploadResult {\n doc_ext_ids: string[]\n duplicates?: string[]\n}\n\nexport interface UploadBatchResult {\n doc_ext_ids: string[]\n duplicates: string[]\n folders: Map<string, { fileCount: number; doc_ext_ids: string[]; duplicates: string[] }>\n}\n\n// ── API operations (browser-safe) ───────────────────────────────────────────\n\nexport async function listDocuments(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/document/list'), 'Failed to fetch documents')\n}\n\nexport async function getDocuments(arbi: ArbiClient, externalIds: string[]) {\n return requireData(\n await arbi.fetch.GET('/v1/document/', { params: { query: { external_ids: externalIds } } }),\n 'Failed to fetch documents'\n )\n}\n\nexport async function deleteDocuments(arbi: ArbiClient, externalIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/document/', { body: { external_ids: externalIds } }),\n 'Failed to delete documents'\n )\n}\n\nexport async function updateDocuments(arbi: ArbiClient, documents: DocUpdateRequest[]) {\n return requireData(\n await arbi.fetch.PATCH('/v1/document/', { body: { documents } }),\n 'Failed to update documents'\n )\n}\n\nexport async function uploadUrl(\n arbi: ArbiClient,\n urls: string[],\n workspaceId: string,\n shared = false\n) {\n return requireData(\n await arbi.fetch.POST('/v1/document/upload-url', {\n params: {\n query: { urls, workspace_ext_id: workspaceId, shared },\n },\n }),\n 'Failed to upload from URLs'\n )\n}\n\n/**\n * Get parsed document content.\n */\nexport async function getParsedContent(\n auth: AuthHeaders,\n docId: string,\n stage: string\n): Promise<Record<string, unknown>> {\n const res = await authenticatedFetch({\n ...auth,\n path: `/v1/document/${docId}/parsed-${stage}`,\n })\n return res.json() as Promise<Record<string, unknown>>\n}\n\n/**\n * Upload a file to a workspace. Uses raw fetch for multipart upload.\n */\nexport async function uploadFile(\n auth: AuthHeaders,\n workspaceId: string,\n fileData: Blob,\n fileName: string,\n options?: UploadOptions\n): Promise<UploadResult> {\n const formData = new FormData()\n formData.append('files', fileData, fileName)\n\n const params = new URLSearchParams({ workspace_ext_id: workspaceId })\n if (options?.folder) params.set('folder', sanitizeFolderPath(options.folder))\n\n const res = await authenticatedFetch({\n ...auth,\n path: `/v1/document/upload?${params.toString()}`,\n method: 'POST',\n body: formData,\n })\n\n return res.json() as Promise<UploadResult>\n}\n\n/**\n * Upload multiple files in a single FormData request with an optional folder parameter.\n */\nexport async function uploadFiles(\n auth: AuthHeaders,\n workspaceId: string,\n files: Array<{ data: Blob; name: string }>,\n options?: UploadOptions\n): Promise<UploadResult> {\n const formData = new FormData()\n for (const f of files) formData.append('files', f.data, f.name)\n\n const params = new URLSearchParams({ workspace_ext_id: workspaceId })\n if (options?.folder) params.set('folder', sanitizeFolderPath(options.folder))\n\n const res = await authenticatedFetch({\n ...auth,\n path: `/v1/document/upload?${params.toString()}`,\n method: 'POST',\n body: formData,\n })\n\n return res.json() as Promise<UploadResult>\n}\n\n/**\n * Download a document. Returns the response for the caller to handle.\n */\nexport async function downloadDocument(auth: AuthHeaders, docId: string): Promise<Response> {\n return authenticatedFetch({\n ...auth,\n path: `/v1/document/${docId}/download`,\n })\n}\n","/**\n * Workspace operations — list, create, delete, update, users, copy.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\ntype WorkspaceUpdateRequest = components['schemas']['WorkspaceUpdateRequest']\n\nexport async function listWorkspaces(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/user/workspaces'), 'Failed to fetch workspaces')\n}\n\nexport async function createWorkspace(\n arbi: ArbiClient,\n name: string,\n description?: string | null,\n isPublic = false\n) {\n return requireData(\n await arbi.fetch.POST('/v1/workspace/create_protected', {\n body: { name, description: description ?? null, is_public: isPublic },\n }),\n 'Failed to create workspace'\n )\n}\n\nexport async function deleteWorkspaces(arbi: ArbiClient, workspaceIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/workspace/', {\n body: { external_ids: workspaceIds },\n }),\n 'Failed to delete workspace(s)'\n )\n}\n\nexport async function updateWorkspace(arbi: ArbiClient, body: WorkspaceUpdateRequest) {\n return requireData(\n await arbi.fetch.PATCH('/v1/workspace/', { body }),\n 'Failed to update workspace'\n )\n}\n\nexport async function listWorkspaceUsers(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/workspace/users'), 'Failed to fetch workspace users')\n}\n\nexport async function addWorkspaceUsers(\n arbi: ArbiClient,\n emails: string[],\n role: 'owner' | 'collaborator' | 'guest' = 'collaborator'\n) {\n return requireData(\n await arbi.fetch.POST('/v1/workspace/users', {\n body: { emails, role },\n }),\n 'Failed to add users'\n )\n}\n\nexport async function removeWorkspaceUsers(arbi: ArbiClient, userIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/workspace/users', {\n body: { users: userIds.map((id) => ({ user_ext_id: id })) },\n }),\n 'Failed to remove users'\n )\n}\n\nexport async function setUserRole(\n arbi: ArbiClient,\n userIds: string[],\n role: 'owner' | 'collaborator' | 'guest'\n) {\n return requireData(\n await arbi.fetch.PATCH('/v1/workspace/users', {\n body: { user_ext_ids: userIds, role },\n }),\n 'Failed to update roles'\n )\n}\n\nexport async function copyDocuments(\n arbi: ArbiClient,\n targetWorkspaceId: string,\n docIds: string[],\n targetWorkspaceKey: string\n) {\n return requireData(\n await arbi.fetch.POST('/v1/workspace/copy', {\n body: {\n target_workspace_ext_id: targetWorkspaceId,\n target_workspace_key: targetWorkspaceKey,\n items: docIds,\n },\n }),\n 'Failed to copy documents'\n )\n}\n","/**\n * Conversation operations — list, threads, delete, share, title, messages.\n */\n\nimport type { ArbiClient } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\n\nexport async function listConversations(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/conversation/list'), 'Failed to fetch conversations')\n}\n\nexport async function getConversationThreads(arbi: ArbiClient, conversationId: string) {\n return requireData(\n await arbi.fetch.GET('/v1/conversation/{conversation_ext_id}/threads', {\n params: { path: { conversation_ext_id: conversationId } },\n }),\n 'Failed to fetch threads'\n )\n}\n\nexport async function deleteConversation(arbi: ArbiClient, conversationId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/conversation/{conversation_ext_id}', {\n params: { path: { conversation_ext_id: conversationId } },\n }),\n 'Failed to delete conversation'\n )\n}\n\nexport async function shareConversation(arbi: ArbiClient, conversationId: string) {\n return requireData(\n await arbi.fetch.POST('/v1/conversation/{conversation_ext_id}/share', {\n params: { path: { conversation_ext_id: conversationId } },\n }),\n 'Failed to share conversation'\n )\n}\n\nexport async function updateConversationTitle(\n arbi: ArbiClient,\n conversationId: string,\n title: string\n) {\n return requireData(\n await arbi.fetch.PATCH('/v1/conversation/{conversation_ext_id}/title', {\n params: { path: { conversation_ext_id: conversationId } },\n body: { title },\n }),\n 'Failed to update title'\n )\n}\n\nexport async function getMessage(arbi: ArbiClient, messageId: string) {\n return requireData(\n await arbi.fetch.GET('/v1/conversation/message/{message_ext_id}', {\n params: { path: { message_ext_id: messageId } },\n }),\n 'Failed to fetch message'\n )\n}\n\nexport async function deleteMessage(arbi: ArbiClient, messageId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/conversation/message/{message_ext_id}', {\n params: { path: { message_ext_id: messageId } },\n }),\n 'Failed to delete message'\n )\n}\n","/**\n * Assistant operations — retrieve (search-only) and query (with LLM).\n *\n * retrieve: Uses the typed SDK route POST /v1/assistant/retrieve.\n * Returns matching chunks without LLM generation.\n *\n * queryAssistant: Returns the raw Response for SSE streaming.\n * Uses raw fetch because the SDK client doesn't support streaming responses.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\nimport { authenticatedFetch, type AuthHeaders } from '../fetch.js'\n\ntype MessageInput = components['schemas']['MessageInput']\ntype ToolEntry = NonNullable<MessageInput['tools']>[string]\n\n// ── Retrieval tool builder ──────────────────────────────────────────────────\n\nexport function buildRetrievalChunkTool(\n docIds: string[],\n searchMode?: 'semantic' | 'keyword' | 'hybrid'\n): components['schemas']['RetrievalChunkTool'] {\n return {\n name: 'retrieval_chunk',\n description: 'retrieval chunk',\n tool_args: { doc_ext_ids: docIds, ...(searchMode ? { search_mode: searchMode } : {}) },\n tool_responses: {},\n }\n}\n\nexport function buildRetrievalFullContextTool(\n docIds: string[]\n): components['schemas']['RetrievalFullContextTool'] {\n return {\n name: 'retrieval_full_context',\n description: 'retrieval full context',\n tool_args: { doc_ext_ids: docIds },\n tool_responses: {},\n }\n}\n\nexport function buildRetrievalTocTool(docIds: string[]): components['schemas']['RetrievalTOCTool'] {\n return {\n name: 'retrieval_toc',\n description: 'retrieval toc',\n tool_args: { doc_ext_ids: docIds },\n tool_responses: {},\n }\n}\n\n// ── Retrieve (search-only, uses typed SDK) ──────────────────────────────────\n\nexport interface RetrieveOptions {\n arbi: ArbiClient\n workspaceId: string\n query: string\n docIds: string[]\n searchMode?: 'semantic' | 'keyword' | 'hybrid'\n fullContextDocIds?: string[]\n tocDocIds?: string[]\n model?: string\n}\n\nexport interface ChunkMetadata {\n doc_ext_id?: string | null\n doc_title?: string | null\n chunk_ext_id: string\n chunk_pg_idx: number\n chunk_doc_idx: number\n page_number: number\n score?: number | null\n rerank_score?: number | null\n tokens?: number | null\n created_at: string\n heading: boolean\n}\n\nexport interface Chunk {\n metadata: ChunkMetadata\n content: string\n}\n\nexport interface RetrieveResult {\n retrieval_chunk?: {\n tool_responses: Record<string, Chunk[]>\n }\n retrieval_full_context?: {\n tool_responses: Record<string, Chunk[]>\n }\n retrieval_toc?: {\n tool_responses: Record<string, Record<string, unknown>[]>\n }\n}\n\n/**\n * Search documents and return matching chunks without LLM generation.\n * Uses the typed SDK route POST /v1/assistant/retrieve.\n */\nexport async function retrieve(options: RetrieveOptions): Promise<RetrieveResult> {\n const { arbi, workspaceId, query, docIds, searchMode, fullContextDocIds, tocDocIds, model } =\n options\n\n const tools: Record<string, ToolEntry> = {\n retrieval_chunk: buildRetrievalChunkTool(docIds, searchMode),\n }\n\n if (fullContextDocIds && fullContextDocIds.length > 0) {\n tools.retrieval_full_context = buildRetrievalFullContextTool(fullContextDocIds)\n }\n\n if (tocDocIds && tocDocIds.length > 0) {\n tools.retrieval_toc = buildRetrievalTocTool(tocDocIds)\n }\n\n const body: MessageInput = {\n input: query,\n workspace_ext_id: workspaceId,\n stream: false,\n background: false,\n store: true,\n tools,\n ...(model ? { model } : {}),\n }\n\n const { data, error } = await arbi.fetch.POST('/v1/assistant/retrieve', { body })\n\n if (error) {\n throw new Error(`Retrieve failed: ${JSON.stringify(error)}`)\n }\n\n // Response type is `unknown` in schema, cast to our typed result\n return data as RetrieveResult\n}\n\n// ── Query (with LLM, raw fetch for SSE streaming) ───────────────────────────\n\nexport interface AssistantQueryOptions extends AuthHeaders {\n workspaceId: string\n question: string\n docIds: string[]\n previousResponseId?: string | null\n model?: string\n}\n\n/**\n * Send a query to the RAG assistant. Returns the raw Response\n * so the caller can stream or buffer as needed.\n *\n * Uses raw fetch (not the SDK client) because we need the streaming\n * Response body — the SDK client consumes the body to parse JSON.\n */\nexport async function queryAssistant(options: AssistantQueryOptions): Promise<Response> {\n const { workspaceId, question, docIds, previousResponseId, model, ...auth } = options\n\n const body: MessageInput = {\n input: question,\n workspace_ext_id: workspaceId,\n stream: true,\n background: false,\n store: true,\n tools: {\n retrieval_chunk: buildRetrievalChunkTool(docIds),\n retrieval_full_context: buildRetrievalFullContextTool([]),\n },\n ...(previousResponseId ? { previous_response_id: previousResponseId } : {}),\n ...(model ? { model } : {}),\n }\n\n return authenticatedFetch({\n ...auth,\n path: '/v1/assistant/query',\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json' },\n })\n}\n\n// ── Respond to agent (human-in-the-loop) ──────────────────────────────────\n\n/**\n * Respond to an agent's question during a human-in-the-loop workflow.\n * The assistant_message_ext_id identifies which agent message to answer.\n */\nexport async function respondToAgent(\n arbi: ArbiClient,\n assistantMessageExtId: string,\n answer: string\n) {\n return requireData(\n await arbi.fetch.POST('/v1/assistant/respond', {\n body: { assistant_message_ext_id: assistantMessageExtId, answer },\n }),\n 'Failed to respond to agent'\n )\n}\n","/**\n * Tag operations — list, create, delete, update.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\n\ntype UpdateTagRequest = components['schemas']['UpdateTagRequest']\n\nexport async function listTags(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/tag/list'), 'Failed to fetch tags')\n}\n\nexport async function createTag(\n arbi: ArbiClient,\n options: {\n name: string\n workspaceId?: string\n tagType?: components['schemas']['TagFormat']\n instruction?: string | null\n shared?: boolean\n }\n) {\n return requireData(\n await arbi.fetch.POST('/v1/tag/', {\n body: {\n name: options.name,\n tag_type: options.tagType ?? { type: 'checkbox', options: [] },\n instruction: options.instruction ?? null,\n shared: options.shared ?? false,\n },\n }),\n 'Failed to create tag'\n )\n}\n\nexport async function deleteTag(arbi: ArbiClient, tagId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/tag/{tag_ext_id}', {\n params: { path: { tag_ext_id: tagId } },\n }),\n 'Failed to delete tag'\n )\n}\n\nexport async function updateTag(arbi: ArbiClient, tagId: string, body: UpdateTagRequest) {\n return requireData(\n await arbi.fetch.PATCH('/v1/tag/{tag_ext_id}', {\n params: { path: { tag_ext_id: tagId } },\n body,\n }),\n 'Failed to update tag'\n )\n}\n","/**\n * Contact operations — list, add, remove.\n */\n\nimport type { ArbiClient } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\nexport async function listContacts(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/user/contacts'), 'Failed to fetch contacts')\n}\n\nexport async function addContacts(arbi: ArbiClient, emails: string[]) {\n return requireData(\n await arbi.fetch.POST('/v1/user/contacts', { body: { emails } }),\n 'Failed to add contacts'\n )\n}\n\nexport async function removeContacts(arbi: ArbiClient, contactIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/user/contacts', { body: { contact_ids: contactIds } }),\n 'Failed to remove contacts'\n )\n}\n\n/**\n * Group contacts by registration status.\n * Returns registered contacts and pending (not yet registered) contacts.\n */\nexport function groupContactsByStatus<T extends { status: string }>(\n contactList: T[]\n): { registered: T[]; pending: T[] } {\n const registered: T[] = []\n const pending: T[] = []\n for (const c of contactList) {\n if (c.status === 'registered') {\n registered.push(c)\n } else {\n pending.push(c)\n }\n }\n return { registered, pending }\n}\n","/**\n * Document-tag (doctag) operations — assign, remove, generate.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\ntype CitationData = components['schemas']['CitationData']\n\nexport async function assignDocTags(\n arbi: ArbiClient,\n tagId: string,\n docIds: string[],\n note?: string | null\n) {\n return requireData(\n await arbi.fetch.POST('/v1/document/doctag', {\n body: { tag_ext_id: tagId, doc_ext_ids: docIds, note: note ?? null },\n }),\n 'Failed to create doctags'\n )\n}\n\nexport async function removeDocTags(arbi: ArbiClient, tagId: string, docIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/document/doctag', {\n body: { tag_ext_id: tagId, doc_ext_ids: docIds },\n }),\n 'Failed to delete doctags'\n )\n}\n\nexport async function updateDocTag(\n arbi: ArbiClient,\n tagId: string,\n docId: string,\n updates: { note?: string | null; citations?: Record<string, CitationData> | null }\n) {\n return requireData(\n await arbi.fetch.PATCH('/v1/document/doctag', {\n body: { tag_ext_id: tagId, doc_ext_id: docId, ...updates },\n }),\n 'Failed to update doctag'\n )\n}\n\nexport async function generateDocTags(arbi: ArbiClient, tagIds: string[], docIds: string[]) {\n return requireData(\n await arbi.fetch.POST('/v1/document/doctag/generate', {\n body: { tag_ext_ids: tagIds, doc_ext_ids: docIds },\n }),\n 'Failed to generate doctags'\n )\n}\n","/**\n * Direct message / notification operations — list, send, mark read, delete.\n */\n\nimport type { ArbiClient } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\nexport async function listDMs(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/notifications/'), 'Failed to fetch messages')\n}\n\nexport async function sendDM(\n arbi: ArbiClient,\n messages: Array<{ recipient_ext_id: string; content: string }>\n) {\n return requireData(\n await arbi.fetch.POST('/v1/notifications/', {\n body: { messages },\n }),\n 'Failed to send message'\n )\n}\n\nexport async function markRead(arbi: ArbiClient, messageIds: string[]) {\n return requireData(\n await arbi.fetch.PATCH('/v1/notifications/', {\n body: { updates: messageIds.map((id) => ({ external_id: id, read: true })) },\n }),\n 'Failed to update messages'\n )\n}\n\nexport async function deleteDMs(arbi: ArbiClient, messageIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/notifications/', { body: { external_ids: messageIds } }),\n 'Failed to delete messages'\n )\n}\n","/**\n * User settings operations — get, update.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\ntype UserSettingsUpdate = components['schemas']['UserSettingsUpdate']\n\nexport async function getSettings(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/user/settings'), 'Failed to fetch settings')\n}\n\nexport async function updateSettings(arbi: ArbiClient, body: UserSettingsUpdate) {\n requireOk(await arbi.fetch.PATCH('/v1/user/settings', { body }), 'Failed to update settings')\n}\n","/**\n * Agent configuration operations — list, get, save, delete, schema, models.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\n\ntype ConfigUpdateData = components['schemas']['ConfigUpdateData']\n\nexport async function listConfigs(arbi: ArbiClient) {\n return requireData(\n await arbi.fetch.GET('/v1/configs/versions'),\n 'Failed to fetch config versions'\n )\n}\n\nexport async function getConfig(arbi: ArbiClient, configId: string) {\n return requireData(\n await arbi.fetch.GET('/v1/configs/{config_ext_id}', {\n params: { path: { config_ext_id: configId } },\n }),\n 'Failed to fetch configuration'\n )\n}\n\nexport async function saveConfig(arbi: ArbiClient, body: ConfigUpdateData) {\n return requireData(\n await arbi.fetch.POST('/v1/configs/', { body }),\n 'Failed to save configuration'\n )\n}\n\nexport async function deleteConfig(arbi: ArbiClient, configId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/configs/{config_ext_id}', {\n params: { path: { config_ext_id: configId } },\n }),\n 'Failed to delete configuration'\n )\n}\n\nexport async function getSchema(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/configs/schema'), 'Failed to fetch config schema')\n}\n\nexport async function getModels(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/health/models'), 'Failed to fetch models')\n}\n","/**\n * Health and model operations.\n */\n\nimport type { ArbiClient } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\n\nexport async function getHealth(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/health/'), 'Failed to fetch health status')\n}\n\nexport async function getHealthModels(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/health/models'), 'Failed to fetch models')\n}\n\nexport async function getRemoteModels(arbi: ArbiClient) {\n return requireData(\n await arbi.fetch.GET('/v1/health/remote-models'),\n 'Failed to fetch remote models'\n )\n}\n\nexport async function getMcpTools(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/health/mcp-tools'), 'Failed to fetch MCP tools')\n}\n","/**\n * File operations — OpenAI-compatible Files API (list, get, delete, upload, content).\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\nimport { authenticatedFetch, type AuthHeaders } from '../fetch.js'\n\ntype FileObject = components['schemas']['FileObject']\ntype FileDeleteResponse = components['schemas']['FileDeleteResponse']\ntype FileListResponse = components['schemas']['FileListResponse']\n\nexport type { FileObject, FileDeleteResponse, FileListResponse }\n\nexport interface ListFilesOptions {\n purpose?: string | null\n limit?: number\n order?: string\n after?: string | null\n}\n\nexport async function listFiles(arbi: ArbiClient, options?: ListFilesOptions) {\n return requireData(\n await arbi.fetch.GET('/v1/files', {\n params: { query: options ?? {} },\n }),\n 'Failed to list files'\n )\n}\n\nexport async function getFile(arbi: ArbiClient, fileId: string) {\n return requireData(\n await arbi.fetch.GET('/v1/files/{file_id}', {\n params: { path: { file_id: fileId } },\n }),\n 'Failed to get file'\n )\n}\n\nexport async function deleteFile(arbi: ArbiClient, fileId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/files/{file_id}', {\n params: { path: { file_id: fileId } },\n }),\n 'Failed to delete file'\n )\n}\n\n/**\n * Upload a file via the OpenAI-compatible Files API.\n * Uses raw fetch for multipart upload.\n */\nexport async function uploadFile(\n auth: AuthHeaders,\n fileData: Blob,\n fileName: string,\n purpose = 'assistants'\n): Promise<FileObject> {\n const formData = new FormData()\n formData.append('file', fileData, fileName)\n formData.append('purpose', purpose)\n\n const res = await authenticatedFetch({\n ...auth,\n path: '/v1/files',\n method: 'POST',\n body: formData,\n })\n\n return res.json() as Promise<FileObject>\n}\n\n/**\n * Get file content (binary). Returns the raw Response for the caller to handle.\n */\nexport async function getFileContent(auth: AuthHeaders, fileId: string): Promise<Response> {\n return authenticatedFetch({\n ...auth,\n path: `/v1/files/${fileId}/content`,\n })\n}\n","/**\n * High-level convenience class that wraps the full ARBI stack into a simple API.\n *\n * Handles SDK client creation, sodium initialization, authentication,\n * workspace key decryption, and delegates to all operations modules.\n *\n * Usage:\n * const arbi = new Arbi({ url: 'https://arbi.mycompany.com' })\n * await arbi.login('user@example.com', 'password')\n * const workspaces = await arbi.workspaces.list()\n * await arbi.selectWorkspace(workspaces[0].external_id)\n * const docs = await arbi.documents.list()\n */\n\nimport {\n createArbiClient,\n type ArbiClient,\n type LoginResult,\n type components,\n} from '@arbidocs/client'\n\ntype DocUpdateRequest = components['schemas']['DocUpdateRequest']\ntype WorkspaceUpdateRequest = components['schemas']['WorkspaceUpdateRequest']\ntype UpdateTagRequest = components['schemas']['UpdateTagRequest']\ntype TagFormat = components['schemas']['TagFormat']\ntype CitationData = components['schemas']['CitationData']\ntype UserSettingsUpdate = components['schemas']['UserSettingsUpdate']\ntype ConfigUpdateData = components['schemas']['ConfigUpdateData']\nimport { ArbiError } from './errors.js'\nimport { selectWorkspace as selectWorkspaceInternal } from './auth.js'\nimport { streamSSE, type SSEStreamCallbacks, type SSEStreamResult } from './sse.js'\nimport type {\n SSEStreamStartData,\n AgentStepEvent,\n UserMessageEvent,\n MessageMetadataPayload,\n UserInputRequestEvent,\n ArtifactEvent,\n} from './sse-types.js'\nimport * as documentsOps from './operations/documents.js'\nimport * as workspacesOps from './operations/workspaces.js'\nimport * as conversationsOps from './operations/conversations.js'\nimport * as assistantOps from './operations/assistant.js'\nimport * as tagsOps from './operations/tags.js'\nimport * as contactsOps from './operations/contacts.js'\nimport * as doctagsOps from './operations/doctags.js'\nimport * as dmOps from './operations/dm.js'\nimport * as settingsOps from './operations/settings.js'\nimport * as agentconfigOps from './operations/agentconfig.js'\nimport * as healthOps from './operations/health.js'\nimport * as filesOps from './operations/files.js'\n\n// ── Options ─────────────────────────────────────────────────────────────────\n\nexport interface ArbiOptions {\n /** Backend API URL (e.g. 'https://arbi.mycompany.com') */\n url: string\n /** Deployment domain for key derivation. Defaults to hostname of url. */\n deploymentDomain?: string\n /** Include credentials (cookies) in requests. Default: 'omit' for SDK consumers. */\n credentials?: 'include' | 'omit' | 'same-origin'\n}\n\n// ── Assistant query options ─────────────────────────────────────────────────\n\nexport interface QueryOptions {\n /** Document IDs to search against */\n docIds: string[]\n /** Previous response ID for follow-up questions */\n previousResponseId?: string | null\n /** Model to use for generation */\n model?: string\n /** Called for each streaming token */\n onToken?: (content: string) => void\n /** Called when stream starts */\n onStreamStart?: (data: SSEStreamStartData) => void\n /** Called for each agent step */\n onAgentStep?: (data: AgentStepEvent) => void\n /** Called on stream error */\n onError?: (message: string) => void\n /** Called when a user message event is received */\n onUserMessage?: (data: UserMessageEvent) => void\n /** Called when message metadata is received */\n onMetadata?: (data: MessageMetadataPayload) => void\n /** Called when the agent requests user input */\n onUserInputRequest?: (data: UserInputRequestEvent) => void\n /** Called when an artifact event is received */\n onArtifact?: (data: ArtifactEvent) => void\n /** Called when backend elapsed time is received */\n onElapsedTime?: (t: number) => void\n /** Called when stream completes */\n onComplete?: () => void\n}\n\n// ── Arbi class ──────────────────────────────────────────────────────────────\n\nexport class Arbi {\n private client: ArbiClient | null = null\n private loginResult: LoginResult | null = null\n private currentWorkspaceId: string | null = null\n private readonly options: ArbiOptions\n\n constructor(options: ArbiOptions) {\n this.options = options\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────\n\n /** Initialize the SDK client and sodium crypto. Called automatically by login(). */\n async init(): Promise<ArbiClient> {\n if (this.client) return this.client\n\n const domain = this.options.deploymentDomain ?? new URL(this.options.url).hostname\n\n this.client = createArbiClient({\n baseUrl: this.options.url,\n deploymentDomain: domain,\n credentials: this.options.credentials ?? 'omit',\n })\n\n await this.client.crypto.initSodium()\n return this.client\n }\n\n /**\n * Request a verification email for registration.\n * The user will receive an email with a 3-word verification code.\n */\n async requestVerification(email: string): Promise<void> {\n const client = await this.init()\n await client.fetch.POST('/v1/user/verify-email', { body: { email } })\n }\n\n /**\n * Register a new account using the verification code received by email.\n */\n async register(params: {\n email: string\n password: string\n verificationCode: string\n firstName?: string\n lastName?: string\n }): Promise<void> {\n const client = await this.init()\n await client.auth.register(params)\n }\n\n /**\n * Log in with email and password.\n * Initializes the SDK client if not already done.\n */\n async login(email: string, password: string): Promise<void> {\n const client = await this.init()\n this.loginResult = await client.auth.login({ email, password })\n }\n\n /**\n * Recover a session using a stored signing private key (base64).\n * Useful for session recovery without re-entering the password.\n */\n async loginWithKey(email: string, signingPrivateKeyBase64: string): Promise<void> {\n const client = await this.init()\n const signingPrivateKey = client.crypto.base64ToBytes(signingPrivateKeyBase64)\n this.loginResult = await client.auth.loginWithKey({ email, signingPrivateKey })\n }\n\n /**\n * Select a workspace by ID. Fetches the workspace list, finds the matching\n * workspace, decrypts the wrapped key, and sets up auth headers.\n */\n async selectWorkspace(workspaceId: string): Promise<void> {\n const client = this.requireClient()\n const lr = this.requireLogin()\n\n const allWorkspaces = await workspacesOps.listWorkspaces(client)\n const ws = allWorkspaces.find((w) => w.external_id === workspaceId)\n if (!ws || !ws.wrapped_key) {\n throw new ArbiError(`Workspace ${workspaceId} not found or has no encryption key`)\n }\n\n const signingPrivateKeyBase64 = client.crypto.bytesToBase64(lr.signingPrivateKey)\n await selectWorkspaceInternal(\n client,\n ws.external_id,\n ws.wrapped_key,\n lr.serverSessionKey,\n signingPrivateKeyBase64\n )\n\n this.currentWorkspaceId = ws.external_id\n }\n\n /** Log out and clear internal state. */\n async logout(): Promise<void> {\n if (this.client) {\n await this.client.auth.logout()\n }\n if (this.loginResult) {\n this.loginResult.signingPrivateKey.fill(0)\n this.loginResult.serverSessionKey.fill(0)\n }\n this.loginResult = null\n this.currentWorkspaceId = null\n }\n\n // ── Accessors ─────────────────────────────────────────────────────────\n\n /** Get the underlying ArbiClient (throws if not initialized). */\n getClient(): ArbiClient {\n return this.requireClient()\n }\n\n /** Get the current workspace ID (throws if none selected). */\n getWorkspaceId(): string {\n return this.requireWorkspace()\n }\n\n /** Check if the user is logged in. */\n get isLoggedIn(): boolean {\n return this.loginResult !== null\n }\n\n /** Check if a workspace is selected. */\n get hasWorkspace(): boolean {\n return this.currentWorkspaceId !== null\n }\n\n // ── Auth headers (for raw fetch operations) ───────────────────────────\n\n private getAuthHeaders() {\n const client = this.requireClient()\n const accessToken = client.session.getState().accessToken\n const workspaceKeyHeader = client.session.getWorkspaceKeyHeader()\n\n if (!accessToken || !workspaceKeyHeader) {\n throw new ArbiError('Missing access token or workspace key header')\n }\n\n return {\n baseUrl: this.options.url,\n accessToken,\n workspaceKeyHeader,\n }\n }\n\n // ── Workspaces ────────────────────────────────────────────────────────\n\n readonly workspaces = {\n list: () => workspacesOps.listWorkspaces(this.requireClient()),\n\n create: (name: string, description?: string | null, isPublic?: boolean) =>\n workspacesOps.createWorkspace(this.requireClient(), name, description, isPublic),\n\n delete: (workspaceIds: string[]) =>\n workspacesOps.deleteWorkspaces(this.requireClient(), workspaceIds),\n\n update: (body: WorkspaceUpdateRequest) =>\n workspacesOps.updateWorkspace(this.requireClient(), body),\n\n listUsers: () => workspacesOps.listWorkspaceUsers(this.requireClient()),\n\n addUsers: (emails: string[], role?: 'owner' | 'collaborator' | 'guest') =>\n workspacesOps.addWorkspaceUsers(this.requireClient(), emails, role),\n\n removeUsers: (userIds: string[]) =>\n workspacesOps.removeWorkspaceUsers(this.requireClient(), userIds),\n\n setUserRole: (userIds: string[], role: 'owner' | 'collaborator' | 'guest') =>\n workspacesOps.setUserRole(this.requireClient(), userIds, role),\n\n copyDocuments: (targetWorkspaceId: string, docIds: string[], targetWorkspaceKey: string) =>\n workspacesOps.copyDocuments(\n this.requireClient(),\n targetWorkspaceId,\n docIds,\n targetWorkspaceKey\n ),\n }\n\n // ── Documents ─────────────────────────────────────────────────────────\n\n readonly documents = {\n list: () => documentsOps.listDocuments(this.requireClient()),\n\n get: (externalIds: string[]) => documentsOps.getDocuments(this.requireClient(), externalIds),\n\n delete: (externalIds: string[]) =>\n documentsOps.deleteDocuments(this.requireClient(), externalIds),\n\n update: (documents: DocUpdateRequest[]) =>\n documentsOps.updateDocuments(this.requireClient(), documents),\n\n uploadUrl: (urls: string[], shared?: boolean, workspaceId?: string) =>\n documentsOps.uploadUrl(\n this.requireClient(),\n urls,\n workspaceId ?? this.requireWorkspace(),\n shared\n ),\n\n uploadFile: (\n fileData: Blob,\n fileName: string,\n options?: { workspaceId?: string; folder?: string }\n ) =>\n documentsOps.uploadFile(\n this.getAuthHeaders(),\n options?.workspaceId ?? this.requireWorkspace(),\n fileData,\n fileName,\n options?.folder ? { folder: options.folder } : undefined\n ),\n\n download: (docId: string) => documentsOps.downloadDocument(this.getAuthHeaders(), docId),\n\n getParsedContent: (docId: string, stage: string) =>\n documentsOps.getParsedContent(this.getAuthHeaders(), docId, stage),\n }\n\n // ── Conversations ─────────────────────────────────────────────────────\n\n readonly conversations = {\n list: () => conversationsOps.listConversations(this.requireClient()),\n\n getThreads: (conversationId: string) =>\n conversationsOps.getConversationThreads(this.requireClient(), conversationId),\n\n delete: (conversationId: string) =>\n conversationsOps.deleteConversation(this.requireClient(), conversationId),\n\n share: (conversationId: string) =>\n conversationsOps.shareConversation(this.requireClient(), conversationId),\n\n updateTitle: (conversationId: string, title: string) =>\n conversationsOps.updateConversationTitle(this.requireClient(), conversationId, title),\n\n getMessage: (messageId: string) => conversationsOps.getMessage(this.requireClient(), messageId),\n\n deleteMessage: (messageId: string) =>\n conversationsOps.deleteMessage(this.requireClient(), messageId),\n }\n\n // ── Assistant ─────────────────────────────────────────────────────────\n\n readonly assistant = {\n /**\n * Send a question to the RAG assistant with streaming support.\n * Returns the accumulated result after the stream completes.\n */\n query: async (question: string, options: QueryOptions): Promise<SSEStreamResult> => {\n const auth = this.getAuthHeaders()\n const workspaceId = this.requireWorkspace()\n\n const response = await assistantOps.queryAssistant({\n ...auth,\n workspaceId,\n question,\n docIds: options.docIds,\n previousResponseId: options.previousResponseId,\n model: options.model,\n })\n\n const callbacks: SSEStreamCallbacks = {\n onToken: options.onToken,\n onStreamStart: options.onStreamStart,\n onAgentStep: options.onAgentStep,\n onError: options.onError,\n onUserMessage: options.onUserMessage,\n onMetadata: options.onMetadata,\n onUserInputRequest: options.onUserInputRequest,\n onArtifact: options.onArtifact,\n onElapsedTime: options.onElapsedTime,\n onComplete: options.onComplete,\n }\n\n return streamSSE(response, callbacks)\n },\n\n /**\n * Respond to an agent's question during a human-in-the-loop workflow.\n */\n respond: (assistantMessageExtId: string, answer: string) =>\n assistantOps.respondToAgent(this.requireClient(), assistantMessageExtId, answer),\n\n /**\n * Search documents without LLM generation (retrieval only).\n */\n retrieve: (\n query: string,\n docIds: string[],\n options?: {\n searchMode?: 'semantic' | 'keyword' | 'hybrid'\n fullContextDocIds?: string[]\n tocDocIds?: string[]\n model?: string\n }\n ) =>\n assistantOps.retrieve({\n arbi: this.requireClient(),\n workspaceId: this.requireWorkspace(),\n query,\n docIds,\n ...options,\n }),\n }\n\n // ── Tags ──────────────────────────────────────────────────────────────\n\n readonly tags = {\n list: () => tagsOps.listTags(this.requireClient()),\n\n create: (options: {\n name: string\n workspaceId?: string\n tagType?: TagFormat\n instruction?: string | null\n shared?: boolean\n }) =>\n tagsOps.createTag(this.requireClient(), {\n ...options,\n workspaceId: options.workspaceId ?? this.requireWorkspace(),\n }),\n\n delete: (tagId: string) => tagsOps.deleteTag(this.requireClient(), tagId),\n\n update: (tagId: string, body: UpdateTagRequest) =>\n tagsOps.updateTag(this.requireClient(), tagId, body),\n }\n\n // ── Document Tags ─────────────────────────────────────────────────────\n\n readonly doctags = {\n assign: (tagId: string, docIds: string[], note?: string | null) =>\n doctagsOps.assignDocTags(this.requireClient(), tagId, docIds, note),\n\n remove: (tagId: string, docIds: string[]) =>\n doctagsOps.removeDocTags(this.requireClient(), tagId, docIds),\n\n update: (\n tagId: string,\n docId: string,\n updates: { note?: string | null; citations?: Record<string, CitationData> | null }\n ) => doctagsOps.updateDocTag(this.requireClient(), tagId, docId, updates),\n\n generate: (tagIds: string[], docIds: string[]) =>\n doctagsOps.generateDocTags(this.requireClient(), tagIds, docIds),\n }\n\n // ── Contacts ──────────────────────────────────────────────────────────\n\n readonly contacts = {\n list: () => contactsOps.listContacts(this.requireClient()),\n add: (emails: string[]) => contactsOps.addContacts(this.requireClient(), emails),\n remove: (contactIds: string[]) => contactsOps.removeContacts(this.requireClient(), contactIds),\n groupByStatus: contactsOps.groupContactsByStatus,\n }\n\n // ── Direct Messages ───────────────────────────────────────────────────\n\n readonly dm = {\n list: () => dmOps.listDMs(this.requireClient()),\n send: (messages: Array<{ recipient_ext_id: string; content: string }>) =>\n dmOps.sendDM(this.requireClient(), messages),\n markRead: (messageIds: string[]) => dmOps.markRead(this.requireClient(), messageIds),\n delete: (messageIds: string[]) => dmOps.deleteDMs(this.requireClient(), messageIds),\n }\n\n // ── Settings ──────────────────────────────────────────────────────────\n\n readonly settings = {\n get: () => settingsOps.getSettings(this.requireClient()),\n update: (body: UserSettingsUpdate) => settingsOps.updateSettings(this.requireClient(), body),\n }\n\n // ── Agent Configuration ───────────────────────────────────────────────\n\n readonly agentConfig = {\n list: () => agentconfigOps.listConfigs(this.requireClient()),\n get: (configId: string) => agentconfigOps.getConfig(this.requireClient(), configId),\n save: (body: ConfigUpdateData) => agentconfigOps.saveConfig(this.requireClient(), body),\n delete: (configId: string) => agentconfigOps.deleteConfig(this.requireClient(), configId),\n getSchema: () => agentconfigOps.getSchema(this.requireClient()),\n getModels: () => agentconfigOps.getModels(this.requireClient()),\n }\n\n // ── Health ────────────────────────────────────────────────────────────\n\n readonly health = {\n check: () => healthOps.getHealth(this.requireClient()),\n models: () => healthOps.getHealthModels(this.requireClient()),\n remoteModels: () => healthOps.getRemoteModels(this.requireClient()),\n mcpTools: () => healthOps.getMcpTools(this.requireClient()),\n }\n\n // ── Files (OpenAI-compatible) ────────────────────────────────────────\n\n readonly files = {\n list: (options?: filesOps.ListFilesOptions) =>\n filesOps.listFiles(this.requireClient(), options),\n\n get: (fileId: string) => filesOps.getFile(this.requireClient(), fileId),\n\n delete: (fileId: string) => filesOps.deleteFile(this.requireClient(), fileId),\n\n upload: (fileData: Blob, fileName: string, purpose?: string) =>\n filesOps.uploadFile(this.getAuthHeaders(), fileData, fileName, purpose),\n\n getContent: (fileId: string) => filesOps.getFileContent(this.getAuthHeaders(), fileId),\n }\n\n // ── Internal guards ───────────────────────────────────────────────────\n\n private requireClient(): ArbiClient {\n if (!this.client) {\n throw new ArbiError('Not initialized. Call login() or init() first.')\n }\n return this.client\n }\n\n private requireLogin(): LoginResult {\n if (!this.loginResult) {\n throw new ArbiError('Not logged in. Call login() first.')\n }\n return this.loginResult\n }\n\n private requireWorkspace(): string {\n if (!this.currentWorkspaceId) {\n throw new ArbiError('No workspace selected. Call selectWorkspace() first.')\n }\n return this.currentWorkspaceId\n }\n}\n","/**\n * Document operations — Node.js file system operations.\n *\n * These functions require Node.js built-ins (fs, path) and are not browser-safe.\n * Browser consumers should use the Blob-based uploadFile/uploadFiles from './documents.js'.\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport {\n uploadFile,\n uploadFiles,\n SUPPORTED_EXTENSIONS,\n sanitizeFolderPath,\n type UploadOptions,\n type UploadResult,\n type UploadBatchResult,\n} from './documents.js'\nimport type { AuthHeaders } from '../fetch.js'\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/**\n * Recursively collect files from a directory, filtered by SUPPORTED_EXTENSIONS.\n * Returns entries with { absolutePath, relativePath }.\n */\nfunction collectFiles(\n dirPath: string,\n baseDir?: string\n): Array<{ absolutePath: string; relativePath: string }> {\n const root = baseDir ?? dirPath\n const results: Array<{ absolutePath: string; relativePath: string }> = []\n\n for (const entry of fs.readdirSync(dirPath, { withFileTypes: true })) {\n const fullPath = path.join(dirPath, entry.name)\n if (entry.isDirectory()) {\n results.push(...collectFiles(fullPath, root))\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase()\n if (SUPPORTED_EXTENSIONS.has(ext)) {\n results.push({ absolutePath: fullPath, relativePath: path.relative(root, fullPath) })\n }\n }\n }\n\n return results\n}\n\n// ── Node.js file system operations ──────────────────────────────────────────\n\n/**\n * Upload a local file by path. Handles readFileSync + basename + Blob + uploadFile.\n * Convenience wrapper for CLI/TUI consumers that work with file system paths.\n */\nexport async function uploadLocalFile(\n auth: AuthHeaders,\n workspaceId: string,\n filePath: string,\n options?: UploadOptions\n): Promise<UploadResult & { fileName: string }> {\n const fileBuffer = fs.readFileSync(filePath)\n const fileName = path.basename(filePath)\n const result = await uploadFile(auth, workspaceId, new Blob([fileBuffer]), fileName, options)\n return { ...result, fileName }\n}\n\n/**\n * Upload all supported files from a directory, preserving folder structure.\n * Files are grouped by their relative folder path and uploaded per group.\n */\nexport async function uploadDirectory(\n auth: AuthHeaders,\n workspaceId: string,\n dirPath: string\n): Promise<UploadBatchResult> {\n const resolvedDir = path.resolve(dirPath)\n const dirName = path.basename(resolvedDir)\n const entries = collectFiles(resolvedDir)\n\n if (entries.length === 0) {\n return { doc_ext_ids: [], duplicates: [], folders: new Map() }\n }\n\n // Group by folder\n const groups = new Map<string, Array<{ absolutePath: string; name: string }>>()\n for (const entry of entries) {\n const relDir = path.dirname(entry.relativePath)\n // Prepend the directory name so the root folder appears on the backend\n const folder = relDir === '.' ? dirName : `${dirName}/${relDir}`\n if (!groups.has(folder)) groups.set(folder, [])\n groups\n .get(folder)!\n .push({ absolutePath: entry.absolutePath, name: path.basename(entry.relativePath) })\n }\n\n const allDocIds: string[] = []\n const allDuplicates: string[] = []\n const folders = new Map<\n string,\n { fileCount: number; doc_ext_ids: string[]; duplicates: string[] }\n >()\n\n for (const [folder, files] of groups) {\n const blobs = files.map((f) => ({\n data: new Blob([fs.readFileSync(f.absolutePath)]),\n name: f.name,\n }))\n\n const result = await uploadFiles(auth, workspaceId, blobs, { folder })\n const dups = result.duplicates ?? []\n\n allDocIds.push(...result.doc_ext_ids)\n allDuplicates.push(...dups)\n folders.set(folder, {\n fileCount: files.length,\n doc_ext_ids: result.doc_ext_ids,\n duplicates: dups,\n })\n }\n\n return { doc_ext_ids: allDocIds, duplicates: allDuplicates, folders }\n}\n\n/**\n * Upload files from a zip archive, preserving internal folder structure.\n * Uses jszip via dynamic import so the dependency is optional at load time.\n */\nexport async function uploadZip(\n auth: AuthHeaders,\n workspaceId: string,\n zipPath: string\n): Promise<UploadBatchResult> {\n const JSZip = (await import('jszip')).default\n const zipBuffer = fs.readFileSync(zipPath)\n const zip = await JSZip.loadAsync(zipBuffer)\n const zipBaseName = path.basename(zipPath).replace(/\\.zip$/i, '')\n\n // Collect supported entries\n const entries: Array<{\n zipEntryPath: string\n zipEntry: { async: (t: 'uint8array') => Promise<Uint8Array> }\n }> = []\n zip.forEach((relativePath, zipEntry) => {\n if (zipEntry.dir) return\n const ext = path.extname(relativePath).toLowerCase()\n if (SUPPORTED_EXTENSIONS.has(ext)) {\n entries.push({ zipEntryPath: relativePath, zipEntry })\n }\n })\n\n if (entries.length === 0) {\n return { doc_ext_ids: [], duplicates: [], folders: new Map() }\n }\n\n // Detect single root folder to avoid redundant nesting\n const firstParts = new Set(entries.map((e) => e.zipEntryPath.split('/')[0]))\n const hasSingleRoot = firstParts.size === 1 && entries.every((e) => e.zipEntryPath.includes('/'))\n\n // Group by folder\n const groups = new Map<string, Array<{ name: string; data: Uint8Array }>>()\n for (const entry of entries) {\n const data = await entry.zipEntry.async('uint8array')\n const fileName = path.basename(entry.zipEntryPath)\n const relDir = path.dirname(entry.zipEntryPath)\n\n let folder: string\n if (hasSingleRoot) {\n // Use the zip internal path as-is (root folder already present)\n folder = relDir === '.' ? zipBaseName : relDir\n } else {\n // Prepend zip base name\n folder = relDir === '.' ? zipBaseName : `${zipBaseName}/${relDir}`\n }\n folder = sanitizeFolderPath(folder)\n\n if (!groups.has(folder)) groups.set(folder, [])\n groups.get(folder)!.push({ name: fileName, data })\n }\n\n const allDocIds: string[] = []\n const allDuplicates: string[] = []\n const folders = new Map<\n string,\n { fileCount: number; doc_ext_ids: string[]; duplicates: string[] }\n >()\n\n for (const [folder, files] of groups) {\n const blobs = files.map((f) => ({\n data: new Blob([f.data]),\n name: f.name,\n }))\n\n const result = await uploadFiles(auth, workspaceId, blobs, { folder })\n const dups = result.duplicates ?? []\n\n allDocIds.push(...result.doc_ext_ids)\n allDuplicates.push(...dups)\n folders.set(folder, {\n fileCount: files.length,\n doc_ext_ids: result.doc_ext_ids,\n duplicates: dups,\n })\n }\n\n return { doc_ext_ids: allDocIds, duplicates: allDuplicates, folders }\n}\n","/**\n * Responses operations — background query submission and retrieval.\n *\n * submitBackgroundQuery: POST /v1/responses with background=true → 202 with task ID.\n * getResponse: GET /v1/responses/{responseId} → current status + output.\n * extractResponseText: Walk response output and join text content.\n */\n\nimport type { components } from '@arbidocs/client'\nimport { authenticatedFetch, type AuthHeaders } from '../fetch.js'\n\ntype MessageInput = components['schemas']['MessageInput']\ntype ResponsesAPIResponse = components['schemas']['ResponsesAPIResponse']\ntype ToolEntry = NonNullable<MessageInput['tools']>[string]\n\n// ── Submit background query ──────────────────────────────────────────────────\n\nexport interface SubmitBackgroundQueryOptions extends AuthHeaders {\n workspaceId: string\n question: string\n docIds: string[]\n previousResponseId?: string | null\n model?: string\n}\n\n/**\n * Submit a query for background processing.\n * Returns immediately with a response ID and \"queued\" status.\n */\nexport async function submitBackgroundQuery(\n options: SubmitBackgroundQueryOptions\n): Promise<ResponsesAPIResponse> {\n const { workspaceId, question, docIds, previousResponseId, model, ...auth } = options\n\n const tools: Record<string, ToolEntry> = {}\n if (docIds.length > 0) {\n tools.retrieval_chunk = {\n name: 'retrieval_chunk',\n description: 'retrieval chunk',\n tool_args: { doc_ext_ids: docIds },\n tool_responses: {},\n }\n tools.retrieval_full_context = {\n name: 'retrieval_full_context',\n description: 'retrieval full context',\n tool_args: { doc_ext_ids: [] },\n tool_responses: {},\n }\n }\n\n const body: MessageInput = {\n input: question,\n workspace_ext_id: workspaceId,\n stream: false,\n background: true,\n store: true,\n tools,\n ...(previousResponseId ? { previous_response_id: previousResponseId } : {}),\n ...(model ? { model } : {}),\n }\n\n const res = await authenticatedFetch({\n ...auth,\n path: '/v1/responses',\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json' },\n })\n\n return (await res.json()) as ResponsesAPIResponse\n}\n\n// ── Get response status/result ───────────────────────────────────────────────\n\n/**\n * Fetch the current state of a response by ID.\n * Returns progressive status, output, usage, and metadata.\n */\nexport async function getResponse(\n auth: AuthHeaders,\n responseId: string\n): Promise<ResponsesAPIResponse> {\n const res = await authenticatedFetch({\n ...auth,\n path: `/v1/responses/${responseId}`,\n method: 'GET',\n })\n\n return (await res.json()) as ResponsesAPIResponse\n}\n\n// ── Text extraction ──────────────────────────────────────────────────────────\n\n/**\n * Walk response output messages and join all output_text content.\n * Pure function, no I/O.\n */\nexport function extractResponseText(response: ResponsesAPIResponse): string {\n const parts: string[] = []\n for (const msg of response.output) {\n for (const item of msg.content) {\n if ('type' in item && item.type === 'output_text' && 'text' in item) {\n parts.push(item.text as string)\n }\n }\n }\n return parts.join('')\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/fetch.ts","../src/config.ts","../src/device-flow.ts","../src/auth.ts","../src/sse.ts","../src/websocket.ts","../src/format.ts","../src/citations.ts","../src/operations/documents.ts","../src/operations/workspaces.ts","../src/operations/conversations.ts","../src/operations/assistant.ts","../src/operations/tags.ts","../src/operations/contacts.ts","../src/operations/doctags.ts","../src/operations/dm.ts","../src/operations/settings.ts","../src/operations/agentconfig.ts","../src/operations/health.ts","../src/operations/files.ts","../src/arbi.ts","../src/operations/documents-node.ts","../src/operations/responses.ts"],"names":["path","os","fs","config","createArbiClient","base64ToBytes","deriveEncryptionKeypairFromSigning","sealedBoxDecrypt","createWorkspaceKeyHeader","arbi","loginResult","buildWebSocketUrl","createAuthMessage","parseServerMessage","isMessageType","uploadFile"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Core error types and throwing error utilities.\n *\n * Unlike CLI helpers which call process.exit(1), these throw typed errors\n * that consumers (CLI, TUI) can catch and handle in their own way.\n */\n\nexport class ArbiError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ArbiError'\n }\n}\n\nexport class ArbiApiError extends ArbiError {\n public readonly apiError?: unknown\n\n constructor(message: string, apiError?: unknown) {\n super(message)\n this.name = 'ArbiApiError'\n this.apiError = apiError\n }\n}\n\n/**\n * Check API response and throw on error. Returns narrowed non-null data.\n */\nexport function requireData<T>(result: { data?: T; error?: unknown }, message: string): T {\n if (result.error || !result.data) {\n throw new ArbiApiError(message, result.error)\n }\n return result.data\n}\n\n/**\n * Check API response for delete/void operations (no data expected).\n */\nexport function requireOk(result: { error?: unknown }, message: string): void {\n if (result.error) {\n throw new ArbiApiError(message, result.error)\n }\n}\n\n/**\n * Extract a human-readable message from an unknown error value.\n * Centralises the `err instanceof Error ? err.message : String(err)` pattern.\n *\n * Unwraps `.cause` chains to surface the root error — critical for Node.js\n * fetch errors where TypeError(\"fetch failed\") wraps the real cause\n * (ECONNREFUSED, UNABLE_TO_VERIFY_LEAF_SIGNATURE, etc.).\n */\nexport function getErrorMessage(err: unknown): string {\n if (!(err instanceof Error)) return String(err)\n\n // Walk the cause chain to find the deepest meaningful error\n const rootCause = getDeepestCause(err)\n if (rootCause !== err) {\n const rootMsg = rootCause.message || String(rootCause)\n // Include both the top-level context and root cause\n if (err.message && !err.message.includes(rootMsg)) {\n return `${err.message}: ${rootMsg}`\n }\n }\n\n return err.message\n}\n\n/**\n * Walk the .cause chain to find the deepest Error.\n */\nfunction getDeepestCause(err: Error): Error {\n let current: Error = err\n const seen = new Set<Error>()\n while (current.cause instanceof Error && !seen.has(current.cause)) {\n seen.add(current)\n current = current.cause\n }\n return current\n}\n\n/**\n * Extract the Node.js error code (e.g. 'ECONNREFUSED', 'ENOTFOUND') from an\n * error or its cause chain. Returns undefined if no code is found.\n */\nexport function getErrorCode(err: unknown): string | undefined {\n if (!(err instanceof Error)) return undefined\n\n let current: Error | undefined = err\n const seen = new Set<Error>()\n while (current && !seen.has(current)) {\n seen.add(current)\n const code = (current as Error & { code?: string }).code\n if (typeof code === 'string') return code\n current = current.cause instanceof Error ? current.cause : undefined\n }\n return undefined\n}\n","/**\n * Authenticated fetch utility — eliminates repeated raw-fetch boilerplate\n * in operations that can't use the typed SDK client (streaming, multipart, etc.).\n */\n\nimport { ArbiApiError } from './errors.js'\n\ninterface AuthHeaders {\n baseUrl: string\n accessToken: string\n workspaceKeyHeader: string\n}\n\ninterface AuthFetchOptions extends AuthHeaders {\n /** URL path relative to baseUrl (e.g. '/v1/document/upload'). */\n path: string\n method?: string\n body?: string | FormData | ArrayBuffer | ReadableStream | Blob | null\n /** Extra headers to merge in. */\n headers?: Record<string, string>\n}\n\n/** Friendly fallbacks for status codes when the server body is empty or unparseable. */\nconst STATUS_FALLBACKS: Record<number, string> = {\n 401: 'Token has expired. Please run: arbi login',\n 403: 'Access denied. You may not have permission for this workspace.',\n 404: 'Resource not found.',\n 503: 'The selected LLM is not responding. Please retry or select another model.',\n}\n\n/**\n * Extract a human-readable error message from an HTTP response.\n *\n * Always tries to read the response body first — the server often includes\n * a specific `detail` string (e.g. \"Parent message not found\") that is more\n * useful than a generic status-code description. Falls back to well-known\n * status messages only when the body is empty or unparseable.\n */\nasync function extractErrorMessage(res: Response): Promise<string> {\n // Try to parse error details from response body\n let bodyDetail: string | undefined\n try {\n const text = await res.text()\n if (text) {\n try {\n const json = JSON.parse(text) as { detail?: string; message?: string; error?: string }\n bodyDetail = json.detail || json.message || json.error || undefined\n } catch {\n // Not JSON — use raw text if it's reasonably short\n if (text.length < 200) bodyDetail = text\n }\n }\n } catch {\n // Ignore read errors\n }\n\n if (bodyDetail) return `Request failed (${res.status}): ${bodyDetail}`\n\n const fallback = STATUS_FALLBACKS[res.status]\n if (fallback) return fallback\n\n return `Request failed: ${res.status} ${res.statusText}`\n}\n\n/**\n * Make an authenticated fetch request with standard error handling.\n * Automatically sets Authorization + workspace-key headers.\n * Throws on non-ok responses with a human-readable message including server error details.\n */\nexport async function authenticatedFetch(options: AuthFetchOptions): Promise<Response> {\n const { baseUrl, accessToken, workspaceKeyHeader, path, method, body, headers } = options\n\n const res = await fetch(`${baseUrl}${path}`, {\n method: method ?? (body ? 'POST' : 'GET'),\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'workspace-key': workspaceKeyHeader,\n ...headers,\n },\n body,\n })\n\n if (!res.ok) {\n const message = await extractErrorMessage(res)\n throw new ArbiApiError(message, { status: res.status, statusText: res.statusText })\n }\n\n return res\n}\n\nexport type { AuthHeaders }\n","/**\n * Configuration persistence — file-based implementation for Node.js environments.\n *\n * Browser consumers should import from './config-types.ts' directly.\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { ArbiError } from './errors.js'\nimport type { CliConfig, CliCredentials, ChatSession, ConfigStore } from './config-types.js'\n\n// Re-export types for backward compatibility\nexport type { CliConfig, CliCredentials, ChatSession, ConfigStore } from './config-types.js'\n\n// ── File-based implementation ────────────────────────────────────────────────\n\nconst DEFAULT_SESSION: ChatSession = {\n lastMessageExtId: null,\n conversationExtId: null,\n workspaceId: null,\n}\n\nexport class FileConfigStore implements ConfigStore {\n private readonly configDir: string\n private readonly configFile: string\n private readonly credentialsFile: string\n private readonly sessionFile: string\n private readonly metadataFile: string\n\n constructor(configDir?: string) {\n this.configDir = configDir ?? process.env.ARBI_CONFIG_DIR ?? path.join(os.homedir(), '.arbi')\n this.configFile = path.join(this.configDir, 'config.json')\n this.credentialsFile = path.join(this.configDir, 'credentials.json')\n this.sessionFile = path.join(this.configDir, 'session.json')\n this.metadataFile = path.join(this.configDir, 'last-metadata.json')\n }\n\n private ensureConfigDir(): void {\n if (!fs.existsSync(this.configDir)) {\n fs.mkdirSync(this.configDir, { recursive: true, mode: 0o700 })\n }\n }\n\n private writeSecureFile(filePath: string, data: object): void {\n this.ensureConfigDir()\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', { mode: 0o600 })\n }\n\n private readJsonFile<T>(filePath: string): T | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as T\n } catch {\n return null\n }\n }\n\n // ── Config ──────────────────────────────────────────────────────────────\n\n getConfig(): CliConfig | null {\n return this.readJsonFile<CliConfig>(this.configFile)\n }\n\n saveConfig(config: CliConfig): void {\n this.writeSecureFile(this.configFile, config)\n }\n\n updateConfig(updates: Partial<CliConfig>): void {\n const existing = this.getConfig() || ({} as Partial<CliConfig>)\n this.saveConfig({ ...existing, ...updates } as CliConfig)\n }\n\n requireConfig(): CliConfig {\n const config = this.getConfig()\n if (!config?.baseUrl) {\n throw new ArbiError('Not configured. Run: arbi config set-url <url>')\n }\n return config\n }\n\n // ── Credentials ─────────────────────────────────────────────────────────\n\n getCredentials(): CliCredentials | null {\n return this.readJsonFile<CliCredentials>(this.credentialsFile)\n }\n\n saveCredentials(creds: CliCredentials): void {\n this.writeSecureFile(this.credentialsFile, creds)\n }\n\n deleteCredentials(): void {\n try {\n fs.unlinkSync(this.credentialsFile)\n } catch {\n // Already gone\n }\n }\n\n requireCredentials(): CliCredentials {\n const creds = this.getCredentials()\n if (!creds) {\n throw new ArbiError('Not logged in. Run: arbi login')\n }\n return creds\n }\n\n // ── Chat session ────────────────────────────────────────────────────────\n\n getChatSession(): ChatSession {\n return this.readJsonFile<ChatSession>(this.sessionFile) || { ...DEFAULT_SESSION }\n }\n\n saveChatSession(session: ChatSession): void {\n this.writeSecureFile(this.sessionFile, session)\n }\n\n updateChatSession(updates: Partial<ChatSession>): void {\n const existing = this.getChatSession()\n this.saveChatSession({ ...existing, ...updates })\n }\n\n clearChatSession(): void {\n this.saveChatSession({ ...DEFAULT_SESSION })\n }\n\n // ── Last metadata (for citation browsing) ────────────────────────────────\n\n saveLastMetadata(metadata: unknown): void {\n this.writeSecureFile(this.metadataFile, metadata as object)\n }\n\n loadLastMetadata(): unknown | null {\n return this.readJsonFile(this.metadataFile)\n }\n\n /**\n * Try to resolve config from multiple sources, in priority order:\n *\n * 1. Existing `~/.arbi/config.json` (highest priority)\n * 2. `ARBI_SERVER_URL` environment variable\n * 3. `.env` file in `searchDir` → read `VITE_DEPLOYMENT_DOMAIN`\n * 4. `public/config.json` in `searchDir` → read `deployment.domain`\n * 5. Default to `https://localhost`\n *\n * Returns `{ config, source }` where source describes where the config came from.\n * Saves auto-detected config to disk so subsequent calls use the fast path.\n */\n resolveConfigWithFallbacks(searchDir?: string): { config: CliConfig; source: string } {\n // 1. Existing config file\n const existing = this.getConfig()\n if (existing?.baseUrl) {\n return { config: existing, source: 'config' }\n }\n\n // 2. ARBI_SERVER_URL env var\n const envUrl = process.env.ARBI_SERVER_URL\n if (envUrl) {\n const domain = new URL(envUrl).hostname\n const config: CliConfig = { baseUrl: envUrl.replace(/\\/$/, ''), deploymentDomain: domain }\n this.saveConfig(config)\n return { config, source: 'ARBI_SERVER_URL env var' }\n }\n\n const dir = searchDir || process.cwd()\n\n // 3. .env file → VITE_DEPLOYMENT_DOMAIN\n const dotenvConfig = this.readDotEnvDomain(path.join(dir, '.env'))\n if (dotenvConfig) {\n this.saveConfig(dotenvConfig)\n return { config: dotenvConfig, source: '.env file' }\n }\n\n // 4. public/config.json → deployment.domain\n const publicConfig = this.readPublicConfigDomain(path.join(dir, 'public', 'config.json'))\n if (publicConfig) {\n this.saveConfig(publicConfig)\n return { config: publicConfig, source: 'public/config.json' }\n }\n\n // 5. Default to https://localhost\n const config: CliConfig = { baseUrl: 'https://localhost', deploymentDomain: 'localhost' }\n this.saveConfig(config)\n return { config, source: 'default (https://localhost)' }\n }\n\n /**\n * Read VITE_DEPLOYMENT_DOMAIN from a .env file.\n */\n private readDotEnvDomain(filePath: string): CliConfig | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n const match = content.match(/^VITE_DEPLOYMENT_DOMAIN\\s*=\\s*(.+)$/m)\n if (match) {\n const domain = match[1].trim().replace(/^[\"']|[\"']$/g, '')\n if (domain) {\n return { baseUrl: `https://${domain}`, deploymentDomain: domain }\n }\n }\n } catch {\n // File not found or unreadable\n }\n return null\n }\n\n /**\n * Read deployment.domain from a public/config.json file.\n */\n private readPublicConfigDomain(filePath: string): CliConfig | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n const json = JSON.parse(content) as { deployment?: { domain?: string } }\n const domain = json?.deployment?.domain\n if (domain) {\n return { baseUrl: `https://${domain}`, deploymentDomain: domain }\n }\n } catch {\n // File not found or unparseable\n }\n return null\n }\n}\n","/**\n * OAuth 2.0 Device Authorization Grant (RFC 8628) for Auth0.\n *\n * Enables headless CLI login: the user authorizes in a browser while the CLI polls for a token.\n */\n\nimport { createArbiClient } from '@arbidocs/client'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface SsoConfig {\n ssoEnabled: boolean\n domain: string\n clientId: string\n audience: string\n}\n\nexport interface DeviceCodeResponse {\n device_code: string\n user_code: string\n verification_uri: string\n verification_uri_complete: string\n expires_in: number\n interval: number\n}\n\n// ── Errors ───────────────────────────────────────────────────────────────────\n\nexport class DeviceFlowError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DeviceFlowError'\n }\n}\n\nexport class DeviceFlowExpired extends DeviceFlowError {\n constructor() {\n super('Device code expired — please try again')\n this.name = 'DeviceFlowExpired'\n }\n}\n\nexport class DeviceFlowAccessDenied extends DeviceFlowError {\n constructor() {\n super('Authorization was denied by the user')\n this.name = 'DeviceFlowAccessDenied'\n }\n}\n\n// ── Functions ────────────────────────────────────────────────────────────────\n\n/**\n * Fetch SSO configuration from the ARBI deployment.\n */\nexport async function fetchSsoConfig(baseUrl: string): Promise<SsoConfig> {\n const arbi = createArbiClient({ baseUrl, deploymentDomain: '', credentials: 'omit' })\n const { data, error } = await arbi.fetch.GET('/v1/user/sso-config')\n if (error || !data) {\n throw new DeviceFlowError(`Failed to fetch SSO config`)\n }\n return {\n ssoEnabled: data.sso_enabled,\n domain: data.domain,\n clientId: data.cli_client_id || data.client_id,\n audience: data.audience,\n }\n}\n\n/**\n * Request a device code from Auth0.\n *\n * POST https://{domain}/oauth/device/code\n */\nexport async function requestDeviceCode(\n domain: string,\n clientId: string,\n audience?: string,\n scope: string = 'openid email profile'\n): Promise<DeviceCodeResponse> {\n const body = new URLSearchParams({\n client_id: clientId,\n scope,\n ...(audience ? { audience } : {}),\n })\n\n const res = await fetch(`https://${domain}/oauth/device/code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new DeviceFlowError(`Device code request failed: ${res.status} ${text}`)\n }\n\n return (await res.json()) as DeviceCodeResponse\n}\n\n/**\n * Poll Auth0 token endpoint until the user authorizes (or the code expires).\n *\n * Returns the Auth0 access_token (JWT).\n */\nexport async function pollForToken(\n domain: string,\n clientId: string,\n deviceCode: string,\n interval: number,\n expiresIn: number,\n onPoll?: (elapsedMs: number) => void\n): Promise<string> {\n const deadline = Date.now() + expiresIn * 1000\n let pollInterval = interval * 1000 // seconds → ms\n\n while (Date.now() < deadline) {\n await sleep(pollInterval)\n onPoll?.(Date.now())\n\n const res = await fetch(`https://${domain}/oauth/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n client_id: clientId,\n device_code: deviceCode,\n }),\n })\n\n if (res.ok) {\n const data = (await res.json()) as { access_token: string }\n return data.access_token\n }\n\n const errBody = (await res.json().catch(() => ({ error: 'unknown' }))) as {\n error: string\n error_description?: string\n }\n\n if (errBody.error === 'authorization_pending') {\n continue\n } else if (errBody.error === 'slow_down') {\n pollInterval += 5000\n continue\n } else if (errBody.error === 'expired_token') {\n throw new DeviceFlowExpired()\n } else if (errBody.error === 'access_denied') {\n throw new DeviceFlowAccessDenied()\n } else {\n throw new DeviceFlowError(\n `Token polling error: ${errBody.error} — ${errBody.error_description ?? ''}`\n )\n }\n }\n\n throw new DeviceFlowExpired()\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","/**\n * Parameterized authentication functions.\n *\n * Unlike CLI's client.ts, these take explicit params instead of reading from disk.\n * This allows both CLI and TUI to use them with their own config sources.\n */\n\nimport {\n createArbiClient,\n sealedBoxDecrypt,\n deriveEncryptionKeypairFromSigning,\n createWorkspaceKeyHeader,\n base64ToBytes,\n type ArbiClient,\n type LoginResult,\n} from '@arbidocs/client'\nimport { ArbiError } from './errors.js'\nimport type { CliConfig, CliCredentials, ConfigStore } from './config-types.js'\nimport { fetchSsoConfig, requestDeviceCode, pollForToken } from './device-flow.js'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface AuthenticatedClient {\n arbi: ArbiClient\n loginResult: LoginResult\n}\n\nexport interface AuthContext {\n arbi: ArbiClient\n loginResult: LoginResult\n config: CliConfig\n}\n\nexport interface WorkspaceContext extends AuthContext {\n workspaceId: string\n accessToken: string\n workspaceKeyHeader: string\n}\n\n// ── Workspace choice formatting ──────────────────────────────────────────────\n\n/** Minimal workspace shape required by formatWorkspaceChoices. */\ninterface WorkspaceForChoice {\n name: string\n external_id: string\n shared_document_count: number\n private_document_count: number\n}\n\n/**\n * Format a list of workspaces into prompt-friendly choices.\n * Returns `{ name, value, description }` objects suitable for @inquirer/prompts\n * or any similar select component.\n */\nexport function formatWorkspaceChoices(\n wsList: WorkspaceForChoice[]\n): Array<{ name: string; value: string; description: string }> {\n return wsList.map((ws) => {\n const totalDocs = ws.shared_document_count + ws.private_document_count\n return {\n name: `${ws.name} (${totalDocs} docs)`,\n value: ws.external_id,\n description: ws.external_id,\n }\n })\n}\n\n// ── Functions ────────────────────────────────────────────────────────────────\n\n/**\n * Create an SDK client, init sodium, and log in with stored signing key.\n * Returns the client + login result (which includes serverSessionKey).\n */\nexport async function createAuthenticatedClient(\n config: CliConfig,\n creds: CliCredentials,\n store: ConfigStore\n): Promise<AuthenticatedClient> {\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n\n await arbi.crypto.initSodium()\n\n const signingPrivateKey = base64ToBytes(creds.signingPrivateKeyBase64)\n\n const loginResult = await arbi.auth.loginWithKey({\n email: creds.email,\n signingPrivateKey,\n ssoToken: creds.ssoToken,\n })\n\n // Update stored server session key (it changes each login).\n // Clear cached workspace tokens — the old workspaceKeyHeader was derived from\n // the previous session key and is now invalid.\n store.saveCredentials({\n ...creds,\n serverSessionKeyBase64: arbi.crypto.bytesToBase64(loginResult.serverSessionKey),\n accessToken: undefined,\n workspaceKeyHeader: undefined,\n workspaceId: undefined,\n tokenTimestamp: undefined,\n })\n\n return { arbi, loginResult }\n}\n\n/**\n * Interactive (password-based) login flow.\n *\n * Creates an SDK client, initializes sodium, authenticates with email/password,\n * and persists the derived credentials to the config store.\n *\n * Use this for CLI/TUI login commands. For session recovery from stored keys,\n * use createAuthenticatedClient() instead.\n */\nexport async function performPasswordLogin(\n config: CliConfig,\n email: string,\n password: string,\n store: ConfigStore\n): Promise<AuthContext> {\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n\n await arbi.crypto.initSodium()\n\n const loginResult = await arbi.auth.login({ email, password })\n\n store.saveCredentials({\n email,\n signingPrivateKeyBase64: arbi.crypto.bytesToBase64(loginResult.signingPrivateKey),\n serverSessionKeyBase64: arbi.crypto.bytesToBase64(loginResult.serverSessionKey),\n // Clear any cached workspace tokens — new session key invalidates them\n accessToken: undefined,\n workspaceKeyHeader: undefined,\n workspaceId: undefined,\n tokenTimestamp: undefined,\n })\n\n return { arbi, loginResult, config }\n}\n\n/**\n * SSO device-flow login (RFC 8628).\n *\n * Fetches SSO config from the deployment, initiates the device authorization\n * flow with Auth0, waits for the user to authorize in a browser, then logs\n * in to the ARBI deployment using the Auth0 JWT.\n */\nexport async function performSsoDeviceFlowLogin(\n config: CliConfig,\n email: string,\n password: string,\n store: ConfigStore,\n callbacks?: {\n onUserCode?: (userCode: string, verificationUri: string) => void\n onPoll?: (elapsedMs: number) => void\n }\n): Promise<AuthContext> {\n // 1. Fetch SSO config from deployment\n const ssoConfig = await fetchSsoConfig(config.baseUrl)\n if (!ssoConfig.ssoEnabled) {\n throw new ArbiError('SSO is not enabled on this deployment')\n }\n\n // 2. Request device code from Auth0\n const dc = await requestDeviceCode(ssoConfig.domain, ssoConfig.clientId, ssoConfig.audience)\n\n // 3. Notify caller with the user code\n callbacks?.onUserCode?.(dc.user_code, dc.verification_uri_complete)\n\n // 4. Poll until user authorizes in browser\n const ssoToken = await pollForToken(\n ssoConfig.domain,\n ssoConfig.clientId,\n dc.device_code,\n dc.interval,\n dc.expires_in,\n callbacks?.onPoll\n )\n\n // 5. Log in to ARBI with SSO token + password\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n await arbi.crypto.initSodium()\n const loginResult = await arbi.auth.login({ email, password, ssoToken })\n\n // 6. Persist credentials (same pattern as performPasswordLogin)\n // Store ssoToken so session recovery can pass it to loginWithKey.\n store.saveCredentials({\n email,\n signingPrivateKeyBase64: arbi.crypto.bytesToBase64(loginResult.signingPrivateKey),\n serverSessionKeyBase64: arbi.crypto.bytesToBase64(loginResult.serverSessionKey),\n ssoToken,\n accessToken: undefined,\n workspaceKeyHeader: undefined,\n workspaceId: undefined,\n tokenTimestamp: undefined,\n })\n\n return { arbi, loginResult, config }\n}\n\n/**\n * Decrypt wrapped workspace key and set it as the active workspace header.\n */\nexport async function selectWorkspace(\n arbi: ArbiClient,\n workspaceId: string,\n wrappedKey: string,\n serverSessionKey: Uint8Array,\n signingPrivateKeyBase64: string\n): Promise<void> {\n const signingPrivateKey = base64ToBytes(signingPrivateKeyBase64)\n\n // Ed25519 public key is the last 32 bytes of the 64-byte private key\n const ed25519PublicKey = signingPrivateKey.slice(32, 64)\n const encryptionKeyPair = deriveEncryptionKeypairFromSigning({\n publicKey: ed25519PublicKey,\n secretKey: signingPrivateKey,\n })\n\n const workspaceKey = sealedBoxDecrypt(wrappedKey, encryptionKeyPair.secretKey)\n const header = await createWorkspaceKeyHeader(workspaceKey, serverSessionKey)\n\n arbi.session.setSelectedWorkspace(workspaceId)\n arbi.session.setCachedWorkspaceHeader(workspaceId, header)\n}\n\n/**\n * Generate an encrypted workspace key for the given workspace.\n * Used for operations that need a key for a workspace other than the current one\n * (e.g., copy documents to a target workspace).\n */\nexport async function generateEncryptedWorkspaceKey(\n arbi: ArbiClient,\n wrappedKey: string,\n serverSessionKey: Uint8Array,\n signingPrivateKeyBase64: string\n): Promise<string> {\n const signingPrivateKey = base64ToBytes(signingPrivateKeyBase64)\n const ed25519PublicKey = signingPrivateKey.slice(32, 64)\n const encryptionKeyPair = deriveEncryptionKeypairFromSigning({\n publicKey: ed25519PublicKey,\n secretKey: signingPrivateKey,\n })\n\n const workspaceKey = sealedBoxDecrypt(wrappedKey, encryptionKeyPair.secretKey)\n return createWorkspaceKeyHeader(workspaceKey, serverSessionKey)\n}\n\n/**\n * Find a workspace by ID in the user's workspace list, select it, and return workspace info.\n */\nexport async function selectWorkspaceById(\n arbi: ArbiClient,\n workspaceId: string,\n serverSessionKey: Uint8Array,\n signingPrivateKeyBase64: string\n): Promise<{ external_id: string; name: string; wrapped_key: string }> {\n const { data: workspaces, error } = await arbi.fetch.GET('/v1/user/workspaces')\n if (error || !workspaces) {\n throw new ArbiError('Failed to fetch workspaces')\n }\n\n const ws = workspaces.find((w) => w.external_id === workspaceId)\n if (!ws || !ws.wrapped_key) {\n throw new ArbiError(`Workspace ${workspaceId} not found or has no encryption key`)\n }\n\n await selectWorkspace(\n arbi,\n ws.external_id,\n ws.wrapped_key,\n serverSessionKey,\n signingPrivateKeyBase64\n )\n\n // Exchange workspace key for a workspace-scoped JWT\n const workspaceKeyHeader = arbi.session.getWorkspaceKeyHeader()\n if (workspaceKeyHeader) {\n const { data: openResult, error: openError } = await arbi.fetch.POST(\n '/v1/workspace/{workspace_ext_id}/open',\n {\n params: { path: { workspace_ext_id: ws.external_id } },\n body: { workspace_key: workspaceKeyHeader },\n }\n )\n if (!openError && openResult?.access_token) {\n arbi.session.setAccessToken(openResult.access_token)\n }\n }\n\n return { external_id: ws.external_id, name: ws.name, wrapped_key: ws.wrapped_key }\n}\n\n/**\n * Authenticate and return the SDK client + config.\n * Throws ArbiError instead of calling process.exit.\n */\nexport async function resolveAuth(store: ConfigStore): Promise<AuthContext> {\n const config = store.requireConfig()\n const creds = store.requireCredentials()\n const { arbi, loginResult } = await createAuthenticatedClient(config, creds, store)\n return { arbi, loginResult, config }\n}\n\n/** Max age for cached tokens before re-login (50 minutes — JWTs typically expire at 60). */\nconst TOKEN_MAX_AGE_MS = 50 * 60 * 1000\n\n/**\n * Check if a cached token is still usable.\n */\nfunction isCachedTokenValid(\n creds: CliCredentials,\n workspaceId: string\n): creds is CliCredentials & {\n accessToken: string\n workspaceKeyHeader: string\n workspaceId: string\n tokenTimestamp: string\n} {\n return !!(\n creds.accessToken &&\n creds.workspaceKeyHeader &&\n creds.workspaceId === workspaceId &&\n creds.tokenTimestamp &&\n Date.now() - new Date(creds.tokenTimestamp).getTime() < TOKEN_MAX_AGE_MS\n )\n}\n\n/**\n * Authenticate, resolve workspace, and set up headers.\n * Uses cached JWT when available for the same workspace and not expired.\n * Throws ArbiError instead of calling process.exit.\n */\nexport async function resolveWorkspace(\n store: ConfigStore,\n workspaceOpt?: string\n): Promise<WorkspaceContext> {\n const config = store.requireConfig()\n const creds = store.requireCredentials()\n const workspaceId = workspaceOpt || config.selectedWorkspaceId\n\n if (!workspaceId) {\n throw new ArbiError('No workspace selected. Run: arbi workspace select <id>')\n }\n\n // Try cached token first — skip login entirely, use stored JWT + workspace key.\n // The session key stays valid until logout; only the workspace token changes on switch.\n if (isCachedTokenValid(creds, workspaceId)) {\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n await arbi.crypto.initSodium()\n\n // Set cached auth state directly — no login round-trip needed\n arbi.session.setSelectedWorkspace(workspaceId)\n arbi.session.setAccessToken(creds.accessToken)\n arbi.session.setCachedWorkspaceHeader(workspaceId, creds.workspaceKeyHeader)\n\n // Reconstruct loginResult from stored credentials\n const signingPrivateKey = base64ToBytes(creds.signingPrivateKeyBase64)\n const serverSessionKey = base64ToBytes(creds.serverSessionKeyBase64)\n const loginResult: LoginResult = {\n accessToken: creds.accessToken,\n signingPrivateKey,\n serverSessionKey,\n }\n\n return {\n arbi,\n loginResult,\n config,\n workspaceId,\n accessToken: creds.accessToken,\n workspaceKeyHeader: creds.workspaceKeyHeader,\n }\n }\n\n // Full re-login + workspace open\n const { arbi, loginResult } = await createAuthenticatedClient(config, creds, store)\n await selectWorkspaceById(\n arbi,\n workspaceId,\n loginResult.serverSessionKey,\n creds.signingPrivateKeyBase64\n )\n\n const accessToken = arbi.session.getState().accessToken\n const workspaceKeyHeader = arbi.session.getWorkspaceKeyHeader()\n\n if (!accessToken || !workspaceKeyHeader) {\n throw new ArbiError('Authentication error — missing token or workspace key')\n }\n\n // Cache the new token for subsequent commands\n store.saveCredentials({\n ...store.requireCredentials(),\n accessToken,\n workspaceKeyHeader,\n workspaceId,\n tokenTimestamp: new Date().toISOString(),\n })\n\n return { arbi, loginResult, config, workspaceId, accessToken, workspaceKeyHeader }\n}\n","/**\n * Server-Sent Events (SSE) parsing utilities.\n *\n * Extracted from CLI ask.ts for shared use by CLI and TUI.\n */\n\nimport type {\n SSEStreamStartData,\n AgentStepEvent,\n UserMessageEvent,\n MessageQueuedEvent,\n MessageMetadataPayload,\n UserInputRequestEvent,\n ArtifactEvent,\n ResponseCreatedEvent,\n ResponseOutputTextDeltaEvent,\n ResponseOutputTextDoneEvent,\n ResponseOutputItemAddedEvent,\n ResponseOutputItemDoneEvent,\n ResponseContentPartAddedEvent,\n ResponseCompletedEvent,\n ResponseFailedEvent,\n ResponseUsage,\n TokenBudgetContext,\n} from './sse-types.js'\n\nexport interface SSEEvent {\n event: string\n data: string\n}\n\nexport const TOOL_LABELS: Record<string, string> = {\n search_documents: 'Searching documents',\n get_document_passages: 'Reading document',\n get_table_of_contents: 'Getting table of contents',\n view_document_pages: 'Viewing document pages',\n get_full_document: 'Reading full document',\n web_search: 'Searching the web',\n read_url: 'Reading web pages',\n ask_user: 'Asking user',\n compaction: 'Compacting conversation',\n personal_agent: 'Running agent',\n create_artifact: 'Creating artifact',\n create_plan: 'Creating plan',\n save_skill: 'Saving skill',\n run_code: 'Running code',\n}\n\nexport const LIFECYCLE_LABELS: Record<string, string> = {\n evaluation: 'Evaluating results',\n answering: 'Writing answer',\n reviewing: 'Reviewing answer',\n planning: 'Planning',\n tool_progress: 'Working',\n}\n\n/**\n * Format an AgentStepEvent into a human-readable label.\n *\n * Priority:\n * 1. `focus` — the agent's descriptive sentence about what it's doing\n * 2. For `tool_progress` — tool-specific label + optional message\n * 3. Lifecycle label (planning, evaluation, etc.)\n * 4. Tool name from detail\n * 5. Fallback to step name or empty string\n */\nexport function formatAgentStepLabel(step: AgentStepEvent): string {\n if (step.focus) return step.focus\n\n const detail = step.detail as Array<{ tool?: string; message?: string }> | undefined\n\n if (step.step === 'tool_progress' && detail && detail.length > 0) {\n const toolName = detail[0].tool\n const label = (toolName && TOOL_LABELS[toolName]) || LIFECYCLE_LABELS.tool_progress\n const message = detail[0].message\n return message ? `${label}: ${message}` : label\n }\n\n if (step.step) {\n return LIFECYCLE_LABELS[step.step] || step.step\n }\n\n if (detail && detail.length > 0 && detail[0].tool) {\n return TOOL_LABELS[detail[0].tool] || detail[0].tool\n }\n\n return ''\n}\n\n/**\n * Parse SSE events from a chunk of text, combining with a buffer\n * of incomplete data from previous chunks.\n *\n * Returns parsed events and any remaining incomplete data.\n */\nexport function parseSSEEvents(\n chunk: string,\n buffer: string\n): { events: SSEEvent[]; remaining: string } {\n const combined = buffer + chunk\n const events: SSEEvent[] = []\n const parts = combined.split('\\n\\n')\n const remaining = parts.pop() || ''\n\n for (const part of parts) {\n if (!part.trim()) continue\n let eventType = ''\n let eventData = ''\n for (const line of part.split('\\n')) {\n if (line.startsWith('event: ')) eventType = line.slice(7).trim()\n else if (line.startsWith('data: ')) eventData = line.slice(6)\n }\n if (eventType && eventData) events.push({ event: eventType, data: eventData })\n }\n\n return { events, remaining }\n}\n\n/**\n * Callbacks for streaming SSE events. All callbacks are optional —\n * omitted callbacks simply ignore that event type.\n */\nexport interface SSEStreamCallbacks {\n onStreamStart?: (data: SSEStreamStartData) => void\n onToken?: (content: string) => void\n onTextDone?: (text: string) => void\n onOutputItemAdded?: (data: ResponseOutputItemAddedEvent) => void\n onOutputItemDone?: (data: ResponseOutputItemDoneEvent) => void\n onContentPartAdded?: (data: ResponseContentPartAddedEvent) => void\n onAgentStep?: (data: AgentStepEvent) => void\n onError?: (message: string) => void\n onMessageQueued?: (data: MessageQueuedEvent) => void\n onUserMessage?: (data: UserMessageEvent) => void\n onMetadata?: (data: MessageMetadataPayload) => void\n onUserInputRequest?: (data: UserInputRequestEvent) => void\n onArtifact?: (data: ArtifactEvent) => void\n onElapsedTime?: (t: number) => void\n onUsage?: (usage: ResponseUsage) => void\n onComplete?: () => void\n}\n\n/**\n * Result returned after the SSE stream is fully consumed.\n */\nexport interface SSEStreamResult {\n text: string\n assistantMessageExtId: string | null\n agentSteps: string[]\n /** Total number of tool calls across all agent steps. */\n toolCallCount: number\n errors: string[]\n userMessage: UserMessageEvent | null\n metadata: MessageMetadataPayload | null\n artifacts: ArtifactEvent[]\n usage: ResponseUsage | null\n /** Token budget context snapshot from response.completed. */\n context: TokenBudgetContext | null\n}\n\n/**\n * Stream SSE events from a Response, invoking callbacks as events arrive.\n *\n * This is the primary streaming function — use it when you need real-time\n * event handling (CLI streaming to stdout, TUI rendering, etc.).\n *\n * Also accumulates the full response and returns it, so callers can use\n * both the streaming callbacks and the final result.\n */\nexport async function streamSSE(\n response: Response,\n callbacks: SSEStreamCallbacks = {}\n): Promise<SSEStreamResult> {\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder('utf-8')\n let sseBuffer = ''\n let text = ''\n let assistantMessageExtId: string | null = null\n const agentSteps: string[] = []\n let toolCallCount = 0\n const errors: string[] = []\n const artifacts: ArtifactEvent[] = []\n let userMessage: UserMessageEvent | null = null\n let metadata: MessageMetadataPayload | null = null\n let usage: ResponseUsage | null = null\n let context: TokenBudgetContext | null = null\n\n // Each handler receives the raw JSON string and parses to the correct type.\n const eventHandlers: Record<string, (raw: string) => void> = {\n // OpenAI Responses API events (dot-separated names from server)\n 'response.created': (raw) => {\n const data: ResponseCreatedEvent = JSON.parse(raw)\n const id = data.response?.id\n if (id) assistantMessageExtId = id\n callbacks.onStreamStart?.({ assistant_message_ext_id: id })\n if (data.t != null) callbacks.onElapsedTime?.(data.t)\n },\n 'response.output_item.added': (raw) => {\n const data: ResponseOutputItemAddedEvent = JSON.parse(raw)\n callbacks.onOutputItemAdded?.(data)\n },\n 'response.content_part.added': (raw) => {\n const data: ResponseContentPartAddedEvent = JSON.parse(raw)\n callbacks.onContentPartAdded?.(data)\n },\n 'response.output_text.delta': (raw) => {\n const data: ResponseOutputTextDeltaEvent = JSON.parse(raw)\n if (data.delta) {\n text += data.delta\n callbacks.onToken?.(data.delta)\n }\n },\n 'response.output_text.done': (raw) => {\n const data: ResponseOutputTextDoneEvent = JSON.parse(raw)\n callbacks.onTextDone?.(data.text)\n },\n 'response.output_item.done': (raw) => {\n const data: ResponseOutputItemDoneEvent = JSON.parse(raw)\n callbacks.onOutputItemDone?.(data)\n },\n 'response.completed': (raw) => {\n const data: ResponseCompletedEvent = JSON.parse(raw)\n if (data.response?.usage) {\n usage = data.response.usage\n callbacks.onUsage?.(data.response.usage)\n }\n // Extract metadata from response.completed envelope (backend embeds it here)\n if (data.response?.metadata) {\n const meta = data.response.metadata as MessageMetadataPayload\n metadata = meta\n callbacks.onMetadata?.(meta)\n }\n // Capture token budget context snapshot\n if (data.context) {\n context = data.context\n }\n if (data.t != null) callbacks.onElapsedTime?.(data.t)\n callbacks.onComplete?.()\n },\n 'response.failed': (raw) => {\n const data: ResponseFailedEvent = JSON.parse(raw)\n const message = data.response?.error?.message || 'Unknown streaming error'\n errors.push(message)\n callbacks.onError?.(message)\n },\n // ARBI-specific events (dot-prefixed from server)\n 'arbi.message_queued': (raw) => {\n const data: MessageQueuedEvent = JSON.parse(raw)\n // For continuation queries, the queued event includes the full user message\n // with status=\"queued\" so the frontend can display it before the gate opens.\n if (data.user_message) {\n userMessage = data.user_message\n callbacks.onUserMessage?.(data.user_message)\n }\n callbacks.onMessageQueued?.(data)\n },\n 'arbi.agent_step': (raw) => {\n const data: AgentStepEvent = JSON.parse(raw)\n const label = formatAgentStepLabel(data)\n if (label) agentSteps.push(label)\n // Count tool calls from detail array (each entry = one tool call)\n const detail = data.detail as Array<{ tool?: string }> | undefined\n if (detail && Array.isArray(detail)) {\n toolCallCount += detail.filter((d) => d.tool).length\n }\n callbacks.onAgentStep?.(data)\n if (data.t != null) callbacks.onElapsedTime?.(data.t)\n },\n 'arbi.user_message': (raw) => {\n const data: UserMessageEvent = JSON.parse(raw)\n userMessage = data\n callbacks.onUserMessage?.(data)\n },\n 'arbi.message_metadata': (raw) => {\n const data: MessageMetadataPayload = JSON.parse(raw)\n metadata = data\n callbacks.onMetadata?.(data)\n },\n 'arbi.user_input_request': (raw) => {\n const data: UserInputRequestEvent = JSON.parse(raw)\n callbacks.onUserInputRequest?.(data)\n },\n 'arbi.artifact': (raw) => {\n const data: ArtifactEvent = JSON.parse(raw)\n artifacts.push(data)\n callbacks.onArtifact?.(data)\n },\n 'response.complete': () => {\n callbacks.onComplete?.()\n },\n }\n\n const processEvents = (events: SSEEvent[]) => {\n for (const { event, data } of events) {\n try {\n const handler = eventHandlers[event]\n if (handler) handler(data)\n } catch {\n /* skip unparseable events */\n }\n }\n }\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n const { events, remaining } = parseSSEEvents(decoder.decode(value, { stream: true }), sseBuffer)\n sseBuffer = remaining\n processEvents(events)\n }\n\n // Process any remaining buffered data\n if (sseBuffer.trim()) {\n const { events } = parseSSEEvents(sseBuffer + '\\n\\n', '')\n processEvents(events)\n }\n\n return {\n text,\n assistantMessageExtId,\n agentSteps,\n toolCallCount,\n errors,\n userMessage,\n metadata,\n artifacts,\n usage,\n context,\n }\n}\n\n/**\n * Format a human-readable summary line from a completed SSE stream result.\n *\n * Returns a string like:\n * \"3 steps (2 tool calls) · 1,234 tokens · 500/8,000 context · 2.5s\"\n *\n * Returns empty string if there's nothing to report.\n */\nexport function formatStreamSummary(result: SSEStreamResult, elapsedTime?: number | null): string {\n const parts: string[] = []\n\n if (result.agentSteps.length > 0) {\n let stepLabel = `${result.agentSteps.length} step${result.agentSteps.length === 1 ? '' : 's'}`\n if (result.toolCallCount > 0) {\n stepLabel += ` (${result.toolCallCount} tool call${result.toolCallCount === 1 ? '' : 's'})`\n }\n parts.push(stepLabel)\n }\n\n if (result.usage) {\n parts.push(`${result.usage.total_tokens.toLocaleString()} tokens`)\n }\n\n if (result.context && result.context.context_window > 0) {\n const used = result.context.all_llm_calls?.last_input_tokens ?? result.context.total_input\n parts.push(`${used.toLocaleString()}/${result.context.context_window.toLocaleString()} context`)\n }\n\n if (elapsedTime != null) {\n parts.push(`${elapsedTime.toFixed(1)}s`)\n }\n\n return parts.length > 0 ? parts.join(' · ') : ''\n}\n\n/**\n * Consume an entire SSE stream without streaming callbacks.\n * Convenience alias for `streamSSE(response)`.\n */\nexport const consumeSSEStream = streamSSE\n","/**\n * WebSocket connection manager.\n *\n * Uses Node.js native WebSocket (available in Node 22+).\n * Authenticates via SDK helpers, routes typed messages to the consumer.\n */\n\nimport {\n buildWebSocketUrl,\n createAuthMessage,\n parseServerMessage,\n isMessageType,\n type WebSocketServerMessage,\n type WsAuthResultMessage,\n type WsTaskUpdateMessage,\n type WsBatchCompleteMessage,\n type WsErrorMessage,\n type WsPresenceUpdateMessage,\n type WsNotificationResponse,\n type WsResponseCompleteMessage,\n} from '@arbidocs/client'\n\nconst AUTH_TIMEOUT_MS = 10_000\nconst MAX_BACKOFF_MS = 30_000\n\nexport interface WsConnection {\n close: () => void\n}\n\nexport interface ConnectOptions {\n baseUrl: string\n accessToken: string\n onMessage: (msg: WebSocketServerMessage) => void\n onClose?: (code: number, reason: string) => void\n}\n\nexport interface ReconnectOptions extends ConnectOptions {\n maxRetries?: number\n initialDelayMs?: number\n onReconnecting?: (attempt: number, maxRetries: number) => void\n onReconnected?: () => void\n onReconnectFailed?: () => void\n}\n\nexport interface ReconnectableWsConnection {\n close: () => void\n}\n\n/**\n * Open a WebSocket, authenticate, and start routing messages.\n *\n * Resolves after a successful `auth_result`, rejects on auth failure or timeout.\n * Subsequent messages are dispatched to `onMessage`.\n */\nexport function connectWebSocket(options: ConnectOptions): Promise<WsConnection> {\n const { baseUrl, accessToken, onMessage, onClose } = options\n const url = buildWebSocketUrl(baseUrl)\n\n return new Promise<WsConnection>((resolve, reject) => {\n const ws = new WebSocket(url)\n let authenticated = false\n\n const timeout = setTimeout(() => {\n if (!authenticated) {\n ws.close()\n reject(new Error('WebSocket auth timed out'))\n }\n }, AUTH_TIMEOUT_MS)\n\n ws.addEventListener('open', () => {\n ws.send(createAuthMessage(accessToken))\n })\n\n ws.addEventListener('message', (event) => {\n const data = typeof event.data === 'string' ? event.data : String(event.data)\n const msg = parseServerMessage(data)\n if (!msg) return\n\n if (!authenticated) {\n if (isMessageType<WsAuthResultMessage>(msg, 'auth_result')) {\n clearTimeout(timeout)\n if (msg.success) {\n authenticated = true\n resolve({ close: () => ws.close() })\n } else {\n ws.close()\n reject(new Error(`WebSocket auth failed: ${msg.reason || 'unknown'}`))\n }\n }\n return\n }\n\n onMessage(msg)\n })\n\n ws.addEventListener('close', (event) => {\n clearTimeout(timeout)\n if (!authenticated) {\n reject(new Error(`WebSocket closed before auth (code ${event.code})`))\n return\n }\n onClose?.(event.code, event.reason)\n })\n\n ws.addEventListener('error', () => {\n // The close event will fire after error, so we handle rejection there.\n // This prevents unhandled rejection from the error event itself.\n })\n })\n}\n\n/**\n * Connect WebSocket with automatic reconnection on disconnect.\n *\n * Initial connection throws on failure (same as connectWebSocket).\n * After successful auth, disconnects trigger exponential backoff reconnection.\n * Call close() on the returned handle to stop reconnection attempts.\n */\nexport async function connectWithReconnect(\n options: ReconnectOptions\n): Promise<ReconnectableWsConnection> {\n const {\n maxRetries = 10,\n initialDelayMs = 1000,\n onReconnecting,\n onReconnected,\n onReconnectFailed,\n onClose,\n ...connectOpts\n } = options\n\n let closed = false\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null\n let currentConnection: WsConnection | null = null\n\n const scheduleReconnect = async () => {\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n if (closed) return\n\n const delay = Math.min(initialDelayMs * Math.pow(2, attempt - 1), MAX_BACKOFF_MS)\n onReconnecting?.(attempt, maxRetries)\n\n await new Promise<void>((resolve) => {\n reconnectTimer = setTimeout(resolve, delay)\n })\n\n if (closed) return\n\n try {\n currentConnection = await connectWebSocket({\n ...connectOpts,\n onClose: (code, reason) => {\n currentConnection = null\n onClose?.(code, reason)\n if (!closed) scheduleReconnect()\n },\n })\n onReconnected?.()\n return\n } catch {\n // Retry on next iteration\n }\n }\n\n if (!closed) onReconnectFailed?.()\n }\n\n // Initial connection — throws on failure (no retry)\n currentConnection = await connectWebSocket({\n ...connectOpts,\n onClose: (code, reason) => {\n currentConnection = null\n onClose?.(code, reason)\n if (!closed) scheduleReconnect()\n },\n })\n\n return {\n close: () => {\n closed = true\n if (reconnectTimer) clearTimeout(reconnectTimer)\n currentConnection?.close()\n currentConnection = null\n },\n }\n}\n\n// ── Document processing waiter ───────────────────────────────────────────────\n\nconst DOC_TERMINAL_STATUSES = new Set(['completed', 'failed', 'skipped'])\n\nexport interface DocumentWaiterOptions {\n /** Base URL of the ARBI server (e.g. \"https://app.arbi.city\"). */\n baseUrl: string\n /** JWT access token for WebSocket authentication. */\n accessToken: string\n /** Optional callback invoked for every task_update on tracked documents. */\n onStatus?: (msg: WsTaskUpdateMessage) => void\n}\n\nexport interface DocumentWaiter {\n /** Register document IDs to track. Can be called multiple times. */\n addDocIds(ids: string[]): void\n /** Block until all tracked documents reach terminal status. */\n waitUntilDone(timeoutMs?: number): Promise<Map<string, string>>\n /** Close the WebSocket without waiting. */\n close(): void\n}\n\n/**\n * Open a WebSocket and start collecting document status events.\n *\n * Call this BEFORE uploading so no events are missed. Then call `addDocIds()`\n * once you know the IDs, and `waitUntilDone()` to block until all reach a\n * terminal status (completed, failed, or skipped).\n *\n * Mirrors the backend SDK's `ArbiWebSocket.wait_for_docs()` pattern.\n *\n * @example\n * ```ts\n * const waiter = createDocumentWaiter({ baseUrl, accessToken })\n * const result = await uploadDocuments(...)\n * waiter.addDocIds(result.doc_ext_ids)\n * const statuses = await waiter.waitUntilDone(120_000)\n * ```\n */\nexport function createDocumentWaiter(options: DocumentWaiterOptions): DocumentWaiter {\n const { baseUrl, accessToken, onStatus } = options\n\n const tracked = new Set<string>()\n const results = new Map<string, string>()\n let resolveWait: ((results: Map<string, string>) => void) | null = null\n let authenticated = false\n\n const url = buildWebSocketUrl(baseUrl)\n const ws = new WebSocket(url)\n\n const checkDone = () => {\n if (resolveWait && [...tracked].every((id) => results.has(id))) {\n resolveWait(results)\n resolveWait = null\n }\n }\n\n ws.addEventListener('open', () => {\n ws.send(createAuthMessage(accessToken))\n })\n\n ws.addEventListener('message', (event) => {\n const data = typeof event.data === 'string' ? event.data : String(event.data)\n const msg = parseServerMessage(data)\n if (!msg) return\n\n if (!authenticated) {\n if (msg.type === 'auth_result') {\n authenticated = (msg as { success?: boolean }).success === true\n }\n return\n }\n\n if (isMessageType<WsTaskUpdateMessage>(msg, 'task_update')) {\n if (!tracked.has(msg.doc_ext_id)) return\n\n onStatus?.(msg)\n\n if (DOC_TERMINAL_STATUSES.has(msg.status)) {\n results.set(msg.doc_ext_id, msg.status)\n checkDone()\n }\n }\n })\n\n return {\n addDocIds(ids: string[]) {\n for (const id of ids) tracked.add(id)\n checkDone()\n },\n\n waitUntilDone(timeoutMs = 120_000): Promise<Map<string, string>> {\n if ([...tracked].every((id) => results.has(id))) {\n ws.close()\n return Promise.resolve(results)\n }\n\n return new Promise<Map<string, string>>((resolve, reject) => {\n resolveWait = (r) => {\n ws.close()\n resolve(r)\n }\n\n setTimeout(() => {\n const pending = [...tracked].filter((id) => !results.has(id))\n ws.close()\n reject(\n new Error(\n `waitForDocuments timed out after ${timeoutMs}ms. Still pending: ${pending.join(', ')}`\n )\n )\n }, timeoutMs)\n })\n },\n\n close() {\n ws.close()\n },\n }\n}\n\n// ── Message formatting (shared by TUI + CLI) ────────────────────────────────\n\nexport type MessageLevel = 'info' | 'success' | 'error' | 'warning'\n\nexport interface FormattedWsMessage {\n text: string\n level: MessageLevel\n}\n\n/** Check if a message is a notification (has sender/recipient, not a system message). */\nfunction isNotification(msg: WebSocketServerMessage): msg is WsNotificationResponse {\n return 'sender' in msg && 'recipient' in msg\n}\n\n/**\n * Format a WebSocket message into display text + severity level.\n * Shared by TUI (toasts) and CLI (stderr lines) — single source of truth.\n */\nexport function formatWsMessage(msg: WebSocketServerMessage): FormattedWsMessage {\n if (isMessageType<WsTaskUpdateMessage>(msg, 'task_update')) {\n const progress = msg.progress > 0 ? ` (${Math.round(msg.progress)}%)` : ''\n const text = `${msg.file_name} — ${msg.status}${progress}`\n\n if (msg.status === 'completed') return { text, level: 'success' }\n if (msg.status === 'failed') return { text, level: 'error' }\n return { text, level: 'info' }\n }\n\n if (isMessageType<WsBatchCompleteMessage>(msg, 'batch_complete')) {\n const count = msg.doc_ext_ids.length\n return {\n text: `Batch complete: ${msg.batch_type} — ${count} doc${count !== 1 ? 's' : ''}`,\n level: 'success',\n }\n }\n\n if (isMessageType<WsErrorMessage>(msg, 'error')) {\n return { text: msg.message, level: 'error' }\n }\n\n if (isMessageType<WsPresenceUpdateMessage>(msg, 'presence_update')) {\n return { text: `${msg.user_id} is ${msg.status}`, level: 'info' }\n }\n\n if (isMessageType<WsResponseCompleteMessage>(msg, 'response_complete')) {\n const icon = msg.status === 'completed' ? '✓' : '✗'\n return {\n text: `${icon} Task ${msg.response_id} ${msg.status}`,\n level: msg.status === 'completed' ? 'success' : 'error',\n }\n }\n\n if (isNotification(msg)) {\n const sender = msg.sender?.email || 'someone'\n const content = msg.content ?? msg.type\n return { text: `${sender}: ${content}`, level: 'info' }\n }\n\n return { text: `${msg.type}`, level: 'info' }\n}\n","/**\n * Shared formatting utilities.\n */\n\n/**\n * Converts file size in bytes to human-readable format.\n *\n * @param bytes File size in bytes\n * @param fallback String to return for null/undefined values (default: 'N/A')\n * @returns Formatted string (e.g., \"1.5 MB\", \"250 KB\")\n */\nexport function formatFileSize(bytes: number | null | undefined, fallback = 'N/A'): string {\n if (bytes === null || bytes === undefined) return fallback\n\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\n/** Minimal user shape used for display formatting. */\nexport type UserInfo = {\n external_id?: string\n email?: string\n given_name?: string\n family_name?: string\n}\n\n/**\n * Format a user's display name from given_name + family_name.\n * Returns empty string if no name parts are available.\n */\nexport function formatUserName(user: UserInfo | null | undefined): string {\n if (!user) return ''\n return [user.given_name, user.family_name].filter(Boolean).join(' ')\n}\n","/**\n * Citation resolution utilities — shared by CLI and TUI.\n *\n * Parses citation data from SSE metadata (`MessageMetadataPayload`) and\n * resolves chunk references into displayable citation summaries and passages.\n *\n * Citation data flow:\n * 1. `tools.model_citations.tool_responses` maps citation number → CitationData\n * (contains chunk_ids, statement, offsets)\n * 2. `tools.retrieval_chunk.tool_responses` and `tools.retrieval_full_context.tool_responses`\n * map document file name → Chunk[] (contains content and metadata)\n * 3. This module joins those two data sets to produce resolved citations.\n */\n\nimport type { components } from '@arbidocs/client'\n\ntype MessageMetadataPayload = components['schemas']['MessageMetadataPayload']\ntype CitationData = components['schemas']['CitationData']\ntype Chunk = components['schemas']['Chunk']\n\n// ── Public types ────────────────────────────────────────────────────────────\n\n/** A fully resolved citation with its source chunks. */\nexport interface ResolvedCitation {\n /** Citation number as a string (e.g. \"1\", \"2\") */\n citationNum: string\n /** Raw citation data from model_citations */\n citationData: CitationData\n /** Resolved chunks matching the citation's chunk_ids */\n chunks: Chunk[]\n}\n\n/** A compact citation summary for display in lists. */\nexport interface CitationSummary {\n citationNum: string\n statement: string\n docTitle: string\n pageNumber: number | null\n chunkCount: number\n}\n\n// ── Core functions ──────────────────────────────────────────────────────────\n\n/**\n * Resolve all citations from SSE metadata into full citation objects.\n *\n * Reads `tools.model_citations.tool_responses` for citation→chunk_id mappings,\n * then builds a chunk lookup from `retrieval_chunk` and `retrieval_full_context`\n * tool responses to resolve each chunk_id to its full Chunk object.\n *\n * Returns citations sorted by citation number (ascending).\n */\nexport function resolveCitations(metadata: MessageMetadataPayload | null): ResolvedCitation[] {\n if (!metadata?.tools) return []\n\n const tools = metadata.tools as Record<string, unknown>\n\n // Extract model_citations tool_responses\n const modelCitations = tools.model_citations as\n | { tool_responses?: Record<string, CitationData> }\n | undefined\n const citationMap = modelCitations?.tool_responses\n if (!citationMap || Object.keys(citationMap).length === 0) return []\n\n // Build chunk lookup from retrieval tools\n const chunkLookup = buildChunkLookup(tools)\n\n // Resolve each citation\n const resolved: ResolvedCitation[] = []\n for (const [citationNum, citationData] of Object.entries(citationMap)) {\n const chunks: Chunk[] = []\n for (const chunkId of citationData.chunk_ids ?? []) {\n const chunk = chunkLookup.get(chunkId)\n if (chunk) chunks.push(chunk)\n }\n resolved.push({ citationNum, citationData, chunks })\n }\n\n // Sort by citation number numerically\n resolved.sort((a, b) => Number(a.citationNum) - Number(b.citationNum))\n return resolved\n}\n\n/**\n * Produce compact summaries for display in citation lists.\n * Uses the first chunk of each citation for doc title and page number.\n */\nexport function summarizeCitations(resolved: ResolvedCitation[]): CitationSummary[] {\n return resolved.map((r) => {\n const firstChunk = r.chunks[0]\n return {\n citationNum: r.citationNum,\n statement: r.citationData.statement ?? '',\n docTitle: firstChunk?.metadata?.doc_title ?? 'Unknown document',\n pageNumber: firstChunk?.metadata?.page_number ?? null,\n chunkCount: r.chunks.length,\n }\n })\n}\n\n/**\n * Count the number of citations in metadata.\n * Returns 0 if metadata is null or has no citations.\n */\nexport function countCitations(metadata: MessageMetadataPayload | null): number {\n if (!metadata?.tools) return 0\n const tools = metadata.tools as Record<string, unknown>\n const modelCitations = tools.model_citations as\n | { tool_responses?: Record<string, unknown> }\n | undefined\n const responses = modelCitations?.tool_responses\n return responses ? Object.keys(responses).length : 0\n}\n\n/**\n * Convert citation markdown to plain text with superscript-style numbers.\n * Replaces `[text](#cite-N)` with `text[N]`.\n */\nexport function stripCitationMarkdown(text: string): string {\n return text.replace(/\\[([^\\]]+)\\]\\(#cite-(\\d+)\\)/g, '$1[$2]')\n}\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/**\n * Build a Map<chunk_ext_id, Chunk> from retrieval_chunk and retrieval_full_context\n * tool responses. Both tools store responses as { [docFileName]: Chunk[] }.\n */\nfunction buildChunkLookup(tools: Record<string, unknown>): Map<string, Chunk> {\n const lookup = new Map<string, Chunk>()\n\n for (const toolName of ['retrieval_chunk', 'retrieval_full_context']) {\n const tool = tools[toolName] as { tool_responses?: Record<string, Chunk[]> } | undefined\n if (!tool?.tool_responses) continue\n\n for (const chunks of Object.values(tool.tool_responses)) {\n if (!Array.isArray(chunks)) continue\n for (const chunk of chunks) {\n const id = chunk.metadata?.chunk_ext_id\n if (id && !lookup.has(id)) {\n lookup.set(id, chunk)\n }\n }\n }\n }\n\n return lookup\n}\n","/**\n * Document operations — browser-safe functions.\n *\n * For Node.js file system operations (uploadLocalFile, uploadDirectory, uploadZip),\n * import from './documents-node.js' instead.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\nimport { authenticatedFetch, type AuthHeaders } from '../fetch.js'\n\ntype DocUpdateRequest = components['schemas']['DocUpdateRequest']\n\n// ── Shared constants ────────────────────────────────────────────────────────\n\n/** File extensions supported for document upload. */\nexport const SUPPORTED_EXTENSIONS = new Set([\n '.pdf',\n '.txt',\n '.md',\n '.html',\n '.doc',\n '.docx',\n '.rtf',\n '.ppt',\n '.pptx',\n '.xls',\n '.xlsx',\n])\n\n// ── Shared utilities ────────────────────────────────────────────────────────\n\n/**\n * Sanitize a folder path to only contain characters allowed by the backend\n * pattern `^[a-zA-Z0-9_\\-\\/]*$`. Replaces disallowed characters with `_` and\n * collapses consecutive underscores.\n */\nexport function sanitizeFolderPath(folderPath: string): string {\n return folderPath.replace(/[^a-zA-Z0-9_\\-/]/g, '_').replace(/_{2,}/g, '_')\n}\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface UploadOptions {\n folder?: string\n}\n\nexport interface UploadResult {\n doc_ext_ids: string[]\n duplicates?: string[]\n}\n\nexport interface UploadBatchResult {\n doc_ext_ids: string[]\n duplicates: string[]\n folders: Map<string, { fileCount: number; doc_ext_ids: string[]; duplicates: string[] }>\n}\n\n// ── API operations (browser-safe) ───────────────────────────────────────────\n\nexport async function listDocuments(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/document/list'), 'Failed to fetch documents')\n}\n\nexport async function getDocuments(arbi: ArbiClient, externalIds: string[]) {\n return requireData(\n await arbi.fetch.GET('/v1/document/', { params: { query: { external_ids: externalIds } } }),\n 'Failed to fetch documents'\n )\n}\n\nexport async function deleteDocuments(arbi: ArbiClient, externalIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/document/', { body: { external_ids: externalIds } }),\n 'Failed to delete documents'\n )\n}\n\nexport async function updateDocuments(arbi: ArbiClient, documents: DocUpdateRequest[]) {\n return requireData(\n await arbi.fetch.PATCH('/v1/document/', { body: { documents } }),\n 'Failed to update documents'\n )\n}\n\nexport async function uploadUrl(\n arbi: ArbiClient,\n urls: string[],\n workspaceId: string,\n shared = false\n) {\n return requireData(\n await arbi.fetch.POST('/v1/document/upload-url', {\n params: {\n query: { urls, workspace_ext_id: workspaceId, shared },\n },\n }),\n 'Failed to upload from URLs'\n )\n}\n\n/**\n * Get parsed document content.\n */\nexport async function getParsedContent(\n auth: AuthHeaders,\n docId: string,\n stage: string\n): Promise<Record<string, unknown>> {\n const res = await authenticatedFetch({\n ...auth,\n path: `/v1/document/${docId}/parsed-${stage}`,\n })\n return res.json() as Promise<Record<string, unknown>>\n}\n\n/**\n * Upload a file to a workspace. Uses raw fetch for multipart upload.\n */\nexport async function uploadFile(\n auth: AuthHeaders,\n workspaceId: string,\n fileData: Blob,\n fileName: string,\n options?: UploadOptions\n): Promise<UploadResult> {\n const formData = new FormData()\n formData.append('files', fileData, fileName)\n\n const params = new URLSearchParams({ workspace_ext_id: workspaceId })\n if (options?.folder) params.set('folder', sanitizeFolderPath(options.folder))\n\n const res = await authenticatedFetch({\n ...auth,\n path: `/v1/document/upload?${params.toString()}`,\n method: 'POST',\n body: formData,\n })\n\n return res.json() as Promise<UploadResult>\n}\n\n/**\n * Upload multiple files in a single FormData request with an optional folder parameter.\n */\nexport async function uploadFiles(\n auth: AuthHeaders,\n workspaceId: string,\n files: Array<{ data: Blob; name: string }>,\n options?: UploadOptions\n): Promise<UploadResult> {\n const formData = new FormData()\n for (const f of files) formData.append('files', f.data, f.name)\n\n const params = new URLSearchParams({ workspace_ext_id: workspaceId })\n if (options?.folder) params.set('folder', sanitizeFolderPath(options.folder))\n\n const res = await authenticatedFetch({\n ...auth,\n path: `/v1/document/upload?${params.toString()}`,\n method: 'POST',\n body: formData,\n })\n\n return res.json() as Promise<UploadResult>\n}\n\n/**\n * Download a document. Returns the response for the caller to handle.\n */\nexport async function downloadDocument(auth: AuthHeaders, docId: string): Promise<Response> {\n return authenticatedFetch({\n ...auth,\n path: `/v1/document/${docId}/download`,\n })\n}\n","/**\n * Workspace operations — list, create, delete, update, users, copy.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\ntype WorkspaceUpdateRequest = components['schemas']['WorkspaceUpdateRequest']\n\nexport async function listWorkspaces(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/user/workspaces'), 'Failed to fetch workspaces')\n}\n\nexport async function createWorkspace(\n arbi: ArbiClient,\n name: string,\n description?: string | null,\n isPublic = false\n) {\n return requireData(\n await arbi.fetch.POST('/v1/workspace/create_protected', {\n body: { name, description: description ?? null, is_public: isPublic },\n }),\n 'Failed to create workspace'\n )\n}\n\nexport async function deleteWorkspaces(arbi: ArbiClient, workspaceIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/workspace/', {\n body: { external_ids: workspaceIds },\n }),\n 'Failed to delete workspace(s)'\n )\n}\n\nexport async function updateWorkspace(arbi: ArbiClient, body: WorkspaceUpdateRequest) {\n return requireData(\n await arbi.fetch.PATCH('/v1/workspace/', { body }),\n 'Failed to update workspace'\n )\n}\n\nexport async function listWorkspaceUsers(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/workspace/users'), 'Failed to fetch workspace users')\n}\n\nexport async function addWorkspaceUsers(\n arbi: ArbiClient,\n emails: string[],\n role: 'owner' | 'collaborator' | 'guest' = 'collaborator'\n) {\n return requireData(\n await arbi.fetch.POST('/v1/workspace/users', {\n body: { emails, role },\n }),\n 'Failed to add users'\n )\n}\n\nexport async function removeWorkspaceUsers(arbi: ArbiClient, userIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/workspace/users', {\n body: { users: userIds.map((id) => ({ user_ext_id: id })) },\n }),\n 'Failed to remove users'\n )\n}\n\nexport async function setUserRole(\n arbi: ArbiClient,\n userIds: string[],\n role: 'owner' | 'collaborator' | 'guest'\n) {\n return requireData(\n await arbi.fetch.PATCH('/v1/workspace/users', {\n body: { user_ext_ids: userIds, role },\n }),\n 'Failed to update roles'\n )\n}\n\nexport async function copyDocuments(\n arbi: ArbiClient,\n targetWorkspaceId: string,\n docIds: string[],\n targetWorkspaceKey: string\n) {\n return requireData(\n await arbi.fetch.POST('/v1/workspace/copy', {\n body: {\n target_workspace_ext_id: targetWorkspaceId,\n target_workspace_key: targetWorkspaceKey,\n items: docIds,\n },\n }),\n 'Failed to copy documents'\n )\n}\n","/**\n * Conversation operations — list, threads, delete, share, title, messages.\n */\n\nimport type { ArbiClient } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\n\nexport async function listConversations(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/conversation/list'), 'Failed to fetch conversations')\n}\n\nexport async function getConversationThreads(arbi: ArbiClient, conversationId: string) {\n return requireData(\n await arbi.fetch.GET('/v1/conversation/{conversation_ext_id}/threads', {\n params: { path: { conversation_ext_id: conversationId } },\n }),\n 'Failed to fetch threads'\n )\n}\n\nexport async function deleteConversation(arbi: ArbiClient, conversationId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/conversation/{conversation_ext_id}', {\n params: { path: { conversation_ext_id: conversationId } },\n }),\n 'Failed to delete conversation'\n )\n}\n\nexport async function shareConversation(arbi: ArbiClient, conversationId: string) {\n return requireData(\n await arbi.fetch.POST('/v1/conversation/{conversation_ext_id}/share', {\n params: { path: { conversation_ext_id: conversationId } },\n }),\n 'Failed to share conversation'\n )\n}\n\nexport async function updateConversationTitle(\n arbi: ArbiClient,\n conversationId: string,\n title: string\n) {\n return requireData(\n await arbi.fetch.PATCH('/v1/conversation/{conversation_ext_id}/title', {\n params: { path: { conversation_ext_id: conversationId } },\n body: { title },\n }),\n 'Failed to update title'\n )\n}\n\nexport async function getMessage(arbi: ArbiClient, messageId: string) {\n return requireData(\n await arbi.fetch.GET('/v1/conversation/message/{message_ext_id}', {\n params: { path: { message_ext_id: messageId } },\n }),\n 'Failed to fetch message'\n )\n}\n\nexport async function deleteMessage(arbi: ArbiClient, messageId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/conversation/message/{message_ext_id}', {\n params: { path: { message_ext_id: messageId } },\n }),\n 'Failed to delete message'\n )\n}\n","/**\n * Assistant operations — retrieve (search-only) and query (with LLM).\n *\n * retrieve: Uses the typed SDK route POST /v1/assistant/retrieve.\n * Returns matching chunks without LLM generation.\n *\n * queryAssistant: Returns the raw Response for SSE streaming.\n * Uses raw fetch because the SDK client doesn't support streaming responses.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\nimport { authenticatedFetch, type AuthHeaders } from '../fetch.js'\n\ntype MessageInput = components['schemas']['MessageInput']\ntype ToolEntry = NonNullable<MessageInput['tools']>[string]\n\n// ── Retrieval tool builder ──────────────────────────────────────────────────\n\nexport function buildRetrievalChunkTool(\n docIds: string[],\n searchMode?: 'semantic' | 'keyword' | 'hybrid'\n): components['schemas']['RetrievalChunkTool'] {\n return {\n name: 'retrieval_chunk',\n description: 'retrieval chunk',\n tool_args: { doc_ext_ids: docIds, ...(searchMode ? { search_mode: searchMode } : {}) },\n tool_responses: {},\n }\n}\n\nexport function buildRetrievalFullContextTool(\n docIds: string[]\n): components['schemas']['RetrievalFullContextTool'] {\n return {\n name: 'retrieval_full_context',\n description: 'retrieval full context',\n tool_args: { doc_ext_ids: docIds },\n tool_responses: {},\n }\n}\n\nexport function buildRetrievalTocTool(docIds: string[]): components['schemas']['RetrievalTOCTool'] {\n return {\n name: 'retrieval_toc',\n description: 'retrieval toc',\n tool_args: { doc_ext_ids: docIds },\n tool_responses: {},\n }\n}\n\n// ── Retrieve (search-only, uses typed SDK) ──────────────────────────────────\n\nexport interface RetrieveOptions {\n arbi: ArbiClient\n workspaceId: string\n query: string\n docIds: string[]\n searchMode?: 'semantic' | 'keyword' | 'hybrid'\n fullContextDocIds?: string[]\n tocDocIds?: string[]\n model?: string\n}\n\nexport interface ChunkMetadata {\n doc_ext_id?: string | null\n doc_title?: string | null\n chunk_ext_id: string\n chunk_pg_idx: number\n chunk_doc_idx: number\n page_number: number\n score?: number | null\n rerank_score?: number | null\n tokens?: number | null\n created_at: string\n heading: boolean\n}\n\nexport interface Chunk {\n metadata: ChunkMetadata\n content: string\n}\n\nexport interface RetrieveResult {\n retrieval_chunk?: {\n tool_responses: Record<string, Chunk[]>\n }\n retrieval_full_context?: {\n tool_responses: Record<string, Chunk[]>\n }\n retrieval_toc?: {\n tool_responses: Record<string, Record<string, unknown>[]>\n }\n}\n\n/**\n * Search documents and return matching chunks without LLM generation.\n * Uses the typed SDK route POST /v1/assistant/retrieve.\n */\nexport async function retrieve(options: RetrieveOptions): Promise<RetrieveResult> {\n const { arbi, workspaceId, query, docIds, searchMode, fullContextDocIds, tocDocIds, model } =\n options\n\n const tools: Record<string, ToolEntry> = {\n retrieval_chunk: buildRetrievalChunkTool(docIds, searchMode),\n }\n\n if (fullContextDocIds && fullContextDocIds.length > 0) {\n tools.retrieval_full_context = buildRetrievalFullContextTool(fullContextDocIds)\n }\n\n if (tocDocIds && tocDocIds.length > 0) {\n tools.retrieval_toc = buildRetrievalTocTool(tocDocIds)\n }\n\n const body: MessageInput = {\n input: query,\n workspace_ext_id: workspaceId,\n stream: false,\n background: false,\n store: true,\n tools,\n ...(model ? { model } : {}),\n }\n\n const { data, error } = await arbi.fetch.POST('/v1/assistant/retrieve', { body })\n\n if (error) {\n throw new Error(`Retrieve failed: ${JSON.stringify(error)}`)\n }\n\n // Response type is `unknown` in schema, cast to our typed result\n return data as RetrieveResult\n}\n\n// ── Query (with LLM, raw fetch for SSE streaming) ───────────────────────────\n\nexport interface AssistantQueryOptions extends AuthHeaders {\n workspaceId: string\n question: string\n docIds: string[]\n previousResponseId?: string | null\n model?: string\n}\n\n/**\n * Send a query to the RAG assistant. Returns the raw Response\n * so the caller can stream or buffer as needed.\n *\n * Uses raw fetch (not the SDK client) because we need the streaming\n * Response body — the SDK client consumes the body to parse JSON.\n */\nexport async function queryAssistant(options: AssistantQueryOptions): Promise<Response> {\n const { workspaceId, question, docIds, previousResponseId, model, ...auth } = options\n\n const body: MessageInput = {\n input: question,\n workspace_ext_id: workspaceId,\n stream: true,\n background: false,\n store: true,\n tools: {\n retrieval_chunk: buildRetrievalChunkTool(docIds),\n retrieval_full_context: buildRetrievalFullContextTool([]),\n },\n ...(previousResponseId ? { previous_response_id: previousResponseId } : {}),\n ...(model ? { model } : {}),\n }\n\n return authenticatedFetch({\n ...auth,\n path: '/v1/assistant/query',\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json' },\n })\n}\n\n// ── Respond to agent (human-in-the-loop) ──────────────────────────────────\n\n/**\n * Respond to an agent's question during a human-in-the-loop workflow.\n * The assistant_message_ext_id identifies which agent message to answer.\n */\nexport async function respondToAgent(\n arbi: ArbiClient,\n assistantMessageExtId: string,\n answer: string\n) {\n return requireData(\n await arbi.fetch.POST('/v1/assistant/respond', {\n body: { assistant_message_ext_id: assistantMessageExtId, answer },\n }),\n 'Failed to respond to agent'\n )\n}\n","/**\n * Tag operations — list, create, delete, update.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\n\ntype UpdateTagRequest = components['schemas']['UpdateTagRequest']\n\nexport async function listTags(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/tag/list'), 'Failed to fetch tags')\n}\n\nexport async function createTag(\n arbi: ArbiClient,\n options: {\n name: string\n workspaceId?: string\n tagType?: components['schemas']['TagFormat']\n instruction?: string | null\n shared?: boolean\n }\n) {\n return requireData(\n await arbi.fetch.POST('/v1/tag/', {\n body: {\n name: options.name,\n tag_type: options.tagType ?? { type: 'checkbox', options: [] },\n instruction: options.instruction ?? null,\n shared: options.shared ?? false,\n },\n }),\n 'Failed to create tag'\n )\n}\n\nexport async function deleteTag(arbi: ArbiClient, tagId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/tag/{tag_ext_id}', {\n params: { path: { tag_ext_id: tagId } },\n }),\n 'Failed to delete tag'\n )\n}\n\nexport async function updateTag(arbi: ArbiClient, tagId: string, body: UpdateTagRequest) {\n return requireData(\n await arbi.fetch.PATCH('/v1/tag/{tag_ext_id}', {\n params: { path: { tag_ext_id: tagId } },\n body,\n }),\n 'Failed to update tag'\n )\n}\n","/**\n * Contact operations — list, add, remove.\n */\n\nimport type { ArbiClient } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\nexport async function listContacts(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/user/contacts'), 'Failed to fetch contacts')\n}\n\nexport async function addContacts(arbi: ArbiClient, emails: string[]) {\n return requireData(\n await arbi.fetch.POST('/v1/user/contacts', { body: { emails } }),\n 'Failed to add contacts'\n )\n}\n\nexport async function removeContacts(arbi: ArbiClient, contactIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/user/contacts', { body: { contact_ids: contactIds } }),\n 'Failed to remove contacts'\n )\n}\n\n/**\n * Group contacts by registration status.\n * Returns registered contacts and pending (not yet registered) contacts.\n */\nexport function groupContactsByStatus<T extends { status: string }>(\n contactList: T[]\n): { registered: T[]; pending: T[] } {\n const registered: T[] = []\n const pending: T[] = []\n for (const c of contactList) {\n if (c.status === 'registered') {\n registered.push(c)\n } else {\n pending.push(c)\n }\n }\n return { registered, pending }\n}\n","/**\n * Document-tag (doctag) operations — assign, remove, generate.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\ntype CitationData = components['schemas']['CitationData']\n\nexport async function assignDocTags(\n arbi: ArbiClient,\n tagId: string,\n docIds: string[],\n note?: string | null\n) {\n return requireData(\n await arbi.fetch.POST('/v1/document/doctag', {\n body: { tag_ext_id: tagId, doc_ext_ids: docIds, note: note ?? null },\n }),\n 'Failed to create doctags'\n )\n}\n\nexport async function removeDocTags(arbi: ArbiClient, tagId: string, docIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/document/doctag', {\n body: { tag_ext_id: tagId, doc_ext_ids: docIds },\n }),\n 'Failed to delete doctags'\n )\n}\n\nexport async function updateDocTag(\n arbi: ArbiClient,\n tagId: string,\n docId: string,\n updates: { note?: string | null; citations?: Record<string, CitationData> | null }\n) {\n return requireData(\n await arbi.fetch.PATCH('/v1/document/doctag', {\n body: { tag_ext_id: tagId, doc_ext_id: docId, ...updates },\n }),\n 'Failed to update doctag'\n )\n}\n\nexport async function generateDocTags(arbi: ArbiClient, tagIds: string[], docIds: string[]) {\n return requireData(\n await arbi.fetch.POST('/v1/document/doctag/generate', {\n body: { tag_ext_ids: tagIds, doc_ext_ids: docIds },\n }),\n 'Failed to generate doctags'\n )\n}\n","/**\n * Direct message / notification operations — list, send, mark read, delete.\n */\n\nimport type { ArbiClient } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\nexport async function listDMs(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/notifications/'), 'Failed to fetch messages')\n}\n\nexport async function sendDM(\n arbi: ArbiClient,\n messages: Array<{ recipient_ext_id: string; content: string }>\n) {\n return requireData(\n await arbi.fetch.POST('/v1/notifications/', {\n body: { messages },\n }),\n 'Failed to send message'\n )\n}\n\nexport async function markRead(arbi: ArbiClient, messageIds: string[]) {\n return requireData(\n await arbi.fetch.PATCH('/v1/notifications/', {\n body: { updates: messageIds.map((id) => ({ external_id: id, read: true })) },\n }),\n 'Failed to update messages'\n )\n}\n\nexport async function deleteDMs(arbi: ArbiClient, messageIds: string[]) {\n requireOk(\n await arbi.fetch.DELETE('/v1/notifications/', { body: { external_ids: messageIds } }),\n 'Failed to delete messages'\n )\n}\n","/**\n * User settings operations — get, update.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData, requireOk } from '../errors.js'\n\ntype UserSettingsUpdate = components['schemas']['UserSettingsUpdate']\n\nexport async function getSettings(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/user/settings'), 'Failed to fetch settings')\n}\n\nexport async function updateSettings(arbi: ArbiClient, body: UserSettingsUpdate) {\n requireOk(await arbi.fetch.PATCH('/v1/user/settings', { body }), 'Failed to update settings')\n}\n","/**\n * Agent configuration operations — list, get, save, delete, schema, models.\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\n\ntype ConfigUpdateData = components['schemas']['ConfigUpdateData']\n\nexport async function listConfigs(arbi: ArbiClient) {\n return requireData(\n await arbi.fetch.GET('/v1/configs/versions'),\n 'Failed to fetch config versions'\n )\n}\n\nexport async function getConfig(arbi: ArbiClient, configId: string) {\n return requireData(\n await arbi.fetch.GET('/v1/configs/{config_ext_id}', {\n params: { path: { config_ext_id: configId } },\n }),\n 'Failed to fetch configuration'\n )\n}\n\nexport async function saveConfig(arbi: ArbiClient, body: ConfigUpdateData) {\n return requireData(\n await arbi.fetch.POST('/v1/configs/', { body }),\n 'Failed to save configuration'\n )\n}\n\nexport async function deleteConfig(arbi: ArbiClient, configId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/configs/{config_ext_id}', {\n params: { path: { config_ext_id: configId } },\n }),\n 'Failed to delete configuration'\n )\n}\n\nexport async function getSchema(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/configs/schema'), 'Failed to fetch config schema')\n}\n\nexport async function getModels(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/health/models'), 'Failed to fetch models')\n}\n","/**\n * Health and model operations.\n */\n\nimport type { ArbiClient } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\n\nexport async function getHealth(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/health/'), 'Failed to fetch health status')\n}\n\nexport async function getHealthModels(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/health/models'), 'Failed to fetch models')\n}\n\nexport async function getRemoteModels(arbi: ArbiClient) {\n return requireData(\n await arbi.fetch.GET('/v1/health/remote-models'),\n 'Failed to fetch remote models'\n )\n}\n\nexport async function getMcpTools(arbi: ArbiClient) {\n return requireData(await arbi.fetch.GET('/v1/health/mcp-tools'), 'Failed to fetch MCP tools')\n}\n","/**\n * File operations — OpenAI-compatible Files API (list, get, delete, upload, content).\n */\n\nimport type { ArbiClient, components } from '@arbidocs/client'\nimport { requireData } from '../errors.js'\nimport { authenticatedFetch, type AuthHeaders } from '../fetch.js'\n\ntype FileObject = components['schemas']['FileObject']\ntype FileDeleteResponse = components['schemas']['FileDeleteResponse']\ntype FileListResponse = components['schemas']['FileListResponse']\n\nexport type { FileObject, FileDeleteResponse, FileListResponse }\n\nexport interface ListFilesOptions {\n purpose?: string | null\n limit?: number\n order?: string\n after?: string | null\n}\n\nexport async function listFiles(arbi: ArbiClient, options?: ListFilesOptions) {\n return requireData(\n await arbi.fetch.GET('/v1/files', {\n params: { query: options ?? {} },\n }),\n 'Failed to list files'\n )\n}\n\nexport async function getFile(arbi: ArbiClient, fileId: string) {\n return requireData(\n await arbi.fetch.GET('/v1/files/{file_id}', {\n params: { path: { file_id: fileId } },\n }),\n 'Failed to get file'\n )\n}\n\nexport async function deleteFile(arbi: ArbiClient, fileId: string) {\n return requireData(\n await arbi.fetch.DELETE('/v1/files/{file_id}', {\n params: { path: { file_id: fileId } },\n }),\n 'Failed to delete file'\n )\n}\n\n/**\n * Upload a file via the OpenAI-compatible Files API.\n * Uses raw fetch for multipart upload.\n */\nexport async function uploadFile(\n auth: AuthHeaders,\n fileData: Blob,\n fileName: string,\n purpose = 'assistants'\n): Promise<FileObject> {\n const formData = new FormData()\n formData.append('file', fileData, fileName)\n formData.append('purpose', purpose)\n\n const res = await authenticatedFetch({\n ...auth,\n path: '/v1/files',\n method: 'POST',\n body: formData,\n })\n\n return res.json() as Promise<FileObject>\n}\n\n/**\n * Get file content (binary). Returns the raw Response for the caller to handle.\n */\nexport async function getFileContent(auth: AuthHeaders, fileId: string): Promise<Response> {\n return authenticatedFetch({\n ...auth,\n path: `/v1/files/${fileId}/content`,\n })\n}\n","/**\n * High-level convenience class that wraps the full ARBI stack into a simple API.\n *\n * Handles SDK client creation, sodium initialization, authentication,\n * workspace key decryption, and delegates to all operations modules.\n *\n * Usage:\n * const arbi = new Arbi({ url: 'https://arbi.mycompany.com' })\n * await arbi.login('user@example.com', 'password')\n * const workspaces = await arbi.workspaces.list()\n * await arbi.selectWorkspace(workspaces[0].external_id)\n * const docs = await arbi.documents.list()\n */\n\nimport {\n createArbiClient,\n type ArbiClient,\n type LoginResult,\n type components,\n} from '@arbidocs/client'\n\ntype DocUpdateRequest = components['schemas']['DocUpdateRequest']\ntype WorkspaceUpdateRequest = components['schemas']['WorkspaceUpdateRequest']\ntype UpdateTagRequest = components['schemas']['UpdateTagRequest']\ntype TagFormat = components['schemas']['TagFormat']\ntype CitationData = components['schemas']['CitationData']\ntype UserSettingsUpdate = components['schemas']['UserSettingsUpdate']\ntype ConfigUpdateData = components['schemas']['ConfigUpdateData']\nimport { ArbiError } from './errors.js'\nimport { selectWorkspace as selectWorkspaceInternal } from './auth.js'\nimport { streamSSE, type SSEStreamCallbacks, type SSEStreamResult } from './sse.js'\nimport type {\n SSEStreamStartData,\n AgentStepEvent,\n UserMessageEvent,\n MessageMetadataPayload,\n UserInputRequestEvent,\n ArtifactEvent,\n} from './sse-types.js'\nimport * as documentsOps from './operations/documents.js'\nimport * as workspacesOps from './operations/workspaces.js'\nimport * as conversationsOps from './operations/conversations.js'\nimport * as assistantOps from './operations/assistant.js'\nimport * as tagsOps from './operations/tags.js'\nimport * as contactsOps from './operations/contacts.js'\nimport * as doctagsOps from './operations/doctags.js'\nimport * as dmOps from './operations/dm.js'\nimport * as settingsOps from './operations/settings.js'\nimport * as agentconfigOps from './operations/agentconfig.js'\nimport * as healthOps from './operations/health.js'\nimport * as filesOps from './operations/files.js'\n\n// ── Options ─────────────────────────────────────────────────────────────────\n\nexport interface ArbiOptions {\n /** Backend API URL (e.g. 'https://arbi.mycompany.com') */\n url: string\n /** Deployment domain for key derivation. Defaults to hostname of url. */\n deploymentDomain?: string\n /** Include credentials (cookies) in requests. Default: 'omit' for SDK consumers. */\n credentials?: 'include' | 'omit' | 'same-origin'\n}\n\n// ── Assistant query options ─────────────────────────────────────────────────\n\nexport interface QueryOptions {\n /** Document IDs to search against */\n docIds: string[]\n /** Previous response ID for follow-up questions */\n previousResponseId?: string | null\n /** Model to use for generation */\n model?: string\n /** Called for each streaming token */\n onToken?: (content: string) => void\n /** Called when stream starts */\n onStreamStart?: (data: SSEStreamStartData) => void\n /** Called for each agent step */\n onAgentStep?: (data: AgentStepEvent) => void\n /** Called on stream error */\n onError?: (message: string) => void\n /** Called when a user message event is received */\n onUserMessage?: (data: UserMessageEvent) => void\n /** Called when message metadata is received */\n onMetadata?: (data: MessageMetadataPayload) => void\n /** Called when the agent requests user input */\n onUserInputRequest?: (data: UserInputRequestEvent) => void\n /** Called when an artifact event is received */\n onArtifact?: (data: ArtifactEvent) => void\n /** Called when backend elapsed time is received */\n onElapsedTime?: (t: number) => void\n /** Called when stream completes */\n onComplete?: () => void\n}\n\n// ── Arbi class ──────────────────────────────────────────────────────────────\n\nexport class Arbi {\n private client: ArbiClient | null = null\n private loginResult: LoginResult | null = null\n private currentWorkspaceId: string | null = null\n private readonly options: ArbiOptions\n\n constructor(options: ArbiOptions) {\n this.options = options\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────\n\n /** Initialize the SDK client and sodium crypto. Called automatically by login(). */\n async init(): Promise<ArbiClient> {\n if (this.client) return this.client\n\n const domain = this.options.deploymentDomain ?? new URL(this.options.url).hostname\n\n this.client = createArbiClient({\n baseUrl: this.options.url,\n deploymentDomain: domain,\n credentials: this.options.credentials ?? 'omit',\n })\n\n await this.client.crypto.initSodium()\n return this.client\n }\n\n /**\n * Request a verification email for registration.\n * The user will receive an email with a 3-word verification code.\n */\n async requestVerification(email: string): Promise<void> {\n const client = await this.init()\n await client.fetch.POST('/v1/user/verify-email', { body: { email } })\n }\n\n /**\n * Register a new account using the verification code received by email.\n */\n async register(params: {\n email: string\n password: string\n verificationCode: string\n firstName?: string\n lastName?: string\n }): Promise<void> {\n const client = await this.init()\n await client.auth.register(params)\n }\n\n /**\n * Log in with email and password.\n * Initializes the SDK client if not already done.\n */\n async login(email: string, password: string): Promise<void> {\n const client = await this.init()\n this.loginResult = await client.auth.login({ email, password })\n }\n\n /**\n * Recover a session using a stored signing private key (base64).\n * Useful for session recovery without re-entering the password.\n */\n async loginWithKey(email: string, signingPrivateKeyBase64: string): Promise<void> {\n const client = await this.init()\n const signingPrivateKey = client.crypto.base64ToBytes(signingPrivateKeyBase64)\n this.loginResult = await client.auth.loginWithKey({ email, signingPrivateKey })\n }\n\n /**\n * Select a workspace by ID. Fetches the workspace list, finds the matching\n * workspace, decrypts the wrapped key, and sets up auth headers.\n */\n async selectWorkspace(workspaceId: string): Promise<void> {\n const client = this.requireClient()\n const lr = this.requireLogin()\n\n const allWorkspaces = await workspacesOps.listWorkspaces(client)\n const ws = allWorkspaces.find((w) => w.external_id === workspaceId)\n if (!ws || !ws.wrapped_key) {\n throw new ArbiError(`Workspace ${workspaceId} not found or has no encryption key`)\n }\n\n const signingPrivateKeyBase64 = client.crypto.bytesToBase64(lr.signingPrivateKey)\n await selectWorkspaceInternal(\n client,\n ws.external_id,\n ws.wrapped_key,\n lr.serverSessionKey,\n signingPrivateKeyBase64\n )\n\n // Exchange the workspace key for a workspace-scoped JWT\n const workspaceKeyHeader = client.session.getWorkspaceKeyHeader()\n if (workspaceKeyHeader) {\n const { data: openResult, error: openError } = await client.fetch.POST(\n '/v1/workspace/{workspace_ext_id}/open',\n {\n params: { path: { workspace_ext_id: ws.external_id } },\n body: { workspace_key: workspaceKeyHeader },\n }\n )\n if (!openError && openResult?.access_token) {\n client.session.setAccessToken(openResult.access_token)\n }\n }\n\n this.currentWorkspaceId = ws.external_id\n }\n\n /** Log out and clear internal state. */\n async logout(): Promise<void> {\n if (this.client) {\n await this.client.auth.logout()\n }\n if (this.loginResult) {\n this.loginResult.signingPrivateKey.fill(0)\n this.loginResult.serverSessionKey.fill(0)\n }\n this.loginResult = null\n this.currentWorkspaceId = null\n }\n\n // ── Accessors ─────────────────────────────────────────────────────────\n\n /** Get the underlying ArbiClient (throws if not initialized). */\n getClient(): ArbiClient {\n return this.requireClient()\n }\n\n /** Get the current workspace ID (throws if none selected). */\n getWorkspaceId(): string {\n return this.requireWorkspace()\n }\n\n /** Check if the user is logged in. */\n get isLoggedIn(): boolean {\n return this.loginResult !== null\n }\n\n /** Check if a workspace is selected. */\n get hasWorkspace(): boolean {\n return this.currentWorkspaceId !== null\n }\n\n // ── Auth headers (for raw fetch operations) ───────────────────────────\n\n private getAuthHeaders() {\n const client = this.requireClient()\n const accessToken = client.session.getState().accessToken\n const workspaceKeyHeader = client.session.getWorkspaceKeyHeader()\n\n if (!accessToken || !workspaceKeyHeader) {\n throw new ArbiError('Missing access token or workspace key header')\n }\n\n return {\n baseUrl: this.options.url,\n accessToken,\n workspaceKeyHeader,\n }\n }\n\n // ── Workspaces ────────────────────────────────────────────────────────\n\n readonly workspaces = {\n list: () => workspacesOps.listWorkspaces(this.requireClient()),\n\n create: (name: string, description?: string | null, isPublic?: boolean) =>\n workspacesOps.createWorkspace(this.requireClient(), name, description, isPublic),\n\n delete: (workspaceIds: string[]) =>\n workspacesOps.deleteWorkspaces(this.requireClient(), workspaceIds),\n\n update: (body: WorkspaceUpdateRequest) =>\n workspacesOps.updateWorkspace(this.requireClient(), body),\n\n listUsers: () => workspacesOps.listWorkspaceUsers(this.requireClient()),\n\n addUsers: (emails: string[], role?: 'owner' | 'collaborator' | 'guest') =>\n workspacesOps.addWorkspaceUsers(this.requireClient(), emails, role),\n\n removeUsers: (userIds: string[]) =>\n workspacesOps.removeWorkspaceUsers(this.requireClient(), userIds),\n\n setUserRole: (userIds: string[], role: 'owner' | 'collaborator' | 'guest') =>\n workspacesOps.setUserRole(this.requireClient(), userIds, role),\n\n copyDocuments: (targetWorkspaceId: string, docIds: string[], targetWorkspaceKey: string) =>\n workspacesOps.copyDocuments(\n this.requireClient(),\n targetWorkspaceId,\n docIds,\n targetWorkspaceKey\n ),\n }\n\n // ── Documents ─────────────────────────────────────────────────────────\n\n readonly documents = {\n list: () => documentsOps.listDocuments(this.requireClient()),\n\n get: (externalIds: string[]) => documentsOps.getDocuments(this.requireClient(), externalIds),\n\n delete: (externalIds: string[]) =>\n documentsOps.deleteDocuments(this.requireClient(), externalIds),\n\n update: (documents: DocUpdateRequest[]) =>\n documentsOps.updateDocuments(this.requireClient(), documents),\n\n uploadUrl: (urls: string[], shared?: boolean, workspaceId?: string) =>\n documentsOps.uploadUrl(\n this.requireClient(),\n urls,\n workspaceId ?? this.requireWorkspace(),\n shared\n ),\n\n uploadFile: (\n fileData: Blob,\n fileName: string,\n options?: { workspaceId?: string; folder?: string }\n ) =>\n documentsOps.uploadFile(\n this.getAuthHeaders(),\n options?.workspaceId ?? this.requireWorkspace(),\n fileData,\n fileName,\n options?.folder ? { folder: options.folder } : undefined\n ),\n\n download: (docId: string) => documentsOps.downloadDocument(this.getAuthHeaders(), docId),\n\n getParsedContent: (docId: string, stage: string) =>\n documentsOps.getParsedContent(this.getAuthHeaders(), docId, stage),\n }\n\n // ── Conversations ─────────────────────────────────────────────────────\n\n readonly conversations = {\n list: () => conversationsOps.listConversations(this.requireClient()),\n\n getThreads: (conversationId: string) =>\n conversationsOps.getConversationThreads(this.requireClient(), conversationId),\n\n delete: (conversationId: string) =>\n conversationsOps.deleteConversation(this.requireClient(), conversationId),\n\n share: (conversationId: string) =>\n conversationsOps.shareConversation(this.requireClient(), conversationId),\n\n updateTitle: (conversationId: string, title: string) =>\n conversationsOps.updateConversationTitle(this.requireClient(), conversationId, title),\n\n getMessage: (messageId: string) => conversationsOps.getMessage(this.requireClient(), messageId),\n\n deleteMessage: (messageId: string) =>\n conversationsOps.deleteMessage(this.requireClient(), messageId),\n }\n\n // ── Assistant ─────────────────────────────────────────────────────────\n\n readonly assistant = {\n /**\n * Send a question to the RAG assistant with streaming support.\n * Returns the accumulated result after the stream completes.\n */\n query: async (question: string, options: QueryOptions): Promise<SSEStreamResult> => {\n const auth = this.getAuthHeaders()\n const workspaceId = this.requireWorkspace()\n\n const response = await assistantOps.queryAssistant({\n ...auth,\n workspaceId,\n question,\n docIds: options.docIds,\n previousResponseId: options.previousResponseId,\n model: options.model,\n })\n\n const callbacks: SSEStreamCallbacks = {\n onToken: options.onToken,\n onStreamStart: options.onStreamStart,\n onAgentStep: options.onAgentStep,\n onError: options.onError,\n onUserMessage: options.onUserMessage,\n onMetadata: options.onMetadata,\n onUserInputRequest: options.onUserInputRequest,\n onArtifact: options.onArtifact,\n onElapsedTime: options.onElapsedTime,\n onComplete: options.onComplete,\n }\n\n return streamSSE(response, callbacks)\n },\n\n /**\n * Respond to an agent's question during a human-in-the-loop workflow.\n */\n respond: (assistantMessageExtId: string, answer: string) =>\n assistantOps.respondToAgent(this.requireClient(), assistantMessageExtId, answer),\n\n /**\n * Search documents without LLM generation (retrieval only).\n */\n retrieve: (\n query: string,\n docIds: string[],\n options?: {\n searchMode?: 'semantic' | 'keyword' | 'hybrid'\n fullContextDocIds?: string[]\n tocDocIds?: string[]\n model?: string\n }\n ) =>\n assistantOps.retrieve({\n arbi: this.requireClient(),\n workspaceId: this.requireWorkspace(),\n query,\n docIds,\n ...options,\n }),\n }\n\n // ── Tags ──────────────────────────────────────────────────────────────\n\n readonly tags = {\n list: () => tagsOps.listTags(this.requireClient()),\n\n create: (options: {\n name: string\n workspaceId?: string\n tagType?: TagFormat\n instruction?: string | null\n shared?: boolean\n }) =>\n tagsOps.createTag(this.requireClient(), {\n ...options,\n workspaceId: options.workspaceId ?? this.requireWorkspace(),\n }),\n\n delete: (tagId: string) => tagsOps.deleteTag(this.requireClient(), tagId),\n\n update: (tagId: string, body: UpdateTagRequest) =>\n tagsOps.updateTag(this.requireClient(), tagId, body),\n }\n\n // ── Document Tags ─────────────────────────────────────────────────────\n\n readonly doctags = {\n assign: (tagId: string, docIds: string[], note?: string | null) =>\n doctagsOps.assignDocTags(this.requireClient(), tagId, docIds, note),\n\n remove: (tagId: string, docIds: string[]) =>\n doctagsOps.removeDocTags(this.requireClient(), tagId, docIds),\n\n update: (\n tagId: string,\n docId: string,\n updates: { note?: string | null; citations?: Record<string, CitationData> | null }\n ) => doctagsOps.updateDocTag(this.requireClient(), tagId, docId, updates),\n\n generate: (tagIds: string[], docIds: string[]) =>\n doctagsOps.generateDocTags(this.requireClient(), tagIds, docIds),\n }\n\n // ── Contacts ──────────────────────────────────────────────────────────\n\n readonly contacts = {\n list: () => contactsOps.listContacts(this.requireClient()),\n add: (emails: string[]) => contactsOps.addContacts(this.requireClient(), emails),\n remove: (contactIds: string[]) => contactsOps.removeContacts(this.requireClient(), contactIds),\n groupByStatus: contactsOps.groupContactsByStatus,\n }\n\n // ── Direct Messages ───────────────────────────────────────────────────\n\n readonly dm = {\n list: () => dmOps.listDMs(this.requireClient()),\n send: (messages: Array<{ recipient_ext_id: string; content: string }>) =>\n dmOps.sendDM(this.requireClient(), messages),\n markRead: (messageIds: string[]) => dmOps.markRead(this.requireClient(), messageIds),\n delete: (messageIds: string[]) => dmOps.deleteDMs(this.requireClient(), messageIds),\n }\n\n // ── Settings ──────────────────────────────────────────────────────────\n\n readonly settings = {\n get: () => settingsOps.getSettings(this.requireClient()),\n update: (body: UserSettingsUpdate) => settingsOps.updateSettings(this.requireClient(), body),\n }\n\n // ── Agent Configuration ───────────────────────────────────────────────\n\n readonly agentConfig = {\n list: () => agentconfigOps.listConfigs(this.requireClient()),\n get: (configId: string) => agentconfigOps.getConfig(this.requireClient(), configId),\n save: (body: ConfigUpdateData) => agentconfigOps.saveConfig(this.requireClient(), body),\n delete: (configId: string) => agentconfigOps.deleteConfig(this.requireClient(), configId),\n getSchema: () => agentconfigOps.getSchema(this.requireClient()),\n getModels: () => agentconfigOps.getModels(this.requireClient()),\n }\n\n // ── Health ────────────────────────────────────────────────────────────\n\n readonly health = {\n check: () => healthOps.getHealth(this.requireClient()),\n models: () => healthOps.getHealthModels(this.requireClient()),\n remoteModels: () => healthOps.getRemoteModels(this.requireClient()),\n mcpTools: () => healthOps.getMcpTools(this.requireClient()),\n }\n\n // ── Files (OpenAI-compatible) ────────────────────────────────────────\n\n readonly files = {\n list: (options?: filesOps.ListFilesOptions) =>\n filesOps.listFiles(this.requireClient(), options),\n\n get: (fileId: string) => filesOps.getFile(this.requireClient(), fileId),\n\n delete: (fileId: string) => filesOps.deleteFile(this.requireClient(), fileId),\n\n upload: (fileData: Blob, fileName: string, purpose?: string) =>\n filesOps.uploadFile(this.getAuthHeaders(), fileData, fileName, purpose),\n\n getContent: (fileId: string) => filesOps.getFileContent(this.getAuthHeaders(), fileId),\n }\n\n // ── Internal guards ───────────────────────────────────────────────────\n\n private requireClient(): ArbiClient {\n if (!this.client) {\n throw new ArbiError('Not initialized. Call login() or init() first.')\n }\n return this.client\n }\n\n private requireLogin(): LoginResult {\n if (!this.loginResult) {\n throw new ArbiError('Not logged in. Call login() first.')\n }\n return this.loginResult\n }\n\n private requireWorkspace(): string {\n if (!this.currentWorkspaceId) {\n throw new ArbiError('No workspace selected. Call selectWorkspace() first.')\n }\n return this.currentWorkspaceId\n }\n}\n","/**\n * Document operations — Node.js file system operations.\n *\n * These functions require Node.js built-ins (fs, path) and are not browser-safe.\n * Browser consumers should use the Blob-based uploadFile/uploadFiles from './documents.js'.\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport {\n uploadFile,\n uploadFiles,\n SUPPORTED_EXTENSIONS,\n sanitizeFolderPath,\n type UploadOptions,\n type UploadResult,\n type UploadBatchResult,\n} from './documents.js'\nimport type { AuthHeaders } from '../fetch.js'\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/**\n * Recursively collect files from a directory, filtered by SUPPORTED_EXTENSIONS.\n * Returns entries with { absolutePath, relativePath }.\n */\nfunction collectFiles(\n dirPath: string,\n baseDir?: string\n): Array<{ absolutePath: string; relativePath: string }> {\n const root = baseDir ?? dirPath\n const results: Array<{ absolutePath: string; relativePath: string }> = []\n\n for (const entry of fs.readdirSync(dirPath, { withFileTypes: true })) {\n const fullPath = path.join(dirPath, entry.name)\n if (entry.isDirectory()) {\n results.push(...collectFiles(fullPath, root))\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase()\n if (SUPPORTED_EXTENSIONS.has(ext)) {\n results.push({ absolutePath: fullPath, relativePath: path.relative(root, fullPath) })\n }\n }\n }\n\n return results\n}\n\n// ── Node.js file system operations ──────────────────────────────────────────\n\n/**\n * Upload a local file by path. Handles readFileSync + basename + Blob + uploadFile.\n * Convenience wrapper for CLI/TUI consumers that work with file system paths.\n */\nexport async function uploadLocalFile(\n auth: AuthHeaders,\n workspaceId: string,\n filePath: string,\n options?: UploadOptions\n): Promise<UploadResult & { fileName: string }> {\n const fileBuffer = fs.readFileSync(filePath)\n const fileName = path.basename(filePath)\n const result = await uploadFile(auth, workspaceId, new Blob([fileBuffer]), fileName, options)\n return { ...result, fileName }\n}\n\n/**\n * Upload all supported files from a directory, preserving folder structure.\n * Files are grouped by their relative folder path and uploaded per group.\n */\nexport async function uploadDirectory(\n auth: AuthHeaders,\n workspaceId: string,\n dirPath: string\n): Promise<UploadBatchResult> {\n const resolvedDir = path.resolve(dirPath)\n const dirName = path.basename(resolvedDir)\n const entries = collectFiles(resolvedDir)\n\n if (entries.length === 0) {\n return { doc_ext_ids: [], duplicates: [], folders: new Map() }\n }\n\n // Group by folder\n const groups = new Map<string, Array<{ absolutePath: string; name: string }>>()\n for (const entry of entries) {\n const relDir = path.dirname(entry.relativePath)\n // Prepend the directory name so the root folder appears on the backend\n const folder = relDir === '.' ? dirName : `${dirName}/${relDir}`\n if (!groups.has(folder)) groups.set(folder, [])\n groups\n .get(folder)!\n .push({ absolutePath: entry.absolutePath, name: path.basename(entry.relativePath) })\n }\n\n const allDocIds: string[] = []\n const allDuplicates: string[] = []\n const folders = new Map<\n string,\n { fileCount: number; doc_ext_ids: string[]; duplicates: string[] }\n >()\n\n for (const [folder, files] of groups) {\n const blobs = files.map((f) => ({\n data: new Blob([fs.readFileSync(f.absolutePath)]),\n name: f.name,\n }))\n\n const result = await uploadFiles(auth, workspaceId, blobs, { folder })\n const dups = result.duplicates ?? []\n\n allDocIds.push(...result.doc_ext_ids)\n allDuplicates.push(...dups)\n folders.set(folder, {\n fileCount: files.length,\n doc_ext_ids: result.doc_ext_ids,\n duplicates: dups,\n })\n }\n\n return { doc_ext_ids: allDocIds, duplicates: allDuplicates, folders }\n}\n\n/**\n * Upload files from a zip archive, preserving internal folder structure.\n * Uses jszip via dynamic import so the dependency is optional at load time.\n */\nexport async function uploadZip(\n auth: AuthHeaders,\n workspaceId: string,\n zipPath: string\n): Promise<UploadBatchResult> {\n const JSZip = (await import('jszip')).default\n const zipBuffer = fs.readFileSync(zipPath)\n const zip = await JSZip.loadAsync(zipBuffer)\n const zipBaseName = path.basename(zipPath).replace(/\\.zip$/i, '')\n\n // Collect supported entries\n const entries: Array<{\n zipEntryPath: string\n zipEntry: { async: (t: 'uint8array') => Promise<Uint8Array> }\n }> = []\n zip.forEach((relativePath, zipEntry) => {\n if (zipEntry.dir) return\n const ext = path.extname(relativePath).toLowerCase()\n if (SUPPORTED_EXTENSIONS.has(ext)) {\n entries.push({ zipEntryPath: relativePath, zipEntry })\n }\n })\n\n if (entries.length === 0) {\n return { doc_ext_ids: [], duplicates: [], folders: new Map() }\n }\n\n // Detect single root folder to avoid redundant nesting\n const firstParts = new Set(entries.map((e) => e.zipEntryPath.split('/')[0]))\n const hasSingleRoot = firstParts.size === 1 && entries.every((e) => e.zipEntryPath.includes('/'))\n\n // Group by folder\n const groups = new Map<string, Array<{ name: string; data: Uint8Array }>>()\n for (const entry of entries) {\n const data = await entry.zipEntry.async('uint8array')\n const fileName = path.basename(entry.zipEntryPath)\n const relDir = path.dirname(entry.zipEntryPath)\n\n let folder: string\n if (hasSingleRoot) {\n // Use the zip internal path as-is (root folder already present)\n folder = relDir === '.' ? zipBaseName : relDir\n } else {\n // Prepend zip base name\n folder = relDir === '.' ? zipBaseName : `${zipBaseName}/${relDir}`\n }\n folder = sanitizeFolderPath(folder)\n\n if (!groups.has(folder)) groups.set(folder, [])\n groups.get(folder)!.push({ name: fileName, data })\n }\n\n const allDocIds: string[] = []\n const allDuplicates: string[] = []\n const folders = new Map<\n string,\n { fileCount: number; doc_ext_ids: string[]; duplicates: string[] }\n >()\n\n for (const [folder, files] of groups) {\n const blobs = files.map((f) => ({\n data: new Blob([f.data]),\n name: f.name,\n }))\n\n const result = await uploadFiles(auth, workspaceId, blobs, { folder })\n const dups = result.duplicates ?? []\n\n allDocIds.push(...result.doc_ext_ids)\n allDuplicates.push(...dups)\n folders.set(folder, {\n fileCount: files.length,\n doc_ext_ids: result.doc_ext_ids,\n duplicates: dups,\n })\n }\n\n return { doc_ext_ids: allDocIds, duplicates: allDuplicates, folders }\n}\n","/**\n * Responses operations — background query submission and retrieval.\n *\n * submitBackgroundQuery: POST /v1/responses with background=true → 202 with task ID.\n * getResponse: GET /v1/responses/{responseId} → current status + output.\n * extractResponseText: Walk response output and join text content.\n */\n\nimport type { components } from '@arbidocs/client'\nimport { authenticatedFetch, type AuthHeaders } from '../fetch.js'\n\ntype MessageInput = components['schemas']['MessageInput']\ntype ResponsesAPIResponse = components['schemas']['ResponsesAPIResponse']\ntype ToolEntry = NonNullable<MessageInput['tools']>[string]\n\n// ── Submit background query ──────────────────────────────────────────────────\n\nexport interface SubmitBackgroundQueryOptions extends AuthHeaders {\n workspaceId: string\n question: string\n docIds: string[]\n previousResponseId?: string | null\n model?: string\n}\n\n/**\n * Submit a query for background processing.\n * Returns immediately with a response ID and \"queued\" status.\n */\nexport async function submitBackgroundQuery(\n options: SubmitBackgroundQueryOptions\n): Promise<ResponsesAPIResponse> {\n const { workspaceId, question, docIds, previousResponseId, model, ...auth } = options\n\n const tools: Record<string, ToolEntry> = {}\n if (docIds.length > 0) {\n tools.retrieval_chunk = {\n name: 'retrieval_chunk',\n description: 'retrieval chunk',\n tool_args: { doc_ext_ids: docIds },\n tool_responses: {},\n }\n tools.retrieval_full_context = {\n name: 'retrieval_full_context',\n description: 'retrieval full context',\n tool_args: { doc_ext_ids: [] },\n tool_responses: {},\n }\n }\n\n const body: MessageInput = {\n input: question,\n workspace_ext_id: workspaceId,\n stream: false,\n background: true,\n store: true,\n tools,\n ...(previousResponseId ? { previous_response_id: previousResponseId } : {}),\n ...(model ? { model } : {}),\n }\n\n const res = await authenticatedFetch({\n ...auth,\n path: '/v1/responses',\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json' },\n })\n\n return (await res.json()) as ResponsesAPIResponse\n}\n\n// ── Get response status/result ───────────────────────────────────────────────\n\n/**\n * Fetch the current state of a response by ID.\n * Returns progressive status, output, usage, and metadata.\n */\nexport async function getResponse(\n auth: AuthHeaders,\n responseId: string\n): Promise<ResponsesAPIResponse> {\n const res = await authenticatedFetch({\n ...auth,\n path: `/v1/responses/${responseId}`,\n method: 'GET',\n })\n\n return (await res.json()) as ResponsesAPIResponse\n}\n\n// ── Text extraction ──────────────────────────────────────────────────────────\n\n/**\n * Walk response output messages and join all output_text content.\n * Pure function, no I/O.\n */\nexport function extractResponseText(response: ResponsesAPIResponse): string {\n const parts: string[] = []\n for (const msg of response.output) {\n for (const item of msg.content) {\n if ('type' in item && item.type === 'output_text' && 'text' in item) {\n parts.push(item.text as string)\n }\n }\n }\n return parts.join('')\n}\n"]}
|