@tabbio-technologies/cli 1.2.8

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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/program.ts", "../../src/core/prompt.ts", "../../src/core/approvals.ts", "../../src/core/artifact-wait.ts", "../../src/commands/approvals.ts", "../../src/commands/artifacts.ts", "../../src/commands/artifacts-files.ts", "../../src/core/run-tool.ts", "../../src/commands/ask.ts", "../../src/commands/chat.ts", "../../src/commands/completion.ts", "../../src/commands/config.ts", "../../src/commands/doctor.ts", "../../src/commands/home.ts", "../../src/commands/generated.ts", "../../src/commands/login.ts", "../../src/commands/logout.ts", "../../src/commands/mcp-serve.ts", "../../src/commands/tools.ts", "../../src/commands/run.ts", "../../src/commands/workflows.ts", "../../src/ui/index.ts"],
4
+ "sourcesContent": ["import { Command, CommanderError } from 'commander';\nimport { registerApprovalsCommand } from './commands/approvals';\nimport { activeCommandSignal } from './core/cancellation';\nimport { registerArtifactsCommand } from './commands/artifacts';\nimport { registerAskCommand } from './commands/ask';\nimport { registerChatCommand } from './commands/chat';\nimport { registerCompletionCommand } from './commands/completion';\nimport { registerConfigCommands } from './commands/config';\nimport { registerDoctorCommand } from './commands/doctor';\nimport { registerHome } from './commands/home';\nimport { registerGeneratedCommands } from './commands/generated';\nimport { registerLoginCommand } from './commands/login';\nimport { registerLogoutCommand } from './commands/logout';\nimport { registerMcpCommands } from './commands/mcp-serve';\nimport { registerRunCommand } from './commands/run';\nimport { registerStatusCommand } from './commands/status';\nimport { registerToolsCommand } from './commands/tools';\nimport { registerWhoamiCommand } from './commands/whoami';\nimport { registerWorkflowsCommand } from './commands/workflows';\nimport type { CatalogTool } from './core/catalog';\nimport { resolveProfile } from './core/config';\nimport { type CommandContext, createCommandContext, readGlobalOptions } from './core/context';\nimport { loadCredentials, redactSecrets } from './core/credentials';\nimport { type CliError, EXIT_CODE_DOCS, ExitCode, isCliError, toCliError } from './core/errors';\nimport { printJson, writeOut } from './core/io';\nimport { McpSession, readCachedCatalog, selectMcpBearer } from './core/mcp';\nimport { debug, getGlobalOptions, isInteractive, setGlobalOptions } from './core/runtime';\nimport { CLI_PACKAGE_NAME, CLI_VERSION, checkForUpdate } from './core/version';\nimport { installInteractiveUi } from './ui/index';\nimport { configureTheme, theme } from './ui/theme';\n\nexport { registerGeneratedCommands };\nexport type GeneratedCommandsRegistrar = (program: Command, catalog: CatalogTool[]) => void;\n\nexport const PROGRAM_NAME = 'tabbio';\n\n/** Global flags that take a value (needed to pre-scan argv before parsing). */\nconst VALUE_FLAGS = new Set(['--profile', '--api-url', '--app-url']);\n\n/** Commands that should see generated commands from the cache (never the network). */\nconst CACHED_CATALOG_COMMANDS = new Set(['completion', 'help']);\n\n/** Commands where an update notice would be noise or would corrupt output. */\nconst NO_UPDATE_NOTICE = new Set(['mcp', 'completion']);\n\ntype HomeHandler = (ctx: CommandContext) => Promise<void>;\nlet homeHandler: HomeHandler | null = null;\n\n/**\n * WP-C hook: the interactive home screen for a bare `tabbio` on a TTY.\n * Without a handler (or off a TTY) a bare `tabbio` prints help.\n */\nexport function setHomeHandler(handler: HomeHandler | null): void {\n homeHandler = handler;\n}\n\nexport function createProgram(): Command {\n const program = new Command(PROGRAM_NAME)\n .description('Tabbio in your terminal: every Tabbio tool, chat, approvals and an MCP bridge.')\n .version(CLI_VERSION, '-v, --version', 'Print the CLI version')\n .option('--profile <name>', 'Use a named profile (env TABBIO_PROFILE)')\n .option('--api-url <url>', 'Override the API URL (env TABBIO_API_URL)')\n .option('--app-url <url>', 'Override the web app URL used for browser sign-in (env TABBIO_APP_URL)')\n .option('--json', 'Machine-readable JSON output')\n .option('--color', 'Force colors (also FORCE_COLOR / CLICOLOR_FORCE)')\n .option('--no-color', 'Disable colors (also NO_COLOR)')\n .option('--debug', 'Trace requests to stderr (secrets redacted)')\n .option('-y, --yes', 'Non-interactive: assume yes for confirmations')\n .option('-q, --quiet', 'Only print results')\n .showHelpAfterError('(add --help for usage)')\n .addHelpText(\n 'after',\n '\\nGet started:\\n $ tabbio login\\n $ tabbio status\\n $ tabbio tools\\n\\n' +\n 'Exit codes: tabbio help exit-codes\\nDocs: https://tabbio.com/developers',\n );\n\n program.hook('preAction', (_root, actionCommand) => {\n const globals = readGlobalOptions(actionCommand);\n configureTheme({ noColor: !globals.color });\n });\n return program;\n}\n\n/** Registers the account, config and MCP commands (WP-A). */\nexport function registerStaticCommands(program: Command): void {\n registerLoginCommand(program);\n registerLogoutCommand(program);\n registerStatusCommand(program);\n registerWhoamiCommand(program);\n registerDoctorCommand(program);\n registerConfigCommands(program);\n registerMcpCommands(program);\n registerCompletionCommand(program);\n registerToolsCommand(program);\n registerRunCommand(program);\n registerWorkflowsCommand(program);\n registerApprovalsCommand(program);\n registerArtifactsCommand(program);\n registerAskCommand(program);\n registerChatCommand(program);\n registerHome();\n}\n\n/** Applies exitOverride + output config to every command, however it was added. */\nfunction applySettings(command: Command): void {\n command.exitOverride();\n command.configureOutput({\n writeOut: (str) => process.stdout.write(str),\n writeErr: (str) => process.stderr.write(str),\n outputError: (str, write) => write(theme.error(redactSecrets(str))),\n });\n for (const sub of command.commands) applySettings(sub);\n}\n\nexport type ArgvScan = { firstCommand?: string; profile?: string; apiUrl?: string; appUrl?: string; help: boolean };\n\n/** Finds the first command token and value-flags before commander parses. */\nexport function scanArgv(args: readonly string[]): ArgvScan {\n const scan: ArgvScan = { help: false };\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i] as string;\n if (arg === '--') break;\n if (arg === '--help' || arg === '-h') {\n scan.help = true;\n continue;\n }\n const [flag, inline] = arg.startsWith('--') ? (arg.split('=', 2) as [string, string?]) : [arg];\n if (VALUE_FLAGS.has(flag)) {\n const value = inline ?? args[i + 1];\n if (inline === undefined) i += 1;\n if (flag === '--profile') scan.profile = value;\n if (flag === '--api-url') scan.apiUrl = value;\n if (flag === '--app-url') scan.appUrl = value;\n continue;\n }\n if (arg.startsWith('-')) continue;\n if (scan.firstCommand === undefined) scan.firstCommand = arg;\n }\n return scan;\n}\n\n/**\n * Registers catalog-generated commands when argv needs them. Static commands\n * never touch the network; `completion`/`help`/bare invocations use the cache\n * only; an unknown first token loads the catalog (cache first, then network).\n */\nasync function attachCatalog(program: Command, scan: ArgvScan): Promise<void> {\n const staticNames = new Set(program.commands.flatMap((c) => [c.name(), ...c.aliases()]));\n const first = scan.firstCommand;\n if (first && staticNames.has(first) && !CACHED_CATALOG_COMMANDS.has(first)) return;\n\n let profile;\n try {\n profile = resolveProfile({ profile: scan.profile, apiUrl: scan.apiUrl, appUrl: scan.appUrl });\n } catch {\n return; // commander will surface the bad flag during parse\n }\n const creds = loadCredentials(profile.name);\n if (!selectMcpBearer(creds)) return;\n\n const cached = readCachedCatalog(profile, creds);\n const cacheOnly = !first || CACHED_CATALOG_COMMANDS.has(first);\n if (cacheOnly || cached?.fresh) {\n if (cached) registerGeneratedCommands(program, cached.tools);\n return;\n }\n\n let session: McpSession | null = null;\n try {\n session = await McpSession.connect(profile, creds);\n registerGeneratedCommands(program, await session.listTools());\n } catch (error) {\n if (!cached) throw error;\n debug(`catalog refresh failed, using stale cache: ${(error as Error).message}`);\n registerGeneratedCommands(program, cached.tools);\n } finally {\n await session?.close();\n }\n}\n\nexport function formatErrorLines(error: CliError, opts: { debug?: boolean } = {}): string[] {\n const lines = [`${theme.error(`${theme.symbols.error} ${redactSecrets(error.message)}`)}`];\n if (error.hint) lines.push(` ${theme.dim(redactSecrets(error.hint))}`);\n if (error.requestId) lines.push(` ${theme.dim(`request id: ${error.requestId}`)}`);\n if (opts.debug) {\n const cause = error.cause instanceof Error ? error.cause : error;\n if (cause.stack) lines.push(theme.dim(redactSecrets(cause.stack)));\n }\n return lines;\n}\n\n/** Error boundary: prints the error and returns the process exit code. */\nexport function handleCliError(error: unknown): number {\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) return ExitCode.Ok;\n if (error.code === 'commander.unknownCommand' && !getGlobalOptions().json) {\n process.stderr.write(\n `${theme.dim(' Tool commands (e.g. `tabbio cv list`) load from your account: run `tabbio login`, then `tabbio tools`.')}\\n`,\n );\n }\n // commander already printed its message (or the help, for a missing subcommand).\n return ExitCode.Usage;\n }\n\n const globals = getGlobalOptions();\n const cliError = toCliError(error);\n if (globals.json) {\n process.stderr.write(`${JSON.stringify({ error: cliError.toJSON() })}\\n`);\n } else if (isCliError(error)) {\n for (const line of formatErrorLines(cliError, { debug: globals.debug })) process.stderr.write(`${line}\\n`);\n } else {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`${theme.error(`${theme.symbols.error} Unexpected error: ${redactSecrets(message)}`)}\\n`);\n if (globals.debug && error instanceof Error && error.stack) {\n process.stderr.write(`${theme.dim(redactSecrets(error.stack))}\\n`);\n } else {\n process.stderr.write(` ${theme.dim('Re-run with --debug for details.')}\\n`);\n }\n }\n return cliError.exitCode;\n}\n\n/** `tabbio help exit-codes` */\nfunction printExitCodes(json: boolean): void {\n if (json) {\n printJson(EXIT_CODE_DOCS);\n return;\n }\n writeOut(theme.bold('Exit codes'));\n for (const doc of EXIT_CODE_DOCS) {\n writeOut(` ${String(doc.code).padStart(3)} ${doc.name.padEnd(16)}${theme.dim(doc.meaning)}`);\n }\n}\n\nasync function maybeNotifyUpdate(scan: ArgvScan): Promise<void> {\n const globals = getGlobalOptions();\n if (globals.json || globals.quiet || NO_UPDATE_NOTICE.has(scan.firstCommand ?? '')) return;\n const latest = await checkForUpdate().catch(() => null);\n if (latest) {\n process.stderr.write(\n `\\n${theme.accent(`Update available ${CLI_VERSION} \u2192 ${latest}`)} ${theme.dim(`npm i -g ${CLI_PACKAGE_NAME}`)}\\n`,\n );\n }\n}\n\n/** Builds the program, runs it, and returns the exit code (never throws). */\nexport async function runCli(argv: readonly string[] = process.argv): Promise<number> {\n const args = argv.slice(2);\n const scan = scanArgv(args);\n // Early, best-effort flags so errors before preAction still honor them.\n setGlobalOptions({\n json: args.includes('--json'),\n debug: args.includes('--debug') || getGlobalOptions().debug,\n color: !args.includes('--no-color'),\n quiet: args.includes('--quiet') || args.includes('-q'),\n });\n configureTheme({ noColor: args.includes('--no-color') });\n\n const positionals = args.filter((a) => !a.startsWith('-'));\n if (positionals[0] === 'help' && positionals[1] === 'exit-codes') {\n printExitCodes(args.includes('--json'));\n return ExitCode.Ok;\n }\n\n const program = createProgram();\n try {\n installInteractiveUi();\n registerStaticCommands(program);\n await attachCatalog(program, scan);\n applySettings(program);\n\n const bare = scan.firstCommand === undefined && !scan.help && !args.some((a) => a === '-v' || a === '--version');\n const unknownFlags = bare ? program.parseOptions(args).unknown : [];\n if (bare && unknownFlags.length === 0) {\n const ctx = createCommandContext(program);\n if (homeHandler && isInteractive() && !ctx.globals.json) {\n try {\n await homeHandler(ctx);\n } finally {\n await ctx.close();\n }\n } else {\n program.outputHelp();\n }\n return ExitCode.Ok;\n }\n\n await program.parseAsync(argv as string[]);\n if (activeCommandSignal.aborted) return ExitCode.Interrupted;\n const code = typeof process.exitCode === 'number' ? process.exitCode : ExitCode.Ok;\n if (code === ExitCode.Ok) await maybeNotifyUpdate(scan);\n return code;\n } catch (error) {\n if (activeCommandSignal.aborted) return ExitCode.Interrupted;\n return handleCliError(error);\n }\n}\n", "import { createInterface } from 'node:readline';\nimport { type CliError, interruptedError, usageError } from './errors';\n\n/**\n * Tiny prompt helpers for the non-Ink commands (login, logout). Prompts are\n * written to stderr so stdout stays clean for `--json`.\n */\n\nfunction cancelled(): CliError {\n return interruptedError();\n}\n\n/** Reads one line. Works for TTY and piped stdin (e.g. `echo 123456 | tabbio login --email \u2026`). */\nexport function promptLine(question: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const rl = createInterface({ input: process.stdin, output: process.stderr, terminal: Boolean(process.stdin.isTTY) });\n let answered = false;\n rl.once('SIGINT', () => {\n rl.close();\n reject(cancelled());\n });\n rl.once('close', () => {\n if (!answered) reject(usageError('No input received'));\n });\n rl.question(question, (answer) => {\n answered = true;\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * Reads a secret with masked echo (`\u2022` per character) on a TTY. Falls back to\n * a plain line read when stdin is not a terminal.\n */\nexport function promptSecret(question: string): Promise<string> {\n const stdin = process.stdin;\n if (!stdin.isTTY || typeof stdin.setRawMode !== 'function') return promptLine(question);\n\n return new Promise((resolve, reject) => {\n let value = '';\n process.stderr.write(question);\n const wasRaw = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const finish = (error?: CliError) => {\n stdin.off('data', onData);\n stdin.setRawMode(wasRaw);\n stdin.pause();\n process.stderr.write('\\n');\n if (error) reject(error);\n else resolve(value.trim());\n };\n\n const onData = (chunk: string) => {\n for (const char of chunk) {\n if (char === '\\u0003') return finish(cancelled()); // Ctrl-C\n if (char === '\\u0004' && value === '') return finish(cancelled()); // Ctrl-D\n if (char === '\\r' || char === '\\n') return finish();\n if (char === '\\u007f' || char === '\\b') {\n if (value.length > 0) {\n value = value.slice(0, -1);\n process.stderr.write('\\b \\b');\n }\n continue;\n }\n if (char < ' ') continue;\n value += char;\n process.stderr.write('\u2022');\n }\n };\n stdin.on('data', onData);\n });\n}\n\n/**\n * Yes/no confirmation. `assumeYes` (from `--yes`) short-circuits to true; a\n * non-interactive session without `--yes` fails with exit code 2.\n */\nexport async function confirm(\n question: string,\n opts: { defaultYes?: boolean; assumeYes?: boolean } = {},\n): Promise<boolean> {\n if (opts.assumeYes) return true;\n if (!process.stdin.isTTY) {\n throw usageError(`${question} (needs confirmation)`, 'Re-run with --yes to confirm non-interactively.');\n }\n const suffix = opts.defaultYes ? ' [Y/n] ' : ' [y/N] ';\n const answer = (await promptLine(`${question}${suffix}`)).toLowerCase();\n if (!answer) return Boolean(opts.defaultYes);\n return answer === 'y' || answer === 'yes';\n}\n", "/**\n * Approval-gated tool calls (plan \u00A76 \"Approval flow\", research \u00A74.5, \u00A75.8).\n *\n * A gated tool answers `{ approvalRequired: true, approvalId, \u2026 }` instead of\n * running. Decision order in handleApproval():\n *\n * 1. `--yes` + app session (JWT) \u2192 confirm now\n * 2. JSON output \u2192 never prompt; leave pending\n * 3. Ink UI registered (TTY) \u2192 hooks.approvalPrompt (y/n/l)\n * 4. TTY + JWT \u2192 readline \"Approve \u2026 now? [y/N]\" (N leaves it pending)\n * 5. otherwise (no JWT, piped) \u2192 leave pending\n *\n * Confirming calls `POST /api/agent/approvals/:id/confirm`, which executes the\n * tool server-side and returns its output in `data.mcp.result`. Leaving it\n * pending sets exit code 6 (not thrown) unless `--wait`, which polls\n * `mcp.approvalStatus` (3 s, backing off to 10 s) until resolved or timeout.\n * The status poll carries no tool output; approving elsewhere shows it there.\n */\nimport { type ApprovalDecision, canUseInteractiveUi, getInteractiveHooks } from '../ui/hooks';\nimport { theme } from '../ui/theme';\nimport type { CatalogTool } from './catalog';\nimport type { CommandContext } from './context';\nimport { CliError, ExitCode, usageError } from './errors';\nimport type { ApiClient } from './http';\nimport type { ApprovalInfo, McpSession } from './mcp';\nimport type { OutputMode } from './output';\nimport { formatDuration } from './output';\nimport { confirm } from './prompt';\n\nexport const DEFAULT_WAIT_TIMEOUT_MS = 10 * 60_000;\nexport const POLL_START_MS = 3_000;\nexport const POLL_MAX_MS = 10_000;\n/** The approved tool runs inside the confirm request; workflows can be slow. */\nconst CONFIRM_TIMEOUT_MS = 10 * 60_000;\n\nexport type ApprovalSession = Pick<McpSession, 'callTool'>;\n\n/** `mcp.approvalStatus` result. */\nexport type ApprovalStatusRecord = {\n id: string;\n toolName: string;\n status: string;\n reason?: string | null;\n resolvedAt?: string | null;\n createdAt?: string;\n updatedAt?: string;\n};\n\nexport type ApprovalOutcome = {\n approval: ApprovalInfo;\n /** Final server status: approved | rejected | pending | expired | \u2026 */\n status: string;\n /** True when this process confirmed it and holds the tool output in `result`. */\n executed: boolean;\n result?: unknown;\n requestId?: string;\n record?: ApprovalStatusRecord;\n timedOut?: boolean;\n};\n\nexport type HandleApprovalOptions = {\n wait?: boolean;\n timeoutMs?: number;\n /** Resolved output mode (JSON never prompts). */\n mode?: OutputMode;\n /** Injected in tests. */\n sleep?: (ms: number) => Promise<void>;\n /** The caller finds and prints the output itself after an approval decided elsewhere. */\n followsOutput?: boolean;\n};\n\nconst defaultSleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\n/** `90s`, `10m`, `1h`, `1500ms`, or bare seconds. */\nexport function parseDuration(value: string | undefined, fallbackMs = DEFAULT_WAIT_TIMEOUT_MS): number {\n if (value === undefined || value === '') return fallbackMs;\n const match = /^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h)?$/i.exec(value.trim());\n if (!match) throw usageError(`Invalid duration \"${value}\"`, 'Use e.g. 30s, 10m or 1h.');\n const amount = Number(match[1]);\n const unit = (match[2] ?? 's').toLowerCase();\n const factor = unit === 'ms' ? 1 : unit === 's' ? 1000 : unit === 'm' ? 60_000 : 3_600_000;\n return Math.round(amount * factor);\n}\n\nexport function hasJwtSession(ctx: Pick<CommandContext, 'api'>): boolean {\n return Boolean(ctx.api.credentials?.accessToken);\n}\n\nfunction label(tool: Pick<CatalogTool, 'id' | 'commandPath'> | null, approval: ApprovalInfo): string {\n return tool?.commandPath?.length ? tool.commandPath.join(' ') : approval.toolName || tool?.id || 'this action';\n}\n\ntype ConfirmData = {\n approval?: Record<string, unknown> | null;\n assistant?: { text?: string | null } | null;\n mcp?: { result?: unknown } | null;\n};\n\n/** POST confirm; returns the executed tool's output (`data.mcp.result`). */\nexport async function confirmApproval(\n api: ApiClient,\n approvalId: string,\n reason?: string,\n): Promise<{ result: unknown; data: ConfirmData; requestId?: string }> {\n const response = await api.request<ConfirmData>(`/api/agent/approvals/${encodeURIComponent(approvalId)}/confirm`, {\n method: 'POST',\n body: reason ? { reason } : {},\n timeoutMs: CONFIRM_TIMEOUT_MS,\n });\n const data = response.data ?? {};\n const result = data.mcp ? data.mcp.result : (data.assistant?.text ?? null);\n return { result: result === undefined ? null : result, data, requestId: response.requestId };\n}\n\nexport async function rejectApproval(\n api: ApiClient,\n approvalId: string,\n reason?: string,\n): Promise<{ data: ConfirmData; requestId?: string }> {\n const response = await api.request<ConfirmData>(`/api/agent/approvals/${encodeURIComponent(approvalId)}/reject`, {\n method: 'POST',\n body: reason ? { reason } : {},\n });\n return { data: response.data ?? {}, requestId: response.requestId };\n}\n\n/** One `mcp.approvalStatus` call (works with any MCP credential). */\nexport async function fetchApprovalStatus(session: ApprovalSession, approvalId: string): Promise<ApprovalStatusRecord> {\n const response = await session.callTool('mcp.approvalStatus', { approvalId });\n if (!response.ok) throw response.error;\n const record = response.result as Partial<ApprovalStatusRecord> | null;\n if (!record || typeof record.status !== 'string') {\n throw new CliError({ code: 'BAD_RESPONSE', message: 'Unexpected approval status response', exitCode: ExitCode.Server });\n }\n return { id: approvalId, toolName: '', ...record } as ApprovalStatusRecord;\n}\n\n/**\n * Polls until the approval leaves `pending` or the timeout passes. Network\n * blips are retried; anything else is thrown.\n */\nexport async function pollApprovalStatus(\n session: ApprovalSession,\n approvalId: string,\n opts: { timeoutMs?: number; sleep?: (ms: number) => Promise<void>; now?: () => number } = {},\n): Promise<{ record: ApprovalStatusRecord | null; timedOut: boolean }> {\n const sleep = opts.sleep ?? defaultSleep;\n const now = opts.now ?? Date.now;\n const deadline = now() + (opts.timeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS);\n let interval = POLL_START_MS;\n let last: ApprovalStatusRecord | null = null;\n for (;;) {\n try {\n last = await fetchApprovalStatus(session, approvalId);\n if (last.status !== 'pending') return { record: last, timedOut: false };\n } catch (error) {\n if (!(error instanceof CliError) || error.exitCode !== ExitCode.Network) throw error;\n }\n const remaining = deadline - now();\n if (remaining <= 0) return { record: last, timedOut: true };\n await sleep(Math.min(interval, remaining));\n interval = Math.min(POLL_MAX_MS, Math.round(interval * 1.5));\n }\n}\n\nfunction notice(mode: OutputMode | undefined, line: string): void {\n if (mode === 'json') return;\n process.stderr.write(`${line}\\n`);\n}\n\n/** Exit code for a final approval status seen by `--wait` / `approvals wait`. */\nexport function exitCodeForApprovalStatus(status: string, timedOut = false): number {\n if (timedOut || status === 'pending') return ExitCode.ApprovalPending;\n return status === 'approved' ? ExitCode.Ok : ExitCode.Error;\n}\n\n/** Human summary of a status seen by polling (stderr). */\nexport function describeWaitResult(\n toolLabel: string,\n record: ApprovalStatusRecord | null,\n timedOut: boolean,\n timeoutMs: number,\n): string[] {\n const status = record?.status ?? 'pending';\n if (timedOut || status === 'pending') {\n return [`${theme.warn(theme.symbols.warning)} Still pending after ${formatDuration(timeoutMs)}`];\n }\n if (status === 'approved') {\n return [\n `${theme.success(theme.symbols.success)} Approved ${toolLabel}`,\n ` ${theme.dim('Tabbio ran it when it was approved; the output is shown where it was approved, not here.')}`,\n ];\n }\n const reason = record?.reason ? `: ${record.reason}` : '';\n return [`${theme.error(theme.symbols.error)} ${status === 'rejected' ? 'Rejected' : `Approval ${status}`} ${toolLabel}${reason}`];\n}\n\nasync function decide(\n ctx: CommandContext,\n tool: CatalogTool | null,\n approval: ApprovalInfo,\n args: Record<string, unknown>,\n mode: OutputMode | undefined,\n): Promise<ApprovalDecision> {\n const jwt = hasJwtSession(ctx);\n if (ctx.globals.yes && jwt) return 'approve';\n if (mode === 'json' || ctx.globals.json || !jwt) return 'leave';\n const hooks = getInteractiveHooks();\n if (hooks && canUseInteractiveUi(ctx) && mode !== 'tsv') {\n return hooks.approvalPrompt(ctx, { ...approval, args });\n }\n if (process.stdin.isTTY && process.stderr.isTTY) {\n notice(mode, `${theme.warn(theme.symbols.warning)} ${approval.message}`);\n return (await confirm(`Approve ${label(tool, approval)} now?`)) ? 'approve' : 'leave';\n }\n return 'leave';\n}\n\n/**\n * Resolves an approval-gated call. Returns the outcome; prints human notices\n * on stderr and sets `process.exitCode` (never throws for \"pending\").\n */\nexport async function handleApproval(\n ctx: CommandContext,\n session: ApprovalSession,\n tool: CatalogTool | null,\n approval: ApprovalInfo,\n args: Record<string, unknown>,\n opts: HandleApprovalOptions = {},\n): Promise<ApprovalOutcome> {\n const mode = opts.mode;\n const name = label(tool, approval);\n const id = approval.approvalId;\n const decision = await decide(ctx, tool, approval, args, mode);\n\n if (decision === 'approve') {\n const confirmed = await confirmApproval(ctx.api, id);\n notice(mode, `${theme.success(theme.symbols.success)} Approved ${name}`);\n return { approval, status: 'approved', executed: true, result: confirmed.result, requestId: confirmed.requestId };\n }\n\n if (decision === 'reject') {\n await rejectApproval(ctx.api, id);\n notice(mode, `${theme.error(theme.symbols.error)} Rejected ${name} ${theme.dim(id)}`);\n process.exitCode = ExitCode.Error;\n return { approval, status: 'rejected', executed: false };\n }\n\n // Leave pending.\n const jwt = hasJwtSession(ctx);\n if (!opts.wait) {\n notice(mode, `${theme.warn(theme.symbols.warning)} Approval needed: ${name} ${theme.dim(id)}`);\n notice(mode, ` ${approval.message}`);\n if (ctx.globals.yes && !jwt) {\n notice(mode, ` ${theme.dim('--yes can only approve with a full sign-in (`tabbio login`); this profile uses a personal MCP token.')}`);\n }\n notice(\n mode,\n ` ${theme.dim(`\u2192 Approve it in the Tabbio app${jwt ? ` or with \\`tabbio approvals approve ${id}\\`` : ''}, then \\`tabbio approvals wait ${id}\\`.`)}`,\n );\n process.exitCode = ExitCode.ApprovalPending;\n return { approval, status: 'pending', executed: false };\n }\n\n const timeoutMs = opts.timeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS;\n notice(\n mode,\n `${theme.warn(theme.symbols.warning)} Waiting for approval of ${name} ${theme.dim(`${id} \u00B7 up to ${formatDuration(timeoutMs)} \u00B7 approve it in the Tabbio app`)}`,\n );\n const { record, timedOut } = await pollApprovalStatus(session, id, { timeoutMs, sleep: opts.sleep });\n const status = timedOut ? 'pending' : (record?.status ?? 'pending');\n const lines = describeWaitResult(name, record, timedOut, timeoutMs);\n for (const line of opts.followsOutput && status === 'approved' ? lines.slice(0, 1) : lines) notice(mode, line);\n const code = exitCodeForApprovalStatus(status, timedOut);\n if (code !== ExitCode.Ok) process.exitCode = code;\n return { approval, status, executed: false, ...(record ? { record } : {}), timedOut };\n}\n\n/** `meta.approval` for JSON output. */\nexport function approvalMeta(outcome: ApprovalOutcome): Record<string, unknown> {\n return {\n approvalId: outcome.approval.approvalId,\n toolName: outcome.approval.toolName,\n status: outcome.status,\n message: outcome.approval.message,\n executed: outcome.executed,\n ...(outcome.timedOut ? { timedOut: true } : {}),\n ...(outcome.record?.reason ? { reason: outcome.record.reason } : {}),\n };\n}\n", "/**\n * `--wait` for artifact-producing tools (`artifact.createDocument`,\n * `createPage`, `generateImage`, `editImage`, `updateDocument`,\n * `updatePage`): their result names an artifact that is usually still\n * rendering (`status: 'pending'`, PDF, deck or image to come). With an app\n * session the CLI polls `GET /api/artifacts/:id`; with a personal MCP token\n * it polls the `artifact.get` tool, which answers the same card.\n */\nimport { theme } from '../ui/theme';\nimport { ARTIFACT_PRODUCING_TOOL_IDS, type ArtifactStatus, artifactFromResult } from './chat-artifacts';\nimport { type ArtifactState, getArtifact, listArtifacts, waitForArtifact } from './artifacts';\nimport type { CommandContext } from './context';\nimport { formatDuration } from './output';\nimport type { McpSession } from './mcp';\n\nexport type ArtifactWaitOutcome = {\n artifactId: string;\n status: ArtifactStatus;\n timedOut: boolean;\n /** The card as last polled (REST summary or the `artifact.get` result). */\n latest: Record<string, unknown> | null;\n};\n\nexport function isArtifactProducingTool(toolId: string): boolean {\n return ARTIFACT_PRODUCING_TOOL_IDS.has(toolId);\n}\n\n/** One status read, REST with a session, MCP `artifact.get` otherwise. */\nexport function artifactStatusReader(ctx: CommandContext, session: Pick<McpSession, 'callTool'> | null, artifactId: string) {\n return async (): Promise<{ status: ArtifactState } & Record<string, unknown>> => {\n if (ctx.api.credentials?.accessToken || !session) {\n const detail = await getArtifact(ctx.api, artifactId);\n const { document: _document, sources: _sources, ...summary } = detail;\n return summary as unknown as { status: ArtifactState } & Record<string, unknown>;\n }\n const response = await session.callTool('artifact.get', { artifactId });\n if (!response.ok) throw response.error;\n const card = artifactFromResult(response.result);\n return { ...(response.result as Record<string, unknown>), status: (card?.status ?? 'pending') as ArtifactState };\n };\n}\n\nfunction notice(ctx: CommandContext, json: boolean, line: string): void {\n if (json || ctx.globals.quiet) return;\n process.stderr.write(`${line}\\n`);\n}\n\n/** Polls the artifact in a tool result until it is ready or failed. No-op for results without one. */\nexport async function waitForToolArtifact(\n ctx: CommandContext,\n session: Pick<McpSession, 'callTool'> | null,\n result: unknown,\n opts: { timeoutMs: number; json: boolean; sleep?: (ms: number) => Promise<void> },\n): Promise<ArtifactWaitOutcome | null> {\n const card = artifactFromResult(result);\n if (!card) return null;\n if (card.status !== 'pending') return { artifactId: card.id, status: card.status, timedOut: false, latest: null };\n notice(ctx, opts.json, theme.dim(`${theme.symbols.pending} Waiting for ${card.kind} ${card.id} to finish rendering (up to ${formatDuration(opts.timeoutMs)})`));\n const { artifact, timedOut } = await waitForArtifact(artifactStatusReader(ctx, session, card.id), {\n timeoutMs: opts.timeoutMs,\n sleep: opts.sleep,\n });\n return { artifactId: card.id, status: (artifact?.status ?? 'pending') as ArtifactStatus, timedOut, latest: artifact };\n}\n\n/**\n * The tool result with what the wait learned: the final `status`, fresh\n * `variants`, `image` and `previewAvailable`, and `failure` when it failed.\n * The pending result's `message` (instructions for the chat model) is\n * dropped, it no longer describes the file.\n */\nexport function mergeWaitedArtifact(result: unknown, outcome: ArtifactWaitOutcome): Record<string, unknown> {\n const { message: _message, ...base } = (result ?? {}) as Record<string, unknown>;\n const latest = outcome.latest ?? {};\n const variants = (latest.variants ?? base.variants) as Record<string, boolean> | undefined;\n const kind = String(latest.kind ?? base.kind ?? '');\n const previewAvailable =\n kind === 'image'\n ? outcome.status === 'ready' && Boolean(variants?.image || variants?.thumbnail)\n : outcome.status !== 'failed' && Boolean(variants?.html);\n const error = latest.error ?? latest.failure;\n return {\n ...base,\n ...(typeof latest.kind === 'string' ? { kind: latest.kind } : {}),\n ...(typeof latest.title === 'string' ? { title: latest.title } : {}),\n status: outcome.status,\n ...(variants ? { variants } : {}),\n previewAvailable,\n ...(latest.image !== undefined ? { image: latest.image } : {}),\n ...(outcome.status === 'failed' && error ? { failure: error } : {}),\n };\n}\n\n/** stderr hints after an artifact result: open, download, or wait. */\nexport function artifactHints(ctx: CommandContext, json: boolean, artifactId: string, status: ArtifactStatus, timedOut = false): void {\n if (status === 'failed') return;\n if (status === 'pending' || timedOut) {\n notice(ctx, json, theme.dim(`${theme.symbols.arrowRight} Still rendering: tabbio artifacts wait ${artifactId}`));\n return;\n }\n notice(\n ctx,\n json,\n theme.dim(`${theme.symbols.arrowRight} tabbio artifacts open ${artifactId} ${theme.symbols.middot} tabbio artifacts download ${artifactId}`),\n );\n}\n\n/**\n * After an approval was decided elsewhere, `mcp.approvalStatus` carries no\n * tool output, so the new artifact is found by what the call asked for: the\n * newest artifact with the requested title created after the approval.\n */\nexport async function findArtifactForApproval(\n ctx: CommandContext,\n input: Record<string, unknown>,\n approvalCreatedAt: string | undefined,\n): Promise<string | null> {\n // Edits name the artifact they change.\n if (typeof input.artifactId === 'string' && input.artifactId) return input.artifactId;\n const title = typeof input.title === 'string' ? input.title.trim() : '';\n if (!title || !ctx.api.credentials?.accessToken) return null;\n const since = approvalCreatedAt ? Date.parse(approvalCreatedAt) : Number.NaN;\n const { artifacts } = await listArtifacts(ctx.api, { limit: 10 });\n const match = artifacts.find((a) => a.title === title && (!Number.isFinite(since) || Date.parse(a.createdAt) >= since - 1000));\n return match?.id ?? null;\n}\n", "import type { Command } from 'commander';\nimport { theme } from '../ui/theme';\nimport {\n type ApprovalStatusRecord,\n confirmApproval,\n describeWaitResult,\n exitCodeForApprovalStatus,\n fetchApprovalStatus,\n hasJwtSession,\n parseDuration,\n pollApprovalStatus,\n rejectApproval,\n} from '../core/approvals';\nimport { artifactHints, mergeWaitedArtifact, waitForToolArtifact } from '../core/artifact-wait';\nimport { type McpPendingApproval, getMcpAccessState } from '../core/auth';\nimport { artifactFromResult } from '../core/chat-artifacts';\nimport { type CommandContext, createCommandContext } from '../core/context';\nimport { CliError, ExitCode, notSignedInError } from '../core/errors';\nimport { interpretToolPayload } from '../core/mcp';\nimport {\n type OutputMode,\n formatDuration,\n formatKv,\n formatTable,\n jsonEnvelope,\n printEmptyNotice,\n renderResult,\n resolveOutputMode,\n toTsv,\n writeJson,\n} from '../core/output';\n\n/**\n * `tabbio approvals`, pending MCP approvals. Listing, approving and rejecting\n * use the app session (JWT); `show` and `wait` use the MCP status tool, so\n * they also work with a personal MCP token.\n */\n\nconst LIST_FIELDS = ['id', 'toolName', 'status', 'createdAt', 'args'];\n\nexport function requireJwtForApprovals(ctx: CommandContext, what: string): void {\n if (hasJwtSession(ctx)) return;\n if (ctx.credentials?.mcpToken) {\n throw new CliError({\n code: 'FULL_SIGN_IN_REQUIRED',\n message: `${what} needs a full sign-in; this profile only has a personal MCP token`,\n hint: 'With the token you can still check one approval: `tabbio approvals show <id>` or `tabbio approvals wait <id>`. Run `tabbio login` for the rest.',\n exitCode: ExitCode.Auth,\n });\n }\n throw notSignedInError(ctx.profile.name);\n}\n\nfunction mode(ctx: CommandContext): OutputMode {\n return resolveOutputMode({ json: ctx.globals.json });\n}\n\nfunction write(lines: readonly string[]): void {\n for (const line of lines) process.stdout.write(`${line}\\n`);\n}\n\nasync function withContext(cmd: Command, fn: (ctx: CommandContext) => Promise<void>): Promise<void> {\n const ctx = createCommandContext(cmd);\n try {\n await fn(ctx);\n } finally {\n await ctx.close();\n }\n}\n\nasync function list(ctx: CommandContext): Promise<void> {\n requireJwtForApprovals(ctx, 'Listing approvals');\n const started = Date.now();\n const state = await getMcpAccessState(ctx.api);\n const pending: McpPendingApproval[] = state.pendingApprovals ?? [];\n const meta = { durationMs: Date.now() - started, requestId: ctx.api.lastRequestId };\n const out = mode(ctx);\n if (out === 'json') return writeJson(jsonEnvelope({ id: 'approvals.list' }, pending, meta));\n if (pending.length === 0) return printEmptyNotice(out, 'No pending approvals', { quiet: ctx.globals.quiet });\n if (out === 'tsv') {\n process.stdout.write(toTsv(pending, LIST_FIELDS));\n return;\n }\n const rows = pending.map((p) => ({ ...p }));\n write(formatTable(rows, { fields: LIST_FIELDS, width: process.stdout.columns }));\n write([\n theme.dim(`${pending.length} pending \u00B7 tabbio approvals approve <id> \u00B7 tabbio approvals reject <id> \u00B7 tabbio approvals show <id>`),\n ]);\n}\n\nasync function show(ctx: CommandContext, id: string): Promise<void> {\n const started = Date.now();\n const session = await ctx.mcp();\n const record: ApprovalStatusRecord & { args?: unknown } = await fetchApprovalStatus(session, id);\n if (hasJwtSession(ctx) && record.status === 'pending') {\n const state = await getMcpAccessState(ctx.api).catch(() => null);\n const match = state?.pendingApprovals.find((p) => p.id === id);\n if (match) record.args = match.args;\n }\n const out = mode(ctx);\n if (out === 'json') return writeJson(jsonEnvelope({ id: 'approvals.show' }, record, { durationMs: Date.now() - started }));\n if (out === 'tsv') {\n process.stdout.write(toTsv(record));\n return;\n }\n write(formatKv(record, { width: process.stdout.columns }));\n}\n\nasync function approve(ctx: CommandContext, id: string, opts: { reason?: string; wait?: boolean; timeout?: string }): Promise<void> {\n requireJwtForApprovals(ctx, 'Approving');\n const started = Date.now();\n const { result, data, requestId } = await confirmApproval(ctx.api, id, opts.reason);\n const toolName = typeof data.approval?.toolName === 'string' ? data.approval.toolName : 'approval';\n const extra: Record<string, unknown> = { approval: { approvalId: id, toolName, status: 'approved', executed: Boolean(data.mcp) } };\n const out = mode(ctx);\n if (out !== 'json') process.stderr.write(`${theme.success(theme.symbols.success)} Approved ${toolName} ${theme.dim(id)}\\n`);\n // Approved, but the tool itself refused (plan, quota, flag off): report it as the error it is.\n const ran = data.mcp ? interpretToolPayload(result, toolName) : null;\n if (ran && !ran.ok) throw ran.error;\n // An approved file tool (#512) answers with the card; --wait follows its render.\n let shown = result;\n const card = artifactFromResult(result);\n if (card && opts.wait) {\n const waited = await waitForToolArtifact(ctx, null, result, { timeoutMs: parseDuration(opts.timeout, 5 * 60_000), json: out === 'json' });\n if (waited) {\n extra.artifactWait = { artifactId: waited.artifactId, status: waited.status, timedOut: waited.timedOut };\n shown = mergeWaitedArtifact(result, waited);\n if (waited.timedOut) process.exitCode = ExitCode.Network;\n else if (waited.status === 'failed') process.exitCode = ExitCode.Error;\n }\n }\n await renderResult(ctx, { id: toolName, commandPath: [toolName] }, shown, {\n durationMs: Date.now() - started,\n requestId,\n mode: out,\n extra,\n });\n const final = artifactFromResult(shown);\n if (final) artifactHints(ctx, out === 'json', final.id, final.status);\n}\n\nasync function reject(ctx: CommandContext, id: string, reason?: string): Promise<void> {\n requireJwtForApprovals(ctx, 'Rejecting');\n const started = Date.now();\n const { data, requestId } = await rejectApproval(ctx.api, id, reason);\n const toolName = typeof data.approval?.toolName === 'string' ? data.approval.toolName : 'approval';\n const out = mode(ctx);\n if (out === 'json') {\n writeJson(\n jsonEnvelope({ id: 'approvals.reject' }, data.approval ?? null, {\n durationMs: Date.now() - started,\n requestId,\n extra: { approval: { approvalId: id, toolName, status: 'rejected', executed: false } },\n }),\n );\n return;\n }\n write([`${theme.error(theme.symbols.error)} Rejected ${toolName} ${theme.dim(id)}`]);\n}\n\nasync function wait(ctx: CommandContext, id: string, timeout?: string): Promise<void> {\n const timeoutMs = parseDuration(timeout);\n const started = Date.now();\n const session = await ctx.mcp();\n const out = mode(ctx);\n if (out !== 'json') {\n process.stderr.write(`${theme.dim(`Waiting for ${id} (up to ${formatDuration(timeoutMs)}) \u00B7 approve it in the Tabbio app`)}\\n`);\n }\n const { record, timedOut } = await pollApprovalStatus(session, id, { timeoutMs });\n const status = timedOut ? 'pending' : (record?.status ?? 'pending');\n if (out === 'json') {\n writeJson(\n jsonEnvelope({ id: 'approvals.wait' }, record, {\n durationMs: Date.now() - started,\n extra: { approval: { approvalId: id, toolName: record?.toolName ?? null, status, timedOut, executed: false } },\n }),\n );\n } else {\n for (const line of describeWaitResult(record?.toolName || id, record, timedOut, timeoutMs)) {\n process.stderr.write(`${line}\\n`);\n }\n }\n const code = exitCodeForApprovalStatus(status, timedOut);\n if (code !== ExitCode.Ok) process.exitCode = code;\n}\n\nexport function registerApprovalsCommand(program: Command): void {\n const approvals = program\n .command('approvals')\n .description('Review and decide actions waiting for your approval')\n .addHelpText(\n 'after',\n '\\nExamples:\\n $ tabbio approvals\\n $ tabbio approvals approve apr_123\\n $ tabbio approvals wait apr_123 --timeout 5m',\n );\n\n approvals\n .command('list', { isDefault: true })\n .description('List pending approvals (needs a full sign-in)')\n .action((_opts: unknown, cmd: Command) => withContext(cmd, list));\n\n approvals\n .command('show')\n .description('Show one approval (works with a personal MCP token)')\n .argument('<id>', 'Approval id')\n .action((id: string, _opts: unknown, cmd: Command) => withContext(cmd, (ctx) => show(ctx, id)));\n\n approvals\n .command('approve')\n .description('Approve and run it now; prints the tool output')\n .argument('<id>', 'Approval id')\n .option('--reason <text>', 'Note stored with the decision')\n .option('--wait', 'When it created a file (document, page, image), wait until it has rendered')\n .option('--timeout <duration>', 'How long --wait waits for the file (default 5m)')\n .action((id: string, opts: { reason?: string; wait?: boolean; timeout?: string }, cmd: Command) =>\n withContext(cmd, (ctx) => approve(ctx, id, opts)),\n );\n\n approvals\n .command('reject')\n .description('Reject it; the action never runs')\n .argument('<id>', 'Approval id')\n .option('--reason <text>', 'Note stored with the decision')\n .action((id: string, opts: { reason?: string }, cmd: Command) => withContext(cmd, (ctx) => reject(ctx, id, opts.reason)));\n\n approvals\n .command('wait')\n .description('Wait until it is approved or rejected (exit 0 approved, 1 rejected, 6 still pending)')\n .argument('<id>', 'Approval id')\n .option('--timeout <duration>', 'Give up after this long (default 10m)')\n .action((id: string, opts: { timeout?: string }, cmd: Command) => withContext(cmd, (ctx) => wait(ctx, id, opts.timeout)));\n}\n", "import { type Command, Option } from 'commander';\nimport {\n ARTIFACT_KINDS,\n type ArtifactSummary,\n deleteArtifact,\n getArtifact,\n listArtifacts,\n listVersions,\n restoreVersion,\n} from '../core/artifacts';\nimport { type CommandContext, createCommandContext } from '../core/context';\nimport { usageError } from '../core/errors';\nimport { assertJwtSession } from '../core/mcp';\nimport {\n type OutputMode,\n formatKv,\n formatTable,\n jsonEnvelope,\n printEmptyNotice,\n resolveOutputMode,\n toTsv,\n writeJson,\n} from '../core/output';\nimport { confirm } from '../core/prompt';\nimport { theme } from '../ui/theme';\nimport { downloadCommand, openCommand, waitCommand } from './artifacts-files';\n\n/**\n * `tabbio artifacts`: the documents, slide decks, pages and images the agent\n * made (PR #512), over the owner-scoped REST API (`/api/artifacts`, app\n * session). The MCP tools (`tabbio artifact list|get|read|\u2026`) are the\n * agent's view of the same files and also work with a personal token.\n */\n\nconst LIST_FIELDS = ['id', 'kind', 'title', 'status', 'version', 'createdAt'];\n\nfunction outMode(ctx: CommandContext): OutputMode {\n return resolveOutputMode({ json: ctx.globals.json });\n}\n\nfunction write(lines: readonly string[]): void {\n for (const line of lines) process.stdout.write(`${line}\\n`);\n}\n\nasync function withSession(cmd: Command, fn: (ctx: CommandContext) => Promise<void>): Promise<void> {\n const ctx = createCommandContext(cmd);\n try {\n assertJwtSession(ctx.credentials, ctx.profile, 'Artifacts');\n await fn(ctx);\n } finally {\n await ctx.close();\n }\n}\n\nfunction row(a: ArtifactSummary): Record<string, unknown> {\n return {\n id: a.id,\n kind: a.kind,\n title: a.title,\n status: a.status,\n version: a.currentVersion?.number ?? a.versionCount ?? null,\n createdAt: a.createdAt,\n ...(a.site?.url ? { site: a.site.url } : {}),\n };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1 || n > 50) throw usageError('--limit must be a whole number from 1 to 50');\n return n;\n}\n\nasync function list(ctx: CommandContext, opts: { kind?: string; status?: string; thread?: string; limit?: string; cursor?: string }) {\n const started = Date.now();\n const page = await listArtifacts(ctx.api, { kind: opts.kind, status: opts.status, threadId: opts.thread, limit: parseLimit(opts.limit), cursor: opts.cursor });\n const out = outMode(ctx);\n if (out === 'json') {\n writeJson(jsonEnvelope({ id: 'artifacts.list' }, page.artifacts, { durationMs: Date.now() - started, extra: { nextCursor: page.nextCursor } }));\n return;\n }\n if (page.artifacts.length === 0) return printEmptyNotice(out, 'No files yet. Ask Tabbio for a document, a page or an image.', { quiet: ctx.globals.quiet });\n const rows = page.artifacts.map(row);\n if (out === 'tsv') {\n process.stdout.write(toTsv(rows, LIST_FIELDS));\n return;\n }\n write(formatTable(rows, { fields: LIST_FIELDS, width: process.stdout.columns }));\n const more = page.nextCursor ? ` ${theme.symbols.middot} more: --cursor ${page.nextCursor}` : '';\n write([theme.dim(`${rows.length} ${rows.length === 1 ? 'file' : 'files'}${more} ${theme.symbols.middot} tabbio artifacts open <id> ${theme.symbols.middot} tabbio artifacts download <id>`)]);\n}\n\nasync function get(ctx: CommandContext, id: string) {\n const started = Date.now();\n const detail = await getArtifact(ctx.api, id);\n const out = outMode(ctx);\n if (out === 'json') {\n writeJson(jsonEnvelope({ id: 'artifacts.get' }, detail, { durationMs: Date.now() - started }));\n return;\n }\n const { document: _document, sources, variants, ...summary } = detail;\n const panel: Record<string, unknown> = {\n ...summary,\n variants: Object.entries(variants ?? {})\n .filter(([, on]) => on)\n .map(([name]) => name)\n .join(', '),\n currentVersion: detail.currentVersion ? `v${detail.currentVersion.number} (${detail.currentVersion.id})` : null,\n site: detail.site?.url ?? null,\n error: detail.error ? `${detail.error.code}: ${detail.error.message}` : null,\n sourceCount: sources?.length ?? detail.sourceCount,\n };\n if (out === 'tsv') {\n process.stdout.write(toTsv(panel));\n return;\n }\n write(formatKv(panel, { width: process.stdout.columns }));\n if (detail.status === 'ready') write([theme.dim(`${theme.symbols.arrowRight} tabbio artifacts open ${id} ${theme.symbols.middot} tabbio artifacts download ${id}`)]);\n}\n\nasync function versions(ctx: CommandContext, id: string) {\n const started = Date.now();\n const page = await listVersions(ctx.api, id, { limit: 50 });\n const out = outMode(ctx);\n if (out === 'json') {\n writeJson(jsonEnvelope({ id: 'artifacts.versions' }, page.versions, { durationMs: Date.now() - started, extra: { nextCursor: page.nextCursor } }));\n return;\n }\n const rows = page.versions.map((v) => ({\n number: v.number,\n id: v.id,\n status: v.status,\n source: v.restoredFrom ? `restore of v${v.restoredFrom.number}` : v.source,\n current: out === 'table' ? (v.isCurrent ? theme.symbols.success : '') : v.isCurrent,\n summary: v.summary ?? '',\n createdAt: v.createdAt,\n }));\n if (rows.length === 0) return printEmptyNotice(out, 'No versions yet', { quiet: ctx.globals.quiet });\n if (out === 'tsv') {\n process.stdout.write(toTsv(rows, ['number', 'id', 'status', 'source', 'current', 'createdAt']));\n return;\n }\n write(formatTable(rows, { fields: ['number', 'id', 'status', 'source', 'current', 'summary', 'createdAt'], width: process.stdout.columns }));\n write([theme.dim(`tabbio artifacts restore ${id} <versionId> makes a copy of that version the newest one`)]);\n}\n\nasync function restore(ctx: CommandContext, id: string, versionId: string) {\n const started = Date.now();\n const result = await restoreVersion(ctx.api, id, versionId);\n const out = outMode(ctx);\n if (out === 'json') {\n writeJson(jsonEnvelope({ id: 'artifacts.restore' }, result, { durationMs: Date.now() - started }));\n return;\n }\n const from = result.version.restoredFrom ? `version ${result.version.restoredFrom.number}` : versionId;\n write([`${theme.success(theme.symbols.success)} Restored ${from} as version ${result.version.number} ${theme.dim(`${theme.symbols.middot} ${result.artifact.title} ${theme.symbols.middot} ${result.version.status}`)}`]);\n}\n\nasync function remove(ctx: CommandContext, id: string) {\n const started = Date.now();\n const out = outMode(ctx);\n if (!ctx.globals.yes) {\n const detail = await getArtifact(ctx.api, id);\n const site = detail.site?.url ? ` Its site ${detail.site.url} goes offline too.` : '';\n process.stderr.write(`${theme.warn(theme.symbols.warning)} Delete ${detail.kind} \"${detail.title}\"?${site} It is removed for good after 30 days.\\n`);\n if (!(await confirm('Delete it?'))) {\n process.stderr.write(`${theme.dim('Kept it.')}\\n`);\n return;\n }\n }\n const result = await deleteArtifact(ctx.api, id);\n if (out === 'json') writeJson(jsonEnvelope({ id: 'artifacts.delete' }, result, { durationMs: Date.now() - started }));\n else write([`${theme.success(theme.symbols.success)} Deleted ${id}`]);\n}\n\nexport function registerArtifactsCommand(program: Command): void {\n const artifacts = program\n .command('artifacts')\n .description('Documents, slide decks, pages and images Tabbio made for you (list, open, download, versions)')\n .addHelpText(\n 'after',\n [\n '',\n 'Examples:',\n ' $ tabbio artifacts list --kind document',\n ' $ tabbio artifacts open art_123',\n ' $ tabbio artifacts download art_123 --format pdf --out ~/Downloads',\n ' $ tabbio artifacts wait art_123 --timeout 2m',\n '',\n 'Needs an app session (tabbio login). With a personal token use `tabbio artifact list|get|read`.',\n ].join('\\n'),\n );\n\n artifacts\n .command('list', { isDefault: true })\n .description('Your files, newest first')\n .addOption(new Option('--kind <kind>', 'Only this kind').choices([...ARTIFACT_KINDS]))\n .addOption(new Option('--status <status>', 'Only this status').choices(['pending', 'ready', 'failed']))\n .option('--thread <id>', 'Only files from this chat thread')\n .option('--limit <n>', 'How many (1-50, default 20)')\n .option('--cursor <id>', 'Next page (from the previous listing)')\n .action((opts: { kind?: string; status?: string; thread?: string; limit?: string; cursor?: string }, cmd: Command) =>\n withSession(cmd, (ctx) => list(ctx, opts)),\n );\n\n artifacts\n .command('get')\n .description('One file: kind, status, versions, formats, site')\n .argument('<id>', 'Artifact id')\n .action((id: string, _opts: unknown, cmd: Command) => withSession(cmd, (ctx) => get(ctx, id)));\n\n artifacts\n .command('open')\n .description('Print a 15-minute preview link and open it in the browser (on a terminal)')\n .argument('<id>', 'Artifact id')\n .addOption(new Option('--variant <variant>', 'What to preview (default: image for images, else html)').choices(['html', 'pdf', 'image', 'thumbnail']))\n .addOption(new Option('--theme <theme>', 'HTML preview theme').choices(['light', 'dark']))\n .option('--version <versionId>', 'A version other than the newest')\n .option('--print', 'Only print the link, never open a browser')\n .action((id: string, opts: { variant?: string; theme?: string; version?: string; print?: boolean }, cmd: Command) =>\n withSession(cmd, (ctx) => openCommand(ctx, id, opts)),\n );\n\n artifacts\n .command('download')\n .description('Save a file to disk (default name from its title; never overwrites without --force)')\n .argument('<id>', 'Artifact id')\n .option('--format <format>', 'pdf | pptx | html | png (image formats save the stored image). Default: pdf for documents, pptx for slides, html for pages, the image for images')\n .option('-O, --out <path>', 'File or directory to save to (default: the current directory)')\n .option('--force', 'Overwrite an existing file')\n .option('--version <versionId>', 'A version other than the newest')\n .option('--wait', 'If it is still rendering, wait for it')\n .option('--timeout <duration>', 'How long --wait waits (default 5m)')\n .action((id: string, opts: { format?: string; out?: string; force?: boolean; version?: string; wait?: boolean; timeout?: string }, cmd: Command) =>\n withSession(cmd, (ctx) => downloadCommand(ctx, id, opts)),\n );\n\n artifacts\n .command('versions')\n .description('Every version of a file, newest first')\n .argument('<id>', 'Artifact id')\n .action((id: string, _opts: unknown, cmd: Command) => withSession(cmd, (ctx) => versions(ctx, id)));\n\n artifacts\n .command('restore')\n .description('Make a copy of an older version the newest one (nothing is lost)')\n .argument('<id>', 'Artifact id')\n .argument('<versionId>', 'Version id from `tabbio artifacts versions <id>`')\n .action((id: string, versionId: string, _opts: unknown, cmd: Command) => withSession(cmd, (ctx) => restore(ctx, id, versionId)));\n\n artifacts\n .command('delete')\n .description('Delete a file (asks first unless --yes; its published site goes offline)')\n .argument('<id>', 'Artifact id')\n .action((id: string, _opts: unknown, cmd: Command) => withSession(cmd, (ctx) => remove(ctx, id)));\n\n artifacts\n .command('wait')\n .description('Wait until a file has rendered (exit 0 ready, 1 failed, 7 still rendering at the timeout)')\n .argument('<id>', 'Artifact id')\n .option('--timeout <duration>', 'Give up after this long (default 5m)')\n .action((id: string, opts: { timeout?: string }, cmd: Command) => withSession(cmd, (ctx) => waitCommand(ctx, id, opts)));\n}\n", "/**\n * The file half of `tabbio artifacts`: `open` (signed preview URL, opened in\n * the browser on a terminal), `download` (streams the signed download URL to\n * disk) and `wait` (polls until the render settles).\n */\nimport open from 'open';\nimport {\n type ArtifactDetail,\n type DownloadVariant,\n type PreviewVariant,\n PREVIEW_VARIANTS,\n defaultVariantFor,\n downloadToFile,\n downloadUrl,\n extensionFor,\n formatToVariant,\n getArtifact,\n previewUrl,\n resolveOutputPath,\n safeFileName,\n waitForArtifact,\n} from '../core/artifacts';\nimport { parseDuration } from '../core/approvals';\nimport { activeCommandSignal } from '../core/cancellation';\nimport { previewVariantFor } from '../core/chat-artifacts';\nimport type { CommandContext } from '../core/context';\nimport { CliError, ExitCode, isCliError, usageError } from '../core/errors';\nimport { type OutputMode, formatDuration, jsonEnvelope, resolveOutputMode, writeJson } from '../core/output';\nimport { hyperlink, supportsHyperlinks } from '../ui/hyperlink';\nimport { theme } from '../ui/theme';\n\nconst DEFAULT_WAIT = 5 * 60_000;\n\nfunction outMode(ctx: CommandContext): OutputMode {\n return resolveOutputMode({ json: ctx.globals.json });\n}\n\nfunction status(ctx: CommandContext, out: OutputMode, line: string): void {\n if (out !== 'json' && !ctx.globals.quiet) process.stderr.write(`${line}\\n`);\n}\n\nfunction strip(detail: ArtifactDetail): Record<string, unknown> {\n const { document: _document, sources, ...summary } = detail;\n return { ...summary, sourceCount: summary.sourceCount ?? sources?.length ?? 0 };\n}\n\nfunction notReady(id: string): CliError {\n return new CliError({\n code: 'ARTIFACT_NOT_READY',\n message: 'This file is still being created',\n hint: `Wait for it with \\`tabbio artifacts wait ${id}\\`, or pass --wait.`,\n exitCode: ExitCode.Error,\n });\n}\n\n/** Polls an artifact until it settles; exit 1 when it failed, 7 when the wait ran out. */\nexport async function waitCommand(ctx: CommandContext, id: string, opts: { timeout?: string }): Promise<void> {\n const out = outMode(ctx);\n const timeoutMs = parseDuration(opts.timeout, DEFAULT_WAIT);\n const started = Date.now();\n status(ctx, out, theme.dim(`${theme.symbols.pending} Waiting for ${id} (up to ${formatDuration(timeoutMs)})`));\n const { artifact, timedOut } = await waitForArtifact(() => getArtifact(ctx.api, id), { timeoutMs });\n const summary = artifact ? strip(artifact) : null;\n if (out === 'json') writeJson(jsonEnvelope({ id: 'artifacts.wait' }, summary, { durationMs: Date.now() - started, extra: { timedOut } }));\n if (timedOut || !artifact) {\n throw new CliError({\n code: 'ARTIFACT_WAIT_TIMEOUT',\n message: `${id} was still rendering after ${formatDuration(timeoutMs)}`,\n hint: `Try again later: tabbio artifacts wait ${id}`,\n exitCode: ExitCode.Network,\n retry: true,\n });\n }\n if (artifact.status === 'failed') {\n if (out !== 'json') process.stdout.write(`${theme.error(theme.symbols.error)} ${artifact.title} failed: ${artifact.error?.message ?? 'unknown error'}\\n`);\n process.exitCode = ExitCode.Error;\n return;\n }\n if (out === 'json') return;\n if (out === 'tsv') {\n process.stdout.write(`${artifact.id}\\t${artifact.status}\\t${artifact.kind}\\t${artifact.title}\\n`);\n return;\n }\n process.stdout.write(`${theme.success(theme.symbols.success)} ${artifact.title} ${theme.dim(`${theme.symbols.middot} ${artifact.kind} ${theme.symbols.middot} ready`)}\\n`);\n status(ctx, out, theme.dim(`${theme.symbols.arrowRight} tabbio artifacts open ${id} ${theme.symbols.middot} tabbio artifacts download ${id}`));\n}\n\n/** Prints (and on a terminal opens) the signed preview URL. */\nexport async function openCommand(\n ctx: CommandContext,\n id: string,\n opts: { variant?: string; theme?: string; version?: string; print?: boolean },\n): Promise<void> {\n const out = outMode(ctx);\n const started = Date.now();\n if (opts.variant && !(PREVIEW_VARIANTS as readonly string[]).includes(opts.variant)) {\n throw usageError(`--variant must be one of ${PREVIEW_VARIANTS.join(', ')}`);\n }\n if (opts.theme && opts.theme !== 'light' && opts.theme !== 'dark') throw usageError('--theme must be light or dark');\n let variant = opts.variant as PreviewVariant | undefined;\n if (!variant) variant = previewVariantFor((await getArtifact(ctx.api, id)).kind);\n const signed = await previewUrl(ctx.api, id, { variant, theme: opts.theme as 'light' | 'dark' | undefined, versionId: opts.version });\n if (out === 'json') {\n writeJson(jsonEnvelope({ id: 'artifacts.open' }, signed, { durationMs: Date.now() - started }));\n return;\n }\n process.stdout.write(`${signed.url}\\n`);\n const browse = !opts.print && process.stdout.isTTY && !process.env.CI;\n if (browse) {\n await open(signed.url).catch(() => undefined);\n const label = supportsHyperlinks() ? hyperlink('Opened the preview', signed.url) : 'Opened the preview';\n status(ctx, out, theme.dim(`${label} ${theme.symbols.middot} the link works for 15 minutes`));\n } else {\n status(ctx, out, theme.dim('The link works for 15 minutes.'));\n }\n}\n\nfunction humanBytes(bytes: number): string {\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/** Signed download URL; with `wait`, retries while a stale PDF or deck re-renders (409). */\nasync function mintDownload(ctx: CommandContext, id: string, variant: DownloadVariant, opts: { version?: string; wait: boolean; timeoutMs: number }) {\n const deadline = Date.now() + opts.timeoutMs;\n for (;;) {\n try {\n return await downloadUrl(ctx.api, id, { variant, versionId: opts.version });\n } catch (error) {\n const preparing = isCliError(error) && error.code === 'ARTIFACT_NOT_READY';\n if (!preparing || !opts.wait || Date.now() > deadline) throw preparing ? notReady(id) : error;\n await new Promise((resolve) => setTimeout(resolve, 3_000));\n }\n }\n}\n\n/** Streams one variant to disk. Never overwrites without --force. */\nexport async function downloadCommand(\n ctx: CommandContext,\n id: string,\n opts: { format?: string; out?: string; force?: boolean; version?: string; wait?: boolean; timeout?: string },\n): Promise<void> {\n const out = outMode(ctx);\n const started = Date.now();\n const timeoutMs = parseDuration(opts.timeout, DEFAULT_WAIT);\n let artifact = await getArtifact(ctx.api, id);\n if (artifact.status === 'pending' && !opts.version) {\n if (!opts.wait) throw notReady(id);\n status(ctx, out, theme.dim(`${theme.symbols.pending} Waiting for ${id} to finish rendering`));\n const waited = await waitForArtifact(() => getArtifact(ctx.api, id), { timeoutMs });\n if (!waited.artifact || waited.timedOut) throw notReady(id);\n artifact = waited.artifact;\n }\n if (artifact.status === 'failed' && !opts.version) {\n throw new CliError({ code: 'ARTIFACT_FAILED', message: `${artifact.title} failed: ${artifact.error?.message ?? 'no file was made'}`, exitCode: ExitCode.Error });\n }\n const variant = opts.format ? formatToVariant(opts.format) : defaultVariantFor(artifact);\n const signed = await mintDownload(ctx, id, variant, { version: opts.version, wait: Boolean(opts.wait), timeoutMs });\n const fileName = safeFileName(artifact.title, extensionFor(variant, signed.contentType));\n const dest = resolveOutputPath(opts.out, fileName);\n const tty = out !== 'json' && process.stderr.isTTY && !ctx.globals.quiet && !process.env.CI;\n let lastPaint = 0;\n const saved = await downloadToFile(signed.url, dest, {\n force: opts.force,\n signal: activeCommandSignal,\n onProgress: ({ received, total }) => {\n if (!tty || Date.now() - lastPaint < 100) return;\n lastPaint = Date.now();\n const of = total ? ` / ${humanBytes(total)}` : '';\n process.stderr.write(`\\r\\u001b[2K${theme.dim(`${theme.symbols.pending} ${fileName} ${humanBytes(received)}${of}`)}`);\n },\n });\n if (tty) process.stderr.write('\\r\\u001b[2K');\n const data = { artifactId: id, path: saved.path, bytes: saved.bytes, variant, contentType: saved.contentType ?? signed.contentType };\n if (out === 'json') {\n writeJson(jsonEnvelope({ id: 'artifacts.download' }, data, { durationMs: Date.now() - started }));\n return;\n }\n status(ctx, out, `${theme.success(theme.symbols.success)} Saved ${variant.toUpperCase()} ${theme.dim(`${humanBytes(saved.bytes)} ${theme.symbols.middot} ${formatDuration(Date.now() - started)}`)}`);\n process.stdout.write(`${saved.path}\\n`);\n}\n", "/**\n * The one execution path behind `tabbio run <tool>`, `tabbio workflows run\n * <key>` and every generated `tabbio <group> <action>` command:\n *\n * flags + --input \u2192 parseToolInput \u2192 required check (Ink form on a TTY,\n * else one combined exit-2 error) \u2192 tools/call \u2192 approval handling \u2192\n * renderResult.\n */\nimport { readFileSync } from 'node:fs';\nimport { Command, CommanderError, Option } from 'commander';\nimport { canUseInteractiveUi, getInteractiveHooks } from '../ui/hooks';\nimport { theme } from '../ui/theme';\nimport { approvalMeta, handleApproval, parseDuration } from './approvals';\nimport {\n artifactHints,\n findArtifactForApproval,\n isArtifactProducingTool,\n mergeWaitedArtifact,\n waitForToolArtifact,\n} from './artifact-wait';\nimport { artifactFromResult } from './chat-artifacts';\nimport { type CatalogTool, findTool } from './catalog';\nimport type { CommandContext } from './context';\nimport { CliError, ExitCode, interruptedError, usageError } from './errors';\nimport { type McpSession, type ToolCallResult, interpretToolPayload } from './mcp';\nimport {\n type OutputMode,\n jsonEnvelope,\n parseFields,\n renderResult,\n resolveOutputMode,\n writeJson,\n} from './output';\nimport { setGlobalOptions } from './runtime';\nimport {\n RESERVED_GLOBAL_FLAGS,\n autoFilledProperties,\n didYouMean,\n flagsForProperties,\n parseToolInput,\n schemaToFlags,\n schemaToOptions,\n} from './schema-flags';\n\n/** Options every tool command accepts next to its schema flags. */\nexport type RunLevelOptions = {\n input?: string;\n inputFile?: string;\n fields?: string;\n wait?: boolean;\n timeout?: string;\n output?: string;\n};\n\nexport type RunToolOptions = RunLevelOptions & Record<string, unknown>;\n\n/** Adds `--input`, `--input-file`, `--fields`, `--wait`, `--timeout`, `-o/--output`. */\nexport function addRunLevelOptions(cmd: Command): Command {\n const options = [\n new Option('--input <json>', 'Tool input as a JSON object; \"-\" reads stdin (flags override its keys)'),\n new Option('--input-file <path>', 'Read the tool input JSON from a file (\"-\" for stdin)'),\n new Option('--fields <list>', 'Only these fields/columns, comma-separated (dot paths ok)'),\n new Option('--wait', 'Wait for an approval instead of exiting 6, and for a created file to finish rendering'),\n new Option('--timeout <duration>', 'How long --wait waits (default 10m)'),\n new Option('-o, --output <mode>', 'json | table | plain (default: table on a TTY, plain TSV when piped)'),\n ];\n for (const option of options) cmd.addOption(option);\n return cmd;\n}\n\n/** Adds the schema flags of a tool to a commander command. */\nexport function addToolOptions(cmd: Command, tool: Pick<CatalogTool, 'inputSchema'>): Command {\n for (const option of schemaToOptions(tool.inputSchema)) cmd.addOption(option);\n return cmd;\n}\n\n/** Every flag a tool command accepts (for \"unknown flag\" errors). */\nexport function validFlagsFor(tool: Pick<CatalogTool, 'inputSchema'>): string[] {\n return [\n ...schemaToFlags(tool.inputSchema).map((spec) => `--${spec.flag}`),\n '--input',\n '--input-file',\n '--fields',\n '--wait',\n '--timeout',\n '--output',\n ];\n}\n\n/** Usage error for leftover args: unknown flags (with the valid list) or stray positionals. */\nexport function unknownArgsError(tool: CatalogTool, args: readonly string[], commandLabel: string): CliError {\n const flag = args.find((arg) => arg.startsWith('-'));\n const valid = validFlagsFor(tool);\n if (!flag) {\n return usageError(\n `Unexpected argument \"${args[0]}\" for ${commandLabel}`,\n `Tool input goes in flags: ${valid.slice(0, 8).join(' ')}${valid.length > 8 ? ' \u2026' : ''}`,\n );\n }\n const name = flag.split('=')[0] as string;\n const guess = didYouMean(name, [...valid, ...RESERVED_GLOBAL_FLAGS.map((f) => `--${f}`)]);\n const toolFlags = schemaToFlags(tool.inputSchema).map((spec) => `--${spec.flag}`);\n return usageError(\n `Unknown flag ${name} for ${commandLabel}`,\n [\n guess ? `Did you mean ${guess}?` : null,\n toolFlags.length ? `Valid flags: ${toolFlags.join(', ')}.` : 'This tool takes no flags.',\n `See \\`tabbio tools describe ${tool.id}\\`.`,\n ]\n .filter(Boolean)\n .join(' '),\n );\n}\n\n/**\n * `tabbio run` and `workflows run` only know the schema after the catalog\n * lookup, so they collect everything after the tool reference and parse it\n * here with a throwaway commander Command built from the same options as the\n * generated commands. That keeps one parser (same `--flag=value`, repeatable\n * arrays and help text) instead of a second hand-written `--key value` loop.\n */\nexport function parseDynamicFlags(\n tool: CatalogTool,\n args: readonly string[],\n): { opts: Record<string, unknown>; rest: string[] } {\n const cmd = addToolOptions(new Command(tool.id), tool)\n .exitOverride()\n .configureOutput({ writeOut: () => undefined, writeErr: () => undefined, outputError: () => undefined });\n try {\n const parsed = cmd.parseOptions([...args]);\n return { opts: cmd.opts(), rest: [...parsed.operands, ...parsed.unknown] };\n } catch (error) {\n if (error instanceof CommanderError) throw usageError(error.message.replace(/^error:\\s*/i, ''));\n throw error;\n }\n}\n\n/** Reads all of stdin (for `--input -`). */\nexport async function readStdin(stream: NodeJS.ReadStream = process.stdin): Promise<string> {\n if (stream.isTTY) {\n throw usageError('\"-\" reads the input from stdin, but stdin is a terminal', 'Pipe JSON in, e.g. `echo \\'{\"limit\":5}\\' | tabbio run cv.list --input -`.');\n }\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : (chunk as Buffer));\n return Buffer.concat(chunks).toString('utf8');\n}\n\nfunction parseInputObject(text: string, source: string): Record<string, unknown> {\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch (error) {\n throw usageError(`${source} is not valid JSON: ${(error as Error).message}`);\n }\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw usageError(`${source} must be a JSON object`, 'Example: --input \\'{\"limit\":5}\\'');\n }\n return value as Record<string, unknown>;\n}\n\n/** Loads `--input-file` then `--input` (later wins); undefined when neither is set. */\nexport async function loadInputBase(\n opts: Pick<RunLevelOptions, 'input' | 'inputFile'>,\n stdin: () => Promise<string> = () => readStdin(),\n): Promise<Record<string, unknown> | undefined> {\n if (opts.input === '-' && opts.inputFile === '-') throw usageError('Only one of --input and --input-file can read stdin');\n let base: Record<string, unknown> | undefined;\n if (opts.inputFile !== undefined) {\n let text: string;\n if (opts.inputFile === '-') text = await stdin();\n else {\n try {\n text = readFileSync(opts.inputFile, 'utf8');\n } catch (error) {\n throw usageError(`Cannot read --input-file ${opts.inputFile}: ${(error as NodeJS.ErrnoException).code ?? (error as Error).message}`);\n }\n }\n base = parseInputObject(text, '--input-file');\n }\n if (opts.input !== undefined) {\n const text = opts.input === '-' ? await stdin() : opts.input;\n base = { ...base, ...parseInputObject(text, '--input') };\n }\n return base;\n}\n\n/** Values the CLI can fill itself (workflows take the caller's `userId`). */\nexport function toolInputDefaults(ctx: Pick<CommandContext, 'credentials'>, tool: CatalogTool): Record<string, unknown> {\n const userId = ctx.credentials?.user?.id;\n return autoFilledProperties(tool, tool.inputSchema).includes('userId') && userId ? { userId } : {};\n}\n\n/** Resolves a tool reference against the catalog, refreshing once on a miss. */\nexport async function resolveCatalogTool(\n session: Pick<McpSession, 'listTools'>,\n ref: string,\n filter: (tool: CatalogTool) => boolean = () => true,\n): Promise<CatalogTool> {\n const find = (tools: CatalogTool[]) => findTool(tools.filter(filter), ref);\n let tools = await session.listTools();\n let tool = find(tools);\n if (!tool) {\n tools = await session.listTools({ refresh: true });\n tool = find(tools);\n }\n if (tool) return tool;\n const candidates = tools.filter(filter).flatMap((t) => [t.id, t.commandPath.join(' ')]);\n const guess = didYouMean(ref, candidates);\n throw new CliError({\n code: 'UNKNOWN_TOOL',\n message: `Unknown tool: ${ref}`,\n hint: guess ? `Did you mean ${guess}? List tools with \\`tabbio tools\\`.` : 'List tools with `tabbio tools` (or `tabbio tools --refresh`).',\n exitCode: ExitCode.NotFound,\n });\n}\n\n/** One stderr status line while a call runs (TTY, human mode only); returns a clear(). */\nexport function startProgress(ctx: CommandContext, mode: OutputMode, text: string): () => void {\n if (mode !== 'table' || ctx.globals.quiet || !process.stderr.isTTY || process.env.CI) return () => undefined;\n process.stderr.write(`${theme.dim(`${theme.symbols.pending} ${text}`)}`);\n return () => process.stderr.write('\\r\\u001b[2K');\n}\n\n/** Output mode for a tool command; `--output json` behaves exactly like `--json`. */\nexport function outputModeFor(ctx: CommandContext, output?: string): OutputMode {\n const mode = resolveOutputMode({ json: ctx.globals.json, output });\n if (mode === 'json' && !ctx.globals.json) {\n ctx.globals.json = true;\n setGlobalOptions({ json: true }); // errors print as JSON too\n }\n return mode;\n}\n\n/**\n * Runs one catalog tool end to end. `extraArgs` are leftovers commander could\n * not place (unknown flags, stray positionals); they fail with exit 2.\n */\nexport async function runTool(\n ctx: CommandContext,\n tool: CatalogTool,\n opts: RunToolOptions,\n extraArgs: readonly string[] = [],\n): Promise<void> {\n const commandLabel = tool.kind === 'tool' ? tool.commandPath.join(' ') : tool.id;\n if (extraArgs.length) throw unknownArgsError(tool, extraArgs, commandLabel);\n const mode = outputModeFor(ctx, opts.output);\n const fields = parseFields(opts.fields);\n const timeoutMs = parseDuration(opts.timeout);\n\n const base = await loadInputBase(opts);\n const parsed = parseToolInput(tool.inputSchema, opts, { base, defaults: toolInputDefaults(ctx, tool) });\n const { missingRequired } = parsed;\n let input = parsed.input;\n\n if (missingRequired.length) {\n const hooks = getInteractiveHooks();\n if (hooks && mode === 'table' && canUseInteractiveUi(ctx)) {\n const filled = await hooks.runToolForm(ctx, tool, input, { missingRequired });\n if (!filled) throw interruptedError('Cancelled');\n input = filled;\n } else {\n const flags = flagsForProperties(tool.inputSchema, missingRequired);\n throw usageError(\n `Missing required ${flags.length === 1 ? 'flag' : 'flags'} for ${commandLabel}: ${flags.join(', ')}`,\n `Pass ${flags.length === 1 ? 'it as a flag' : 'them as flags'} or in --input '{\u2026}'. See \\`tabbio tools describe ${tool.id}\\`.`,\n );\n }\n }\n\n const session = await ctx.mcp();\n const started = Date.now();\n const clear = startProgress(ctx, mode, `Running ${commandLabel}${theme.symbols.ellipsis}`);\n let response: ToolCallResult;\n try {\n response = await session.callTool(tool.id, input);\n } finally {\n clear();\n }\n if (!response.ok) throw response.error;\n\n if (response.approval) {\n const outcome = await handleApproval(ctx, session, tool, response.approval, input, {\n wait: Boolean(opts.wait),\n timeoutMs,\n mode,\n followsOutput: isArtifactProducingTool(tool.id),\n });\n const extra: Record<string, unknown> = { approval: approvalMeta(outcome) };\n if (outcome.executed) {\n // The approved call ran on the server: a refusal there (plan, quota, flag) is an error here too.\n const ran = interpretToolPayload(outcome.result, tool.id);\n if (!ran.ok) throw ran.error;\n const result = await settleArtifact(ctx, session, tool, outcome.result, { wait: opts.wait, timeoutMs, mode, extra });\n await renderResult(ctx, tool, result, {\n durationMs: Date.now() - started,\n requestId: outcome.requestId,\n mode,\n fields,\n extra,\n });\n afterArtifact(ctx, tool, result, mode);\n } else if (opts.wait && outcome.status === 'approved' && isArtifactProducingTool(tool.id)) {\n // Approved elsewhere: the status poll has no tool output, so find the new file.\n const artifactId = await findArtifactForApproval(ctx, input, outcome.record?.createdAt).catch(() => null);\n const result = artifactId\n ? await settleArtifact(ctx, session, tool, { artifactId, status: 'pending', kind: 'file', title: String(input.title ?? '') }, { wait: true, timeoutMs, mode, extra })\n : null;\n if (result || mode === 'json') {\n await renderResult(ctx, tool, result, { durationMs: Date.now() - started, mode, fields, extra });\n }\n if (result) afterArtifact(ctx, tool, result, mode);\n } else if (mode === 'json') {\n writeJson(jsonEnvelope(tool, null, { durationMs: Date.now() - started, extra }));\n }\n return;\n }\n\n const extra: Record<string, unknown> = {};\n const result = await settleArtifact(ctx, session, tool, response.result, { wait: opts.wait, timeoutMs, mode, extra });\n await renderResult(ctx, tool, result, { durationMs: Date.now() - started, mode, fields, extra });\n afterArtifact(ctx, tool, result, mode);\n}\n\n/**\n * `--wait` on an artifact-producing tool: poll the file until it is ready\n * or failed and return the result with the final status (and the artifact\n * summary under `artifact`). Without `--wait`, the result as it came.\n */\nasync function settleArtifact(\n ctx: CommandContext,\n session: McpSession,\n tool: CatalogTool,\n result: unknown,\n opts: { wait?: boolean; timeoutMs: number; mode: OutputMode; extra: Record<string, unknown> },\n): Promise<unknown> {\n if (!opts.wait || !isArtifactProducingTool(tool.id) || !artifactFromResult(result)) return result;\n const outcome = await waitForToolArtifact(ctx, session, result, { timeoutMs: opts.timeoutMs, json: opts.mode === 'json' });\n if (!outcome) return result;\n opts.extra.artifactWait = { artifactId: outcome.artifactId, status: outcome.status, timedOut: outcome.timedOut };\n if (outcome.timedOut) process.exitCode = ExitCode.Network;\n else if (outcome.status === 'failed') process.exitCode = ExitCode.Error;\n return mergeWaitedArtifact(result, outcome);\n}\n\nfunction afterArtifact(ctx: CommandContext, tool: CatalogTool, result: unknown, mode: OutputMode): void {\n const card = artifactFromResult(result);\n if (!card || !tool.id.startsWith('artifact.')) return;\n artifactHints(ctx, mode === 'json', card.id, card.status);\n}\n\n/** Prints tool-specific help for `run <tool> --help`. */\nexport function wantsHelp(args: readonly string[]): boolean {\n return args.includes('--help') || args.includes('-h');\n}\n", "import type { Command } from 'commander';\nimport { approvalMeta, handleApproval } from '../core/approvals';\nimport { type CatalogTool, type JsonSchema, PRIMARY_AGENT_KEY, findTool } from '../core/catalog';\nimport { capabilityRequestFields, loadCapabilityPrefs } from '../core/capabilities';\nimport { streamChat } from '../core/chat';\nimport {\n type ChatArtifact,\n type ChatSource,\n artifactFromResult,\n capabilityDenial,\n mergeSources,\n sourcesFromResult,\n} from '../core/chat-artifacts';\nimport { type CommandContext, createCommandContext } from '../core/context';\nimport { CliError, ExitCode, usageError } from '../core/errors';\nimport { type ToolCallResult, describeMcpBearer } from '../core/mcp';\nimport { type OutputMode, jsonEnvelope, writeJson } from '../core/output';\nimport { outputModeFor, readStdin, startProgress } from '../core/run-tool';\nimport { theme } from '../ui/theme';\nimport type { AgentMode } from '@tabbio/types';\n\n/**\n * `tabbio ask \"<question>\"`, one-shot question to the Tabbio agent.\n *\n * With an app session the question goes through the chat stream\n * (`POST /api/agent/chat`), which owns a real thread and the agent's memory.\n * With a personal MCP token it falls back to the MCP `ask_tabbio` tool. The\n * server's `ask_tabbio` currently fails when the agent's observational memory\n * needs a thread id, so the chat path is preferred whenever it is available\n * (`--via-mcp` forces the tool path).\n */\n\ntype AskOptions = { mode?: AgentMode; viaMcp?: boolean };\n\n/** The input key for the question: first required string property, else first string property. */\nexport function askInputField(schema: JsonSchema | undefined): string {\n const properties = schema?.properties ?? {};\n const isString = (key: string) => {\n const type = properties[key]?.type;\n return type === 'string' || (Array.isArray(type) && type.includes('string'));\n };\n const required = (schema?.required ?? []).find((key) => key in properties && isString(key));\n return required ?? Object.keys(properties).find(isString) ?? 'message';\n}\n\nexport function findAskTool(tools: readonly CatalogTool[]): CatalogTool | undefined {\n return (\n tools.find((t) => t.kind === 'agent' && t.key === PRIMARY_AGENT_KEY) ?? findTool(tools, `ask_${PRIMARY_AGENT_KEY}`)\n );\n}\n\n/** Agent results are Mastra `generate()` output: `{ text, finishReason, \u2026 }`. */\nexport function answerText(result: unknown): string {\n if (typeof result === 'string') return result;\n if (result && typeof result === 'object') {\n const record = result as Record<string, unknown>;\n if (typeof record.text === 'string') return record.text;\n if (typeof record.answer === 'string') return record.answer;\n }\n return result === null || result === undefined ? '' : JSON.stringify(result, null, 2);\n}\n\n/** JSON data for `ask --json`: the answer only, never the agent's internal steps. */\nexport function answerData(result: unknown): { text: string; finishReason?: string } {\n const finishReason =\n result && typeof result === 'object' && typeof (result as Record<string, unknown>).finishReason === 'string'\n ? ((result as Record<string, unknown>).finishReason as string)\n : undefined;\n return { text: answerText(result), ...(finishReason ? { finishReason } : {}) };\n}\n\nasync function ask(ctx: CommandContext, words: readonly string[], opts: AskOptions = {}): Promise<void> {\n const mode = outputModeFor(ctx);\n let question = words.join(' ').trim();\n if (!question && !process.stdin.isTTY) question = (await readStdin()).trim();\n if (!question) throw usageError('Ask a question', 'e.g. tabbio ask \"Which of my CVs fits product roles best?\"');\n\n if (!opts.viaMcp && describeMcpBearer(ctx.credentials)?.kind === 'app-session') {\n await askViaChat(ctx, question, mode, opts.mode ?? 'seeker');\n return;\n }\n\n const session = await ctx.mcp();\n const tool = findAskTool(await session.listTools());\n if (!tool) {\n throw new CliError({\n code: 'UNKNOWN_TOOL',\n message: 'This Tabbio server does not offer the ask_tabbio tool',\n hint: 'Try `tabbio chat`, or `tabbio tools --refresh`.',\n exitCode: ExitCode.NotFound,\n });\n }\n const input = { [askInputField(tool.inputSchema)]: question };\n const started = Date.now();\n const clear = startProgress(ctx, mode, 'Asking Tabbio\u2026');\n let response: ToolCallResult;\n try {\n response = await session.callTool(tool.id, input);\n } finally {\n clear();\n }\n if (!response.ok) throw response.error;\n\n let result = response.result;\n let extra: Record<string, unknown> | undefined;\n if (response.approval) {\n const outcome = await handleApproval(ctx, session, tool, response.approval, input, { mode });\n extra = { approval: approvalMeta(outcome) };\n if (!outcome.executed) {\n if (mode === 'json') writeJson(jsonEnvelope(tool, null, { durationMs: Date.now() - started, extra }));\n return;\n }\n result = outcome.result;\n }\n\n if (mode === 'json') {\n writeJson(jsonEnvelope(tool, answerData(result), { durationMs: Date.now() - started, extra }));\n return;\n }\n const text = answerText(result).trimEnd();\n process.stdout.write(text ? `${text}\\n` : '');\n}\n\n/** One question through the chat stream: prints the answer as it arrives. */\nasync function askViaChat(ctx: CommandContext, question: string, mode: OutputMode, agentMode: AgentMode): Promise<void> {\n const started = Date.now();\n const controller = new AbortController();\n const onSigint = () => controller.abort();\n process.on('SIGINT', onSigint);\n const clear = mode === 'json' ? () => undefined : startProgress(ctx, mode, 'Asking Tabbio\u2026');\n let cleared = false;\n let text = '';\n let finishReason: string | undefined;\n let threadId: string | undefined;\n let approval: { approvalId: string; name: string } | undefined;\n let errorMessage: string | undefined;\n let sources: ChatSource[] = [];\n const artifacts = new Map<string, ChatArtifact>();\n const notices: string[] = [];\n try {\n // The profile's saved Research / Image / Result choice (no flags on ask) and the timezone.\n const capabilities = capabilityRequestFields(agentMode, loadCapabilityPrefs(ctx.profile.name));\n const events = streamChat(ctx, { mode: agentMode, message: question, ...capabilities }, { signal: controller.signal });\n for await (const event of events) {\n const payload = (event.payload ?? {}) as Record<string, unknown>;\n switch (event.type) {\n case 'start':\n if (typeof payload.threadId === 'string') threadId = payload.threadId;\n break;\n case 'text-delta': {\n const delta = typeof payload.text === 'string' ? payload.text : '';\n if (!delta) break;\n if (!cleared) {\n clear();\n cleared = true;\n }\n text += delta;\n if (mode !== 'json') process.stdout.write(delta);\n break;\n }\n case 'tool-call-approval':\n approval = { approvalId: String(payload.approvalId ?? ''), name: String(payload.name ?? 'A tool') };\n break;\n case 'tool-result': {\n sources = mergeSources(sources, sourcesFromResult(payload.result));\n const artifact = artifactFromResult(payload.result);\n if (artifact) artifacts.set(artifact.id, artifact);\n const denial = capabilityDenial(payload.result);\n if (denial) notices.push(`${denial.message}${denial.reason ? ` (${denial.reason})` : ''}`);\n break;\n }\n case 'error':\n errorMessage = typeof payload.message === 'string' ? payload.message : 'The agent reported an error';\n break;\n case 'finish':\n if (typeof payload.finishReason === 'string') finishReason = payload.finishReason;\n if (typeof payload.threadId === 'string') threadId = payload.threadId;\n if (!text.trim() && typeof payload.text === 'string') text = payload.text;\n break;\n default:\n break;\n }\n }\n } finally {\n if (!cleared) clear();\n process.off('SIGINT', onSigint);\n }\n if (errorMessage && !text.trim()) {\n throw new CliError({ code: 'AGENT_ERROR', message: errorMessage, exitCode: ExitCode.Server });\n }\n const durationMs = Date.now() - started;\n const files = [...artifacts.values()].map(({ id, kind, title, status }) => ({ id, kind, title, status }));\n if (mode === 'json') {\n writeJson({\n data: {\n text: text.trimEnd(),\n ...(finishReason ? { finishReason } : {}),\n ...(threadId ? { threadId } : {}),\n ...(sources.length ? { sources } : {}),\n ...(files.length ? { artifacts: files } : {}),\n },\n meta: { schemaVersion: 1, tool: 'chat', durationMs, ...(approval ? { approval } : {}) },\n });\n } else {\n if (text && !text.endsWith('\\n')) process.stdout.write('\\n');\n printAskExtras({ sources, files, notices });\n if (approval) {\n process.stderr.write(\n `${theme.warn(`${theme.symbols.pending} ${approval.name} is waiting for your approval`)} ${theme.dim(approval.approvalId)}\\n` +\n `${theme.dim('Run:')} tabbio approvals approve ${approval.approvalId}\\n`,\n );\n }\n }\n if (approval) process.exitCode = ExitCode.ApprovalPending;\n}\n\n/** Sources, files and capability notices after a streamed answer (stdout, plain text). */\nfunction printAskExtras(extras: { sources: ChatSource[]; files: Array<{ id: string; kind: string; title: string; status: string }>; notices: string[] }): void {\n for (const note of extras.notices) process.stderr.write(`${theme.dim(`${theme.symbols.arrowRight} ${note}`)}\\n`);\n if (extras.sources.length) {\n process.stdout.write(`\\n${theme.dim('Sources')}\\n`);\n extras.sources.forEach((source, i) => process.stdout.write(`${i + 1}. ${source.title} ${theme.dim(source.url)}\\n`));\n }\n for (const file of extras.files) {\n process.stdout.write(`${theme.dim(`${file.kind} ${file.status}:`)} ${file.title} ${theme.dim(`tabbio artifacts open ${file.id}`)}\\n`);\n }\n}\n\nexport function registerAskCommand(program: Command): void {\n program\n .command('ask')\n .description('Ask Tabbio one question (streams through your session; MCP ask tool with a personal token)')\n .argument('[question...]', 'Your question; read from stdin when omitted and piped')\n .option('--mode <mode>', 'seeker or employer (app session only)', 'seeker')\n .option('--via-mcp', 'Force the MCP ask_tabbio tool even with an app session')\n .addHelpText(\n 'after',\n '\\nExamples:\\n $ tabbio ask \"What jobs fit my CV?\"\\n $ echo \"Summarise my applications\" | tabbio ask\\n $ tabbio ask \"Draft a headline\" --json',\n )\n .action(async (words: string[], opts: { mode?: string; viaMcp?: boolean }, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const agentMode: AgentMode = opts.mode === 'employer' ? 'employer' : 'seeker';\n try {\n await ask(ctx, words, { mode: agentMode, viaMcp: Boolean(opts.viaMcp) });\n } finally {\n await ctx.close();\n }\n });\n}\n", "import type { AgentMode } from '@tabbio/types';\nimport { type Command, Option } from 'commander';\nimport {\n type ChatCapabilities,\n capabilityRequestFields,\n loadCapabilityPrefs,\n resolveCapabilities,\n saveCapabilityPrefs,\n} from '../core/capabilities';\nimport { type AgentStreamEvent, streamChatFrames } from '../core/chat';\nimport { type CommandContext, createCommandContext } from '../core/context';\nimport { ExitCode, usageError } from '../core/errors';\nimport { assertJwtSession } from '../core/mcp';\nimport { assertInteractive, isInteractiveTerminal } from '../ui/render';\n\ntype ChatOptions = {\n mode: AgentMode;\n company?: string;\n thread?: string;\n model?: string;\n research?: string;\n image?: string;\n result?: string;\n save?: boolean;\n /** Resolved from the saved choice and the flags (set by the action). */\n capabilities?: ChatCapabilities;\n};\n\nasync function readStdin(): Promise<string | undefined> {\n if (process.stdin.isTTY) return undefined;\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n return Buffer.concat(chunks).toString('utf8');\n}\n\n/** True when this event means the turn failed (for the exit code). */\nexport function isFailureEvent(event: AgentStreamEvent): boolean {\n return event.type === 'error' || (event.type === 'finish' && event.payload.finishReason === 'error');\n}\n\n/**\n * Non-interactive chat: one message in, NDJSON stream events out (one\n * `{ type, payload }` object per line, exactly as the server sent them,\n * including event types this CLI does not know, such as #512's\n * `artifact-draft`). Ctrl+C aborts the request and exits 130.\n */\nexport async function runChatNdjson(ctx: CommandContext, message: string | undefined, opts: ChatOptions): Promise<void> {\n const text = (message ?? (await readStdin()))?.trim();\n if (!text) {\n throw usageError('Chat needs a message when it is not interactive', 'Pass it as an argument, or pipe it in: echo \"hi\" | tabbio chat --json');\n }\n const controller = new AbortController();\n const onSigint = () => controller.abort();\n process.on('SIGINT', onSigint);\n let failed = false;\n try {\n const capabilities = opts.capabilities ?? loadCapabilityPrefs(ctx.api.profile.name);\n const frames = streamChatFrames(\n ctx,\n {\n mode: opts.mode,\n message: text,\n threadId: opts.thread,\n modelId: opts.model,\n companyId: opts.company,\n ...capabilityRequestFields(opts.mode, capabilities),\n },\n { signal: controller.signal },\n );\n for await (const frame of frames) {\n process.stdout.write(`${ndjsonLine(frame.data)}\\n`);\n if (frame.event && isFailureEvent(frame.event)) failed = true;\n }\n } finally {\n process.off('SIGINT', onSigint);\n }\n if (failed) process.exitCode = ExitCode.Error;\n}\n\n/** One NDJSON line from an SSE `data` field: the server's JSON, re-serialized onto one line. */\nexport function ndjsonLine(data: string): string {\n try {\n return JSON.stringify(JSON.parse(data));\n } catch {\n return JSON.stringify({ type: 'unparsed', payload: { data } });\n }\n}\n\nexport function registerChatCommand(program: Command): void {\n program\n .command('chat')\n .description('Chat with Tabbio (streaming; interactive on a terminal, NDJSON events with --json or when piped)')\n .argument('[message]', 'First message (non-interactive: the only message; stdin works too)')\n .addOption(new Option('--mode <mode>', 'Workspace').choices(['seeker', 'employer']).default('seeker'))\n .option('--company <id>', 'Company id for employer mode')\n .option('--thread <id>', 'Continue an existing thread')\n .option('--model <id>', \"Model id from the app's picker (default: auto)\")\n .addOption(new Option('--research <mode>', 'Web research for this chat (default: your saved choice, else auto)').choices(['auto', 'on', 'off']))\n .addOption(new Option('--image <mode>', 'Image generation for this chat').choices(['auto', 'on', 'off']))\n .addOption(\n new Option('--result <mode>', 'What to make: an answer, a document, slides, a page or an image').choices([\n 'auto',\n 'summary',\n 'document',\n 'slides',\n 'page',\n 'image',\n ]),\n )\n .option('--save', 'Remember --research/--image/--result for this profile (like /research in the chat)')\n .addHelpText(\n 'after',\n [\n '',\n 'In the chat: /new \u00B7 /threads \u00B7 /mode seeker|employer \u00B7 /model <id> \u00B7 /research \u00B7 /image \u00B7 /result \u00B7 /help \u00B7 /exit',\n 'Research, image and result modes are sent with every message (seeker mode) with your timezone.',\n 'Keys: enter send \u00B7 ctrl+j newline \u00B7 esc interrupt \u00B7 ctrl+o expand tool \u00B7 ctrl+c twice quit',\n '',\n 'Examples:',\n ' $ tabbio chat',\n ' $ tabbio chat \"Find senior product design roles in Dubai\"',\n ` $ tabbio chat --json \"Summarise my CV\" | jq -r 'select(.type==\"text-delta\").payload.text'`,\n ' $ tabbio chat --research on \"Latest UAE labour law changes, with sources\"',\n ' $ tabbio chat --result document \"A one-page brief on my job search\"',\n ].join('\\n'),\n )\n .action(async (message: string | undefined, opts: ChatOptions, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n try {\n assertJwtSession(ctx.credentials, ctx.profile, 'Chat');\n opts.capabilities = resolveCapabilities(loadCapabilityPrefs(ctx.profile.name), opts);\n if (opts.save) saveCapabilityPrefs(ctx.profile.name, opts.capabilities);\n if (ctx.globals.json || !isInteractiveTerminal() || process.env.CI) {\n await runChatNdjson(ctx, message, opts);\n return;\n }\n assertInteractive('Chat');\n const { runChat } = await import('../ui/entry');\n await runChat(ctx, {\n mode: opts.mode,\n companyId: opts.company,\n threadId: opts.thread,\n modelId: opts.model,\n message,\n capabilities: opts.capabilities,\n });\n } finally {\n await ctx.close();\n }\n });\n}\n", "import type { Command, Option } from 'commander';\nimport { usageError } from '../core/errors';\nimport { writeOut } from '../core/io';\n\n/**\n * Shell completion generated from the live commander tree, so catalog\n * commands are included whenever the catalog is cached (see attachCatalog).\n */\n\nexport type CompletionOption = { flags: string[]; long?: string; short?: string; description: string; takesValue: boolean };\nexport type CompletionNode = {\n /** Space-joined path under `tabbio` ('' for the root). */\n path: string;\n name: string;\n description: string;\n children: CompletionNode[];\n options: CompletionOption[];\n};\n\nexport const SHELLS = ['bash', 'zsh', 'fish'] as const;\nexport type Shell = (typeof SHELLS)[number];\n\nfunction isHidden(cmd: Command): boolean {\n // commander keeps the hidden flag private; read it structurally.\n return Boolean((cmd as unknown as { _hidden?: boolean })._hidden);\n}\n\nfunction toOption(option: Option): CompletionOption {\n const flags = [option.long, option.short].filter((f): f is string => Boolean(f));\n return {\n flags,\n long: option.long?.replace(/^--/, ''),\n short: option.short?.replace(/^-/, ''),\n description: option.description ?? '',\n takesValue: Boolean(option.required || option.optional),\n };\n}\n\nexport function buildCompletionTree(program: Command): CompletionNode {\n const walk = (cmd: Command, path: string[]): CompletionNode => {\n const children = cmd.commands.filter((c) => !isHidden(c)).map((c) => walk(c, [...path, c.name()]));\n const options = cmd.options.filter((o) => !o.hidden).map(toOption);\n options.push({ flags: ['--help', '-h'], long: 'help', short: 'h', description: 'Show help', takesValue: false });\n return { path: path.join(' '), name: cmd.name(), description: cmd.description(), children, options };\n };\n const root = walk(program, []);\n if (!root.children.some((c) => c.name === 'help')) {\n root.children.push({ path: 'help', name: 'help', description: 'Show help for a command', children: [], options: [] });\n }\n return root;\n}\n\nfunction flatten(node: CompletionNode): CompletionNode[] {\n return [node, ...node.children.flatMap(flatten)];\n}\n\nconst sq = (value: string) => `'${value.replace(/'/g, `'\\\\''`)}'`;\nconst oneLine = (value: string) => value.replace(/\\s+/g, ' ').trim();\n\nexport function bashScript(root: CompletionNode): string {\n const nodes = flatten(root);\n const paths = nodes.filter((n) => n.path).map((n) => sq(n.path)).join('|');\n const cases = nodes\n .map((n) => {\n const words = [...n.children.map((c) => c.name), ...n.options.flatMap((o) => o.flags)].join(' ');\n return ` ${n.path ? sq(n.path) : \"''\"}) cmdwords=${sq(words)} ;;`;\n })\n .join('\\n');\n return `# tabbio bash completion\n# Install: tabbio completion bash > ~/.local/share/bash-completion/completions/tabbio\n_tabbio() {\n local cur w i cmdpath=\"\" cmdwords=\"\"\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n for ((i=1; i<COMP_CWORD; i++)); do\n w=\"\\${COMP_WORDS[i]}\"\n [[ \"$w\" == -* ]] && continue\n case \"\\${cmdpath:+$cmdpath }$w\" in\n ${paths || \"''\"}) cmdpath=\"\\${cmdpath:+$cmdpath }$w\" ;;\n esac\n done\n case \"$cmdpath\" in\n${cases}\n esac\n COMPREPLY=( $(compgen -W \"$cmdwords\" -- \"$cur\") )\n}\ncomplete -F _tabbio tabbio\n`;\n}\n\nexport function zshScript(root: CompletionNode): string {\n const nodes = flatten(root);\n const paths = nodes.filter((n) => n.path).map((n) => sq(n.path)).join('|');\n const escapeName = (value: string) => value.replace(/:/g, '\\\\:');\n const cases = nodes\n .map((n) => {\n const subs = n.children.map((c) => sq(`${escapeName(c.name)}:${oneLine(c.description)}`)).join(' ');\n const opts = n.options.flatMap((o) => o.flags).map(sq).join(' ');\n return ` ${n.path ? sq(n.path) : \"''\"}) subcmds=(${subs}); opts=(${opts}) ;;`;\n })\n .join('\\n');\n return `#compdef tabbio\n# tabbio zsh completion\n# Install: tabbio completion zsh > \"\\${fpath[1]}/_tabbio\" (or: eval \"$(tabbio completion zsh)\")\n_tabbio() {\n local cmdpath=\"\" w i\n local -a subcmds opts\n for ((i=2; i<CURRENT; i++)); do\n w=\"\\${words[i]}\"\n [[ \"$w\" == -* ]] && continue\n case \"\\${cmdpath:+$cmdpath }$w\" in\n ${paths || \"''\"}) cmdpath=\"\\${cmdpath:+$cmdpath }$w\" ;;\n esac\n done\n case \"$cmdpath\" in\n${cases}\n esac\n if [[ \"\\${words[CURRENT]}\" == -* ]]; then\n compadd -- \"\\${opts[@]}\"\n else\n _describe -t commands 'tabbio command' subcmds\n fi\n}\nif [[ \"\\${funcstack[1]}\" == \"_tabbio\" ]]; then\n _tabbio \"$@\"\nelse\n compdef _tabbio tabbio\nfi\n`;\n}\n\nexport function fishScript(root: CompletionNode): string {\n const nodes = flatten(root);\n const fq = (value: string) => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n const lines: string[] = [\n '# tabbio fish completion',\n '# Install: tabbio completion fish > ~/.config/fish/completions/tabbio.fish',\n `set -g __tabbio_paths ${nodes.filter((n) => n.path).map((n) => fq(n.path)).join(' ')}`,\n 'function __tabbio_cmdpath',\n ' set -l tokens (commandline -opc)',\n ' set -l cmdpath',\n ' for t in $tokens[2..-1]',\n \" if string match -q -- '-*' $t\",\n ' continue',\n ' end',\n \" set -l candidate (string join ' ' $cmdpath $t)\",\n ' if contains -- $candidate $__tabbio_paths',\n ' set cmdpath $cmdpath $t',\n ' end',\n ' end',\n \" string join ' ' $cmdpath\",\n 'end',\n 'function __tabbio_is',\n ' set -l current (__tabbio_cmdpath)',\n ' test \"$current\" = \"$argv[1]\"',\n 'end',\n 'complete -c tabbio -f',\n ];\n for (const node of nodes) {\n const condition = `-n ${fq(`__tabbio_is ${fq(node.path)}`)}`;\n for (const child of node.children) {\n lines.push(`complete -c tabbio ${condition} -a ${fq(child.name)} -d ${fq(oneLine(child.description))}`);\n }\n for (const option of node.options) {\n const parts = [\n option.long ? `-l ${option.long}` : '',\n option.short ? `-s ${option.short}` : '',\n option.takesValue ? '-r' : '',\n ].filter(Boolean);\n if (parts.length === 0) continue;\n lines.push(`complete -c tabbio ${condition} ${parts.join(' ')} -d ${fq(oneLine(option.description))}`);\n }\n }\n return `${lines.join('\\n')}\\n`;\n}\n\nexport function completionScript(shell: string, program: Command): string {\n const tree = buildCompletionTree(program);\n switch (shell) {\n case 'bash':\n return bashScript(tree);\n case 'zsh':\n return zshScript(tree);\n case 'fish':\n return fishScript(tree);\n default:\n throw usageError(`Unsupported shell \"${shell}\"`, `Choose one of: ${SHELLS.join(', ')}`);\n }\n}\n\nexport function registerCompletionCommand(program: Command): void {\n program\n .command('completion')\n .description('Print a shell completion script (bash, zsh or fish)')\n .argument('<shell>', SHELLS.join(' | '))\n .addHelpText(\n 'after',\n '\\nExamples:\\n $ tabbio completion zsh > \"${fpath[1]}/_tabbio\"\\n $ tabbio completion bash > ~/.local/share/bash-completion/completions/tabbio\\n $ tabbio completion fish > ~/.config/fish/completions/tabbio.fish',\n )\n .action((shell: string, _opts: unknown, cmd: Command) => {\n let root: Command = cmd;\n while (root.parent) root = root.parent;\n writeOut(completionScript(shell, root).trimEnd());\n });\n}\n", "import type { Command } from 'commander';\nimport {\n DEFAULT_PROFILE,\n PROFILE_PRESETS,\n assertProfileName,\n configPaths,\n listProfileNames,\n loadConfig,\n normalizeBaseUrl,\n resolveProfileWithSources,\n updateConfig,\n} from '../core/config';\nimport { createCommandContext } from '../core/context';\nimport { listCredentialProfiles, loadStoredCredentials } from '../core/credentials';\nimport { usageError } from '../core/errors';\nimport { type KvRow, printJson, printKeyValues, successLine, writeOut } from '../core/io';\nimport { theme } from '../ui/theme';\n\n/** Keys accepted by `tabbio config get|set|unset`. */\nexport const CONFIG_KEYS = {\n profile: 'Current profile used when --profile / TABBIO_PROFILE are not set',\n 'api-url': 'API base URL for the profile',\n 'app-url': 'Web app URL for the profile (browser sign-in)',\n 'mcp-url': 'MCP endpoint for the profile (default: <api-url>/api/mcp)',\n 'update-check': 'Check npm for a newer CLI once a day (true/false)',\n} as const;\n\nexport type ConfigKey = keyof typeof CONFIG_KEYS;\n\nfunction assertKey(key: string): ConfigKey {\n if (key in CONFIG_KEYS) return key as ConfigKey;\n throw usageError(`Unknown config key \"${key}\"`, `Known keys: ${Object.keys(CONFIG_KEYS).join(', ')}`);\n}\n\nconst PROFILE_FIELD: Record<'api-url' | 'app-url' | 'mcp-url', 'apiUrl' | 'appUrl' | 'mcpUrl'> = {\n 'api-url': 'apiUrl',\n 'app-url': 'appUrl',\n 'mcp-url': 'mcpUrl',\n};\n\nfunction parseBoolean(value: string): boolean {\n const normalized = value.trim().toLowerCase();\n if (['true', '1', 'yes', 'on'].includes(normalized)) return true;\n if (['false', '0', 'no', 'off'].includes(normalized)) return false;\n throw usageError(`Expected true or false, got \"${value}\"`);\n}\n\n/** Effective values with their source, for `config list` / `config get`. */\nexport function effectiveConfig(opts: { profile?: string; apiUrl?: string; appUrl?: string }) {\n const { profile, sources } = resolveProfileWithSources(opts);\n const config = loadConfig();\n return {\n profile: { value: profile.name, source: sources.name },\n 'api-url': { value: profile.apiUrl, source: sources.apiUrl },\n 'app-url': { value: profile.appUrl, source: sources.appUrl },\n 'mcp-url': { value: profile.mcpUrl, source: sources.mcpUrl },\n 'update-check': { value: config.updateCheck !== false, source: config.updateCheck === undefined ? 'default' : 'config' },\n } satisfies Record<ConfigKey, { value: string | boolean; source: string }>;\n}\n\nfunction registerConfig(program: Command): Command {\n const config = program.command('config').description('Read and change CLI settings');\n\n config\n .command('list')\n .description('Show effective settings and where each comes from')\n .action((_opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const values = effectiveConfig(ctx.globals);\n if (ctx.globals.json) {\n printJson({ ...values, paths: configPaths() });\n return;\n }\n const rows: KvRow[] = Object.entries(values).map(([key, entry]) => [\n key,\n `${String(entry.value)} ${theme.dim(`(${entry.source})`)}`,\n ]);\n rows.push(['config dir', configPaths().dir]);\n printKeyValues(rows);\n });\n\n config\n .command('get')\n .description('Print one setting')\n .argument('<key>', `One of: ${Object.keys(CONFIG_KEYS).join(', ')}`)\n .action((key: string, _opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const entry = effectiveConfig(ctx.globals)[assertKey(key)];\n if (ctx.globals.json) printJson({ key, ...entry });\n else writeOut(String(entry.value));\n });\n\n config\n .command('set')\n .description('Change a setting (profile-scoped keys apply to --profile or the current profile)')\n .argument('<key>', `One of: ${Object.keys(CONFIG_KEYS).join(', ')}`)\n .argument('<value>')\n .action((rawKey: string, value: string, _opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const key = assertKey(rawKey);\n const profileName = ctx.profile.name;\n updateConfig((c) => {\n if (key === 'profile') c.currentProfile = assertProfileName(value);\n else if (key === 'update-check') c.updateCheck = parseBoolean(value);\n else {\n const label = key === 'mcp-url' ? 'MCP URL' : key === 'api-url' ? 'API URL' : 'App URL';\n c.profiles[profileName] = { ...c.profiles[profileName], [PROFILE_FIELD[key]]: normalizeBaseUrl(value, label) };\n }\n });\n if (ctx.globals.json) printJson({ key, value: effectiveConfig({ profile: key === 'profile' ? value : profileName })[key].value });\n else writeOut(successLine(`Set ${key}${key in PROFILE_FIELD ? ` for profile ${profileName}` : ''}`));\n });\n\n config\n .command('unset')\n .description('Reset a setting to its default')\n .argument('<key>', `One of: ${Object.keys(CONFIG_KEYS).join(', ')}`)\n .action((rawKey: string, _opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const key = assertKey(rawKey);\n updateConfig((c) => {\n if (key === 'profile') delete c.currentProfile;\n else if (key === 'update-check') delete c.updateCheck;\n else {\n const current = { ...c.profiles[ctx.profile.name] };\n delete current[PROFILE_FIELD[key]];\n c.profiles[ctx.profile.name] = current;\n }\n });\n if (ctx.globals.json) printJson({ key, unset: true });\n else writeOut(successLine(`Reset ${key}`));\n });\n\n config\n .command('path')\n .description('Print the config, credentials and cache locations')\n .action((_opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const paths = configPaths();\n if (ctx.globals.json) printJson(paths);\n else printKeyValues([\n ['config', paths.configFile],\n ['credentials', paths.credentialsFile],\n ['cache', paths.cacheDir],\n ]);\n });\n\n return config;\n}\n\n/**\n * Lives under `config` (not top-level `profile`) so the product's `profile.*`\n * tools keep the short `tabbio profile get|update \u2026` commands.\n */\nfunction registerProfile(config: Command): void {\n const profile = config.command('profile').description('Manage named profiles (e.g. production, local)');\n\n profile\n .command('list')\n .description('List profiles')\n .action((_opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const names = Array.from(new Set([...listProfileNames(), ...listCredentialProfiles()])).sort();\n const rows = names.map((name) => {\n const { profile: resolved } = resolveProfileWithSources({ profile: name });\n const creds = loadStoredCredentials(name);\n return {\n name,\n current: name === ctx.profile.name,\n apiUrl: resolved.apiUrl,\n signedIn: Boolean(creds?.accessToken || creds?.mcpToken),\n user: creds?.user?.email ?? null,\n };\n });\n if (ctx.globals.json) {\n printJson(rows);\n return;\n }\n for (const row of rows) {\n const marker = row.current ? theme.accent(theme.symbols.dot) : ' ';\n const who = row.signedIn ? (row.user ?? 'token') : theme.dim('signed out');\n writeOut(`${marker} ${row.name.padEnd(14)} ${who} ${theme.dim(row.apiUrl)}`);\n }\n });\n\n profile\n .command('use')\n .description('Make a profile the default')\n .argument('<name>')\n .action((name: string, _opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const profileName = assertProfileName(name);\n const known = new Set([...listProfileNames(), ...listCredentialProfiles(), ...Object.keys(PROFILE_PRESETS)]);\n if (!known.has(profileName)) {\n throw usageError(`No profile named \"${profileName}\"`, `Create it with \\`tabbio config profile add ${profileName} --api-url \u2026\\`.`);\n }\n updateConfig((c) => {\n if (profileName === DEFAULT_PROFILE) delete c.currentProfile;\n else c.currentProfile = profileName;\n });\n if (ctx.globals.json) printJson({ current: profileName });\n else writeOut(successLine(`Now using profile ${profileName}`));\n });\n\n profile\n .command('add')\n .description('Create or update a profile')\n .argument('<name>')\n .option('--api-url <url>', 'API base URL')\n .option('--app-url <url>', 'Web app URL (browser sign-in)')\n .option('--mcp-url <url>', 'MCP endpoint (default: <api-url>/api/mcp)')\n .action((name: string, opts: { apiUrl?: string; appUrl?: string; mcpUrl?: string }, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const profileName = assertProfileName(name);\n // Local options shadow the global --api-url/--app-url, so read both.\n const local = cmd.opts<{ apiUrl?: string; appUrl?: string; mcpUrl?: string }>();\n const apiUrl = local.apiUrl ?? opts.apiUrl ?? ctx.globals.apiUrl;\n const appUrl = local.appUrl ?? opts.appUrl ?? ctx.globals.appUrl;\n const mcpUrl = local.mcpUrl ?? opts.mcpUrl;\n if (!apiUrl && !PROFILE_PRESETS[profileName]) {\n throw usageError('A new profile needs --api-url', 'Example: tabbio config profile add staging --api-url https://\u2026 --app-url https://\u2026');\n }\n updateConfig((c) => {\n c.profiles[profileName] = {\n ...c.profiles[profileName],\n ...(apiUrl ? { apiUrl: normalizeBaseUrl(apiUrl, 'API URL') } : {}),\n ...(appUrl ? { appUrl: normalizeBaseUrl(appUrl, 'App URL') } : {}),\n ...(mcpUrl ? { mcpUrl: normalizeBaseUrl(mcpUrl, 'MCP URL') } : {}),\n };\n });\n const { profile: resolved } = resolveProfileWithSources({ profile: profileName });\n if (ctx.globals.json) printJson(resolved);\n else writeOut(successLine(`Saved profile ${profileName} (${resolved.apiUrl})`));\n });\n\n profile\n .command('remove')\n .description('Delete a profile from the config (sign out of it first)')\n .argument('<name>')\n .action((name: string, _opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const profileName = assertProfileName(name);\n if (loadStoredCredentials(profileName)) {\n throw usageError(\n `Profile \"${profileName}\" is still signed in`,\n `Run \\`tabbio logout --profile ${profileName}\\` first so its tokens are revoked.`,\n );\n }\n updateConfig((c) => {\n delete c.profiles[profileName];\n if (c.currentProfile === profileName) delete c.currentProfile;\n });\n if (ctx.globals.json) printJson({ removed: profileName });\n else writeOut(successLine(`Removed profile ${profileName}`));\n });\n}\n\nexport function registerConfigCommands(program: Command): void {\n const config = registerConfig(program);\n registerProfile(config);\n}\n", "import type { Command } from 'commander';\nimport { configPaths } from '../core/config';\nimport { type CommandContext, createCommandContext } from '../core/context';\nimport { credentialPermissionIssues } from '../core/credentials';\nimport { ExitCode } from '../core/errors';\nimport { ApiClient, readRequestId } from '../core/http';\nimport { printJson, writeOut } from '../core/io';\nimport { McpSession } from '../core/mcp';\nimport { mcpSummary } from './status';\nimport { CLI_VERSION } from '../core/version';\nimport { theme } from '../ui/theme';\n\nexport type CheckStatus = 'ok' | 'warn' | 'fail' | 'skip';\nexport type DoctorCheck = { name: string; status: CheckStatus; detail: string; hint?: string };\n\nconst MAX_CLOCK_SKEW_MS = 2 * 60 * 1000;\n\nexport function checkNodeVersion(version = process.versions.node): DoctorCheck {\n const major = Number.parseInt(version.split('.')[0] ?? '0', 10);\n return major >= 20\n ? { name: 'Node.js', status: 'ok', detail: `v${version}` }\n : { name: 'Node.js', status: 'fail', detail: `v${version}`, hint: 'Tabbio CLI needs Node.js 20 or newer.' };\n}\n\nfunction checkPermissions(): DoctorCheck {\n const issues = credentialPermissionIssues();\n return issues.length === 0\n ? { name: 'Credential store', status: 'ok', detail: `${configPaths().dir} (private)` }\n : {\n name: 'Credential store',\n status: 'fail',\n detail: issues.join('; '),\n hint: `Run: chmod 700 \"${configPaths().dir}\" && chmod 600 \"${configPaths().credentialsFile}\"`,\n };\n}\n\nasync function checkApi(ctx: CommandContext): Promise<DoctorCheck[]> {\n const started = Date.now();\n const api = new ApiClient(ctx.profile, null, { persist: false });\n try {\n const response = await api.raw('/api/health', { auth: 'none', timeoutMs: 10_000 });\n const latency = Date.now() - started;\n const body = (await response.json().catch(() => null)) as { data?: { commitSha?: string | null } } | null;\n const checks: DoctorCheck[] = [\n {\n name: 'API health',\n status: response.ok ? 'ok' : 'fail',\n detail: `${ctx.profile.apiUrl} \u2192 HTTP ${response.status} in ${latency}ms${\n body?.data?.commitSha ? ` \u00B7 ${body.data.commitSha.slice(0, 7)}` : ''\n }${readRequestId(response.headers) ? ` \u00B7 req ${readRequestId(response.headers)}` : ''}`,\n },\n ];\n const serverDate = response.headers.get('date');\n if (serverDate) {\n const skew = Date.parse(serverDate) - (started + latency / 2);\n checks.push(\n Math.abs(skew) > MAX_CLOCK_SKEW_MS\n ? {\n name: 'Clock',\n status: 'warn',\n detail: `local clock is ${Math.round(Math.abs(skew) / 1000)}s ${skew > 0 ? 'behind' : 'ahead of'} the server`,\n hint: 'Token expiry checks may misfire; sync your system clock.',\n }\n : { name: 'Clock', status: 'ok', detail: `within ${Math.round(Math.abs(skew) / 1000)}s of the server` },\n );\n }\n return checks;\n } catch (error) {\n return [\n {\n name: 'API health',\n status: 'fail',\n detail: `${ctx.profile.apiUrl}: ${(error as Error).message}`,\n hint: 'Check your network or the API URL (`tabbio config get api-url`).',\n },\n ];\n }\n}\n\nasync function checkSession(ctx: CommandContext): Promise<DoctorCheck> {\n if (!ctx.credentials?.accessToken) {\n return { name: 'Session (JWT)', status: 'skip', detail: 'no app session (MCP-only or signed out)' };\n }\n try {\n const me = await ctx.api.json<{ email?: string }>('/api/users/me');\n return { name: 'Session (JWT)', status: 'ok', detail: `valid${me?.email ? ` for ${me.email}` : ''}` };\n } catch (error) {\n return {\n name: 'Session (JWT)',\n status: 'fail',\n detail: (error as Error).message,\n hint: 'Run `tabbio login`.',\n };\n }\n}\n\nasync function checkMcp(ctx: CommandContext): Promise<DoctorCheck> {\n const creds = ctx.api.credentials ?? ctx.credentials;\n const via = mcpSummary(creds);\n if (!via) return { name: 'MCP', status: 'skip', detail: 'not signed in', hint: 'Run `tabbio login`.' };\n const started = Date.now();\n let session: McpSession | null = null;\n try {\n session = await McpSession.connect(ctx.profile, creds, { api: ctx.api });\n const tools = await session.listTools({ refresh: true });\n return {\n name: 'MCP',\n status: tools.length > 0 ? 'ok' : 'warn',\n detail: `${ctx.profile.mcpUrl} \u2192 ${tools.length} tools in ${Date.now() - started}ms via ${via.label}`,\n };\n } catch (error) {\n return {\n name: 'MCP',\n status: 'fail',\n detail: `${(error as Error).message} (via ${via.label})`,\n hint: (error as { hint?: string }).hint,\n };\n } finally {\n await session?.close();\n }\n}\n\nconst SYMBOL: Record<CheckStatus, () => string> = {\n ok: () => theme.success(theme.symbols.success),\n warn: () => theme.warn(theme.symbols.warning),\n fail: () => theme.error(theme.symbols.error),\n skip: () => theme.dim('-'),\n};\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Diagnose Node, config permissions, API reachability, clock skew, session and MCP')\n .action(async (_opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const checks: DoctorCheck[] = [\n { name: 'Tabbio CLI', status: 'ok', detail: `v${CLI_VERSION} \u00B7 profile ${ctx.profile.name}` },\n checkNodeVersion(),\n checkPermissions(),\n ...(await checkApi(ctx)),\n await checkSession(ctx),\n await checkMcp(ctx),\n ];\n const failed = checks.some((check) => check.status === 'fail');\n\n if (ctx.globals.json) {\n printJson({ ok: !failed, checks });\n } else {\n const width = Math.max(...checks.map((c) => c.name.length));\n for (const check of checks) {\n writeOut(`${SYMBOL[check.status]()} ${check.name.padEnd(width)} ${theme.dim(check.detail)}`);\n if (check.hint && check.status !== 'ok') writeOut(` ${' '.repeat(width)} ${check.hint}`);\n }\n }\n if (failed) process.exitCode = ExitCode.Error;\n });\n}\n", "import { setHomeHandler } from '../program';\n\n/**\n * Bare `tabbio` on an interactive terminal opens the home screen. Off a TTY,\n * in CI or with --json, program.ts never calls the handler and prints help.\n */\nexport function registerHome(): void {\n setHomeHandler(async (ctx) => {\n const { runHome } = await import('../ui/entry');\n await runHome(ctx);\n });\n}\n", "import type { Command } from 'commander';\nimport type { CatalogTool } from '../core/catalog';\nimport { createCommandContext } from '../core/context';\nimport { addRunLevelOptions, addToolOptions, runTool, type RunToolOptions } from '../core/run-tool';\nimport { exampleInvocation } from '../core/schema-flags';\n\n/**\n * Catalog-generated commands: `tabbio <group> <action>` for every visible\n * catalog tool (e.g. `tabbio cv list`, `tabbio career-highlight upsert`).\n *\n * Called at most once per process, before parsing, and only when argv needs\n * it (see `attachCatalog` in src/program.ts). It does no I/O: the catalog is\n * already loaded. Skipped here:\n * - hidden tools (`mcp.approvalStatus`, surfaced by `tabbio approvals`)\n * - workflows (`tabbio workflows run <key>`) and agents (`tabbio ask`)\n * - groups named like a static command (`profile`, `mcp`, \u2026); those tools\n * stay reachable through `tabbio run <tool.id>`\n */\n\n/** Top-level names owned by static commands (present or planned). */\nexport const STATIC_COMMAND_NAMES: ReadonlySet<string> = new Set([\n 'login',\n 'logout',\n 'status',\n 'whoami',\n 'doctor',\n 'config',\n 'mcp',\n 'completion',\n 'tools',\n 'run',\n 'workflows',\n 'approvals',\n 'artifacts',\n 'ask',\n 'chat',\n 'help',\n]);\n\nexport const TOOL_COMMANDS_HELP_GROUP = 'Tool commands:';\n\n/** `[group, action]` when the tool gets a generated command, else null. */\nexport function generatedCommandPath(tool: CatalogTool): [string, string] | null {\n if (tool.hidden || tool.kind !== 'tool' || tool.commandPath.length < 2) return null;\n const [group, action] = tool.commandPath as [string, string];\n if (!group || !action || STATIC_COMMAND_NAMES.has(group)) return null;\n return [group, action];\n}\n\n/** How a user invokes a tool from the shell, e.g. ['cv','list'] or ['run','profile.update']. */\nexport function invocationPath(tool: CatalogTool): string[] {\n if (tool.kind === 'agent') return tool.commandPath.length === 1 ? tool.commandPath : ['run', tool.id];\n if (tool.kind === 'workflow') return ['workflows', 'run', tool.action];\n return generatedCommandPath(tool) ?? ['run', tool.id];\n}\n\nexport function invocation(tool: CatalogTool): string {\n return `tabbio ${invocationPath(tool).join(' ')}`;\n}\n\nfunction toolHelpText(tool: CatalogTool): string {\n const lines = ['', 'Example:', ` $ ${exampleInvocation(tool, tool.inputSchema)}`, ''];\n lines.push(`Tool: ${tool.id}${tool.readOnly ? ' (read-only)' : ' (writes; may need approval)'}`);\n return lines.join('\\n');\n}\n\nexport function registerGeneratedCommands(program: Command, catalog: CatalogTool[]): void {\n const taken = new Set(program.commands.flatMap((c) => [c.name(), ...c.aliases()]));\n const groups = new Map<string, Command>();\n const counts = new Map<string, number>();\n\n for (const tool of catalog) {\n const path = generatedCommandPath(tool);\n if (!path) continue;\n const [group, action] = path;\n let groupCmd = groups.get(group);\n if (!groupCmd) {\n if (taken.has(group)) continue; // a static command registered later than this list knows\n groupCmd = program.command(group).helpGroup(TOOL_COMMANDS_HELP_GROUP);\n groups.set(group, groupCmd);\n }\n if (groupCmd.commands.some((c) => c.name() === action)) continue;\n counts.set(group, (counts.get(group) ?? 0) + 1);\n\n const cmd = groupCmd\n .command(action)\n .summary(tool.title)\n .description(tool.description || tool.title)\n .allowUnknownOption()\n .allowExcessArguments()\n .addHelpText('after', () => toolHelpText(tool));\n addToolOptions(cmd, tool);\n addRunLevelOptions(cmd);\n cmd.action(async (opts: RunToolOptions, command: Command) => {\n const ctx = createCommandContext(command);\n try {\n await runTool(ctx, tool, opts, command.args);\n } finally {\n await ctx.close();\n }\n });\n }\n\n for (const [group, cmd] of groups) {\n const n = counts.get(group) ?? 0;\n cmd.description(`${n} ${group} ${n === 1 ? 'tool' : 'tools'}`);\n }\n}\n", "import type { Command } from 'commander';\nimport open from 'open';\nimport {\n chooseLoginMethod,\n credentialsFromLogin,\n hasDisplay,\n loginWithBrowser,\n loginWithEmailOtp,\n revokeSession,\n} from '../core/auth';\nimport { type Profile, type ResolvedProfile, updateConfig } from '../core/config';\nimport { type CommandContext, createCommandContext } from '../core/context';\nimport { fingerprint, loadStoredCredentials, saveCredentials } from '../core/credentials';\nimport { usageError } from '../core/errors';\nimport { ApiClient, type TokenPayload } from '../core/http';\nimport { printJson, successLine, writeOut } from '../core/io';\nimport { McpSession, clearCatalogCache } from '../core/mcp';\nimport { promptLine, promptSecret } from '../core/prompt';\nimport { debug, deviceLabel, info, warn } from '../core/runtime';\nimport { theme } from '../ui/theme';\n\ntype LoginOptions = {\n browser?: boolean;\n email?: string;\n token?: string;\n withToken?: boolean;\n nonInteractive?: boolean;\n};\n\n/** `--with-token`: the whole of stdin is the token (e.g. `tabbio login --with-token < token.txt`). */\nexport async function readTokenFromStdin(stdin: NodeJS.ReadStream = process.stdin): Promise<string> {\n if (stdin.isTTY) {\n throw usageError('--with-token reads the token from stdin', 'Pipe it in: `tabbio login --with-token < token.txt`.');\n }\n const chunks: Buffer[] = [];\n for await (const chunk of stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n const token = Buffer.concat(chunks).toString('utf8').trim();\n if (!token) throw usageError('No token on stdin');\n return token;\n}\n\n/** Saves --api-url / --app-url given on the command line into the profile. */\nexport function persistProfileUrls(profile: Profile, sources: ResolvedProfile['sources']): void {\n if (sources.apiUrl !== 'flag' && sources.appUrl !== 'flag') return;\n updateConfig((config) => {\n const current = config.profiles[profile.name] ?? {};\n config.profiles[profile.name] = {\n ...current,\n ...(sources.apiUrl === 'flag' ? { apiUrl: profile.apiUrl } : {}),\n ...(sources.appUrl === 'flag' ? { appUrl: profile.appUrl } : {}),\n };\n });\n}\n\n/** Best effort: end the profile's previous server session after a new sign-in. */\nasync function revokePrevious(profile: Profile, refreshToken: string | undefined, keep?: string): Promise<void> {\n if (!refreshToken || refreshToken === keep) return;\n await revokeSession(new ApiClient(profile, null, { persist: false }), refreshToken).catch((error: Error) =>\n debug(`previous session not revoked: ${error.message}`),\n );\n}\n\n/** `--token` / `--with-token`: MCP-only mode with a user-created personal token. */\nasync function loginWithToken(ctx: CommandContext, rawToken: string): Promise<void> {\n const token = rawToken.trim();\n if (!token.startsWith('tabbio_mcp_')) {\n warn('This is not a tabbio_mcp_ token; treating it as an OAuth access token.');\n }\n const probe = { profile: ctx.profile.name, mcpToken: token };\n const session = await McpSession.connect(ctx.profile, probe);\n let toolCount = 0;\n try {\n toolCount = (await session.listTools({ refresh: true })).length;\n } finally {\n await session.close();\n }\n\n const previous = loadStoredCredentials(ctx.profile.name);\n saveCredentials(probe);\n persistProfileUrls(ctx.profile, ctx.sources);\n await revokePrevious(ctx.profile, previous?.refreshToken);\n\n if (ctx.globals.json) {\n printJson({\n profile: ctx.profile.name,\n method: 'token',\n user: null,\n mcp: { kind: 'personal-token', token: fingerprint(token) },\n tools: toolCount,\n });\n return;\n }\n writeOut(successLine(`Token accepted \u00B7 ${toolCount} tools available \u00B7 profile ${ctx.profile.name}`));\n writeOut(theme.dim(' MCP-only mode: `tabbio chat` and approving actions need `tabbio login` (browser or --email).'));\n}\n\nasync function obtainSession(ctx: CommandContext, method: 'browser' | 'email', opts: LoginOptions): Promise<TokenPayload> {\n const api = new ApiClient(ctx.profile, null, { persist: false });\n if (method === 'email') {\n const email = opts.email?.trim() || (await promptLine('Email: '));\n info(`Sending a sign-in code to ${email}\u2026`);\n return loginWithEmailOtp(api, {\n email,\n promptCode: (attempt) => promptSecret(attempt === 1 ? 'Enter the 6-digit code: ' : 'Try the code again: '),\n onInvalidCode: (left) => warn(`That code did not match. ${left} attempt${left === 1 ? '' : 's'} left.`),\n });\n }\n\n const agentMode = Boolean(opts.nonInteractive);\n if (!agentMode) info(`Connecting this computer (${deviceLabel()}) to Tabbio\u2026`);\n const controller = new AbortController();\n const onSigint = () => controller.abort();\n process.once('SIGINT', onSigint);\n try {\n return await loginWithBrowser(api, {\n device: deviceLabel(),\n signal: controller.signal,\n openUrl: async (url) => {\n if (agentMode) return false;\n try {\n await open(url);\n return true;\n } catch {\n return false;\n }\n },\n onWaiting: (url, opened, details) => {\n if (agentMode) {\n // One JSON line for the calling agent; the result line follows on completion.\n printJson({ url, state: details.state, expiresAt: details.expiresAt });\n return;\n }\n info(opened ? theme.dim('If your browser did not open, visit:') : 'Open this URL to continue:');\n info(` ${theme.accent(url)}`);\n info(theme.dim('Waiting for you to approve in the browser\u2026 (Ctrl-C to cancel)'));\n },\n });\n } finally {\n process.off('SIGINT', onSigint);\n }\n}\n\nasync function runLogin(opts: LoginOptions, cmd: Command): Promise<void> {\n const ctx = createCommandContext(cmd);\n if (opts.nonInteractive) ctx.globals.json = true;\n const method = chooseLoginMethod({\n browser: opts.browser,\n email: opts.email,\n token: opts.token,\n withToken: opts.withToken,\n nonInteractive: opts.nonInteractive,\n isTTY: Boolean(process.stdin.isTTY && process.stderr.isTTY),\n hasDisplay: hasDisplay(),\n });\n if (method === 'token') {\n return loginWithToken(ctx, opts.withToken ? await readTokenFromStdin() : (opts.token ?? ''));\n }\n\n const previous = loadStoredCredentials(ctx.profile.name);\n const payload = await obtainSession(ctx, method, opts);\n // The app session also authenticates MCP; any stored personal token is dropped.\n const creds = credentialsFromLogin(ctx.profile, payload);\n saveCredentials(creds);\n clearCatalogCache(ctx.profile);\n persistProfileUrls(ctx.profile, ctx.sources);\n await revokePrevious(ctx.profile, previous?.refreshToken, payload.refreshToken);\n\n if (ctx.globals.json) {\n printJson({\n profile: ctx.profile.name,\n method,\n apiUrl: ctx.profile.apiUrl,\n user: creds.user ?? null,\n mcp: { kind: 'app-session' },\n });\n return;\n }\n const who = creds.user?.name ? `${creds.user.name} <${creds.user.email}>` : (creds.user?.email ?? 'your account');\n writeOut(successLine(`Signed in as ${theme.bold(who)} \u00B7 profile ${ctx.profile.name}`));\n if (process.env.TABBIO_TOKEN) {\n warn('TABBIO_TOKEN is set, so tool commands keep using that personal token.');\n }\n writeOut(theme.dim(' Next: tabbio status \u00B7 tabbio tools \u00B7 tabbio chat'));\n}\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Sign in (browser by default; --email for SSH/headless; --token for MCP-only)')\n .option('--browser', 'Approve this computer in your browser')\n .option('--email <address>', 'Sign in with a one-time code sent to this email')\n .option('--token <token>', 'Use a personal MCP token (tabbio_mcp_\u2026); tool commands only')\n .option('--with-token', 'Read a personal MCP token from stdin (CI)')\n .option(\n '--non-interactive',\n 'For agents: print {\"url\",\"state\",\"expiresAt\"} as JSON, wait for the browser approval, never prompt',\n )\n .addHelpText(\n 'after',\n '\\nThe browser flow opens <app-url>/cli/connect and receives the session on 127.0.0.1.\\n' +\n 'Environment: TABBIO_TOKEN / TABBIO_ACCESS_TOKEN override stored credentials (never saved).',\n )\n .action(async (opts: LoginOptions, cmd: Command) => runLogin(opts, cmd));\n}\n", "import type { Command } from 'commander';\nimport { logoutProfile } from '../core/auth';\nimport { resolveProfile } from '../core/config';\nimport { createCommandContext } from '../core/context';\nimport { listCredentialProfiles, loadStoredCredentials } from '../core/credentials';\nimport { printJson, successLine, writeOut } from '../core/io';\nimport { warn } from '../core/runtime';\nimport { theme } from '../ui/theme';\n\ntype LogoutResult = {\n profile: string;\n signedOut: boolean;\n revokedSession: boolean;\n warnings: string[];\n};\n\nasync function logoutOne(name: string, apiUrl?: string, appUrl?: string): Promise<LogoutResult> {\n const profile = resolveProfile({ profile: name, apiUrl, appUrl });\n const creds = loadStoredCredentials(profile.name);\n if (!creds) {\n return { profile: profile.name, signedOut: false, revokedSession: false, warnings: [] };\n }\n const result = await logoutProfile(profile, creds);\n return { profile: profile.name, signedOut: true, ...result };\n}\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Sign out: end the session on the server and delete local credentials')\n .option('--all', 'Sign out of every profile')\n .action(async (opts: { all?: boolean }, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const names = opts.all ? listCredentialProfiles() : [ctx.profile.name];\n const results: LogoutResult[] = [];\n for (const name of names) {\n // Only the selected profile honors --api-url; --all uses each profile's own URLs.\n results.push(\n await logoutOne(name, opts.all ? undefined : ctx.globals.apiUrl, opts.all ? undefined : ctx.globals.appUrl),\n );\n }\n const envNote =\n process.env.TABBIO_TOKEN || process.env.TABBIO_ACCESS_TOKEN\n ? 'TABBIO_TOKEN / TABBIO_ACCESS_TOKEN is still set in your environment.'\n : undefined;\n\n if (ctx.globals.json) {\n printJson({ results, ...(envNote ? { note: envNote } : {}) });\n return;\n }\n if (results.length === 0 || results.every((r) => !r.signedOut)) {\n writeOut(theme.dim(opts.all ? 'No stored sign-ins.' : `Not signed in (profile ${ctx.profile.name}).`));\n }\n for (const result of results.filter((r) => r.signedOut)) {\n for (const warning of result.warnings) warn(warning);\n writeOut(successLine(`Signed out of profile ${result.profile}`));\n }\n if (envNote) warn(envNote);\n });\n}\n", "import type { Command } from 'commander';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n type CallToolResult,\n ListToolsRequestSchema,\n type Tool,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { createCommandContext } from '../core/context';\nimport { redactSecrets } from '../core/credentials';\nimport { toCliError } from '../core/errors';\nimport { printJson, writeOut } from '../core/io';\nimport type { McpSession } from '../core/mcp';\nimport { info } from '../core/runtime';\nimport { CLI_VERSION } from '../core/version';\nimport { theme } from '../ui/theme';\nimport { mcpSummary } from './status';\n\n/** Long enough for workflows and `ask_tabbio`; progress notifications reset it. */\nconst BRIDGE_CALL_TIMEOUT_MS = 15 * 60 * 1000;\n\n/** Converts a bridge-side failure into an MCP tool error the client can show. */\nexport function bridgeErrorResult(error: unknown): CallToolResult {\n const cliError = toCliError(error);\n const text = [cliError.message, cliError.hint].filter(Boolean).join('\\n');\n return { isError: true, content: [{ type: 'text', text: redactSecrets(text) }] };\n}\n\n/**\n * A stdio MCP server whose `tools/list` and `tools/call` are forwarded to the\n * remote Tabbio MCP session. Nothing but protocol frames goes to stdout.\n */\nexport function createBridgeServer(remote: McpSession, opts: { refreshFirstList?: boolean } = {}): Server {\n const server = new Server(\n { name: 'tabbio', version: CLI_VERSION },\n { capabilities: { tools: { listChanged: false } }, instructions: remote.instructions },\n );\n let refreshNext = Boolean(opts.refreshFirstList);\n\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n const tools = await remote.listRawTools({ refresh: refreshNext });\n refreshNext = false;\n return { tools: tools as unknown as Tool[] };\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n try {\n return await remote.callRaw(request.params, { signal: extra.signal, timeoutMs: BRIDGE_CALL_TIMEOUT_MS });\n } catch (error) {\n return bridgeErrorResult(error);\n }\n });\n return server;\n}\n\nasync function serve(opts: { refresh?: boolean }, cmd: Command): Promise<void> {\n const ctx = createCommandContext(cmd);\n const remote = await ctx.mcp();\n const server = createBridgeServer(remote, { refreshFirstList: opts.refresh });\n const transport = new StdioServerTransport();\n\n const closed = new Promise<void>((resolve) => {\n transport.onclose = () => resolve();\n process.stdin.once('end', () => resolve());\n process.stdin.once('close', () => resolve());\n });\n await server.connect(transport);\n const via = mcpSummary(ctx.api.credentials ?? ctx.credentials);\n info(theme.dim(`tabbio mcp serve: bridging stdio \u2192 ${ctx.profile.mcpUrl} (profile ${ctx.profile.name}, via ${via?.label ?? 'unknown'})`));\n\n await closed;\n await server.close().catch(() => undefined);\n await ctx.close();\n}\n\nexport function registerMcpCommands(program: Command): void {\n const mcp = program.command('mcp').description('Use Tabbio from other MCP clients (Claude, Cursor, \u2026)');\n\n mcp\n .command('serve')\n .description(\"Run a stdio MCP server that forwards to Tabbio using this CLI's sign-in\")\n .option('--refresh', 'Reload the tool list from the server instead of the 1h cache')\n .addHelpText(\n 'after',\n '\\nExample:\\n $ claude mcp add tabbio -- tabbio mcp serve\\n $ claude mcp add tabbio -- tabbio --profile work mcp serve',\n )\n .action(async (opts: { refresh?: boolean }, cmd: Command) => serve(opts, cmd));\n\n mcp\n .command('url')\n .description('Print the MCP endpoint URL and how to add it to a client')\n .action((_opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const url = ctx.profile.mcpUrl;\n const commands = {\n http: `claude mcp add --transport http tabbio ${url}`,\n stdio: `claude mcp add tabbio -- tabbio${ctx.profile.name === 'default' ? '' : ` --profile ${ctx.profile.name}`} mcp serve`,\n };\n if (ctx.globals.json) {\n printJson({ url, profile: ctx.profile.name, commands });\n return;\n }\n writeOut(url);\n if (!ctx.globals.quiet) {\n writeOut(theme.dim(` Remote (the client signs in with OAuth): ${commands.http}`));\n writeOut(theme.dim(` Local stdio bridge (uses this CLI): ${commands.stdio}`));\n }\n });\n}\n", "import type { Command } from 'commander';\nimport { canUseInteractiveUi, getInteractiveHooks } from '../ui/hooks';\nimport { theme } from '../ui/theme';\nimport { type CatalogTool, groupCatalog } from '../core/catalog';\nimport { type CommandContext, createCommandContext } from '../core/context';\nimport { usageError } from '../core/errors';\nimport { type OutputMode, displayWidth, printEmptyNotice, resolveOutputMode, truncate, writeJson } from '../core/output';\nimport { resolveCatalogTool } from '../core/run-tool';\nimport { autoFilledProperties, describeSchema, exampleInvocation } from '../core/schema-flags';\nimport { invocation, invocationPath } from './generated';\n\nexport type ToolFilter = { query?: string; group?: string; reads?: boolean; writes?: boolean };\n\nexport type ToolListEntry = {\n id: string;\n name: string;\n title: string;\n description: string;\n readOnly: boolean;\n kind: CatalogTool['kind'];\n group: string;\n action: string;\n command: string;\n};\n\nexport function toListEntry(tool: CatalogTool): ToolListEntry {\n return {\n id: tool.id,\n name: tool.mcpName,\n title: tool.title,\n description: tool.description,\n readOnly: tool.readOnly,\n kind: tool.kind,\n group: tool.group,\n action: tool.action,\n command: invocation(tool),\n };\n}\n\n/** 0 = no match; higher is better. Every query token must match somewhere. */\nexport function matchScore(tool: CatalogTool, query: string): number {\n const tokens = query.toLowerCase().split(/\\s+/).filter(Boolean);\n if (tokens.length === 0) return 1;\n const id = `${tool.id} ${tool.mcpName} ${tool.commandPath.join(' ')}`.toLowerCase();\n const title = tool.title.toLowerCase();\n const description = tool.description.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (id.includes(token)) score += 3;\n else if (title.includes(token)) score += 2;\n else if (description.includes(token)) score += 1;\n else return 0;\n }\n return score;\n}\n\n/** Visible tools matching the filter, best match first (then by command path). */\nexport function filterTools(tools: readonly CatalogTool[], filter: ToolFilter = {}): CatalogTool[] {\n if (filter.reads && filter.writes) throw usageError('Use either --reads or --writes, not both');\n const group = filter.group?.trim().toLowerCase();\n const scored = tools\n .filter((t) => !t.hidden)\n .filter((t) => !group || t.group === group || t.group.startsWith(group))\n .filter((t) => (filter.reads ? t.readOnly : filter.writes ? !t.readOnly : true))\n .map((tool) => ({ tool, score: filter.query ? matchScore(tool, filter.query) : 1 }))\n .filter((entry) => entry.score > 0);\n if (filter.query) scored.sort((a, b) => b.score - a.score);\n return scored.map((entry) => entry.tool);\n}\n\nconst WRITES_LABEL = ' \u00B7 writes';\n\nfunction readWrite(tool: CatalogTool): string {\n return tool.readOnly ? theme.muted(theme.symbols.dot) : theme.warn(theme.symbols.dot);\n}\n\n/** Grouped human listing: group header, glyph, id, title (writes are labelled). */\nexport function formatToolList(tools: readonly CatalogTool[], width = process.stdout.columns ?? 100): string[] {\n if (tools.length === 0) return [theme.dim('No tools match.')];\n const idWidth = Math.min(36, Math.max(...tools.map((t) => displayWidth(t.id))));\n const lines: string[] = [];\n const groups = [...groupCatalog(tools)].sort(([a], [b]) => a.localeCompare(b));\n for (const [group, list] of groups) {\n lines.push(`${theme.bold(group)} ${theme.dim(`(${list.length})`)}`);\n for (const tool of list) {\n const id = truncate(tool.id, idWidth);\n const room = Math.max(10, width - idWidth - 6 - (tool.readOnly ? 0 : WRITES_LABEL.length));\n const writes = tool.readOnly ? '' : theme.dim(WRITES_LABEL);\n lines.push(` ${readWrite(tool)} ${id}${' '.repeat(idWidth - displayWidth(id))} ${truncate(tool.title, room)}${writes}`);\n }\n }\n lines.push(\n theme.dim(\n `${tools.length} tools \u00B7 ${theme.symbols.dot} read \u00B7 ${theme.symbols.dot} writes (may need approval) \u00B7 tabbio tools describe <id>`,\n ),\n );\n return lines;\n}\n\nexport function toolsToTsv(tools: readonly CatalogTool[]): string {\n return tools.map((t) => [t.id, invocationPath(t).join(' '), t.readOnly ? 'read' : 'write', t.title].join('\\t')).join('\\n');\n}\n\n/** `No tools match \"cv\" in group \"job\" (read-only)`. */\nexport function noToolsMessage(filter: ToolFilter): string {\n const scope = [\n filter.group ? `in group \"${filter.group}\"` : null,\n filter.reads ? '(read-only)' : filter.writes ? '(writes)' : null,\n ].filter(Boolean);\n if (!filter.query && scope.length === 0) return 'No tools are available to this account';\n return ['No tools match', filter.query ? `\"${filter.query}\"` : 'these filters', ...scope].join(' ');\n}\n\nasync function listTools(ctx: CommandContext, filter: ToolFilter & { refresh?: boolean }): Promise<void> {\n const mode: OutputMode = resolveOutputMode({ json: ctx.globals.json });\n const session = await ctx.mcp();\n const all = await session.listTools({ refresh: filter.refresh });\n const hooks = getInteractiveHooks();\n if (hooks && mode === 'table' && canUseInteractiveUi(ctx)) {\n await hooks.browseTools(ctx, filterTools(all, { reads: filter.reads, writes: filter.writes }), {\n query: filter.query,\n group: filter.group,\n });\n return;\n }\n const tools = filterTools(all, filter);\n if (mode === 'json') writeJson(tools.map(toListEntry));\n else if (tools.length === 0) printEmptyNotice(mode, noToolsMessage(filter), { quiet: ctx.globals.quiet });\n else if (mode === 'tsv') process.stdout.write(`${toolsToTsv(tools)}\\n`);\n else for (const line of formatToolList(tools)) process.stdout.write(`${line}\\n`);\n}\n\nexport type ToolDescription = ToolListEntry & {\n inputSchema: CatalogTool['inputSchema'];\n flags: ReturnType<typeof describeSchema>;\n example: string;\n mayRequireApproval: boolean;\n autoFilled: string[];\n};\n\nexport function describeTool(tool: CatalogTool): ToolDescription {\n return {\n ...toListEntry(tool),\n inputSchema: tool.inputSchema,\n flags: describeSchema(tool.inputSchema),\n example: exampleInvocation(tool, tool.inputSchema, invocationPath(tool)),\n mayRequireApproval: !tool.readOnly,\n autoFilled: autoFilledProperties(tool, tool.inputSchema),\n };\n}\n\nexport function formatToolDescription(info: ToolDescription, width = process.stdout.columns ?? 100): string[] {\n const lines = [\n theme.bold(info.title),\n theme.dim(`${info.id} \u00B7 MCP ${info.name} \u00B7 ${info.kind} \u00B7 ${info.readOnly ? 'read-only' : 'writes'}`),\n ];\n if (info.description) lines.push('', info.description);\n if (info.mayRequireApproval) {\n lines.push('', `${theme.warn(theme.symbols.warning)} May require approval before it runs (exit 6 until approved; --wait to wait).`);\n }\n lines.push('', theme.bold('Flags'));\n if (info.flags.length === 0) lines.push(theme.dim(' (none)'));\n const flagWidth = Math.min(32, Math.max(0, ...info.flags.map((f) => f.flag.length)));\n const typeWidth = Math.min(24, Math.max(0, ...info.flags.map((f) => f.type.length)));\n for (const row of info.flags) {\n const auto = info.autoFilled.includes(row.property) ? 'filled from your session' : null;\n const notes = [row.required && !auto ? 'required' : null, auto, ...row.notes].filter(Boolean).join('; ');\n const text = [row.description, notes ? `(${notes})` : ''].filter(Boolean).join(' ');\n const room = Math.max(20, width - flagWidth - typeWidth - 6);\n lines.push(` ${row.flag.padEnd(flagWidth)} ${theme.dim(truncate(row.type, typeWidth).padEnd(typeWidth))} ${truncate(text, room)}`.trimEnd());\n }\n lines.push(\n theme.dim(' Also: --input <json> | --input-file <path> | --fields a,b | --wait | --timeout 10m | -o json|table|plain'),\n '',\n theme.bold('Example'),\n ` $ ${info.example}`,\n );\n return lines;\n}\n\nasync function describe(ctx: CommandContext, ref: string): Promise<void> {\n const session = await ctx.mcp();\n const tool = await resolveCatalogTool(session, ref);\n const info = describeTool(tool);\n if (resolveOutputMode({ json: ctx.globals.json }) === 'json') writeJson(info);\n else for (const line of formatToolDescription(info)) process.stdout.write(`${line}\\n`);\n}\n\nexport function registerToolsCommand(program: Command): void {\n const tools = program\n .command('tools')\n .description('Browse and search every Tabbio tool (TTY: interactive browser)')\n .argument('[query]', 'Filter by id, title or description')\n .option('--group <group>', 'Only this group (e.g. cv, job)')\n .option('--reads', 'Only read-only tools')\n .option('--writes', 'Only tools that change data')\n .option('--refresh', 'Reload the catalog from Tabbio (ignores the 1h cache)')\n .addHelpText('after', '\\nExamples:\\n $ tabbio tools cv\\n $ tabbio tools --group job --reads\\n $ tabbio tools describe cv.list')\n .action(async (query: string | undefined, opts: ToolFilter & { refresh?: boolean }, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n try {\n await listTools(ctx, { ...opts, query });\n } finally {\n await ctx.close();\n }\n });\n\n tools\n .command('describe')\n .description('Show a tool: flags, types, approval note and an example')\n .argument('<tool>', 'Tool id (cv.list), MCP name (cvList) or command (cv list)')\n .action(async (ref: string, _opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n try {\n await describe(ctx, ref);\n } finally {\n await ctx.close();\n }\n });\n}\n", "import type { Command } from 'commander';\nimport type { CatalogTool } from '../core/catalog';\nimport { createCommandContext } from '../core/context';\nimport { usageError } from '../core/errors';\nimport { resolveOutputMode, writeJson } from '../core/output';\nimport {\n type RunLevelOptions,\n addRunLevelOptions,\n parseDynamicFlags,\n resolveCatalogTool,\n runTool,\n wantsHelp,\n} from '../core/run-tool';\nimport { describeTool, formatToolDescription } from './tools';\n\nexport type DynamicRunOptions = RunLevelOptions & { help?: boolean };\n\nfunction runLevel(opts: DynamicRunOptions): RunLevelOptions {\n const { input, inputFile, fields, wait, timeout, output } = opts;\n return { input, inputFile, fields, wait, timeout, output };\n}\n\n/**\n * Shared by `tabbio run` and `tabbio workflows run`: the tool is only known\n * after the catalog lookup, so its flags arrive as raw args (`rest`) and are\n * parsed by `parseDynamicFlags` (see core/run-tool.ts for why).\n */\nexport async function runDynamic(\n cmd: Command,\n ref: string | undefined,\n rest: readonly string[],\n opts: DynamicRunOptions,\n filter?: (tool: CatalogTool) => boolean,\n): Promise<void> {\n if (!ref) {\n if (opts.help) {\n cmd.outputHelp();\n return;\n }\n throw usageError(`Missing the ${filter ? 'workflow' : 'tool'} to run`, `Usage: tabbio ${cmd.parent?.name() === 'workflows' ? 'workflows run <key>' : 'run <tool>'} [flags]. List them with \\`tabbio ${filter ? 'workflows list' : 'tools'}\\`.`);\n }\n if (ref.startsWith('-')) throw usageError(`Put the ${filter ? 'workflow key' : 'tool'} first, then its flags`, `e.g. tabbio run cv.list --limit 5`);\n\n const ctx = createCommandContext(cmd);\n try {\n const session = await ctx.mcp();\n const tool = await resolveCatalogTool(session, ref, filter);\n if (opts.help || wantsHelp(rest)) {\n const info = describeTool(tool);\n if (resolveOutputMode({ json: ctx.globals.json }) === 'json') writeJson(info);\n else for (const line of formatToolDescription(info)) process.stdout.write(`${line}\\n`);\n return;\n }\n const parsed = parseDynamicFlags(tool, rest);\n await runTool(ctx, tool, { ...parsed.opts, ...runLevel(opts) }, parsed.rest);\n } finally {\n await ctx.close();\n }\n}\n\n/** `run` and `workflows run`: tool-specific `--help`, raw flags after the reference. */\nexport function configureDynamicRunCommand(cmd: Command, refName: string, refHelp: string): Command {\n cmd\n .argument(`[${refName}]`, refHelp)\n .argument('[flags...]', 'The tool\\'s own flags, e.g. --limit 5 (see --help after the tool)')\n .helpOption(false)\n .option('-h, --help', 'Show help; after a tool, show that tool\\'s flags')\n .allowUnknownOption()\n .allowExcessArguments();\n return addRunLevelOptions(cmd);\n}\n\nexport function registerRunCommand(program: Command): void {\n const run = program.command('run').description('Run any Tabbio tool by id, MCP name or command path');\n configureDynamicRunCommand(run, 'tool', 'Tool id (cv.list), MCP name (cvList) or command (\"cv list\")')\n .addHelpText(\n 'after',\n [\n '',\n 'Examples:',\n ' $ tabbio run cv.list',\n ' $ tabbio run job.search --query \"product designer\" --fields id,title,company',\n ' $ tabbio run cv.delete --cv-id cv_123 --wait',\n ' $ echo \\'{\"limit\":5}\\' | tabbio run cv.list --input - --json',\n ' $ tabbio run cv.get --help # that tool\\'s flags',\n ].join('\\n'),\n )\n .action(async (ref: string | undefined, rest: string[], opts: DynamicRunOptions, cmd: Command) => {\n await runDynamic(cmd, ref, rest, opts);\n });\n}\n", "import type { Command } from 'commander';\nimport { theme } from '../ui/theme';\nimport type { CatalogTool } from '../core/catalog';\nimport { createCommandContext } from '../core/context';\nimport { printEmptyNotice, resolveOutputMode, truncate, writeJson } from '../core/output';\nimport { autoFilledProperties, flagsForProperties, shortDescription } from '../core/schema-flags';\nimport { invocation } from './generated';\nimport { type DynamicRunOptions, configureDynamicRunCommand, runDynamic } from './run';\n\nexport const isWorkflow = (tool: CatalogTool): boolean => tool.kind === 'workflow';\n\nexport type WorkflowEntry = {\n key: string;\n id: string;\n name: string;\n command: string;\n description: string;\n /** Required flags the caller must pass (session-filled ones excluded). */\n requiredFlags: string[];\n};\n\n/** Mastra prefixes workflow descriptions with \"Run workflow 'x'. Workflow description:\". */\nexport function workflowSummary(tool: CatalogTool): string {\n return shortDescription(tool.description.replace(/^Run workflow '[^']*'\\.\\s*(Workflow description:\\s*)?/i, ''), 120);\n}\n\nexport function toWorkflowEntry(tool: CatalogTool): WorkflowEntry {\n const auto = new Set(autoFilledProperties(tool, tool.inputSchema));\n const required = (tool.inputSchema.required ?? []).filter((key) => !auto.has(key));\n return {\n key: tool.action,\n id: tool.id,\n name: tool.mcpName,\n command: invocation(tool),\n description: workflowSummary(tool),\n requiredFlags: flagsForProperties(tool.inputSchema, required),\n };\n}\n\nexport function formatWorkflowList(entries: readonly WorkflowEntry[], width = process.stdout.columns ?? 100): string[] {\n if (entries.length === 0) return [theme.dim('No workflows are exposed over MCP; multi-step flows run through `tabbio chat`.')];\n const keyWidth = Math.max(...entries.map((e) => e.key.length));\n const lines = [`${theme.bold('Workflows')} ${theme.dim(`(${entries.length})`)}`];\n for (const entry of entries) {\n const needs = entry.requiredFlags.length ? theme.dim(` needs ${entry.requiredFlags.join(' ')}`) : '';\n const room = Math.max(20, width - keyWidth - 4 - (entry.requiredFlags.join(' ').length + 8));\n lines.push(` ${entry.key.padEnd(keyWidth)} ${truncate(entry.description, room)}${needs}`);\n }\n lines.push(theme.dim('Run one: tabbio workflows run <key> [flags] \u00B7 its flags: tabbio workflows run <key> --help'));\n return lines;\n}\n\nexport function registerWorkflowsCommand(program: Command): void {\n const workflows = program.command('workflows').description('List and run multi-step Tabbio workflows');\n\n workflows\n .command('list', { isDefault: true })\n .description('List the workflows available to you')\n .action(async (_opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n try {\n const session = await ctx.mcp();\n const entries = (await session.listTools()).filter(isWorkflow).map(toWorkflowEntry);\n const mode = resolveOutputMode({ json: ctx.globals.json });\n if (mode === 'json') writeJson(entries);\n else if (entries.length === 0) {\n printEmptyNotice(mode, 'No workflows are exposed over MCP; multi-step flows run through tabbio chat', { quiet: ctx.globals.quiet });\n } else if (mode === 'tsv') {\n for (const e of entries) process.stdout.write(`${[e.key, e.command, e.description].join('\\t')}\\n`);\n } else for (const line of formatWorkflowList(entries)) process.stdout.write(`${line}\\n`);\n } finally {\n await ctx.close();\n }\n });\n\n const run = workflows.command('run').description('Run a workflow (same flags and output options as `tabbio run`)');\n configureDynamicRunCommand(run, 'key', 'Workflow key (tailored-cv-flow) or MCP name (run_tailoredCvFlow)')\n .addHelpText(\n 'after',\n '\\nExamples:\\n $ tabbio workflows run tailored-cv-flow --cv-id cv_1 --job-id job_9\\n $ tabbio workflows run tailored-cv-flow --help',\n )\n .action(async (ref: string | undefined, rest: string[], opts: DynamicRunOptions, cmd: Command) => {\n await runDynamic(cmd, ref, rest, opts, isWorkflow);\n });\n}\n", "/**\n * Registers the Ink implementations of the interactive hooks (see hooks.ts).\n * Call `installInteractiveUi()` once at startup (src/index.ts or program.ts).\n * Nothing heavy loads here: each hook imports the screens on first use.\n */\nimport { type InteractiveHooks, setInteractiveHooks } from './hooks';\n\nexport function installInteractiveUi(): void {\n const hooks: InteractiveHooks = {\n async browseTools(ctx, tools, options) {\n const { runBrowseTools } = await import('./entry');\n return runBrowseTools(ctx, tools, options);\n },\n async runToolForm(ctx, tool, initial, options) {\n const { runToolForm } = await import('./entry');\n return runToolForm(ctx, tool, initial, options);\n },\n async approvalPrompt(ctx, approval) {\n const { runApprovalPrompt } = await import('./entry');\n return runApprovalPrompt(ctx, approval);\n },\n async showResult(ctx, tool, result, meta) {\n const { runShowResult } = await import('./entry');\n return runShowResult(ctx, tool, result, meta);\n },\n };\n setInteractiveHooks(hooks);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Command", "CommanderError", "reject", "mode", "status", "notice", "status", "status", "label", "LIST_FIELDS", "outMode", "write", "list", "Option", "Option", "tools", "mode", "extra", "result", "mode", "status", "Option", "readStdin", "Option", "label", "row", "open", "open", "list", "mode", "info", "row", "wait", "info", "mode", "Command", "write", "CommanderError"]
7
+ }