@arbidocs/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/commands/config-cmd.ts","../src/prompts.ts","../src/commands/login.ts","../src/commands/register.ts","../src/commands/logout.ts","../src/commands/status.ts","../src/client.ts","../src/helpers.ts","../src/commands/workspaces.ts","../src/commands/docs.ts","../src/ws.ts","../src/commands/upload.ts","../src/commands/download.ts","../src/commands/ask.ts","../src/commands/watch.ts","../src/commands/contacts.ts","../src/commands/dm.ts","../src/commands/tags.ts","../src/commands/doctags.ts","../src/commands/conversations.ts","../src/commands/settings.ts","../src/commands/agentconfig.ts","../src/commands/health.ts","../src/index.ts"],"names":["path","os","fs","program","select","checkbox","search","input","password","confirm","createArbiClient","ws","base64ToBytes","deriveEncryptionKeypairFromSigning","sealedBoxDecrypt","createWorkspaceKeyHeader","buildWebSocketUrl","createAuthMessage","parseServerMessage","isMessageType","data","Command"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * CLI configuration persistence (~/.arbi/)\n *\n * Two files:\n * - config.json: server URL, deployment domain, selected workspace\n * - credentials.json: email, signing private key (base64), server session key (base64)\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\n\nconst CONFIG_DIR = path.join(os.homedir(), '.arbi')\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json')\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json')\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface CliConfig {\n baseUrl: string\n deploymentDomain: string\n selectedWorkspaceId?: string\n}\n\nexport interface CliCredentials {\n email: string\n signingPrivateKeyBase64: string\n serverSessionKeyBase64: string\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 })\n }\n}\n\nfunction writeSecureFile(filePath: string, data: object): void {\n ensureConfigDir()\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', { mode: 0o600 })\n}\n\nfunction 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\nexport function getConfig(): CliConfig | null {\n return readJsonFile<CliConfig>(CONFIG_FILE)\n}\n\nexport function saveConfig(config: CliConfig): void {\n writeSecureFile(CONFIG_FILE, config)\n}\n\nexport function updateConfig(updates: Partial<CliConfig>): void {\n const existing = getConfig() || ({} as Partial<CliConfig>)\n saveConfig({ ...existing, ...updates } as CliConfig)\n}\n\nexport function requireConfig(): CliConfig {\n const config = getConfig()\n if (!config?.baseUrl) {\n console.error('Not configured. Run: arbi config set-url <url>')\n process.exit(1)\n }\n return config\n}\n\n// ── Credentials ──────────────────────────────────────────────────────────────\n\nexport function getCredentials(): CliCredentials | null {\n return readJsonFile<CliCredentials>(CREDENTIALS_FILE)\n}\n\nexport function saveCredentials(creds: CliCredentials): void {\n writeSecureFile(CREDENTIALS_FILE, creds)\n}\n\nexport function deleteCredentials(): void {\n try {\n fs.unlinkSync(CREDENTIALS_FILE)\n } catch {\n // Already gone\n }\n}\n\nexport function requireCredentials(): CliCredentials {\n const creds = getCredentials()\n if (!creds) {\n console.error('Not logged in. Run: arbi login')\n process.exit(1)\n }\n return creds\n}\n\n// ── Chat session state ──────────────────────────────────────────────────────\n\nconst SESSION_FILE = path.join(CONFIG_DIR, 'session.json')\n\nexport interface ChatSession {\n /** Last assistant message ID — used as parent_message_ext_id for follow-ups */\n lastMessageExtId: string | null\n}\n\nconst DEFAULT_SESSION: ChatSession = {\n lastMessageExtId: null,\n}\n\nexport function getChatSession(): ChatSession {\n return readJsonFile<ChatSession>(SESSION_FILE) || { ...DEFAULT_SESSION }\n}\n\nexport function saveChatSession(session: ChatSession): void {\n writeSecureFile(SESSION_FILE, session)\n}\n\nexport function updateChatSession(updates: Partial<ChatSession>): void {\n const existing = getChatSession()\n saveChatSession({ ...existing, ...updates })\n}\n\nexport function clearChatSession(): void {\n saveChatSession({ ...DEFAULT_SESSION })\n}\n","/**\n * arbi config set-url <url>\n */\n\nimport { Command } from 'commander'\nimport { updateConfig } from '../config.js'\n\nexport function registerConfigCommand(program: Command): void {\n const config = program.command('config').description('Manage CLI configuration')\n\n config\n .command('set-url <url>')\n .description('Set the ARBI server URL')\n .action((url: string) => {\n try {\n const parsed = new URL(url)\n const deploymentDomain = parsed.hostname\n updateConfig({ baseUrl: url.replace(/\\/+$/, ''), deploymentDomain })\n console.log(`Server URL: ${url}`)\n console.log(`Domain: ${deploymentDomain}`)\n } catch {\n console.error(`Invalid URL: ${url}`)\n process.exit(1)\n }\n })\n}\n","/**\n * Interactive prompt helpers using @inquirer/prompts.\n *\n * These are only used in interactive (TTY) flows.\n * AI agents and CI should bypass prompts by passing all values via flags/env vars.\n */\n\nimport { select, input, password, confirm, checkbox, search } from '@inquirer/prompts'\n\nexport { select, input, password, confirm, checkbox, search }\n\n/**\n * Prompt user to pick from a list of items.\n * Returns the value of the selected choice.\n */\nexport async function promptSelect<T>(\n message: string,\n choices: Array<{ name: string; value: T; description?: string }>\n): Promise<T> {\n return select({ message, choices })\n}\n\n/**\n * Prompt user to pick multiple items from a list.\n * Returns array of selected values.\n */\nexport async function promptCheckbox<T>(\n message: string,\n choices: Array<{ name: string; value: T; checked?: boolean }>\n): Promise<T[]> {\n return checkbox({ message, choices })\n}\n\n/**\n * Prompt user to search and pick from a large list.\n * Type-ahead fuzzy filtering — best for docs (could be hundreds).\n */\nexport async function promptSearch<T>(\n message: string,\n choices: Array<{ name: string; value: T; description?: string }>\n): Promise<T> {\n return search({\n message,\n source: async (term) => {\n if (!term) return choices\n const lower = term.toLowerCase()\n return choices.filter((c) => c.name.toLowerCase().includes(lower))\n },\n })\n}\n\n/**\n * Prompt for text input. Returns trimmed string.\n */\nexport async function promptInput(message: string, required = true): Promise<string> {\n return input({\n message,\n validate: required ? (v) => (v.trim() ? true : 'Required') : undefined,\n })\n}\n\n/**\n * Prompt for a password (masked input).\n */\nexport async function promptPassword(message: string): Promise<string> {\n return password({\n message,\n mask: '*',\n validate: (v) => (v ? true : 'Required'),\n })\n}\n\n/**\n * Prompt for yes/no confirmation.\n */\nexport async function promptConfirm(message: string, defaultValue = true): Promise<boolean> {\n return confirm({ message, default: defaultValue })\n}\n","/**\n * arbi login [--email <email>] [--password <password>]\n *\n * Authenticates via SDK, stores signing key.\n * If email/password not provided via flags or env vars, prompts interactively.\n * After login, shows interactive workspace picker.\n */\n\nimport { Command } from 'commander'\nimport 'fake-indexeddb/auto'\nimport { createArbiClient } from '@arbidocs/sdk'\nimport { requireConfig, saveCredentials, updateConfig } from '../config.js'\nimport { promptInput, promptPassword, promptSelect } from '../prompts.js'\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Log in to ARBI')\n .option('-e, --email <email>', 'Email address (or ARBI_EMAIL env var)')\n .option('-p, --password <password>', 'Password (or ARBI_PASSWORD env var)')\n .option('-w, --workspace <id>', 'Workspace ID to select after login')\n .action(async (opts: { email?: string; password?: string; workspace?: string }) => {\n const config = requireConfig()\n\n // Resolve credentials: flags > env vars > interactive prompt\n const email = opts.email || process.env.ARBI_EMAIL || (await promptInput('Email'))\n const pw = opts.password || process.env.ARBI_PASSWORD || (await promptPassword('Password'))\n\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n\n await arbi.crypto.initSodium()\n\n try {\n const result = await arbi.auth.login({ email, password: pw })\n\n saveCredentials({\n email,\n signingPrivateKeyBase64: arbi.crypto.bytesToBase64(result.signingPrivateKey),\n serverSessionKeyBase64: arbi.crypto.bytesToBase64(result.serverSessionKey),\n })\n\n const { data: workspaces } = await arbi.fetch.GET('/api/user/workspaces')\n const wsList = workspaces || []\n\n console.log(`Logged in as ${email}`)\n\n if (wsList.length === 0) {\n console.log('No workspaces found.')\n return\n }\n\n // If workspace specified via flag, select it directly\n if (opts.workspace) {\n const ws = wsList.find((w) => w.external_id === opts.workspace)\n if (!ws) {\n console.error(`Workspace ${opts.workspace} not found.`)\n process.exit(1)\n }\n updateConfig({ selectedWorkspaceId: ws.external_id })\n console.log(`Workspace: ${ws.name} (${ws.external_id})`)\n return\n }\n\n // Auto-select if only one workspace\n if (wsList.length === 1) {\n updateConfig({ selectedWorkspaceId: wsList[0].external_id })\n console.log(`Workspace: ${wsList[0].name} (${wsList[0].external_id})`)\n return\n }\n\n // Interactive workspace selection\n const choices = 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 const selected = await promptSelect('Select workspace', choices)\n updateConfig({ selectedWorkspaceId: selected })\n const ws = wsList.find((w) => w.external_id === selected)!\n console.log(`Workspace: ${ws.name} (${selected})`)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`Login failed: ${msg}`)\n process.exit(1)\n }\n })\n}\n","/**\n * arbi register — interactive registration\n * arbi register --non-interactive [opts] — CI/automation mode (requires SUPPORT_API_KEY)\n *\n * Interactive mode:\n * 1. Prompt for email\n * 2. Enter an invitation code, or request a verification email\n * 3. Set password + name\n * 4. On success, offer to log in immediately\n *\n * Non-interactive mode:\n * All fields via flags / env vars, verification code fetched via SUPPORT_API_KEY.\n */\n\nimport { Command } from 'commander'\nimport 'fake-indexeddb/auto'\nimport { createArbiClient } from '@arbidocs/sdk'\nimport { requireConfig, saveCredentials, updateConfig } from '../config.js'\nimport { promptInput, promptPassword, promptConfirm, promptSelect } from '../prompts.js'\n\nconst CENTRAL_API_URL = 'https://central.arbi.work'\n\n// ── CI verification code fetch ───────────────────────────────────────────────\n\nasync function getVerificationCode(email: string, apiKey: string): Promise<string> {\n const params = new URLSearchParams({ email })\n const res = await fetch(`${CENTRAL_API_URL}/license-management/verify-ci?${params.toString()}`, {\n method: 'GET',\n headers: { 'x-api-key': apiKey },\n })\n\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n throw new Error(`Failed to get verification code: ${res.status} ${body}`)\n }\n\n const data = (await res.json()) as { verification_words?: string[]; verification_code?: string }\n const words = data?.verification_words ?? data?.verification_code ?? null\n if (!words) throw new Error('No verification code in response')\n\n return Array.isArray(words) ? words.join(' ') : String(words)\n}\n\n// ── Command ──────────────────────────────────────────────────────────────────\n\nexport function registerRegisterCommand(program: Command): void {\n program\n .command('register')\n .description('Register a new ARBI account')\n .option('--non-interactive', 'CI/automation mode (requires SUPPORT_API_KEY env var)')\n .option('-e, --email <email>', 'Email address (or ARBI_EMAIL env var)')\n .option('-p, --password <password>', 'Password (or ARBI_PASSWORD env var)')\n .option('--first-name <name>', 'First name')\n .option('--last-name <name>', 'Last name')\n .action(\n async (opts: {\n nonInteractive?: boolean\n email?: string\n password?: string\n firstName?: string\n lastName?: string\n }) => {\n const config = requireConfig()\n\n if (opts.nonInteractive) {\n await nonInteractiveRegister(config, opts)\n } else {\n await interactiveRegister(config, opts)\n }\n }\n )\n}\n\n// ── Interactive mode ─────────────────────────────────────────────────────────\n\nasync function interactiveRegister(\n config: { baseUrl: string; deploymentDomain: string },\n opts: { email?: string; password?: string; firstName?: string; lastName?: string }\n) {\n // 1. Email\n const email = opts.email || (await promptInput('Email'))\n\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n await arbi.crypto.initSodium()\n\n // 2. Verification code — enter existing or request one\n const codeMethod = await promptSelect('Verification method', [\n { name: 'I have an invitation code', value: 'code' },\n { name: 'Send me a verification email', value: 'email' },\n ])\n\n let verificationCode: string\n if (codeMethod === 'code') {\n verificationCode = await promptInput('Invitation code')\n } else {\n console.log('Sending verification email...')\n const verifyResponse = await arbi.fetch.POST('/api/user/verify-email', {\n body: { email },\n })\n if (verifyResponse.error) {\n console.error(`Failed to send verification email: ${JSON.stringify(verifyResponse.error)}`)\n process.exit(1)\n }\n console.log('Verification email sent. Check your inbox.')\n verificationCode = await promptInput('Verification code')\n }\n\n // 3. Password\n const password = opts.password || (await promptPassword('Password'))\n const confirmPw = await promptPassword('Confirm password')\n if (password !== confirmPw) {\n console.error('Passwords do not match.')\n process.exit(1)\n }\n\n // 4. Name\n const firstName = opts.firstName || (await promptInput('First name', false)) || 'User'\n const lastName = opts.lastName || (await promptInput('Last name', false)) || ''\n\n // 5. Register\n try {\n await arbi.auth.register({\n email,\n password,\n verificationCode,\n firstName,\n lastName,\n })\n console.log(`\\nRegistered successfully as ${email}`)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`Registration failed: ${msg}`)\n process.exit(1)\n }\n\n // 6. Offer to log in\n const doLogin = await promptConfirm('Log in now?')\n if (doLogin) {\n try {\n const loginResult = await arbi.auth.login({ email, password })\n saveCredentials({\n email,\n signingPrivateKeyBase64: arbi.crypto.bytesToBase64(loginResult.signingPrivateKey),\n serverSessionKeyBase64: arbi.crypto.bytesToBase64(loginResult.serverSessionKey),\n })\n\n const { data: workspaces } = await arbi.fetch.GET('/api/user/workspaces')\n const wsList = workspaces || []\n\n console.log(`Logged in as ${email}`)\n if (wsList.length === 1) {\n updateConfig({ selectedWorkspaceId: wsList[0].external_id })\n console.log(`Workspace: ${wsList[0].name} (${wsList[0].external_id})`)\n } else if (wsList.length > 1) {\n const choices = 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 const selected = await promptSelect('Select workspace', choices)\n updateConfig({ selectedWorkspaceId: selected })\n const ws = wsList.find((w) => w.external_id === selected)!\n console.log(`Workspace: ${ws.name} (${selected})`)\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`Login failed: ${msg}`)\n console.error('You can log in later with: arbi login')\n }\n }\n}\n\n// ── Non-interactive mode ─────────────────────────────────────────────────────\n\nasync function nonInteractiveRegister(\n config: { baseUrl: string; deploymentDomain: string },\n opts: { email?: string; password?: string; firstName?: string; lastName?: string }\n) {\n const email = opts.email || process.env.ARBI_EMAIL\n const password = opts.password || process.env.ARBI_PASSWORD\n const supportApiKey = process.env.SUPPORT_API_KEY\n\n if (!email) {\n console.error('Email required. Use --email <email> or set ARBI_EMAIL')\n process.exit(1)\n }\n if (!password) {\n console.error('Password required. Use --password <password> or set ARBI_PASSWORD')\n process.exit(1)\n }\n if (!supportApiKey) {\n console.error('SUPPORT_API_KEY env var is required for --non-interactive registration')\n process.exit(1)\n }\n\n const arbi = createArbiClient({\n baseUrl: config.baseUrl,\n deploymentDomain: config.deploymentDomain,\n credentials: 'omit',\n })\n await arbi.crypto.initSodium()\n\n // Request verification email\n const verifyResponse = await arbi.fetch.POST('/api/user/verify-email', {\n body: { email },\n })\n if (verifyResponse.error) {\n console.error(`verify-email failed: ${JSON.stringify(verifyResponse.error)}`)\n process.exit(1)\n }\n\n // Fetch code from CI endpoint\n const verificationCode = await getVerificationCode(email, supportApiKey)\n\n // Register\n try {\n await arbi.auth.register({\n email,\n password,\n verificationCode,\n firstName: opts.firstName ?? 'Test',\n lastName: opts.lastName ?? 'User',\n })\n console.log(`Registered: ${email}`)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`Registration failed: ${msg}`)\n process.exit(1)\n }\n}\n","/**\n * arbi logout\n */\n\nimport { Command } from 'commander'\nimport { deleteCredentials, updateConfig } from '../config.js'\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Log out of ARBI')\n .action(() => {\n deleteCredentials()\n updateConfig({ selectedWorkspaceId: undefined })\n console.log('Logged out.')\n })\n}\n","/**\n * arbi status\n *\n * Shows current config + login state (no API calls).\n */\n\nimport { Command } from 'commander'\nimport { getConfig, getCredentials } from '../config.js'\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show current configuration and login status')\n .action(() => {\n const config = getConfig()\n const creds = getCredentials()\n\n if (!config?.baseUrl) {\n console.log('Not configured. Run: arbi config set-url <url>')\n return\n }\n\n console.log(`Server: ${config.baseUrl}`)\n\n if (creds) {\n console.log(`User: ${creds.email}`)\n } else {\n console.log('User: (not logged in)')\n }\n\n if (config.selectedWorkspaceId) {\n console.log(`Workspace: ${config.selectedWorkspaceId}`)\n } else {\n console.log('Workspace: (none selected)')\n }\n })\n}\n","/**\n * Authenticated client factory for CLI commands\n *\n * Creates an ArbiClient, initializes sodium, and logs in using stored credentials.\n * Also provides workspace key header generation (reused by all workspace commands).\n */\n\nimport 'fake-indexeddb/auto'\nimport {\n createArbiClient,\n sealedBoxDecrypt,\n deriveEncryptionKeypairFromSigning,\n createWorkspaceKeyHeader,\n base64ToBytes,\n type ArbiClient,\n type LoginResult,\n} from '@arbidocs/sdk'\nimport { requireConfig, requireCredentials, saveCredentials } from './config.js'\n\nexport interface AuthenticatedClient {\n arbi: ArbiClient\n loginResult: LoginResult\n}\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(): Promise<AuthenticatedClient> {\n const config = requireConfig()\n const creds = requireCredentials()\n\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 saveCredentials({\n ...creds,\n serverSessionKeyBase64: arbi.crypto.bytesToBase64(loginResult.serverSessionKey),\n })\n\n return { arbi, loginResult }\n}\n\n/**\n * Decrypt wrapped workspace key and set it as the active workspace header.\n * Pattern from test-sdk.cjs:108-123.\n */\nexport async function selectWorkspace(\n arbi: ArbiClient,\n workspaceId: string,\n wrappedKey: string,\n serverSessionKey: Uint8Array\n): Promise<void> {\n const creds = requireCredentials()\n const signingPrivateKey = base64ToBytes(creds.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 * 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): Promise<{ external_id: string; name: string; wrapped_key: string }> {\n const { data: workspaces, error } = await arbi.fetch.GET('/api/user/workspaces')\n if (error || !workspaces) {\n throw new Error('Failed to fetch workspaces')\n }\n\n // find() uses the SDK's typed WorkspaceResponse — no inline type annotation needed\n const ws = workspaces.find((w) => w.external_id === workspaceId)\n if (!ws || !ws.wrapped_key) {\n throw new Error(`Workspace ${workspaceId} not found or has no encryption key`)\n }\n\n await selectWorkspace(arbi, ws.external_id, ws.wrapped_key, serverSessionKey)\n\n return { external_id: ws.external_id, name: ws.name, wrapped_key: ws.wrapped_key }\n}\n","/**\n * Shared CLI helpers — eliminates boilerplate across all commands.\n *\n * - runAction: wraps async command handlers with error formatting\n * - resolveAuth: authenticates and returns the SDK client\n * - resolveWorkspace: authenticates + selects workspace (most common pattern)\n * - printTable: column-aligned table output\n * - parseJsonArg: parse JSON CLI argument with helpful error\n */\n\nimport type { ArbiClient, LoginResult } from '@arbidocs/sdk'\nimport { createAuthenticatedClient, selectWorkspaceById } from './client.js'\nimport { requireConfig, type CliConfig } from './config.js'\n\n// ── Error handling ────────────────────────────────────────────────────────────\n\n/**\n * Wrap a command action — catches errors, formats message, exits.\n * Every command handler should use this instead of manual try/catch.\n */\nexport function runAction(fn: () => Promise<void>): () => Promise<void> {\n return async () => {\n try {\n await fn()\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`Error: ${msg}`)\n process.exit(1)\n }\n }\n}\n\n/**\n * Check API response and exit 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 console.error(message)\n process.exit(1)\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 console.error(message)\n process.exit(1)\n }\n}\n\n// ── Auth & workspace resolution ───────────────────────────────────────────────\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/**\n * Authenticate and return the SDK client + config.\n * For commands that don't need a workspace (contacts, health, etc.)\n */\nexport async function resolveAuth(): Promise<AuthContext> {\n const config = requireConfig()\n const { arbi, loginResult } = await createAuthenticatedClient()\n return { arbi, loginResult, config }\n}\n\n/**\n * Authenticate, resolve workspace, and set up headers.\n * The most common pattern — used by docs, upload, tags, conversations, etc.\n */\nexport async function resolveWorkspace(workspaceOpt?: string): Promise<WorkspaceContext> {\n const config = requireConfig()\n const workspaceId = workspaceOpt || config.selectedWorkspaceId\n\n if (!workspaceId) {\n console.error('No workspace selected. Run: arbi workspace select <id>')\n process.exit(1)\n }\n\n const { arbi, loginResult } = await createAuthenticatedClient()\n await selectWorkspaceById(arbi, workspaceId, loginResult.serverSessionKey)\n\n const accessToken = arbi.session.getState().accessToken\n const workspaceKeyHeader = arbi.session.getWorkspaceKeyHeader()\n\n if (!accessToken || !workspaceKeyHeader) {\n console.error('Authentication error — missing token or workspace key')\n process.exit(1)\n }\n\n return { arbi, loginResult, config, workspaceId, accessToken, workspaceKeyHeader }\n}\n\n// ── Table formatting ──────────────────────────────────────────────────────────\n\nexport interface Column {\n header: string\n width: number\n value: (row: Record<string, unknown>) => string\n}\n\n/**\n * Print a formatted table with header + rows.\n * Handles truncation to column width and padding.\n */\nexport function printTable<T extends Record<string, unknown>>(columns: Column[], rows: T[]): void {\n // Header\n console.log(columns.map((c) => c.header.padEnd(c.width)).join(''))\n\n // Rows\n for (const row of rows) {\n console.log(\n columns\n .map((c) => {\n const val = c.value(row as Record<string, unknown>)\n return val.slice(0, c.width - 2).padEnd(c.width)\n })\n .join('')\n )\n }\n}\n\n// ── JSON parsing ──────────────────────────────────────────────────────────────\n\n/**\n * Parse a JSON string argument with a helpful error message.\n */\nexport function parseJsonArg<T = Record<string, unknown>>(input: string, example: string): T {\n try {\n return JSON.parse(input) as T\n } catch {\n console.error(`Invalid JSON. Example: ${example}`)\n process.exit(1)\n }\n}\n","/**\n * arbi workspaces — list workspaces\n * arbi workspace select/create/delete/update — workspace CRUD\n * arbi workspace users/add-user/remove-user — user management\n * arbi workspace set-role/copy — role & copy operations\n */\n\nimport { Command } from 'commander'\nimport {\n runAction,\n resolveAuth,\n resolveWorkspace,\n requireData,\n requireOk,\n printTable,\n parseJsonArg,\n} from '../helpers.js'\nimport { updateConfig } from '../config.js'\nimport { promptSelect } from '../prompts.js'\n\nexport function registerWorkspacesCommand(program: Command): void {\n program\n .command('workspaces')\n .description('List workspaces')\n .action(\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.GET('/api/user/workspaces'),\n 'Failed to fetch workspaces'\n )\n\n if (data.length === 0) {\n console.log('No workspaces found.')\n return\n }\n\n printTable(\n [\n { header: 'ID', width: 24, value: (r) => r.external_id as string },\n { header: 'NAME', width: 30, value: (r) => r.name as string },\n {\n header: 'DOCS',\n width: 6,\n value: (r) =>\n String((r.shared_document_count as number) + (r.private_document_count as number)),\n },\n {\n header: 'ROLE',\n width: 10,\n value: (r) => (r.users as { role: string }[])?.[0]?.role ?? '',\n },\n ],\n data\n )\n })\n )\n\n const workspace = program.command('workspace').description('Workspace management')\n\n workspace\n .command('select [id]')\n .description('Select active workspace (interactive picker if no ID given)')\n .action((id?: string) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.GET('/api/user/workspaces'),\n 'Failed to fetch workspaces'\n )\n\n if (data.length === 0) {\n console.log('No workspaces found.')\n return\n }\n\n let selectedId: string\n if (id) {\n const ws = data.find((w) => w.external_id === id)\n if (!ws) {\n console.error(`Workspace ${id} not found.`)\n console.error('Available workspaces:')\n for (const w of data) console.error(` ${w.external_id} ${w.name}`)\n process.exit(1)\n }\n selectedId = id\n } else {\n // Interactive picker\n const choices = data.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 as string,\n description: ws.external_id as string,\n }\n })\n selectedId = await promptSelect('Select workspace', choices)\n }\n\n updateConfig({ selectedWorkspaceId: selectedId })\n const ws = data.find((w) => w.external_id === selectedId)!\n console.log(`Selected: ${ws.name} (${selectedId})`)\n })()\n )\n\n workspace\n .command('create <name>')\n .description('Create a new workspace')\n .option('-d, --description <text>', 'Workspace description')\n .option('--public', 'Make workspace public', false)\n .action((name: string, opts: { description?: string; public?: boolean }) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.POST('/api/workspace/create_protected', {\n body: { name, description: opts.description ?? null, is_public: opts.public ?? false },\n }),\n 'Failed to create workspace'\n )\n console.log(`Created: ${data.name} (${data.external_id})`)\n })()\n )\n\n workspace\n .command('delete <id>')\n .description('Delete a workspace')\n .action((id: string) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.DELETE('/api/workspace/{workspace_ext_id}', {\n params: { path: { workspace_ext_id: id } },\n }),\n 'Failed to delete workspace'\n )\n console.log(data?.detail ?? `Deleted workspace ${id}`)\n })()\n )\n\n workspace\n .command('update <id> <json>')\n .description('Update workspace properties (pass JSON)')\n .action((id: string, json: string) =>\n runAction(async () => {\n const body = parseJsonArg(json, 'arbi workspace update wrk-123 \\'{\"name\": \"New Name\"}\\'')\n const { arbi } = await resolveWorkspace(id)\n const data = requireData(\n await arbi.fetch.PATCH('/api/workspace/{workspace_ext_id}', {\n params: { path: { workspace_ext_id: id } },\n body: body as never,\n }),\n 'Failed to update workspace'\n )\n console.log(`Updated: ${data.name} (${data.external_id})`)\n })()\n )\n\n workspace\n .command('users')\n .description('List users in the active workspace')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .action((opts: { workspace?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/users', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch workspace users'\n )\n\n if (data.length === 0) {\n console.log('No users found.')\n return\n }\n\n type User = {\n external_id?: string\n email?: string\n given_name?: string\n family_name?: string\n }\n printTable(\n [\n {\n header: 'USER_ID',\n width: 16,\n value: (r) => (r.user as User)?.external_id ?? '',\n },\n {\n header: 'NAME',\n width: 20,\n value: (r) => {\n const u = r.user as User\n return [u?.given_name, u?.family_name].filter(Boolean).join(' ') || ''\n },\n },\n {\n header: 'EMAIL',\n width: 30,\n value: (r) => (r.user as User)?.email ?? '',\n },\n { header: 'ROLE', width: 14, value: (r) => r.role as string },\n { header: 'DOCS', width: 6, value: (r) => String(r.document_count) },\n { header: 'CONVS', width: 6, value: (r) => String(r.conversation_count) },\n ],\n data\n )\n })()\n )\n\n workspace\n .command('add-user <emails...>')\n .description('Add users to the active workspace')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .option('-r, --role <role>', 'Role: owner, collaborator, guest', 'collaborator')\n .action((emails: string[], opts: { workspace?: string; role?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n const role = (opts.role ?? 'collaborator') as 'owner' | 'collaborator' | 'guest'\n const data = requireData(\n await arbi.fetch.POST('/api/workspace/{workspace_ext_id}/users', {\n params: { path: { workspace_ext_id: workspaceId } },\n body: { emails, role },\n }),\n 'Failed to add users'\n )\n for (const u of data) console.log(`Added: ${u.user.email} as ${u.role}`)\n })()\n )\n\n workspace\n .command('remove-user <user-ids...>')\n .description('Remove users from the active workspace')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .action((userIds: string[], opts: { workspace?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n requireOk(\n await arbi.fetch.DELETE('/api/workspace/{workspace_ext_id}/users', {\n params: { path: { workspace_ext_id: workspaceId } },\n body: { users: userIds.map((id) => ({ user_ext_id: id })) },\n }),\n 'Failed to remove users'\n )\n console.log(`Removed ${userIds.length} user(s).`)\n })()\n )\n\n workspace\n .command('set-role <role> <user-ids...>')\n .description('Update user roles (owner, collaborator, guest)')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .action((role: string, userIds: string[], opts: { workspace?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n const data = requireData(\n await arbi.fetch.PATCH('/api/workspace/{workspace_ext_id}/users', {\n params: { path: { workspace_ext_id: workspaceId } },\n body: { user_ext_ids: userIds, role: role as 'owner' | 'collaborator' | 'guest' },\n }),\n 'Failed to update roles'\n )\n for (const u of data) console.log(`Updated: ${u.user.email} → ${u.role}`)\n })()\n )\n\n workspace\n .command('copy <target-workspace-id> <doc-ids...>')\n .description('Copy documents to another workspace')\n .option('-w, --workspace <id>', 'Source workspace ID (defaults to selected workspace)')\n .action((targetId: string, docIds: string[], opts: { workspace?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n const data = requireData(\n await arbi.fetch.POST('/api/workspace/{workspace_ext_id}/copy', {\n params: { path: { workspace_ext_id: workspaceId } },\n body: { target_workspace_ext_id: targetId, items: docIds },\n }),\n 'Failed to copy documents'\n )\n console.log(`${data.detail} (${data.documents_copied} document(s) copied)`)\n })()\n )\n}\n","/**\n * arbi docs — list documents\n * arbi doc get [ids...] — get doc details (picker if no IDs)\n * arbi doc delete [ids...] — delete docs (picker if no IDs)\n * arbi doc update [json] — update docs (form if no JSON)\n * arbi doc upload-url <urls...> — upload from URLs\n * arbi doc parsed [doc-id] <stage> — parsed content (picker if no doc ID)\n */\n\nimport { Command } from 'commander'\nimport {\n runAction,\n resolveWorkspace,\n requireData,\n requireOk,\n printTable,\n parseJsonArg,\n} from '../helpers.js'\nimport { promptSearch, promptCheckbox, promptInput, promptSelect } from '../prompts.js'\n\nfunction formatSize(bytes: number | null | undefined): string {\n if (!bytes) return '-'\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\n/** Fetch workspace docs and return as picker choices */\nasync function fetchDocChoices(\n arbi: Awaited<ReturnType<typeof resolveWorkspace>>['arbi'],\n workspaceId: string\n) {\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/documents', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch documents'\n )\n if (data.length === 0) {\n console.log('No documents found.')\n process.exit(0)\n }\n return data.map((d) => ({\n name: `${d.file_name ?? 'Unnamed'} (${d.status})`,\n value: d.external_id as string,\n description: d.external_id as string,\n }))\n}\n\nexport function registerDocsCommand(program: Command): void {\n program\n .command('docs')\n .description('List documents in the active workspace')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .action((opts: { workspace?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/documents', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch documents'\n )\n\n if (data.length === 0) {\n console.log('No documents found.')\n return\n }\n\n printTable(\n [\n { header: 'ID', width: 24, value: (r) => r.external_id as string },\n { header: 'NAME', width: 36, value: (r) => (r.file_name as string) ?? 'Unnamed' },\n { header: 'STATUS', width: 14, value: (r) => (r.status as string) ?? '' },\n { header: 'SIZE', width: 10, value: (r) => formatSize(r.file_size as number | null) },\n ],\n data\n )\n })()\n )\n\n const doc = program.command('doc').description('Document management')\n\n doc\n .command('get [ids...]')\n .description('Get document details (interactive picker if no IDs given)')\n .action((ids?: string[]) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n let docIds = ids && ids.length > 0 ? ids : undefined\n if (!docIds) {\n const choices = await fetchDocChoices(arbi, workspaceId)\n const selected = await promptCheckbox('Select documents', choices)\n if (selected.length === 0) return\n docIds = selected\n }\n const data = requireData(\n await arbi.fetch.GET('/api/document/', { params: { query: { external_ids: docIds } } }),\n 'Failed to fetch documents'\n )\n console.log(JSON.stringify(data, null, 2))\n })()\n )\n\n doc\n .command('delete [ids...]')\n .description('Delete documents (interactive picker if no IDs given)')\n .action((ids?: string[]) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n let docIds = ids && ids.length > 0 ? ids : undefined\n if (!docIds) {\n const choices = await fetchDocChoices(arbi, workspaceId)\n const selected = await promptCheckbox('Select documents to delete', choices)\n if (selected.length === 0) return\n docIds = selected\n }\n requireOk(\n await arbi.fetch.DELETE('/api/document/', { body: { external_ids: docIds } }),\n 'Failed to delete documents'\n )\n console.log(`Deleted ${docIds.length} document(s).`)\n })()\n )\n\n doc\n .command('update [json]')\n .description('Update documents (interactive form if no JSON given)')\n .action((json?: string) =>\n runAction(async () => {\n if (json) {\n const parsed = parseJsonArg<\n Record<string, unknown>[] | { documents: Record<string, unknown>[] }\n >(json, 'arbi doc update \\'[{\"external_id\": \"doc-123\", \"shared\": true}]\\'')\n const body = Array.isArray(parsed) ? { documents: parsed } : parsed\n\n const { arbi } = await resolveWorkspace()\n const data = requireData(\n await arbi.fetch.PATCH('/api/document/', { body: body as never }),\n 'Failed to update documents'\n )\n console.log(`Updated ${data.length} document(s).`)\n } else {\n // Interactive: pick a doc, then ask what to change\n const { arbi, workspaceId } = await resolveWorkspace()\n const choices = await fetchDocChoices(arbi, workspaceId)\n const docId = await promptSearch('Select document to update', choices)\n\n const field = await promptSelect('Field to update', [\n { name: 'Title', value: 'title' },\n { name: 'Shared', value: 'shared' },\n { name: 'Author', value: 'author' },\n { name: 'Abstract', value: 'abstract' },\n { name: 'Date', value: 'date' },\n ])\n\n let value: unknown\n if (field === 'shared') {\n value = await promptSelect('Shared?', [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ])\n } else if (field === 'date') {\n value = (await promptInput('Date (YYYY-MM-DD)', false)) || null\n } else {\n value = await promptInput(`${field.charAt(0).toUpperCase() + field.slice(1)}`)\n }\n\n const data = requireData(\n await arbi.fetch.PATCH('/api/document/', {\n body: { documents: [{ external_id: docId, [field]: value }] } as never,\n }),\n 'Failed to update document'\n )\n console.log(`Updated ${data.length} document(s).`)\n }\n })()\n )\n\n doc\n .command('upload-url <urls...>')\n .description('Upload documents from URLs')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .option('--shared', 'Make documents shared', false)\n .action((urls: string[], opts: { workspace?: string; shared?: boolean }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n const data = requireData(\n await arbi.fetch.POST('/api/document/upload-url', {\n params: {\n query: { urls, workspace_ext_id: workspaceId, shared: opts.shared ?? false },\n },\n }),\n 'Failed to upload from URLs'\n )\n console.log(`Uploaded: ${data.doc_ext_ids.join(', ')}`)\n if (data.duplicates && data.duplicates.length > 0) {\n console.log(`Duplicates: ${data.duplicates.join(', ')}`)\n }\n })()\n )\n\n doc\n .command('parsed [doc-id] [stage]')\n .description('Get parsed document content (stage: marker, subchunk, final)')\n .action((docId?: string, stage?: string) =>\n runAction(async () => {\n const { arbi, config, accessToken, workspaceKeyHeader, workspaceId } =\n await resolveWorkspace()\n\n // Pick doc if not given\n if (!docId) {\n const choices = await fetchDocChoices(arbi, workspaceId)\n docId = await promptSearch('Select document', choices)\n }\n\n // Pick stage if not given\n const validStages = ['marker', 'subchunk', 'final']\n if (!stage) {\n stage = await promptSelect('Parsing stage', [\n { name: 'Final (processed)', value: 'final' },\n { name: 'Subchunk', value: 'subchunk' },\n { name: 'Marker (raw)', value: 'marker' },\n ])\n } else if (!validStages.includes(stage)) {\n console.error(`Invalid stage: ${stage}. Must be one of: ${validStages.join(', ')}`)\n process.exit(1)\n }\n\n const res = await fetch(`${config.baseUrl}/api/document/${docId}/parsed-${stage}`, {\n headers: { Authorization: `Bearer ${accessToken}`, 'workspace-key': workspaceKeyHeader },\n })\n\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n console.error(`Failed: ${res.status} ${body}`)\n process.exit(1)\n }\n\n console.log(JSON.stringify(await res.json(), null, 2))\n })()\n )\n}\n","/**\n * CLI 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} from '@arbidocs/sdk'\n\nconst AUTH_TIMEOUT_MS = 10_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\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 * arbi upload <file...> [--workspace <id>] [--watch]\n */\n\nimport { Command } from 'commander'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport type { components } from '@arbidocs/sdk'\nimport { isMessageType, type WsTaskUpdateMessage } from '@arbidocs/sdk'\nimport { runAction, resolveWorkspace } from '../helpers.js'\nimport { connectWebSocket } from '../ws.js'\n\ntype UploadResponse = components['schemas']['UploadDocumentsResponse']\n\nexport function registerUploadCommand(program: Command): void {\n program\n .command('upload <files...>')\n .description('Upload documents to the active workspace')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .option('-W, --watch', 'Watch document processing progress after upload')\n .action((files: string[], opts: { workspace?: string; watch?: boolean }) =>\n runAction(async () => {\n // Validate files exist before authenticating\n for (const f of files) {\n if (!fs.existsSync(f)) {\n console.error(`File not found: ${f}`)\n process.exit(1)\n }\n }\n\n const { config, accessToken, workspaceKeyHeader, workspaceId } = await resolveWorkspace(\n opts.workspace\n )\n\n // Track uploaded doc IDs and their file names for --watch\n const uploadedDocs = new Map<string, string>()\n\n for (const filePath of files) {\n const fileBuffer = fs.readFileSync(filePath)\n const fileName = path.basename(filePath)\n\n const formData = new FormData()\n formData.append('files', new Blob([fileBuffer]), fileName)\n\n const res = await fetch(\n `${config.baseUrl}/api/document/upload?workspace_ext_id=${workspaceId}`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'workspace-key': workspaceKeyHeader,\n },\n body: formData,\n }\n )\n\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n console.error(`Upload failed for ${fileName}: ${res.status} ${body}`)\n process.exit(1)\n }\n\n const result = (await res.json()) as UploadResponse\n console.log(`Uploaded: ${fileName} (${result.doc_ext_ids.join(', ')})`)\n if (result.duplicates && result.duplicates.length > 0) {\n console.log(` Duplicates: ${result.duplicates.join(', ')}`)\n }\n\n for (const id of result.doc_ext_ids) uploadedDocs.set(id, fileName)\n }\n\n // --watch: monitor processing via WebSocket\n if (opts.watch && uploadedDocs.size > 0) {\n const pending = new Set(uploadedDocs.keys())\n console.log(`\\nWatching ${pending.size} document(s)...`)\n\n const conn = await connectWebSocket({\n baseUrl: config.baseUrl,\n accessToken,\n onMessage: (msg) => {\n if (isMessageType<WsTaskUpdateMessage>(msg, 'task_update')) {\n if (!pending.has(msg.doc_ext_id)) return\n console.log(\n ` ${uploadedDocs.get(msg.doc_ext_id) || msg.file_name}: ${msg.status} (${msg.progress}%)`\n )\n if (msg.status === 'completed' || msg.status === 'failed') {\n pending.delete(msg.doc_ext_id)\n if (pending.size === 0) {\n console.log('\\nAll documents processed.')\n conn.close()\n }\n }\n }\n },\n onClose: () => {\n if (pending.size > 0)\n console.log(`\\nConnection closed. ${pending.size} document(s) still processing.`)\n },\n })\n }\n })()\n )\n}\n","/**\n * arbi download [doc-id] [--output <path>]\n *\n * Interactive doc picker if no doc-id given.\n */\n\nimport { Command } from 'commander'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { runAction, resolveWorkspace, requireData } from '../helpers.js'\nimport { promptSearch } from '../prompts.js'\n\nexport function registerDownloadCommand(program: Command): void {\n program\n .command('download [doc-id]')\n .description('Download a document (interactive picker if no ID given)')\n .option('-o, --output <path>', 'Output file path')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .action((docId: string | undefined, opts: { output?: string; workspace?: string }) =>\n runAction(async () => {\n const { arbi, config, accessToken, workspaceKeyHeader, workspaceId } =\n await resolveWorkspace(opts.workspace)\n\n // Pick doc if not given\n if (!docId) {\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/documents', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch documents'\n )\n if (data.length === 0) {\n console.log('No documents found.')\n return\n }\n const choices = data.map((d) => ({\n name: `${d.file_name ?? 'Unnamed'} (${d.status})`,\n value: d.external_id as string,\n description: d.external_id as string,\n }))\n docId = await promptSearch('Select document to download', choices)\n }\n\n const res = await fetch(`${config.baseUrl}/api/document/${docId}/download`, {\n headers: { Authorization: `Bearer ${accessToken}`, 'workspace-key': workspaceKeyHeader },\n })\n\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n console.error(`Download failed: ${res.status} ${body}`)\n process.exit(1)\n }\n\n let filename = `${docId}`\n const disposition = res.headers.get('content-disposition')\n if (disposition) {\n const match = disposition.match(/filename[*]?=(?:UTF-8''|\"?)([^\";]+)/i)\n if (match) filename = decodeURIComponent(match[1].replace(/\"/g, ''))\n }\n\n const outputPath = opts.output || path.join(process.cwd(), filename)\n const buffer = Buffer.from(await res.arrayBuffer())\n fs.writeFileSync(outputPath, buffer)\n console.log(\n `Downloaded: ${path.basename(outputPath)} (${(buffer.length / (1024 * 1024)).toFixed(1)} MB)`\n )\n })()\n )\n}\n","/**\n * arbi ask \"question\" [--workspace <id>] [--new]\n *\n * Streams SSE response from POST /api/assistant/query.\n * Always includes all workspace documents in retrieval context.\n * Maintains conversation continuity: each response's assistant message ID\n * is saved and sent as parent_message_ext_id in the next query.\n * Use --new to start a fresh conversation.\n */\n\nimport { Command } from 'commander'\nimport { runAction, resolveWorkspace, requireData } from '../helpers.js'\nimport { getChatSession, updateChatSession, clearChatSession } from '../config.js'\n\nfunction parseSSEEvents(\n chunk: string,\n buffer: string\n): { events: Array<{ event: string; data: string }>; remaining: string } {\n const combined = buffer + chunk\n const events: Array<{ event: string; data: string }> = []\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\nexport function registerAskCommand(program: Command): void {\n program\n .command('ask <question>')\n .description('Ask the RAG assistant a question')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .option('-c, --config <id>', 'Config ext_id to use (e.g. cfg-xxx)')\n .option('-n, --new', 'Start a new conversation (ignore previous context)')\n .option('-v, --verbose', 'Show agent steps and tool calls')\n .action(\n (\n question: string,\n opts: { workspace?: string; config?: string; new?: boolean; verbose?: boolean }\n ) =>\n runAction(async () => {\n const { arbi, config, accessToken, workspaceKeyHeader, workspaceId } =\n await resolveWorkspace(opts.workspace)\n\n // Load chat session\n const session = getChatSession()\n\n // --new flag clears conversation state\n if (opts.new) {\n clearChatSession()\n session.lastMessageExtId = null\n }\n\n // Always include all workspace documents in retrieval context\n const docs = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/documents', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch workspace documents'\n )\n const docIds = docs.map((d) => d.external_id as string)\n\n // Build request body\n const body: Record<string, unknown> = {\n content: question,\n workspace_ext_id: workspaceId,\n tools: {\n retrieval_chunk: {\n name: 'retrieval_chunk',\n description: 'retrieval chunk',\n tool_args: { doc_ext_ids: docIds },\n tool_responses: {},\n },\n 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\n // Include parent message for conversation continuity\n if (session.lastMessageExtId) {\n body.parent_message_ext_id = session.lastMessageExtId\n }\n\n // Include config if specified\n if (opts.config) {\n body.config_ext_id = opts.config\n }\n\n const res = await fetch(`${config.baseUrl}/api/assistant/query`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'workspace-key': workspaceKeyHeader,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n })\n\n if (!res.ok) {\n if (res.status === 503)\n console.error(\n 'The selected LLM is not responding. Please retry or select another model.'\n )\n else if (res.status === 401) console.error('Token has expired. Please run: arbi login')\n else console.error(`Query failed: ${res.status} ${await res.text().catch(() => '')}`)\n process.exit(1)\n }\n\n if (!res.body) {\n console.error('No response body')\n process.exit(1)\n }\n\n const reader = res.body.getReader()\n const decoder = new TextDecoder('utf-8')\n let sseBuffer = ''\n let assistantMessageExtId: string | null = null\n\n const processEvents = (events: Array<{ event: string; data: string }>) => {\n for (const { event, data } of events) {\n try {\n if (event === 'stream_start') {\n const parsed = JSON.parse(data)\n if (parsed.assistant_message_ext_id) {\n assistantMessageExtId = parsed.assistant_message_ext_id\n }\n } else if (event === 'agent_step') {\n if (opts.verbose) {\n const parsed = JSON.parse(data)\n const focus = parsed.focus || parsed.status || ''\n console.error(`\\n[agent] ${focus}`)\n }\n } else if (event === 'token') {\n const parsed = JSON.parse(data)\n if (parsed.content) process.stdout.write(parsed.content)\n } else if (event === 'error') {\n const parsed = JSON.parse(data)\n console.error(`\\nError: ${parsed.message || 'Unknown streaming error'}`)\n }\n } catch {\n /* skip */\n }\n }\n }\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n const { events, remaining } = parseSSEEvents(\n decoder.decode(value, { stream: true }),\n sseBuffer\n )\n sseBuffer = remaining\n processEvents(events)\n }\n\n if (sseBuffer.trim()) {\n const { events } = parseSSEEvents(sseBuffer + '\\n\\n', '')\n processEvents(events)\n }\n\n process.stdout.write('\\n')\n\n // Save assistant message ID for conversation continuity\n if (assistantMessageExtId) {\n updateChatSession({ lastMessageExtId: assistantMessageExtId })\n }\n })()\n )\n}\n","/**\n * arbi watch — stream workspace activity in real time\n */\n\nimport { Command } from 'commander'\nimport {\n isMessageType,\n type WsTaskUpdateMessage,\n type WsBatchCompleteMessage,\n type WsErrorMessage,\n} from '@arbidocs/sdk'\nimport { runAction, resolveWorkspace } from '../helpers.js'\nimport { connectWebSocket } from '../ws.js'\n\nfunction timestamp(): string {\n return new Date().toLocaleTimeString('en-GB', { hour12: false })\n}\n\nexport function registerWatchCommand(program: Command): void {\n program\n .command('watch')\n .description('Watch workspace activity in real time')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .action((opts: { workspace?: string }) =>\n runAction(async () => {\n const { config, accessToken, workspaceId } = await resolveWorkspace(opts.workspace)\n\n console.log(`Watching workspace ${workspaceId}... (Ctrl+C to stop)`)\n\n await connectWebSocket({\n baseUrl: config.baseUrl,\n accessToken,\n onMessage: (msg) => {\n if (isMessageType<WsTaskUpdateMessage>(msg, 'task_update')) {\n console.log(\n `[${timestamp()}] task_update: ${msg.file_name} - ${msg.status} (${msg.progress}%)`\n )\n } else if (isMessageType<WsBatchCompleteMessage>(msg, 'batch_complete')) {\n console.log(\n `[${timestamp()}] batch_complete: ${msg.batch_type} - ${msg.doc_ext_ids.length} docs`\n )\n } else if (isMessageType<WsErrorMessage>(msg, 'error')) {\n console.log(`[${timestamp()}] error: ${msg.message}`)\n } else {\n console.log(`[${timestamp()}] ${msg.type}: ${JSON.stringify(msg)}`)\n }\n },\n onClose: (code, reason) => {\n console.log(`\\nConnection closed (code ${code}${reason ? ': ' + reason : ''})`)\n },\n })\n })()\n )\n}\n","/**\n * arbi contacts — list contacts\n * arbi contacts add [emails] — add contacts (prompt if no emails)\n * arbi contacts remove [ids] — remove contacts (picker if no IDs)\n */\n\nimport { Command } from 'commander'\nimport { runAction, resolveAuth, requireData, requireOk, printTable } from '../helpers.js'\nimport { promptCheckbox, promptInput } from '../prompts.js'\n\nexport function registerContactsCommand(program: Command): void {\n const contacts = program.command('contacts').description('Manage contacts')\n\n contacts\n .command('list')\n .description('List all contacts')\n .action(\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.GET('/api/user/contacts'),\n 'Failed to fetch contacts'\n )\n\n if (data.length === 0) {\n console.log('No contacts found.')\n return\n }\n\n type User = { given_name?: string; family_name?: string }\n printTable(\n [\n { header: 'ID', width: 16, value: (r) => r.external_id as string },\n {\n header: 'NAME',\n width: 20,\n value: (r) => {\n const u = r.user as User | null\n return u ? [u.given_name, u.family_name].filter(Boolean).join(' ') : ''\n },\n },\n { header: 'EMAIL', width: 30, value: (r) => r.email as string },\n { header: 'STATUS', width: 18, value: (r) => r.status as string },\n ],\n data\n )\n })\n )\n\n contacts\n .command('add [emails...]')\n .description('Add contacts by email (prompt if no emails given)')\n .action((emails?: string[]) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n if (!emails || emails.length === 0) {\n const input = await promptInput('Email address(es), comma-separated')\n emails = input\n .split(',')\n .map((e) => e.trim())\n .filter(Boolean)\n if (emails.length === 0) return\n }\n const data = requireData(\n await arbi.fetch.POST('/api/user/contacts', { body: { emails } }),\n 'Failed to add contacts'\n )\n for (const c of data) {\n console.log(`Added: ${c.email} (${c.external_id}) — ${c.status}`)\n }\n })()\n )\n\n contacts\n .command('remove [ids...]')\n .description('Remove contacts (interactive picker if no IDs given)')\n .action((ids?: string[]) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n let contactIds = ids && ids.length > 0 ? ids : undefined\n if (!contactIds) {\n const data = requireData(\n await arbi.fetch.GET('/api/user/contacts'),\n 'Failed to fetch contacts'\n )\n if (data.length === 0) {\n console.log('No contacts found.')\n return\n }\n type User = { given_name?: string; family_name?: string }\n contactIds = await promptCheckbox(\n 'Select contacts to remove',\n data.map((c) => {\n const u = c.user as User | null\n const name = u ? [u.given_name, u.family_name].filter(Boolean).join(' ') : ''\n return {\n name: name ? `${name} (${c.email})` : (c.email as string),\n value: c.external_id as string,\n }\n })\n )\n if (contactIds.length === 0) return\n }\n requireOk(\n await arbi.fetch.DELETE('/api/user/contacts', { body: { contact_ids: contactIds } }),\n 'Failed to remove contacts'\n )\n console.log(`Removed ${contactIds.length} contact(s).`)\n })()\n )\n\n // Default action: list\n contacts.action(async () => {\n await contacts.commands.find((c) => c.name() === 'list')!.parseAsync([], { from: 'user' })\n })\n}\n","/**\n * arbi dm list — list DMs / notifications\n * arbi dm send [recipient] [content] — send a DM (picker + prompt if no args)\n * arbi dm read [ids...] — mark messages as read (picker if no IDs)\n * arbi dm delete [ids...] — delete messages (picker if no IDs)\n */\n\nimport { Command } from 'commander'\nimport { runAction, resolveAuth, requireData, requireOk, printTable } from '../helpers.js'\nimport { promptSelect, promptCheckbox, promptInput } from '../prompts.js'\n\nexport function registerDmCommand(program: Command): void {\n const dm = program.command('dm').description('Direct messages')\n\n dm.command('list')\n .description('List all DMs and notifications')\n .action(\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.GET('/api/notifications/'),\n 'Failed to fetch messages'\n )\n\n if (data.length === 0) {\n console.log('No messages found.')\n return\n }\n\n type Sender = { email?: string; given_name?: string; family_name?: string }\n printTable(\n [\n { header: 'ID', width: 16, value: (r) => r.external_id as string },\n { header: 'TYPE', width: 18, value: (r) => r.type as string },\n {\n header: 'FROM',\n width: 22,\n value: (r) => {\n const s = r.sender as Sender | null\n if (!s) return ''\n const name = [s.given_name, s.family_name].filter(Boolean).join(' ')\n return name || s.email || ''\n },\n },\n { header: 'READ', width: 6, value: (r) => (r.read ? 'yes' : 'no') },\n { header: 'CONTENT', width: 40, value: (r) => (r.content as string) ?? '' },\n ],\n data\n )\n })\n )\n\n dm.command('send [recipient] [content]')\n .description('Send a DM (interactive if no args; recipient can be email or user ext_id)')\n .action((recipient?: string, content?: string) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n\n // Pick recipient from contacts if not given\n if (!recipient) {\n const contacts = requireData(\n await arbi.fetch.GET('/api/user/contacts'),\n 'Failed to fetch contacts'\n )\n if (contacts.length === 0) {\n console.error('No contacts found. Add contacts first: arbi contacts add <email>')\n process.exit(1)\n }\n type User = { external_id?: string; given_name?: string; family_name?: string }\n recipient = await promptSelect(\n 'Send to',\n contacts.map((c) => {\n const u = c.user as User | null\n const name = u ? [u.given_name, u.family_name].filter(Boolean).join(' ') : ''\n return {\n name: name ? `${name} (${c.email})` : (c.email as string),\n value: u?.external_id ?? (c.external_id as string),\n description: c.email as string,\n }\n })\n )\n }\n\n // Prompt for content if not given\n if (!content) {\n content = await promptInput('Message')\n }\n\n // If recipient looks like an email, resolve to ext_id via contacts\n let recipientExtId = recipient\n if (recipient.includes('@')) {\n const contacts = requireData(\n await arbi.fetch.GET('/api/user/contacts'),\n 'Failed to fetch contacts'\n )\n type ContactUser = { external_id?: string }\n const match = contacts.find((c) => c.email === recipient)\n if (!match) {\n console.error(`No contact found with email: ${recipient}`)\n console.error('Add them first: arbi contacts add ' + recipient)\n process.exit(1)\n }\n recipientExtId = (match.user as ContactUser)?.external_id ?? (match.external_id as string)\n }\n\n const data = requireData(\n await arbi.fetch.POST('/api/notifications/', {\n body: { messages: [{ recipient_ext_id: recipientExtId, content }] },\n }),\n 'Failed to send message'\n )\n for (const n of data) {\n console.log(`Sent: ${n.external_id} → ${n.recipient.email}`)\n }\n })()\n )\n\n dm.command('read [ids...]')\n .description('Mark messages as read (interactive picker if no IDs given)')\n .action((ids?: string[]) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n let msgIds = ids && ids.length > 0 ? ids : undefined\n if (!msgIds) {\n const data = requireData(\n await arbi.fetch.GET('/api/notifications/'),\n 'Failed to fetch messages'\n )\n type Sender = { given_name?: string; family_name?: string; email?: string }\n const unread = data.filter((m) => !m.read)\n if (unread.length === 0) {\n console.log('No unread messages.')\n return\n }\n msgIds = await promptCheckbox(\n 'Select messages to mark as read',\n unread.map((m) => {\n const s = m.sender as Sender | null\n const from = s\n ? [s.given_name, s.family_name].filter(Boolean).join(' ') || s.email || ''\n : ''\n return {\n name: `${from}: ${((m.content as string) ?? '').slice(0, 50)}`,\n value: m.external_id as string,\n }\n })\n )\n if (msgIds.length === 0) return\n }\n const data = requireData(\n await arbi.fetch.PATCH('/api/notifications/', {\n body: { updates: msgIds.map((id) => ({ external_id: id, read: true })) },\n }),\n 'Failed to update messages'\n )\n console.log(`Marked ${data.length} message(s) as read.`)\n })()\n )\n\n dm.command('delete [ids...]')\n .description('Delete messages (interactive picker if no IDs given)')\n .action((ids?: string[]) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n let msgIds = ids && ids.length > 0 ? ids : undefined\n if (!msgIds) {\n const data = requireData(\n await arbi.fetch.GET('/api/notifications/'),\n 'Failed to fetch messages'\n )\n if (data.length === 0) {\n console.log('No messages found.')\n return\n }\n type Sender = { given_name?: string; family_name?: string; email?: string }\n msgIds = await promptCheckbox(\n 'Select messages to delete',\n data.map((m) => {\n const s = m.sender as Sender | null\n const from = s\n ? [s.given_name, s.family_name].filter(Boolean).join(' ') || s.email || ''\n : ''\n return {\n name: `${from}: ${((m.content as string) ?? '').slice(0, 50)}`,\n value: m.external_id as string,\n }\n })\n )\n if (msgIds.length === 0) return\n }\n requireOk(\n await arbi.fetch.DELETE('/api/notifications/', { body: { external_ids: msgIds } }),\n 'Failed to delete messages'\n )\n console.log(`Deleted ${msgIds.length} message(s).`)\n })()\n )\n\n // Default action: list\n dm.action(async () => {\n await dm.commands.find((c) => c.name() === 'list')!.parseAsync([], { from: 'user' })\n })\n}\n","/**\n * arbi tags — list tags in workspace\n * arbi tags create [name] — create a tag (form if no name)\n * arbi tags delete [id] — delete a tag (picker if no ID)\n * arbi tags update [id] [json] — update a tag (picker + form if no args)\n */\n\nimport { Command } from 'commander'\nimport { runAction, resolveWorkspace, requireData, printTable, parseJsonArg } from '../helpers.js'\nimport { promptSelect, promptInput, promptConfirm } from '../prompts.js'\n\n/** Fetch workspace tags and return as picker choices */\nasync function fetchTagChoices(\n arbi: Awaited<ReturnType<typeof resolveWorkspace>>['arbi'],\n workspaceId: string\n) {\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/tags', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch tags'\n )\n if (data.length === 0) {\n console.log('No tags found.')\n process.exit(0)\n }\n return {\n data,\n choices: data.map((t) => ({\n name: `${t.name} (${(t.tag_type as { type?: string })?.type ?? 'unknown'}, ${t.doctag_count} docs)`,\n value: t.external_id as string,\n description: t.external_id as string,\n })),\n }\n}\n\nexport function registerTagsCommand(program: Command): void {\n const tags = program.command('tags').description('Manage tags')\n\n tags\n .command('list')\n .description('List tags in the active workspace')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .action((opts: { workspace?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/tags', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch tags'\n )\n\n if (data.length === 0) {\n console.log('No tags found.')\n return\n }\n\n printTable(\n [\n { header: 'ID', width: 24, value: (r) => r.external_id as string },\n { header: 'NAME', width: 24, value: (r) => r.name as string },\n {\n header: 'TYPE',\n width: 12,\n value: (r) => (r.tag_type as { type?: string })?.type ?? '',\n },\n { header: 'DOCS', width: 6, value: (r) => String(r.doctag_count) },\n { header: 'SHARED', width: 8, value: (r) => (r.shared ? 'yes' : 'no') },\n ],\n data\n )\n })()\n )\n\n tags\n .command('create [name]')\n .description('Create a new tag (interactive form if no name given)')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .option(\n '-t, --type <type>',\n 'Tag type (checkbox, text, number, select, folder, search, date, assistant)',\n 'checkbox'\n )\n .option('-i, --instruction <text>', 'Tag instruction')\n .option('--shared', 'Make tag shared', false)\n .action(\n (\n name: string | undefined,\n opts: { workspace?: string; type?: string; instruction?: string; shared?: boolean }\n ) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n\n // Interactive form if name not given\n const interactive = !name\n if (!name) {\n name = await promptInput('Tag name')\n }\n const tagType =\n opts.type ||\n (await promptSelect('Tag type', [\n { name: 'Checkbox', value: 'checkbox' },\n { name: 'Text', value: 'text' },\n { name: 'Number', value: 'number' },\n { name: 'Select', value: 'select' },\n { name: 'Date', value: 'date' },\n { name: 'Folder', value: 'folder' },\n { name: 'Search', value: 'search' },\n { name: 'Assistant', value: 'assistant' },\n ]))\n const instruction = interactive\n ? (opts.instruction ?? ((await promptInput('Instruction (optional)', false)) || null))\n : (opts.instruction ?? null)\n const shared = interactive\n ? opts.shared || (await promptConfirm('Shared?', false))\n : (opts.shared ?? false)\n\n const data = requireData(\n await arbi.fetch.POST('/api/tag/', {\n body: {\n name,\n workspace_ext_id: workspaceId,\n tag_type: { type: tagType as 'checkbox', options: [] },\n instruction,\n shared,\n },\n }),\n 'Failed to create tag'\n )\n console.log(`Created: ${data.name} (${data.external_id})`)\n })()\n )\n\n tags\n .command('delete [id]')\n .description('Delete a tag (interactive picker if no ID given)')\n .action((id?: string) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!id) {\n const { choices } = await fetchTagChoices(arbi, workspaceId)\n id = await promptSelect('Select tag to delete', choices)\n }\n const data = requireData(\n await arbi.fetch.DELETE('/api/tag/{tag_ext_id}', {\n params: { path: { tag_ext_id: id } },\n }),\n 'Failed to delete tag'\n )\n console.log(data?.detail ?? `Deleted tag ${id}`)\n })()\n )\n\n tags\n .command('update [id] [json]')\n .description('Update a tag (interactive picker + form if no args)')\n .action((id?: string, json?: string) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!id) {\n const { choices } = await fetchTagChoices(arbi, workspaceId)\n id = await promptSelect('Select tag to update', choices)\n }\n\n let body: Record<string, unknown>\n if (json) {\n body = parseJsonArg(json, 'arbi tags update tag-123 \\'{\"name\": \"New Name\"}\\'')\n } else {\n const field = await promptSelect('Field to update', [\n { name: 'Name', value: 'name' },\n { name: 'Instruction', value: 'instruction' },\n { name: 'Shared', value: 'shared' },\n ])\n if (field === 'shared') {\n body = { shared: await promptConfirm('Shared?') }\n } else {\n body = { [field]: await promptInput(field.charAt(0).toUpperCase() + field.slice(1)) }\n }\n }\n\n const data = requireData(\n await arbi.fetch.PATCH('/api/tag/{tag_ext_id}', {\n params: { path: { tag_ext_id: id } },\n body: body as never,\n }),\n 'Failed to update tag'\n )\n console.log(`Updated: ${data.name} (${data.external_id})`)\n })()\n )\n\n // Default action: list\n tags.action(async (_opts: Record<string, unknown>, cmd: Command) => {\n await cmd.commands.find((c) => c.name() === 'list')!.parseAsync([], { from: 'user' })\n })\n}\n","/**\n * arbi doctags create [tag-id] [doc-ids...] — assign tag to docs (pickers if no args)\n * arbi doctags delete [tag-id] [doc-ids...] — remove tag from docs (pickers if no args)\n * arbi doctags generate — AI-generate doctags (pickers if no flags)\n */\n\nimport { Command } from 'commander'\nimport { runAction, resolveWorkspace, requireData, requireOk } from '../helpers.js'\nimport { promptSelect, promptCheckbox } from '../prompts.js'\n\n/** Fetch tags as picker choices */\nasync function pickTag(\n arbi: Awaited<ReturnType<typeof resolveWorkspace>>['arbi'],\n workspaceId: string,\n message = 'Select tag'\n) {\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/tags', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch tags'\n )\n if (data.length === 0) {\n console.log('No tags found.')\n process.exit(0)\n }\n return promptSelect(\n message,\n data.map((t) => ({\n name: `${t.name} (${(t.tag_type as { type?: string })?.type ?? ''})`,\n value: t.external_id as string,\n description: t.external_id as string,\n }))\n )\n}\n\n/** Fetch docs as checkbox choices */\nasync function pickDocs(\n arbi: Awaited<ReturnType<typeof resolveWorkspace>>['arbi'],\n workspaceId: string,\n message = 'Select documents'\n) {\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/documents', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch documents'\n )\n if (data.length === 0) {\n console.log('No documents found.')\n process.exit(0)\n }\n return promptCheckbox(\n message,\n data.map((d) => ({\n name: `${d.file_name ?? 'Unnamed'} (${d.status})`,\n value: d.external_id as string,\n }))\n )\n}\n\nexport function registerDoctagsCommand(program: Command): void {\n const doctags = program.command('doctags').description('Manage document tags (doctags)')\n\n doctags\n .command('create [tag-id] [doc-ids...]')\n .description('Assign a tag to documents (interactive pickers if no args)')\n .option('-n, --note <text>', 'Note for the doctag')\n .action((tagId?: string, docIds?: string[], opts?: { note?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!tagId) tagId = await pickTag(arbi, workspaceId, 'Select tag to assign')\n if (!docIds || docIds.length === 0)\n docIds = await pickDocs(arbi, workspaceId, 'Select documents to tag')\n if (docIds.length === 0) return\n const data = requireData(\n await arbi.fetch.POST('/api/document/doctag', {\n body: { tag_ext_id: tagId, doc_ext_ids: docIds, note: opts?.note ?? null },\n }),\n 'Failed to create doctags'\n )\n console.log(`Created ${data.length} doctag(s) for tag ${tagId}.`)\n })()\n )\n\n doctags\n .command('delete [tag-id] [doc-ids...]')\n .description('Remove a tag from documents (interactive pickers if no args)')\n .action((tagId?: string, docIds?: string[]) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!tagId) tagId = await pickTag(arbi, workspaceId, 'Select tag to remove')\n if (!docIds || docIds.length === 0)\n docIds = await pickDocs(arbi, workspaceId, 'Select documents to untag')\n if (docIds.length === 0) return\n requireOk(\n await arbi.fetch.DELETE('/api/document/doctag', {\n body: { tag_ext_id: tagId, doc_ext_ids: docIds },\n }),\n 'Failed to delete doctags'\n )\n console.log(`Removed tag ${tagId} from ${docIds.length} document(s).`)\n })()\n )\n\n doctags\n .command('generate')\n .description('AI-generate doctags (interactive pickers if no flags)')\n .option('--tags <ids>', 'Comma-separated tag IDs')\n .option('--docs <ids>', 'Comma-separated document IDs')\n .action((opts: { tags?: string; docs?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n\n let tagIds: string[]\n if (opts.tags) {\n tagIds = opts.tags.split(',').map((s) => s.trim())\n } else {\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/tags', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch tags'\n )\n if (data.length === 0) {\n console.log('No tags found.')\n return\n }\n tagIds = await promptCheckbox(\n 'Select tags to generate',\n data.map((t) => ({\n name: `${t.name} (${(t.tag_type as { type?: string })?.type ?? ''})`,\n value: t.external_id as string,\n }))\n )\n if (tagIds.length === 0) return\n }\n\n let docIds: string[]\n if (opts.docs) {\n docIds = opts.docs.split(',').map((s) => s.trim())\n } else {\n docIds = await pickDocs(arbi, workspaceId, 'Select documents for AI tagging')\n if (docIds.length === 0) return\n }\n\n const data = requireData(\n await arbi.fetch.POST('/api/document/doctag/generate', {\n body: { tag_ext_ids: tagIds, doc_ext_ids: docIds },\n }),\n 'Failed to generate doctags'\n )\n console.log(\n `Generating doctags for ${data.doc_ext_ids.length} doc(s) with ${data.tag_ext_ids.length} tag(s).`\n )\n })()\n )\n}\n","/**\n * arbi conversations list — list conversations\n * arbi conversations threads [id] — show threads (picker if no ID)\n * arbi conversations delete [id] — delete (picker if no ID)\n * arbi conversations share [id] — share (picker if no ID)\n * arbi conversations title [id] [title] — update title (picker + prompt)\n * arbi conversations add-user [id] [user-id] — add user (picker + prompt)\n * arbi conversations remove-user [id] [uid] — remove user (picker + prompt)\n * arbi conversations message <message-id> — get message details\n * arbi conversations delete-message <msg-id> — delete message\n */\n\nimport { Command } from 'commander'\nimport { runAction, resolveAuth, resolveWorkspace, requireData, printTable } from '../helpers.js'\nimport { promptSelect, promptInput } from '../prompts.js'\n\n/** Fetch workspace conversations and return as picker choices */\nasync function pickConversation(\n arbi: Awaited<ReturnType<typeof resolveWorkspace>>['arbi'],\n workspaceId: string,\n message = 'Select conversation'\n) {\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/conversations', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch conversations'\n )\n if (data.length === 0) {\n console.log('No conversations found.')\n process.exit(0)\n }\n return promptSelect(\n message,\n data.map((c) => ({\n name: `${(c.title as string) ?? 'Untitled'} (${c.message_count} msgs)`,\n value: c.external_id as string,\n description: c.external_id as string,\n }))\n )\n}\n\nexport function registerConversationsCommand(program: Command): void {\n const conv = program.command('conversations').description('Manage conversations')\n\n conv\n .command('list')\n .description('List conversations in the active workspace')\n .option('-w, --workspace <id>', 'Workspace ID (defaults to selected workspace)')\n .action((opts: { workspace?: string }) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace(opts.workspace)\n const data = requireData(\n await arbi.fetch.GET('/api/workspace/{workspace_ext_id}/conversations', {\n params: { path: { workspace_ext_id: workspaceId } },\n }),\n 'Failed to fetch conversations'\n )\n\n if (data.length === 0) {\n console.log('No conversations found.')\n return\n }\n\n printTable(\n [\n { header: 'ID', width: 24, value: (r) => r.external_id as string },\n { header: 'TITLE', width: 36, value: (r) => (r.title as string) ?? 'Untitled' },\n { header: 'MSGS', width: 6, value: (r) => String(r.message_count) },\n { header: 'SHARED', width: 8, value: (r) => (r.is_shared ? 'yes' : 'no') },\n ],\n data\n )\n })()\n )\n\n conv\n .command('threads [conversation-id]')\n .description('Show threads (interactive picker if no ID given)')\n .action((conversationId?: string) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!conversationId) conversationId = await pickConversation(arbi, workspaceId)\n const data = requireData(\n await arbi.fetch.GET('/api/conversation/{conversation_ext_id}/threads', {\n params: { path: { conversation_ext_id: conversationId } },\n }),\n 'Failed to fetch threads'\n )\n console.log(JSON.stringify(data, null, 2))\n })()\n )\n\n conv\n .command('delete [conversation-id]')\n .description('Delete a conversation (interactive picker if no ID given)')\n .action((conversationId?: string) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!conversationId)\n conversationId = await pickConversation(\n arbi,\n workspaceId,\n 'Select conversation to delete'\n )\n const data = requireData(\n await arbi.fetch.DELETE('/api/conversation/{conversation_ext_id}', {\n params: { path: { conversation_ext_id: conversationId } },\n }),\n 'Failed to delete conversation'\n )\n console.log(data?.detail ?? `Deleted conversation ${conversationId}`)\n })()\n )\n\n conv\n .command('share [conversation-id]')\n .description('Share a conversation (interactive picker if no ID given)')\n .action((conversationId?: string) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!conversationId)\n conversationId = await pickConversation(arbi, workspaceId, 'Select conversation to share')\n const data = requireData(\n await arbi.fetch.POST('/api/conversation/{conversation_ext_id}/share', {\n params: { path: { conversation_ext_id: conversationId } },\n }),\n 'Failed to share conversation'\n )\n console.log(data?.detail ?? `Shared conversation ${conversationId}`)\n })()\n )\n\n conv\n .command('title [conversation-id] [title]')\n .description('Update conversation title (interactive if no args)')\n .action((conversationId?: string, title?: string) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!conversationId) conversationId = await pickConversation(arbi, workspaceId)\n if (!title) title = await promptInput('New title')\n const data = requireData(\n await arbi.fetch.PATCH('/api/conversation/{conversation_ext_id}/title', {\n params: { path: { conversation_ext_id: conversationId } },\n body: { title },\n }),\n 'Failed to update title'\n )\n console.log(data?.detail ?? `Updated title to: ${title}`)\n })()\n )\n\n conv\n .command('add-user [conversation-id] [user-id]')\n .description('Add a user to a conversation (interactive if no args)')\n .action((conversationId?: string, userId?: string) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!conversationId) conversationId = await pickConversation(arbi, workspaceId)\n if (!userId) userId = await promptInput('User ext_id or email')\n const data = requireData(\n await arbi.fetch.POST('/api/conversation/{conversation_ext_id}/user', {\n params: { path: { conversation_ext_id: conversationId } },\n body: { user_ext_id: userId },\n }),\n 'Failed to add user to conversation'\n )\n console.log(data?.detail ?? `Added user ${userId} to conversation`)\n })()\n )\n\n conv\n .command('remove-user [conversation-id] [user-id]')\n .description('Remove a user from a conversation (interactive if no args)')\n .action((conversationId?: string, userId?: string) =>\n runAction(async () => {\n const { arbi, workspaceId } = await resolveWorkspace()\n if (!conversationId) conversationId = await pickConversation(arbi, workspaceId)\n if (!userId) userId = await promptInput('User ext_id')\n const data = requireData(\n await arbi.fetch.DELETE('/api/conversation/{conversation_ext_id}/user', {\n params: { path: { conversation_ext_id: conversationId } },\n body: { user_ext_id: userId },\n }),\n 'Failed to remove user from conversation'\n )\n console.log(data?.detail ?? `Removed user ${userId} from conversation`)\n })()\n )\n\n conv\n .command('message <message-id>')\n .description('Get message details')\n .action((messageId: string) =>\n runAction(async () => {\n const { arbi } = await resolveWorkspace()\n const data = requireData(\n await arbi.fetch.GET('/api/conversation/message/{message_ext_id}', {\n params: { path: { message_ext_id: messageId } },\n }),\n 'Failed to fetch message'\n )\n console.log(JSON.stringify(data, null, 2))\n })()\n )\n\n conv\n .command('delete-message <message-id>')\n .description('Delete a message and its descendants')\n .action((messageId: string) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.DELETE('/api/conversation/message/{message_ext_id}', {\n params: { path: { message_ext_id: messageId } },\n }),\n 'Failed to delete message'\n )\n console.log(data?.detail ?? `Deleted message ${messageId}`)\n })()\n )\n\n // Default action: list\n conv.action(async (_opts: Record<string, unknown>, cmd: Command) => {\n await cmd.commands.find((c) => c.name() === 'list')!.parseAsync([], { from: 'user' })\n })\n}\n","/**\n * arbi settings — show current user settings\n * arbi settings set — update a setting\n */\n\nimport { Command } from 'commander'\nimport { runAction, resolveAuth, requireData, requireOk, parseJsonArg } from '../helpers.js'\n\nexport function registerSettingsCommand(program: Command): void {\n const settings = program.command('settings').description('Manage user settings')\n\n settings\n .command('get')\n .description('Show current user settings')\n .action(\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.GET('/api/user/settings'),\n 'Failed to fetch settings'\n )\n console.log(JSON.stringify(data, null, 2))\n })\n )\n\n settings\n .command('set <json>')\n .description('Update user settings (pass JSON object)')\n .action((json: string) =>\n runAction(async () => {\n const body = parseJsonArg(json, 'arbi settings set \\'{\"hide_online_status\": true}\\'')\n const { arbi } = await resolveAuth()\n requireOk(\n await arbi.fetch.PATCH('/api/user/settings', { body: body as never }),\n 'Failed to update settings'\n )\n console.log('Settings updated.')\n })()\n )\n\n // Default action: get\n settings.action(async () => {\n await settings.commands.find((c) => c.name() === 'get')!.parseAsync([], { from: 'user' })\n })\n}\n","/**\n * arbi agentconfig list — list saved config versions\n * arbi agentconfig get [id] — show config (picker if no ID, 'default' for system)\n * arbi agentconfig save [json] — save new config (interactive if no JSON)\n * arbi agentconfig delete [id] — delete config (picker if no ID)\n * arbi agentconfig schema — dump JSON schema for all config models\n */\n\nimport { Command } from 'commander'\nimport { runAction, resolveAuth, requireData, printTable, parseJsonArg } from '../helpers.js'\nimport { promptSelect, promptInput, promptConfirm } from '../prompts.js'\n\n/** Config sections that have a MODEL_NAME field — the most common thing to change */\nconst MODEL_SECTIONS = [\n 'Agents',\n 'QueryLLM',\n 'EvaluatorLLM',\n 'TitleLLM',\n 'SummariseLLM',\n 'DoctagLLM',\n 'ArtifactLLM',\n] as const\n\n/** All config sections */\nconst ALL_SECTIONS = [\n ...MODEL_SECTIONS,\n 'ModelCitation',\n 'Retriever',\n 'Reranker',\n 'Chunker',\n 'Embedder',\n 'KeywordEmbedder',\n 'Parser',\n] as const\n\n/** Pick a config version from saved versions */\nasync function pickConfig(\n arbi: Awaited<ReturnType<typeof resolveAuth>>['arbi'],\n message = 'Select configuration'\n) {\n const data = requireData(\n await arbi.fetch.GET('/api/configs/versions'),\n 'Failed to fetch config versions'\n )\n if (data.versions.length === 0) {\n console.log('No saved configurations found.')\n process.exit(0)\n }\n return promptSelect(\n message,\n data.versions.map((v) => ({\n name: `${v.title || '(untitled)'} — ${new Date(v.created_at).toLocaleString()}`,\n value: v.external_id,\n description: v.external_id,\n }))\n )\n}\n\n/** Fetch available models for interactive picker */\nasync function fetchModels(arbi: Awaited<ReturnType<typeof resolveAuth>>['arbi']) {\n const data = requireData(await arbi.fetch.GET('/api/health/models'), 'Failed to fetch models')\n return data.models.map((m) => ({\n name: `${m.model_name} (${m.provider ?? m.api_type})`,\n value: m.model_name,\n description: m.api_type,\n }))\n}\n\n/** Interactive config builder — walks through most common settings */\nasync function buildConfigInteractively(\n arbi: Awaited<ReturnType<typeof resolveAuth>>['arbi']\n): Promise<Record<string, unknown>> {\n const body: Record<string, unknown> = {}\n\n // Title\n const title = await promptInput('Config title (optional)', false)\n if (title) body.title = title\n\n // Pick section to configure\n const section = await promptSelect('Section to configure', [\n { name: 'Agents — main agent model, persona, tools', value: 'Agents' },\n { name: 'QueryLLM — answer review model', value: 'QueryLLM' },\n { name: 'EvaluatorLLM — chunk evaluation', value: 'EvaluatorLLM' },\n { name: 'TitleLLM — title generation', value: 'TitleLLM' },\n { name: 'SummariseLLM — conversation summariser', value: 'SummariseLLM' },\n { name: 'DoctagLLM — AI document tagging', value: 'DoctagLLM' },\n { name: 'ArtifactLLM — skill/memory synthesis', value: 'ArtifactLLM' },\n { name: 'Retriever — search parameters', value: 'Retriever' },\n { name: 'Reranker — reranking model', value: 'Reranker' },\n { name: 'ModelCitation — citation thresholds', value: 'ModelCitation' },\n { name: 'Chunker — chunk size', value: 'Chunker' },\n { name: 'Embedder — embedding model', value: 'Embedder' },\n { name: 'KeywordEmbedder — BM25 parameters', value: 'KeywordEmbedder' },\n ])\n\n const sectionConfig: Record<string, unknown> = {}\n\n // Sections with MODEL_NAME get a model picker\n if ((MODEL_SECTIONS as readonly string[]).includes(section)) {\n const models = await fetchModels(arbi)\n if (models.length > 0) {\n const changeModel = await promptConfirm('Change model?', true)\n if (changeModel) {\n const modelKey = section === 'Agents' ? 'AGENT_MODEL_NAME' : 'MODEL_NAME'\n sectionConfig[modelKey] = await promptSelect('Model', models)\n\n if (section === 'Agents') {\n sectionConfig.AGENT_API_TYPE = 'remote'\n } else {\n sectionConfig.API_TYPE = 'remote'\n }\n }\n }\n }\n\n // Section-specific fields\n if (section === 'Agents') {\n const field = await promptSelect('What else to change?', [\n { name: 'Nothing else', value: 'done' },\n { name: 'Temperature', value: 'LLM_AGENT_TEMPERATURE' },\n { name: 'Max tokens', value: 'AGENT_MAX_TOKENS' },\n { name: 'Max iterations', value: 'AGENT_MAX_ITERATIONS' },\n { name: 'Persona', value: 'PERSONA' },\n { name: 'Web search enabled', value: 'WEB_SEARCH' },\n { name: 'Human in the loop', value: 'HUMAN_IN_THE_LOOP' },\n ])\n if (field !== 'done') {\n if (field === 'WEB_SEARCH' || field === 'HUMAN_IN_THE_LOOP') {\n sectionConfig[field] = await promptConfirm(field + '?')\n } else if (field === 'LLM_AGENT_TEMPERATURE') {\n sectionConfig[field] = parseFloat(await promptInput('Temperature (0.0 - 2.0)'))\n } else if (field === 'AGENT_MAX_TOKENS' || field === 'AGENT_MAX_ITERATIONS') {\n sectionConfig[field] = parseInt(await promptInput(field), 10)\n } else {\n sectionConfig[field] = await promptInput(field)\n }\n }\n } else if (section === 'Retriever') {\n const field = await promptSelect('Field to change', [\n { name: 'Search mode', value: 'SEARCH_MODE' },\n { name: 'Min similarity score', value: 'MIN_RETRIEVAL_SIM_SCORE' },\n { name: 'Max chunks to retrieve', value: 'MAX_TOTAL_CHUNKS_TO_RETRIEVE' },\n { name: 'Max distinct documents', value: 'MAX_DISTINCT_DOCUMENTS' },\n { name: 'Hybrid dense weight', value: 'HYBRID_DENSE_WEIGHT' },\n { name: 'Hybrid sparse weight', value: 'HYBRID_SPARSE_WEIGHT' },\n ])\n if (field === 'SEARCH_MODE') {\n sectionConfig[field] = await promptSelect('Search mode', [\n { name: 'Semantic (dense)', value: 'semantic' },\n { name: 'Keyword (sparse/BM25)', value: 'keyword' },\n { name: 'Hybrid (dense + sparse)', value: 'hybrid' },\n ])\n } else {\n sectionConfig[field] = parseFloat(await promptInput(field))\n }\n } else if (section === 'ModelCitation') {\n const field = await promptSelect('Field to change', [\n { name: 'Similarity threshold', value: 'SIM_THREASHOLD' },\n { name: 'Min char size', value: 'MIN_CHAR_SIZE_TO_ANSWER' },\n { name: 'Max citations', value: 'MAX_NUMB_CITATIONS' },\n ])\n sectionConfig[field] = parseFloat(await promptInput(field))\n } else if (section === 'Chunker') {\n sectionConfig.MAX_CHUNK_TOKENS = parseInt(await promptInput('Max chunk tokens'), 10)\n } else if (section === 'Reranker') {\n const field = await promptSelect('Field to change', [\n { name: 'Max chunks after rerank', value: 'MAX_NUMB_OF_CHUNKS' },\n { name: 'Model', value: 'MODEL_NAME' },\n ])\n if (field === 'MODEL_NAME') {\n const models = await fetchModels(arbi)\n sectionConfig.MODEL_NAME = await promptSelect('Model', models)\n sectionConfig.API_TYPE = 'remote'\n } else {\n sectionConfig[field] = parseInt(await promptInput(field), 10)\n }\n } else if (\n section === 'QueryLLM' ||\n section === 'EvaluatorLLM' ||\n section === 'TitleLLM' ||\n section === 'SummariseLLM' ||\n section === 'DoctagLLM' ||\n section === 'ArtifactLLM'\n ) {\n // LLM sections share temperature/max_tokens\n const field = await promptSelect('What else to change?', [\n { name: 'Nothing else', value: 'done' },\n { name: 'Temperature', value: 'TEMPERATURE' },\n { name: 'Max tokens', value: 'MAX_TOKENS' },\n ])\n if (field !== 'done') {\n sectionConfig[field] =\n field === 'TEMPERATURE'\n ? parseFloat(await promptInput('Temperature (0.0 - 2.0)'))\n : parseInt(await promptInput('Max tokens'), 10)\n }\n }\n\n if (Object.keys(sectionConfig).length > 0) {\n body[section] = sectionConfig\n }\n\n return body\n}\n\nexport function registerAgentconfigCommand(program: Command): void {\n const ac = program.command('agentconfig').description('Manage agent configurations')\n\n ac.command('list')\n .description('List saved configuration versions')\n .action(\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.GET('/api/configs/versions'),\n 'Failed to fetch config versions'\n )\n\n if (data.versions.length === 0) {\n console.log('No saved configurations.')\n return\n }\n\n printTable(\n [\n { header: 'ID', width: 24, value: (r) => r.external_id as string },\n { header: 'TITLE', width: 30, value: (r) => (r.title as string) ?? '(untitled)' },\n {\n header: 'CREATED',\n width: 22,\n value: (r) => new Date(r.created_at as string).toLocaleString(),\n },\n ],\n data.versions\n )\n })\n )\n\n ac.command('get [config-id]')\n .description('Show configuration details (picker if no ID; use \"default\" for system defaults)')\n .action((configId?: string) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n if (!configId) {\n configId = await promptSelect('Which configuration?', [\n { name: 'System defaults', value: 'default', description: 'Built-in defaults' },\n { name: 'Pick from saved versions...', value: '__pick__' },\n ])\n if (configId === '__pick__') {\n configId = await pickConfig(arbi)\n }\n }\n const data = requireData(\n await arbi.fetch.GET('/api/configs/{config_ext_id}', {\n params: { path: { config_ext_id: configId } },\n }),\n 'Failed to fetch configuration'\n )\n console.log(JSON.stringify(data, null, 2))\n })()\n )\n\n ac.command('save [json]')\n .description('Save a new configuration (interactive if no JSON given)')\n .option('-t, --title <title>', 'Config title')\n .option('--tag <tag-ext-id>', 'Associate with an assistant tag')\n .option('--message <msg-ext-id>', 'Associate with a parent message')\n .action((json?: string, opts?: { title?: string; tag?: string; message?: string }) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n\n let body: Record<string, unknown>\n if (json) {\n body = parseJsonArg(\n json,\n 'arbi agentconfig save \\'{\"Agents\": {\"AGENT_MODEL_NAME\": \"GPT4o@OpenAI\"}, \"title\": \"GPT-4o config\"}\\''\n )\n if (opts?.title) body.title = opts.title\n } else {\n body = await buildConfigInteractively(arbi)\n }\n\n if (opts?.tag) body.tag_ext_id = opts.tag\n if (opts?.message) body.parent_message_ext_id = opts.message\n\n const data = requireData(\n await arbi.fetch.POST('/api/configs/', { body: body as never }),\n 'Failed to save configuration'\n )\n console.log(`Saved: ${data.title || '(untitled)'} (${data.external_id})`)\n })()\n )\n\n ac.command('delete [config-id]')\n .description('Delete a configuration (picker if no ID)')\n .action((configId?: string) =>\n runAction(async () => {\n const { arbi } = await resolveAuth()\n if (!configId) configId = await pickConfig(arbi, 'Select configuration to delete')\n const data = requireData(\n await arbi.fetch.DELETE('/api/configs/{config_ext_id}', {\n params: { path: { config_ext_id: configId } },\n }),\n 'Failed to delete configuration'\n )\n console.log(data.detail)\n })()\n )\n\n ac.command('schema')\n .description('Show JSON schema for all configuration models')\n .action(\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.GET('/api/configs/schema'),\n 'Failed to fetch config schema'\n )\n console.log(JSON.stringify(data, null, 2))\n })\n )\n\n // Default action: list\n ac.action(async () => {\n await ac.commands.find((c) => c.name() === 'list')!.parseAsync([], { from: 'user' })\n })\n}\n","/**\n * arbi health — show server health\n * arbi models — list available models\n */\n\nimport { Command } from 'commander'\nimport { runAction, resolveAuth, requireData, printTable } from '../helpers.js'\n\nexport function registerHealthCommand(program: Command): void {\n program\n .command('health')\n .description('Show server health status')\n .action(\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.GET('/api/health/'),\n 'Failed to fetch health status'\n )\n\n console.log(`Status: ${data.status}`)\n if (data.backend_git_hash) console.log(`Backend: ${data.backend_git_hash}`)\n if (data.frontend_docker_version) console.log(`Frontend: ${data.frontend_docker_version}`)\n\n if (data.services.length > 0) {\n console.log('\\nServices:')\n for (const s of data.services) {\n console.log(` ${s.name}: ${s.status}${s.detail ? ` — ${s.detail}` : ''}`)\n }\n }\n\n if (data.models_health) {\n console.log(`\\nModels (${data.models_health.application}):`)\n for (const m of data.models_health.models) {\n console.log(` ${m.model}: ${m.status}${m.detail ? ` — ${m.detail}` : ''}`)\n }\n }\n })\n )\n\n program\n .command('models')\n .description('List available AI models')\n .action(\n runAction(async () => {\n const { arbi } = await resolveAuth()\n const data = requireData(\n await arbi.fetch.GET('/api/health/models'),\n 'Failed to fetch models'\n )\n\n if (data.models.length === 0) {\n console.log('No models available.')\n return\n }\n\n printTable(\n [\n { header: 'NAME', width: 30, value: (r) => r.model_name as string },\n { header: 'PROVIDER', width: 20, value: (r) => (r.provider as string) ?? '' },\n { header: 'API_TYPE', width: 16, value: (r) => r.api_type as string },\n ],\n data.models\n )\n })\n )\n}\n","/**\n * ARBI CLI — entry point\n *\n * Wires all commands into commander and runs.\n */\n\n// Suppress SDK middleware logging (console.debug/info go to stdout in Node.js, polluting piped output)\nconsole.debug = () => {}\nconst _origInfo = console.info\nconsole.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].startsWith('[API]')) return\n _origInfo(...args)\n}\n\nimport { Command } from 'commander'\nimport { registerConfigCommand } from './commands/config-cmd.js'\nimport { registerLoginCommand } from './commands/login.js'\nimport { registerRegisterCommand } from './commands/register.js'\nimport { registerLogoutCommand } from './commands/logout.js'\nimport { registerStatusCommand } from './commands/status.js'\nimport { registerWorkspacesCommand } from './commands/workspaces.js'\nimport { registerDocsCommand } from './commands/docs.js'\nimport { registerUploadCommand } from './commands/upload.js'\nimport { registerDownloadCommand } from './commands/download.js'\nimport { registerAskCommand } from './commands/ask.js'\nimport { registerWatchCommand } from './commands/watch.js'\nimport { registerContactsCommand } from './commands/contacts.js'\nimport { registerDmCommand } from './commands/dm.js'\nimport { registerTagsCommand } from './commands/tags.js'\nimport { registerDoctagsCommand } from './commands/doctags.js'\nimport { registerConversationsCommand } from './commands/conversations.js'\nimport { registerSettingsCommand } from './commands/settings.js'\nimport { registerAgentconfigCommand } from './commands/agentconfig.js'\nimport { registerHealthCommand } from './commands/health.js'\n\nconst program = new Command()\n\nprogram.name('arbi').description('ARBI CLI — interact with ARBI from the terminal').version('0.1.0')\n\nregisterConfigCommand(program)\nregisterLoginCommand(program)\nregisterRegisterCommand(program)\nregisterLogoutCommand(program)\nregisterStatusCommand(program)\nregisterWorkspacesCommand(program)\nregisterDocsCommand(program)\nregisterUploadCommand(program)\nregisterDownloadCommand(program)\nregisterAskCommand(program)\nregisterWatchCommand(program)\nregisterContactsCommand(program)\nregisterDmCommand(program)\nregisterTagsCommand(program)\nregisterDoctagsCommand(program)\nregisterConversationsCommand(program)\nregisterSettingsCommand(program)\nregisterAgentconfigCommand(program)\nregisterHealthCommand(program)\n\nprogram.parse()\n"]}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@arbidocs/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for interacting with ARBI — login, manage workspaces, upload documents, query the RAG assistant",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "bin": {
8
+ "arbi": "dist/index.cjs"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsup",
15
+ "test": "vitest run",
16
+ "typecheck": "tsc --noEmit"
17
+ },
18
+ "dependencies": {
19
+ "@arbidocs/sdk": "^0.1.0",
20
+ "@inquirer/prompts": "^8.2.0",
21
+ "commander": "^13.1.0",
22
+ "fake-indexeddb": "^6.2.5"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^24.9.2",
26
+ "tsup": "^8.4.0",
27
+ "typescript": "^5.9.3",
28
+ "vitest": "^4.0.18"
29
+ },
30
+ "license": "MIT",
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/arbitrationcity/ARBI-frontend.git",
37
+ "directory": "packages/arbi-cli"
38
+ },
39
+ "keywords": ["arbi", "cli", "rag", "document-management", "e2e-encryption"]
40
+ }