@tabbio-technologies/cli 1.2.8 → 1.3.1

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.
Files changed (27) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +86 -19
  3. package/dist/chunks/{chunk-7LNC3FIV.js → chunk-GGJEDG3P.js} +95 -14
  4. package/dist/chunks/{chunk-7LNC3FIV.js.map → chunk-GGJEDG3P.js.map} +4 -4
  5. package/dist/chunks/{chunk-Y6GWIFHI.js → chunk-KBIQKZUK.js} +3 -53
  6. package/dist/chunks/chunk-KBIQKZUK.js.map +7 -0
  7. package/dist/chunks/{chunk-QVR5KIEQ.js → chunk-KHLGZ5IV.js} +1796 -244
  8. package/dist/chunks/chunk-KHLGZ5IV.js.map +7 -0
  9. package/dist/chunks/{chunk-NAWA6NCZ.js → chunk-NRFVKK3S.js} +37 -96
  10. package/dist/chunks/chunk-NRFVKK3S.js.map +7 -0
  11. package/dist/chunks/chunk-TP3CRQJD.js +106 -0
  12. package/dist/chunks/chunk-TP3CRQJD.js.map +7 -0
  13. package/dist/chunks/{entry-WENOOT6W.js → entry-ZAXWZSEE.js} +2023 -770
  14. package/dist/chunks/entry-ZAXWZSEE.js.map +7 -0
  15. package/dist/chunks/{mount-NGUARMCL.js → mount-36JUVX3R.js} +3 -2
  16. package/dist/chunks/{mount-NGUARMCL.js.map → mount-36JUVX3R.js.map} +1 -1
  17. package/dist/chunks/{program-O2BA5L6Z.js → program-J6GENE2V.js} +314 -375
  18. package/dist/chunks/program-J6GENE2V.js.map +7 -0
  19. package/dist/chunks/{status-I5UAQPBY.js → status-2C7BECKK.js} +3 -3
  20. package/dist/cli.js +1 -1
  21. package/package.json +4 -8
  22. package/dist/chunks/chunk-NAWA6NCZ.js.map +0 -7
  23. package/dist/chunks/chunk-QVR5KIEQ.js.map +0 -7
  24. package/dist/chunks/chunk-Y6GWIFHI.js.map +0 -7
  25. package/dist/chunks/entry-WENOOT6W.js.map +0 -7
  26. package/dist/chunks/program-O2BA5L6Z.js.map +0 -7
  27. /package/dist/chunks/{status-I5UAQPBY.js.map → status-2C7BECKK.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ui/entry.tsx", "../../src/ui/components/ApprovalCard.tsx", "../../src/ui/components/KeyHints.tsx", "../../src/ui/components/KeyValue.tsx", "../../src/ui/components/Rail.tsx", "../../src/ui/components/approval-model.ts", "../../src/ui/components/Form.tsx", "../../src/ui/fuzzy.ts", "../../src/ui/components/form-model.ts", "../../src/ui/screens/chat/Chat.tsx", "../../src/ui/components/editor-model.ts", "../../src/ui/components/SelectList.tsx", "../../src/ui/components/select-model.ts", "../../src/ui/components/TextInput.tsx", "../../src/ui/screens/login/LoginPanel.tsx", "../../src/ui/screens/login/login-model.ts", "../../src/ui/screens/Palette.tsx", "../../src/ui/screens/palette-model.ts", "../../src/ui/screens/useSkills.ts", "../../src/ui/screens/chat/ChatStatus.tsx", "../../src/ui/components/StatusBar.tsx", "../../src/ui/screens/chat/commands.ts", "../../src/ui/screens/chat/Transcript.tsx", "../../src/ui/components/ArtifactRow.tsx", "../../src/ui/components/cards/CardView.tsx", "../../src/ui/components/Markdown.tsx", "../../src/ui/components/markdown-inline.ts", "../../src/ui/components/Table.tsx", "../../src/ui/components/table-layout.ts", "../../src/ui/components/SourcesList.tsx", "../../src/ui/components/ToolCallRow.tsx", "../../src/ui/screens/chat/useChatCommands.ts", "../../src/ui/screens/chat/useFileCommands.ts", "../../src/ui/screens/chat/apply-command.ts", "../../src/ui/screens/chat/card-commands.ts", "../../src/ui/screens/chat/useChatSession.ts", "../../src/ui/screens/chat/useArtifactFollowUp.ts", "../../src/ui/screens/chat/useAutoSave.ts", "../../src/ui/screens/home/Home.tsx", "../../src/ui/session-controls.ts", "../../src/ui/services.ts", "../../src/ui/screens/Approvals.tsx", "../../src/ui/screens/ResultPanel.tsx", "../../src/ui/components/Panel.tsx", "../../src/ui/result-model.ts", "../../src/ui/screens/ToolBrowser.tsx", "../../src/ui/screens/ToolRun.tsx", "../../src/ui/screens/tool-browser-model.ts", "../../src/ui/screens/home/home-model.ts", "../../src/ui/screens/home/HomeView.tsx", "../../src/ui/components/Header.tsx", "../../src/ui/components/Wordmark.tsx"],
4
+ "sourcesContent": ["/**\n * Ink entry points, loaded lazily by `ui/index.ts` (hooks) and by the\n * `home` / `chat` commands. Each one renders a screen, waits for it to\n * resolve, and unmounts; Ctrl+C becomes the CANCELLED error (exit 130).\n */\nimport type { AgentMode } from '@tabbio/types';\nimport { Box, Static, Text } from 'ink';\nimport { type ReactNode, useEffect, useState } from 'react';\nimport type { ChatCapabilities } from '../core/capabilities';\nimport type { CatalogTool } from '../core/catalog';\nimport { isDestructiveTool } from '../core/chat-model';\nimport type { CommandContext } from '../core/context';\nimport { interruptedError } from '../core/errors';\nimport type { ApprovalInfo } from '../core/mcp';\nimport { autoFilledProperties } from '../core/schema-flags';\nimport { ApprovalCard } from './components/ApprovalCard';\nimport { approvalOutcomeText } from './components/approval-model';\nimport { Form } from './components/Form';\nimport { createFormState, equivalentCommand } from './components/form-model';\nimport type { ApprovalDecision, ToolRunMeta } from './hooks';\nimport { Page, useTerminalSize } from './layout';\nimport { renderScreen } from './render';\nimport { Chat } from './screens/chat/Chat';\nimport { Home, accountNotice } from './screens/home/Home';\nimport { ResultPanel } from './screens/ResultPanel';\nimport { ToolBrowser } from './screens/ToolBrowser';\nimport { toolLabel } from './screens/ToolRun';\nimport { type AccountChange, type UiServices, accountIdentity, createUiServices } from './services';\nimport { closeUiContexts } from './session-controls';\nimport { theme } from './theme';\nimport { oneLine, sentenceCase } from './text';\n\nfunction unwrap<T>(outcome: { status: 'done'; value: T } | { status: 'interrupted' }): T {\n if (outcome.status === 'interrupted') throw interruptedError();\n return outcome.value;\n}\n\nexport async function runBrowseTools(ctx: CommandContext, tools: CatalogTool[], options: { query?: string; group?: string }): Promise<void> {\n const services = createUiServices(ctx);\n unwrap(\n await renderScreen<void>('The tool browser', ({ finish, width, height }) => (\n <ToolBrowser\n tools={tools}\n services={services}\n width={width}\n height={height}\n initialQuery={options.query}\n initialGroup={options.group}\n onExit={() => finish(undefined)}\n />\n )),\n );\n}\n\nexport async function runToolForm(\n _ctx: CommandContext,\n tool: CatalogTool,\n initial: Record<string, unknown>,\n options: { missingRequired: string[] },\n): Promise<Record<string, unknown> | null> {\n const skip = autoFilledProperties(tool, tool.inputSchema);\n const state = createFormState(tool.inputSchema, initial, { skip, missingRequired: options.missingRequired });\n return unwrap(\n await renderScreen<Record<string, unknown> | null>('The input form', ({ finish, width, height }) => (\n <Box flexDirection=\"column\" width={width}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text wrap=\"truncate-end\">\n {theme.bold(toolLabel(tool))} {theme.dim(`${theme.symbols.middot} ${oneLine(tool.title)}`)}\n </Text>\n {options.missingRequired.length ? (\n <Text wrap=\"truncate-end\">{theme.dim(`Missing: ${options.missingRequired.join(', ')}`)}</Text>\n ) : null}\n </Box>\n <Form\n initial={state}\n width={width}\n height={Math.max(3, height - 5)}\n isActive\n onSubmit={(input) => finish(input, <Text wrap=\"truncate-end\">{theme.dim(`${theme.symbols.pointer} ${equivalentCommand(tool, input, skip)}`)}</Text>)}\n onCancel={() => finish(null)}\n />\n </Box>\n )),\n );\n}\n\nexport async function runApprovalPrompt(\n ctx: CommandContext,\n approval: ApprovalInfo & { args: Record<string, unknown> },\n): Promise<ApprovalDecision> {\n const shownAt = Date.now();\n const title = sentenceCase(approval.toolName || 'this action');\n return unwrap(\n await renderScreen<ApprovalDecision>('The approval prompt', ({ finish, width }) => (\n <ApprovalCard\n approvalId={approval.approvalId}\n title={title}\n message={approval.message}\n args={approval.args}\n destructive={isDestructiveTool(approval.toolName)}\n context={`Writes to your account ${theme.symbols.middot} profile ${ctx.profile.name}`}\n isActive\n width={width}\n onDecision={(decision) =>\n finish(decision, <Text>{approvalOutcomeText(decision, title, approval.approvalId, Date.now() - shownAt)}</Text>)\n }\n />\n )),\n );\n}\n\n/** Prints its children once into the scrollback via <Static>, then resolves. */\nexport function PrintOnce({ children, onPrinted }: { children: ReactNode; onPrinted(): void }) {\n const { columns } = useTerminalSize();\n useEffect(() => {\n onPrinted();\n }, [onPrinted]);\n return (\n <Static items={['once']}>\n {(key) => (\n <Page key={key} columns={columns}>\n {children}\n </Page>\n )}\n </Static>\n );\n}\n\n/**\n * Result panel for tool commands. It prints and returns (no key wait), so\n * `tabbio cv list` behaves like any CLI command; the interactive panel with\n * j/r/q lives in the tool browser.\n */\nexport async function runShowResult(_ctx: CommandContext, tool: CatalogTool, result: unknown, meta: ToolRunMeta): Promise<void> {\n unwrap(\n await renderScreen<void>('The result panel', ({ finish, width, height }) => (\n <PrintOnce onPrinted={() => finish(undefined)}>\n <ResultPanel\n title={toolLabel(tool)}\n result={result}\n durationMs={meta.durationMs}\n requestId={meta.requestId}\n width={width}\n height={height}\n interactive={false}\n />\n </PrintOnce>\n )),\n );\n}\n\nexport type RunHomeOptions = {\n mode?: AgentMode;\n companyId?: string;\n /** Chats started from Home save generated files (default on). */\n saveArtifacts?: boolean;\n};\n\nexport async function runHome(ctx: CommandContext, opts: RunHomeOptions = {}): Promise<void> {\n const services = createUiServices(ctx);\n try {\n await renderScreen<void>(\n 'The home screen',\n ({ finish, width, height }) => (\n <Home\n services={services}\n width={width}\n height={height}\n mode={opts.mode}\n companyId={opts.companyId}\n saveArtifacts={opts.saveArtifacts}\n onExit={() => finish(undefined)}\n />\n ),\n { ctrlC: 'screen' },\n );\n } finally {\n await closeUiContexts();\n }\n}\n\nexport type RunChatOptions = {\n mode: AgentMode;\n companyId?: string;\n threadId?: string;\n modelId?: string;\n message?: string;\n /** Research / Image / Result for this chat (flags over the saved choice). */\n capabilities?: ChatCapabilities;\n /** Save generated files into the artifacts dir (default on). */\n saveArtifacts?: boolean;\n};\n\n/**\n * `tabbio chat`: the chat, with its own account state so `/login` swaps the\n * services in place and `/logout` lands on the signed-out home screen.\n */\nexport function ChatHost(props: RunChatOptions & { services: UiServices; width: number; height: number; onExit(): void }) {\n const [services, setServices] = useState(props.services);\n const [signedOut, setSignedOut] = useState<AccountChange | null>(null);\n const [sessionGeneration, setSessionGeneration] = useState(0);\n if (signedOut) {\n return (\n <Home\n services={services}\n width={props.width}\n height={props.height}\n mode={props.mode}\n companyId={props.companyId}\n saveArtifacts={props.saveArtifacts}\n initialNotice={accountNotice(signedOut)}\n onExit={props.onExit}\n />\n );\n }\n return (\n <Chat\n key={sessionGeneration}\n services={services}\n mode={props.mode}\n companyId={props.companyId}\n threadId={sessionGeneration === 0 ? props.threadId : undefined}\n modelId={props.modelId}\n initialMessage={sessionGeneration === 0 ? props.message : undefined}\n capabilities={props.capabilities}\n saveArtifacts={props.saveArtifacts}\n width={props.width}\n height={props.height}\n onAccountChange={(change) => {\n if (accountIdentity(services) !== accountIdentity(change.services)) setSessionGeneration((generation) => generation + 1);\n setServices(change.services);\n if (change.signedOut) setSignedOut(change);\n }}\n onExit={() => props.onExit()}\n />\n );\n}\n\nexport async function runChat(ctx: CommandContext, opts: RunChatOptions): Promise<void> {\n const services = createUiServices(ctx);\n try {\n await renderScreen<void>(\n 'Chat',\n ({ finish, width, height }) => <ChatHost {...opts} services={services} width={width} height={height} onExit={() => finish(undefined)} />,\n { ctrlC: 'screen' },\n );\n } finally {\n await closeUiContexts();\n }\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { useEffect, useState } from 'react';\nimport { theme } from '../theme';\nimport { oneLine, padEnd, safeJson, shortId } from '../text';\nimport { KeyHints } from './KeyHints';\nimport { KeyValue, type KeyValueRow } from './KeyValue';\nimport { Rail } from './Rail';\nimport { Spinner } from './Spinner';\nimport { APPROVAL_OPTIONS, type ApprovalCardState, approvalKeyReducer, initialApprovalState } from './approval-model';\nimport type { ApprovalChoice } from '../../core/chat-model';\n\nexport type ApprovalCardProps = {\n approvalId: string;\n /** Tool title, e.g. \"Cv tailor\". */\n title: string;\n message?: string;\n args: Record<string, unknown>;\n destructive?: boolean;\n /** Context line under the args (e.g. \"Writes to your account \u00B7 profile default\"). */\n context?: string;\n /** While the decision is being sent. */\n busy?: ApprovalChoice | null;\n error?: string | null;\n isActive: boolean;\n width: number;\n onDecision(decision: ApprovalChoice): void;\n};\n\nconst MAX_ARGS = 8;\n\nfunction argRows(args: Record<string, unknown>, expanded: boolean): KeyValueRow[] {\n const rows = Object.entries(args)\n .filter(([key]) => key !== 'userId')\n .map(([key, value]) => ({\n label: key.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(),\n value: typeof value === 'string' ? oneLine(value) : safeJson(value, 0),\n }));\n if (expanded || rows.length <= MAX_ARGS) return rows;\n return [...rows.slice(0, MAX_ARGS), { label: '', value: theme.dim(`+${rows.length - MAX_ARGS} more (ctrl+o)`) }];\n}\n\n/**\n * Yellow `\u25C6` rail (red for destructive tools), the arguments, and numbered\n * options with y/n/l hotkeys. Esc leaves the approval pending, never rejects.\n */\nexport function ApprovalCard(props: ApprovalCardProps) {\n const { approvalId, title, message, args, destructive = false, context, busy, error, isActive, width, onDecision } = props;\n const [state, setState] = useState<ApprovalCardState>(initialApprovalState);\n\n useInput(\n (input, key) => {\n setState((current) => approvalKeyReducer(current, input, key));\n },\n { isActive: isActive && !busy },\n );\n\n useEffect(() => {\n if (state.decision) {\n onDecision(state.decision);\n setState((current) => ({ ...current, decision: undefined }));\n }\n }, [state.decision, onDecision]);\n\n const inner = Math.max(20, width - 2);\n const optionWidth = Math.max(10, Math.min(inner - 4, 52));\n return (\n <Rail tone={destructive ? 'danger' : 'attention'} width={width}>\n <Box width={inner}>\n <Box flexGrow={1}>\n <Text>\n {(destructive ? theme.danger : theme.attention)(theme.symbols.attention)} {theme.bold('Approval needed')}\n </Text>\n </Box>\n <Text>{theme.dim(shortId(approvalId))}</Text>\n </Box>\n <Text> </Text>\n <Text wrap=\"wrap\">{message ? oneLine(message) : `${theme.bold(title)} wants to run with these inputs`}</Text>\n <Text> </Text>\n <Box marginLeft={2}>\n <KeyValue rows={argRows(args, state.expanded)} width={Math.max(16, inner - 2)} wrap={state.expanded} />\n </Box>\n <Text> </Text>\n <Text wrap=\"truncate-end\">\n {destructive ? theme.danger('This cannot be undone') : theme.dim(context ?? 'Writes to your account')}\n </Text>\n <Text> </Text>\n {APPROVAL_OPTIONS.map((option, i) => {\n const selected = i === state.selected;\n const pointer = selected ? theme.accent(theme.symbols.pointer) : ' ';\n const label = `${i + 1}. ${option.label}`;\n return (\n <Text key={option.decision} wrap=\"truncate-end\">\n {pointer} {selected ? theme.accent(padEnd(label, optionWidth)) : padEnd(label, optionWidth)} {theme.dim(option.hotkey)}\n </Text>\n );\n })}\n <Text> </Text>\n {busy ? (\n <Spinner label={theme.dim(busy === 'approve' ? 'Approving\u2026' : busy === 'reject' ? 'Rejecting\u2026' : 'Leaving it pending\u2026')} />\n ) : error ? (\n <Text wrap=\"wrap\">{theme.error(`${theme.symbols.error} ${error}`)}</Text>\n ) : (\n <KeyHints\n width={inner}\n hints={[\n { key: theme.symbols.upDown, label: 'select' },\n { key: 'enter', label: 'confirm' },\n { key: 'esc', label: 'leave pending' },\n { key: 'ctrl+o', label: 'all inputs' },\n ]}\n />\n )}\n </Rail>\n );\n}\n", "import { Text } from 'ink';\nimport { memo } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth } from '../text';\n\nexport type KeyHint = { key: string; label: string };\n\n/** `enter send \u00B7 / commands` with keys in the accent and labels dim. */\nexport function formatHints(hints: readonly KeyHint[]): string {\n const sep = theme.dim(` ${theme.symbols.middot} `);\n return hints.map((h) => `${theme.accent(h.key)} ${theme.dim(h.label)}`).join(sep);\n}\n\n/** Drops hints from the end until the row fits `width`. */\nexport function fitHints(hints: readonly KeyHint[], width: number): KeyHint[] {\n const out = [...hints];\n while (out.length > 1 && displayWidth(formatHints(out)) > width) out.pop();\n return out;\n}\n\n/** One contextual row of key hints; never wraps. */\nexport const KeyHints = memo(function KeyHints({ hints, width }: { hints: readonly KeyHint[]; width: number }) {\n return <Text wrap=\"truncate-end\">{formatHints(fitHints(hints, width))}</Text>;\n});\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth, padEnd, truncate } from '../text';\n\nexport type KeyValueRow = { label: string; value: string; note?: string };\n\nexport type KeyValueProps = {\n rows: readonly KeyValueRow[];\n width: number;\n /** Wrap long values instead of truncating them with `\u2026`. */\n wrap?: boolean;\n maxLabelWidth?: number;\n};\n\n/** Aligned `label value note` rows; labels and notes dim. */\nexport const KeyValue = memo(function KeyValue({ rows, width, wrap = false, maxLabelWidth = 24 }: KeyValueProps) {\n const labelWidth = Math.min(maxLabelWidth, Math.max(0, ...rows.map((r) => displayWidth(r.label))));\n const valueWidth = Math.max(8, width - labelWidth - 2);\n return (\n <Box flexDirection=\"column\" width={width}>\n {rows.map((row, i) => {\n const note = row.note ? ` ${row.note}` : '';\n const value = wrap ? row.value : truncate(row.value.replace(/\\n/g, ' '), Math.max(4, valueWidth - displayWidth(note)));\n return (\n <Box key={`${row.label}-${i}`}>\n <Text>{theme.dim(padEnd(truncate(row.label, labelWidth), labelWidth))} </Text>\n <Box width={valueWidth}>\n <Text wrap={wrap ? 'wrap' : 'truncate-end'}>\n {value}\n {note ? theme.dim(note) : ''}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n});\n", "import { Box } from 'ink';\nimport type { ReactNode } from 'react';\nimport { theme } from '../theme';\n\nexport type RailTone = 'accent' | 'attention' | 'danger' | 'success' | 'muted';\n\nfunction railColor(tone: RailTone): string | undefined {\n switch (tone) {\n case 'accent':\n return theme.accentInk;\n case 'attention':\n return 'yellow';\n case 'danger':\n return 'red';\n case 'success':\n return 'green';\n default:\n return undefined;\n }\n}\n\n/** Left `\u2503` rail (`|` without Unicode) in a status colour; content indented by one. */\nexport function Rail({ tone = 'accent', children, width }: { tone?: RailTone; children?: ReactNode; width?: number }) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle={theme.railStyle}\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderLeftColor={railColor(tone)}\n borderLeftDimColor={tone === 'muted'}\n paddingLeft={1}\n width={width}\n >\n {children}\n </Box>\n );\n}\n", "import type { Key } from 'ink';\nimport type { ApprovalChoice } from '../../core/chat-model';\nimport { theme } from '../theme';\nimport { formatElapsed, shortId } from '../text';\n\nexport type ApprovalOption = { decision: ApprovalChoice; label: string; hotkey: string };\n\nexport const APPROVAL_OPTIONS: readonly ApprovalOption[] = [\n { decision: 'approve', label: 'Approve', hotkey: 'y' },\n { decision: 'reject', label: 'Reject', hotkey: 'n' },\n { decision: 'leave', label: 'Leave pending (decide later in the app)', hotkey: 'l' },\n];\n\nexport type ApprovalCardState = { selected: number; expanded: boolean; decision?: ApprovalChoice };\n\nexport const initialApprovalState: ApprovalCardState = { selected: 0, expanded: false };\n\n/**\n * Keys \u2192 state (pure, for tests): \u2191\u2193/j/k move, 1\u20133 and y/n/l decide at once,\n * Enter confirms the selection, Esc is the safe option (leave pending),\n * ctrl+o expands the arguments.\n */\nexport function approvalKeyReducer(state: ApprovalCardState, input: string, key: Partial<Key>): ApprovalCardState {\n if (state.decision) return state;\n const count = APPROVAL_OPTIONS.length;\n if (key.escape) return { ...state, decision: 'leave' };\n if (key.ctrl && input === 'o') return { ...state, expanded: !state.expanded };\n if (key.upArrow || (!key.ctrl && input === 'k')) return { ...state, selected: (state.selected - 1 + count) % count };\n if (key.downArrow || (!key.ctrl && input === 'j')) return { ...state, selected: (state.selected + 1) % count };\n if (key.return) return { ...state, decision: (APPROVAL_OPTIONS[state.selected] as ApprovalOption).decision };\n const byNumber = /^[1-9]$/.test(input) ? APPROVAL_OPTIONS[Number(input) - 1] : undefined;\n const byHotkey = APPROVAL_OPTIONS.find((o) => o.hotkey === input.toLowerCase());\n const chosen = byNumber ?? (key.ctrl || key.meta ? undefined : byHotkey);\n return chosen ? { ...state, selected: APPROVAL_OPTIONS.indexOf(chosen), decision: chosen.decision } : state;\n}\n\n/** The one-row collapsed form: `\u2713 Approved cv tailor \u00B7 2.1s` (research \u00A75.8). */\nexport function approvalOutcomeText(decision: ApprovalChoice, title: string, approvalId: string, durationMs?: number): string {\n const time = durationMs !== undefined ? theme.dim(` ${theme.symbols.middot} ${formatElapsed(durationMs)}`) : '';\n if (decision === 'approve') return `${theme.success(theme.symbols.success)} Approved ${title}${time}`;\n if (decision === 'reject') return `${theme.error(theme.symbols.error)} Rejected ${title}${time}`;\n return `${theme.attention(theme.symbols.attention)} Left pending ${title} ${theme.dim(shortId(approvalId))}`;\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { memo, useEffect, useReducer } from 'react';\nimport { windowAround } from '../fuzzy';\nimport { theme } from '../theme';\nimport { displayWidth, padEnd, truncate, truncateStart } from '../text';\nimport { KeyHints } from './KeyHints';\nimport { type FormField, type FormState, formKeyAction, formReducer } from './form-model';\n\nexport type FormProps = {\n initial: FormState;\n width: number;\n /** Rows available for fields. */\n height: number;\n isActive: boolean;\n submitLabel?: string;\n onSubmit(input: Record<string, unknown>): void;\n onCancel(): void;\n};\n\nfunction valueText(field: FormField, raw: string, focused: boolean): string {\n const kind = field.spec.kind;\n if (kind === 'boolean') {\n const on = raw === 'true';\n const unset = raw === '';\n const box = unset ? '[ ]' : on ? '[x]' : '[-]';\n const label = unset ? theme.dim('unset') : on ? 'yes' : 'no';\n return `${focused ? theme.accent(box) : box} ${label}`;\n }\n if (kind === 'enum') {\n const text = raw || theme.dim('none');\n return focused ? `${theme.accent('\u2039')} ${text} ${theme.accent('\u203A')}` : text;\n }\n return raw;\n}\n\nconst FieldRow = memo(function FieldRow(props: {\n field: FormField;\n raw: string;\n focused: boolean;\n error?: string;\n labelWidth: number;\n width: number;\n}) {\n const { field, raw, focused, error, labelWidth, width } = props;\n const marker = field.spec.required ? theme.attention('*') : ' ';\n const label = padEnd(truncate(field.label, labelWidth), labelWidth);\n const valueWidth = Math.max(8, Math.floor((width - labelWidth - 6) * 0.6));\n const textLike = field.spec.kind !== 'boolean' && field.spec.kind !== 'enum';\n const shown = textLike ? truncateStart(raw, valueWidth - 1) : valueText(field, raw, focused);\n const cursor = focused && textLike ? theme.accent(theme.symbols.cursor) : '';\n const descBudget = width - labelWidth - 6 - valueWidth - 2;\n const hint =\n field.spec.kind === 'enum' && field.spec.enumValues?.length\n ? field.spec.enumValues.join(' | ')\n : field.spec.kind === 'array'\n ? 'comma-separated'\n : field.spec.kind === 'json'\n ? 'JSON'\n : field.spec.description;\n return (\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {focused ? theme.accent(theme.symbols.pointer) : ' '} {focused ? theme.bold(label) : label} {marker}{' '}\n {padEnd(`${shown}${cursor}`, valueWidth)}\n {descBudget > 8 && hint ? ` ${theme.dim(truncate(hint, descBudget))}` : ''}\n </Text>\n {error ? (\n <Text wrap=\"truncate-end\">\n {' '}\n {theme.error(`${theme.symbols.error} ${error}`)}\n </Text>\n ) : null}\n </Box>\n );\n});\n\n/** Fields from a JSON Schema; Tab/Shift-Tab move, Enter on the last submits, Esc cancels. */\nexport function Form(props: FormProps) {\n const { width, height, isActive, submitLabel = 'run' } = props;\n const [state, dispatch] = useReducer(formReducer, props.initial);\n\n useInput(\n (input, key) => {\n const action = formKeyAction(state, input, key);\n if (action) dispatch(action);\n },\n { isActive: isActive && state.status === 'editing' },\n );\n\n const { onSubmit, onCancel } = props;\n useEffect(() => {\n if (state.status === 'submitted' && state.result) onSubmit(state.result);\n if (state.status === 'cancelled') onCancel();\n }, [state.status, state.result, onSubmit, onCancel]);\n\n const labelWidth = Math.min(24, Math.max(6, ...state.fields.map((f) => displayWidth(f.label))));\n const errorRows = Object.keys(state.errors).length;\n const rows = Math.max(1, height - errorRows);\n const { start, end } = windowAround(state.fields.length, state.focus, rows);\n return (\n <Box flexDirection=\"column\" width={width}>\n {state.fields.length === 0 ? <Text>{theme.dim(' This tool takes no input.')}</Text> : null}\n {start > 0 ? <Text>{theme.dim(` ${theme.symbols.ellipsis} ${start} above`)}</Text> : null}\n {state.fields.slice(start, end).map((field, i) => (\n <FieldRow\n key={field.spec.property}\n field={field}\n raw={state.values[field.spec.property] ?? ''}\n focused={start + i === state.focus}\n error={state.errors[field.spec.property]}\n labelWidth={labelWidth}\n width={width}\n />\n ))}\n {end < state.fields.length ? <Text>{theme.dim(` ${theme.symbols.ellipsis} ${state.fields.length - end} more`)}</Text> : null}\n <Text> </Text>\n <KeyHints\n width={width}\n hints={[\n { key: 'tab', label: 'next' },\n { key: 'shift+tab', label: 'back' },\n { key: 'enter', label: state.focus >= state.fields.length - 1 ? submitLabel : 'next' },\n { key: 'ctrl+s', label: submitLabel },\n { key: 'esc', label: 'cancel' },\n ]}\n />\n </Box>\n );\n}\n", "/**\n * Fuzzy ranking shared by the command palette, SelectList and the tool\n * browser (research \u00A71.2 order): exact \u2192 prefix \u2192 word prefix \u2192 substring \u2192\n * subsequence \u2192 description substring. Lower rank is better; null = no match.\n */\nexport function rankMatch(query: string, primary: string, secondary = ''): number | null {\n const q = query.trim().toLowerCase();\n if (!q) return 0;\n const p = primary.toLowerCase();\n if (p === q) return 0;\n if (p.startsWith(q)) return 1;\n if (p.split(/[\\s._/-]+/).some((word) => word.startsWith(q))) return 2;\n if (p.includes(q)) return 3;\n if (isSubsequence(q, p)) return 4;\n // Descriptions only for 3+ letters: two letters match nearly every sentence.\n if (secondary && q.length >= 3 && secondary.toLowerCase().includes(q)) return 5;\n return null;\n}\n\nexport function isSubsequence(needle: string, haystack: string): boolean {\n let i = 0;\n for (const char of haystack) {\n if (char === needle[i]) i += 1;\n if (i === needle.length) return true;\n }\n return needle.length === 0;\n}\n\n/** Stable filter + sort by rank. */\nexport function fuzzyFilter<T>(items: readonly T[], query: string, fields: (item: T) => [string, string?]): T[] {\n if (!query.trim()) return [...items];\n return items\n .map((item, index) => {\n const [primary, secondary] = fields(item);\n return { item, index, rank: rankMatch(query, primary, secondary) };\n })\n .filter((entry): entry is { item: T; index: number; rank: number } => entry.rank !== null)\n .sort((a, b) => a.rank - b.rank || a.index - b.index)\n .map((entry) => entry.item);\n}\n\n/** Window of `size` rows that keeps `cursor` visible. */\nexport function windowAround(count: number, cursor: number, size: number): { start: number; end: number } {\n if (count <= size) return { start: 0, end: count };\n const half = Math.floor(size / 2);\n const start = Math.max(0, Math.min(count - size, cursor - half));\n return { start, end: start + size };\n}\n", "/**\n * Tool input form model (pure, for tests). Fields come from the same\n * schema \u2192 flag mapping as the generated commands (`core/schema-flags.ts`),\n * and values are validated with the same parser, so the form accepts exactly\n * what `--flags` accept.\n */\nimport type { Key } from 'ink';\nimport type { JsonSchema } from '../../core/catalog';\nimport { isCliError } from '../../core/errors';\nimport { type FlagSpec, parseToolInput, schemaToFlags } from '../../core/schema-flags';\n\nexport type FormField = { spec: FlagSpec; label: string };\n\nexport type FormState = {\n schema: JsonSchema;\n fields: FormField[];\n /** Raw text per property. */\n values: Record<string, string>;\n focus: number;\n errors: Record<string, string>;\n status: 'editing' | 'submitted' | 'cancelled';\n /** Values passed in that have no field (nested, auto-filled): kept as is. */\n base: Record<string, unknown>;\n result?: Record<string, unknown>;\n};\n\nexport type FormAction =\n | { type: 'type'; text: string }\n | { type: 'backspace' }\n | { type: 'clear-field' }\n | { type: 'next' }\n | { type: 'prev' }\n | { type: 'toggle' }\n | { type: 'cycle'; delta: number }\n | { type: 'enter' }\n | { type: 'submit' }\n | { type: 'cancel' };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Initial value \u2192 the raw text a user would type. */\nexport function rawFromValue(spec: FlagSpec, value: unknown): string {\n if (value === undefined) return '';\n if (value === null) return spec.nullable ? 'null' : '';\n if (spec.kind === 'array' && Array.isArray(value) && value.every((v) => typeof v !== 'object')) return value.join(', ');\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nexport function createFormState(\n schema: JsonSchema,\n initial: Record<string, unknown> = {},\n opts: { skip?: readonly string[]; missingRequired?: readonly string[] } = {},\n): FormState {\n const skip = new Set(opts.skip ?? []);\n const specs = schemaToFlags(schema).filter((spec) => !skip.has(spec.property));\n const ordered = [...specs.filter((s) => s.required), ...specs.filter((s) => !s.required)];\n const fields = ordered.map((spec) => ({ spec, label: spec.flag }));\n const values: Record<string, string> = {};\n for (const field of fields) values[field.spec.property] = rawFromValue(field.spec, initial[field.spec.property]);\n const missing = new Set(opts.missingRequired ?? []);\n const firstMissing = fields.findIndex((f) => missing.has(f.spec.property) || (f.spec.required && !values[f.spec.property]));\n return {\n schema,\n fields,\n values,\n focus: Math.max(0, firstMissing),\n errors: {},\n status: 'editing',\n base: isRecord(initial) ? { ...initial } : {},\n };\n}\n\n/** Parses one raw value with the flag parser: `{ value }`, `{ error }`, or `{}` for empty. */\nexport function validateField(schema: JsonSchema, spec: FlagSpec, raw: string): { value?: unknown; error?: string } {\n if (raw.trim() === '') return spec.required ? { error: 'Required' } : {};\n try {\n const { input } = parseToolInput(schema, { [spec.attr]: raw });\n return { value: input[spec.property] };\n } catch (error) {\n if (isCliError(error)) return { error: error.hint ? `${error.message}. ${error.hint}` : error.message };\n return { error: error instanceof Error ? error.message : String(error) };\n }\n}\n\nfunction withError(state: FormState, property: string, error: string | undefined): FormState {\n const errors = { ...state.errors };\n if (error) errors[property] = error;\n else delete errors[property];\n return { ...state, errors };\n}\n\nfunction focused(state: FormState): FormField | undefined {\n return state.fields[state.focus];\n}\n\nfunction setValue(state: FormState, value: string): FormState {\n const field = focused(state);\n if (!field) return state;\n return withError({ ...state, values: { ...state.values, [field.spec.property]: value } }, field.spec.property, undefined);\n}\n\nfunction choices(spec: FlagSpec): string[] {\n if (spec.kind === 'boolean') return spec.required ? ['true', 'false'] : ['', 'true', 'false'];\n const values = spec.enumValues ?? [];\n return spec.required ? values : ['', ...values];\n}\n\nfunction submit(state: FormState): FormState {\n let next = { ...state, errors: {} as Record<string, string> };\n const result: Record<string, unknown> = { ...state.base };\n for (const field of state.fields) {\n const property = field.spec.property;\n const checked = validateField(state.schema, field.spec, state.values[property] ?? '');\n if (checked.error) next = withError(next, property, checked.error);\n else if (checked.value === undefined) delete result[property];\n else result[property] = checked.value;\n }\n const firstError = state.fields.findIndex((f) => next.errors[f.spec.property]);\n if (firstError >= 0) return { ...next, focus: firstError };\n return { ...next, status: 'submitted', result };\n}\n\nexport function formReducer(state: FormState, action: FormAction): FormState {\n if (state.status !== 'editing') return state;\n const field = focused(state);\n const raw = field ? (state.values[field.spec.property] ?? '') : '';\n switch (action.type) {\n case 'type':\n if (field?.spec.kind === 'boolean') {\n const c = action.text.toLowerCase();\n if (c === 'y' || c === 't') return setValue(state, 'true');\n if (c === 'n' || c === 'f') return setValue(state, 'false');\n if (c === ' ') return formReducer(state, { type: 'toggle' });\n return state;\n }\n return field ? setValue(state, raw + action.text.replace(/\\r\\n?|\\n/g, ' ')) : state;\n case 'backspace':\n return field ? setValue(state, field.spec.kind === 'boolean' ? '' : [...raw].slice(0, -1).join('')) : state;\n case 'clear-field':\n return setValue(state, '');\n case 'toggle':\n case 'cycle': {\n if (!field || (field.spec.kind !== 'boolean' && field.spec.kind !== 'enum')) return state;\n const options = choices(field.spec);\n const delta = action.type === 'cycle' ? action.delta : 1;\n const index = Math.max(0, options.indexOf(raw));\n return setValue(state, options[(index + delta + options.length) % options.length] ?? '');\n }\n case 'next':\n case 'prev': {\n if (state.fields.length === 0) return state;\n const checked = field ? validateField(state.schema, field.spec, raw) : {};\n const next = field && raw.trim() ? withError(state, field.spec.property, checked.error) : state;\n const delta = action.type === 'next' ? 1 : -1;\n return { ...next, focus: (state.focus + delta + state.fields.length) % state.fields.length };\n }\n case 'enter':\n if (state.fields.length === 0 || state.focus >= state.fields.length - 1) return submit(state);\n return formReducer(state, { type: 'next' });\n case 'submit':\n return submit(state);\n case 'cancel':\n return { ...state, status: 'cancelled' };\n default:\n return state;\n }\n}\n\n/** Keys: Tab / Shift-Tab / \u2191\u2193 move, \u2190\u2192 and Space pick choices, Enter next (submits on the last), Ctrl+S submits, Esc cancels. */\nexport function formKeyAction(state: FormState, input: string, key: Partial<Key>): FormAction | null {\n const kind = focused(state)?.spec.kind;\n if (key.escape) return { type: 'cancel' };\n if (key.tab) return key.shift ? { type: 'prev' } : { type: 'next' };\n if (key.downArrow) return { type: 'next' };\n if (key.upArrow) return { type: 'prev' };\n if (key.return) return { type: 'enter' };\n if (key.ctrl && input === 's') return { type: 'submit' };\n if (key.ctrl && input === 'u') return { type: 'clear-field' };\n if ((kind === 'enum' || kind === 'boolean') && (key.leftArrow || key.rightArrow)) {\n return { type: 'cycle', delta: key.leftArrow ? -1 : 1 };\n }\n if (key.backspace || key.delete) return { type: 'backspace' };\n if (key.ctrl || key.meta) return null;\n return input ? { type: 'type', text: input } : null;\n}\n\nfunction shellQuote(text: string): string {\n return /^[\\w@%+=:,./-]+$/.test(text) ? text : `'${text.replace(/'/g, `'\\\\''`)}'`;\n}\n\n/** The flags form of a submitted input (`tabbio cv tailor --cv-id cv_8f2 --tone formal`). */\nexport function equivalentCommand(\n tool: { commandPath: readonly string[]; inputSchema: JsonSchema },\n input: Record<string, unknown>,\n skip: readonly string[] = [],\n): string {\n const parts = ['tabbio', ...tool.commandPath];\n for (const spec of schemaToFlags(tool.inputSchema)) {\n const value = input[spec.property];\n if (value === undefined || skip.includes(spec.property)) continue;\n if (spec.kind === 'boolean' && typeof value === 'boolean') {\n parts.push(value ? `--${spec.flag}` : `--${spec.flag}=false`);\n continue;\n }\n const text =\n spec.kind === 'array' && Array.isArray(value) && value.every((v) => typeof v !== 'object')\n ? value.join(',')\n : typeof value === 'object' && value !== null\n ? JSON.stringify(value)\n : String(value);\n parts.push(`--${spec.flag}`, shellQuote(text));\n }\n return parts.join(' ');\n}\n", "import type { AgentMode, AgentThreadSummary } from '@tabbio/types';\nimport { Box, type Key, Static, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react';\nimport { artifactsDir, displayPath } from '../../../core/artifact-save';\nimport type { ChatCapabilities } from '../../../core/capabilities';\nimport { isDestructiveTool } from '../../../core/chat';\nimport { toCliError } from '../../../core/errors';\nimport { relativeTime } from '../../../core/io';\nimport { ApprovalCard } from '../../components/ApprovalCard';\nimport { editorReducer, emptyEditor } from '../../components/editor-model';\nimport { SelectList } from '../../components/SelectList';\nimport { Working } from '../../components/Spinner';\nimport { TextInput } from '../../components/TextInput';\nimport { pageMargin, useTerminalSize } from '../../layout';\nimport type { AccountChange, UiServices } from '../../services';\nimport { theme } from '../../theme';\nimport { shortId } from '../../text';\nimport { LoginPanel, type LoginOutcome } from '../login/LoginPanel';\nimport type { LoginStart } from '../login/login-model';\nimport { Palette, parseSlash } from '../Palette';\nimport { paletteView, resolveSubmit } from '../palette-model';\nimport { useSkills } from '../useSkills';\nimport { ChatStatus, SelectEscape, capabilitySegments } from './ChatStatus';\nimport { chatCommands } from './commands';\nimport { EntryView, LiveTurn, type StaticItem } from './Transcript';\nimport { useChatCommands } from './useChatCommands';\nimport { useChatSession } from './useChatSession';\n\nexport { capabilitySegments } from './ChatStatus';\n\nexport type ChatExitReason = 'exit' | 'home';\n\nexport type ChatProps = {\n services: UiServices;\n mode: AgentMode;\n companyId?: string;\n threadId?: string;\n modelId?: string;\n initialMessage?: string;\n /** Research / Image / Result for this chat; defaults to the profile's saved choice. */\n capabilities?: ChatCapabilities;\n /** Save generated files into the artifacts dir (default on; `--no-save` turns it off). */\n saveArtifacts?: boolean;\n width: number;\n height: number;\n hostedByHome?: boolean;\n /** /login and /logout: the host swaps the services (and leaves the chat on sign-out). */\n onAccountChange?(change: AccountChange): void;\n onExit(reason: ChatExitReason): void;\n};\n\ntype Overlay = { kind: 'threads'; since: number; threads?: AgentThreadSummary[]; error?: string } | { kind: 'login'; start: LoginStart } | null;\n\nconst DOUBLE_PRESS_MS = 2000;\n\n/** The once-per-session line under the composer while auto-save is on. */\nexport function saveHintText(dir: string = artifactsDir()): string {\n return `Generated files are saved to ${displayPath(dir)} (/help for /save, /show, /open)`;\n}\n\n/**\n * Streaming chat (research \u00A75.9): finished items go through `<Static>` into\n * scrollback; the live region is the current turn, any approval card, the\n * composer and the status bar. Ctrl+C stops the turn, twice quits.\n */\nexport function Chat(props: ChatProps) {\n const { services, width, height, hostedByHome = false, onExit, onAccountChange } = props;\n // <Static> output is laid out outside the page frame, so it carries its own gutter.\n const gutter = pageMargin(useTerminalSize().columns);\n const session = useChatSession(props);\n const { state } = session;\n const [editor, dispatchEditor] = useReducer(editorReducer, emptyEditor);\n const [paletteIndex, setPaletteIndex] = useState(0);\n const [navigated, setNavigated] = useState(false);\n const [overlay, setOverlay] = useState<Overlay>(null);\n const [expandTools, setExpandTools] = useState(false);\n const [hint, setHint] = useState<string | null>(null);\n const lastCtrlC = useRef(0);\n const lastEsc = useRef(0);\n\n const commands = useMemo(() => chatCommands({ hostedByHome }), [hostedByHome]);\n const skills = useSkills(services, services.account.hasSession && editor.value.startsWith('/'));\n const view = overlay ? null : paletteView(commands, skills, editor.value, { ellipsis: theme.symbols.ellipsis, separator: theme.symbols.middot });\n const matches = view?.items ?? [];\n const selected = Math.min(paletteIndex, Math.max(0, matches.length - 1));\n const approval = !state.streaming ? state.approvals[0] : undefined;\n const composerActive = !overlay && !approval;\n const firstTurn = !state.entries.some((e) => e.kind === 'user') && !state.turn;\n const saveHint = session.saveArtifacts && firstTurn ? saveHintText() : null;\n\n const [header] = useState<StaticItem>(() => ({\n kind: 'header',\n id: 'chat-header',\n text: `${theme.bold('Chat')} ${theme.dim(`${theme.symbols.middot} ${props.mode}${props.threadId ? ` ${theme.symbols.middot} resumed` : ''}`)}`,\n right: `profile ${services.profileName}`,\n }));\n const staticItems = useMemo<StaticItem[]>(() => [header, ...state.entries], [header, state.entries]);\n\n useEffect(() => {\n if (!hint) return undefined;\n const timer = setTimeout(() => setHint(null), DOUBLE_PRESS_MS);\n return () => clearTimeout(timer);\n }, [hint]);\n\n useEffect(() => setNavigated(false), [editor.value]);\n\n const openThreads = useCallback(() => {\n setOverlay({ kind: 'threads', since: Date.now() });\n services\n .listThreads({ mode: state.mode, companyId: props.companyId })\n .then((threads) => setOverlay((o) => (o?.kind === 'threads' ? { ...o, threads } : o)))\n .catch((error: unknown) => setOverlay((o) => (o?.kind === 'threads' ? { ...o, error: toCliError(error).message } : o)));\n }, [services, state.mode, props.companyId]);\n\n const openLogin = useCallback((start: LoginStart) => setOverlay({ kind: 'login', start }), []);\n\n const onLoginDone = useCallback(\n (outcome: LoginOutcome) => {\n setOverlay(null);\n if (outcome.status === 'done') {\n onAccountChange?.(outcome.change);\n session.dispatch({ type: 'notice', tone: 'success', text: outcome.change.message });\n for (const warning of outcome.change.warnings ?? []) session.dispatch({ type: 'notice', tone: 'attention', text: warning });\n } else if (outcome.status === 'cancelled') session.dispatch({ type: 'notice', tone: 'info', text: 'Sign-in cancelled' });\n else session.dispatch({ type: 'notice', tone: 'error', text: outcome.message, hint: outcome.hint });\n },\n [onAccountChange, session],\n );\n\n const runCommand = useChatCommands({ session, services, companyId: props.companyId, hostedByHome, onExit, openThreads, openLogin, onAccountChange });\n\n const submit = useCallback(\n (value: string) => {\n const argRows = view?.args ? matches : [];\n const res = resolveSubmit(value, { commands, skills, highlighted: view?.args ? undefined : matches[selected], navigated });\n if (res.kind === 'empty' || res.kind === 'bare') return;\n if (res.kind === 'loading') {\n setHint('Skills are still loading. Press enter again in a moment.');\n return;\n }\n const text = value.trim();\n const done = () => {\n dispatchEditor({ type: 'remember', value: text });\n dispatchEditor({ type: 'clear' });\n setPaletteIndex(0);\n };\n if (res.kind === 'message' || res.kind === 'skill') {\n done();\n session.send(res.kind === 'skill' ? res.message : res.text);\n return;\n }\n if (res.kind === 'unknown') {\n done();\n session.dispatch({ type: 'notice', tone: 'error', text: `Unknown command /${res.name}`, hint: 'Type / to see the commands and your skills.' });\n return;\n }\n const exact = res.picked ? undefined : commands.find((c) => c.name === res.name);\n const choice = exact ?? commands.find((c) => c.name === res.name);\n // The highlighted argument when the palette lists them (`/research ` or `/research o`).\n const picked = exact?.args ? argRows[selected]?.completion : undefined;\n if (choice?.args && !res.arg && !picked) {\n // `/research` + enter opens its choices, like `/mode`.\n dispatchEditor({ type: 'set', value: `/${choice.name} ` });\n setPaletteIndex(0);\n return;\n }\n let arg = exact ? res.arg : '';\n const known = exact?.args?.some((a) => a.value === arg.toLowerCase());\n if (exact?.args && !known && picked) arg = parseSlash(picked)?.arg ?? arg;\n done();\n runCommand(res.name, arg);\n },\n [view, matches, selected, commands, skills, navigated, runCommand, session],\n );\n\n const onCtrlC = useCallback(() => {\n const now = Date.now();\n if (now - lastCtrlC.current < DOUBLE_PRESS_MS) {\n session.interrupt();\n onExit('exit');\n return;\n }\n lastCtrlC.current = now;\n if (session.interrupt()) setHint('Stopped. Press ctrl+c again to quit.');\n else {\n if (editor.value) dispatchEditor({ type: 'clear' });\n setHint('Press ctrl+c again to quit.');\n }\n }, [session, onExit, editor.value]);\n\n useInput((input, key) => {\n if (key.ctrl && input === 'c') onCtrlC();\n });\n\n const onComposerKey = useCallback(\n (input: string, key: Key): boolean => {\n if (key.ctrl && input === 'c') return true;\n if (matches.length > 0) {\n if (key.upArrow || key.downArrow) {\n setPaletteIndex((i) => (key.upArrow ? Math.max(0, i - 1) : Math.min(matches.length - 1, i + 1)));\n setNavigated(true);\n return true;\n }\n if (key.tab) {\n const choice = matches[selected];\n if (choice?.completion) dispatchEditor({ type: 'set', value: choice.completion });\n else if (choice) dispatchEditor({ type: 'set', value: `/${choice.name}${choice.usage || choice.skillId ? ' ' : ''}` });\n setPaletteIndex(0);\n return true;\n }\n }\n if (key.escape) {\n if (session.interrupt()) return true;\n const now = Date.now();\n if (!editor.value) {\n if (hostedByHome) onExit('home');\n else setHint('Type /exit or press ctrl+c twice to quit.');\n } else if (view?.open || now - lastEsc.current < 600) dispatchEditor({ type: 'clear' });\n lastEsc.current = now;\n return true;\n }\n if (key.tab && key.shift) {\n if (!state.streaming) runCommand('mode', state.mode === 'seeker' ? 'employer' : 'seeker');\n return true;\n }\n if (key.ctrl && input === 'o') {\n const liveTools = state.turn?.items.some((item) => item.kind === 'tool');\n if (liveTools) setExpandTools((v) => !v);\n else session.dispatch({ type: 'expand-last-tool' });\n return true;\n }\n return false;\n },\n [matches, selected, view, session, editor.value, state.streaming, state.mode, state.turn, runCommand, hostedByHome, onExit],\n );\n\n // Height budget: the live region must stay shorter than the terminal.\n const cardRows = approval ? 14 + Math.min(9, Object.keys(approval.args).length) : 0;\n const paletteRows = view?.open ? Math.min(6, matches.length) + 2 : 0;\n const saveHintRows = saveHint ? Math.ceil(saveHint.length / Math.max(20, width)) : 0;\n const fixedRows = 4 + 1 + (hint ? 1 : 0) + saveHintRows + session.queue.length + paletteRows + (overlay ? 12 : 0) + cardRows + 2;\n const liveBudget = Math.max(3, height - fixedRows - 1);\n\n const placeholder = approval\n ? 'Decide the approval above first'\n : state.streaming\n ? `Queue a follow-up${theme.symbols.ellipsis} (esc to interrupt)`\n : 'Ask Tabbio anything, or / for commands';\n const segments = [\n `profile ${services.profileName}`,\n state.mode,\n state.modelId ?? 'auto',\n ...capabilitySegments(state.mode, state.capabilities),\n state.threadId ? shortId(state.threadId, 6, 3) : 'new chat',\n ];\n\n return (\n <Box flexDirection=\"column\" width={width}>\n <Static items={staticItems}>\n {(item) => (\n <Box key={item.id} paddingLeft={gutter}>\n <EntryView entry={item} width={width} />\n </Box>\n )}\n </Static>\n {state.turn ? (\n <LiveTurn turn={state.turn} width={width} expandTools={expandTools} maxLines={liveBudget} streaming={state.streaming} />\n ) : null}\n {session.loading ? (\n <Box marginTop={1}>\n <Working label={session.loading.label} since={session.loading.since} />\n </Box>\n ) : null}\n {approval ? (\n <Box marginTop={1}>\n <ApprovalCard\n approvalId={approval.approvalId}\n title={approval.title}\n args={approval.args}\n destructive={isDestructiveTool(approval.name)}\n context={`Writes to your account ${theme.symbols.middot} profile ${services.profileName}`}\n busy={session.deciding}\n isActive={!session.deciding && !overlay}\n width={width}\n onDecision={(decision) => void session.decide(approval, decision)}\n />\n </Box>\n ) : null}\n {overlay?.kind === 'login' ? (\n <Box marginTop={1}>\n <LoginPanel services={services} start={overlay.start} width={width} onDone={onLoginDone} />\n </Box>\n ) : null}\n {overlay?.kind === 'threads' ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>{theme.bold('Recent chats')}</Text>\n {overlay.error ? (\n <Text>{theme.error(`${theme.symbols.error} ${overlay.error}`)}</Text>\n ) : !overlay.threads ? (\n <Working label=\"Loading chats\u2026\" since={overlay.since} />\n ) : (\n <SelectList\n items={overlay.threads.map((t) => ({\n id: t.id,\n label: t.title?.trim() || 'Untitled chat',\n meta: relativeTime(new Date(t.lastMessageAt ?? t.updatedAt)),\n }))}\n width={width}\n height={8}\n isActive\n emptyText=\"No chats yet\"\n onSelect={(item) => {\n setOverlay(null);\n void session.resume(item.id, item.label);\n }}\n onCancel={() => setOverlay(null)}\n />\n )}\n {overlay.error || !overlay.threads ? <SelectEscape onClose={() => setOverlay(null)} /> : null}\n </Box>\n ) : null}\n {session.queue.map((queued, i) => (\n <Text key={`q-${i}`} wrap=\"truncate-end\">\n {theme.dim(`${theme.symbols.arrowRight} queued: ${queued}`)}\n </Text>\n ))}\n {view?.open ? (\n <Box marginTop={1}>\n <Palette commands={matches} selected={selected} width={width} footer={view.footer} />\n </Box>\n ) : null}\n <Box marginTop={view?.open ? 0 : 1}>\n <TextInput\n editor={editor}\n dispatch={dispatchEditor}\n onSubmit={submit}\n onKey={onComposerKey}\n isActive={composerActive}\n width={width}\n placeholder={placeholder}\n boxed\n />\n </Box>\n {hint ? <Text>{theme.attention(hint)}</Text> : null}\n {saveHint && !hint ? <Text wrap=\"wrap\">{theme.dim(saveHint)}</Text> : null}\n <ChatStatus\n width={width}\n segments={segments}\n since={state.streaming && state.turn ? state.turn.startedAt : null}\n streaming={state.streaming}\n approval={Boolean(approval)}\n overlay={Boolean(overlay)}\n />\n </Box>\n );\n}\n", "import type { Key } from 'ink';\n\n/**\n * Composer state (pure, for tests). Values may contain newlines (Ctrl+J, or\n * `\\` then Enter, or a multi-line paste); the input renders them on one line.\n */\nexport type EditorState = {\n value: string;\n /** Cursor as an index into the code points of `value`. */\n cursor: number;\n history: string[];\n /** Position while browsing history (null = editing the draft). */\n historyIndex: number | null;\n draft: string;\n};\n\nexport type EditorAction =\n | { type: 'insert'; text: string }\n | { type: 'backspace' }\n | { type: 'left' }\n | { type: 'right' }\n | { type: 'home' }\n | { type: 'end' }\n | { type: 'kill-line' }\n | { type: 'kill-word' }\n | { type: 'newline' }\n /** `\\` then Enter: the backslash becomes a newline. */\n | { type: 'backslash-newline' }\n | { type: 'set'; value: string }\n | { type: 'clear' }\n | { type: 'history-prev' }\n | { type: 'history-next' }\n | { type: 'remember'; value: string };\n\nexport const emptyEditor: EditorState = { value: '', cursor: 0, history: [], historyIndex: null, draft: '' };\n\nexport function editorWith(value: string): EditorState {\n return { ...emptyEditor, value, cursor: [...value].length };\n}\n\nfunction chars(value: string): string[] {\n return [...value];\n}\n\nfunction place(state: EditorState, next: string[], cursor: number): EditorState {\n return { ...state, value: next.join(''), cursor: Math.max(0, Math.min(next.length, cursor)), historyIndex: null };\n}\n\nexport function editorReducer(state: EditorState, action: EditorAction): EditorState {\n const list = chars(state.value);\n switch (action.type) {\n case 'insert': {\n const text = action.text.replace(/\\r\\n?/g, '\\n');\n const inserted = chars(text);\n return place(state, [...list.slice(0, state.cursor), ...inserted, ...list.slice(state.cursor)], state.cursor + inserted.length);\n }\n case 'newline':\n return editorReducer(state, { type: 'insert', text: '\\n' });\n case 'backslash-newline':\n if (state.cursor === 0 || list[state.cursor - 1] !== '\\\\') return editorReducer(state, { type: 'newline' });\n return place(state, [...list.slice(0, state.cursor - 1), '\\n', ...list.slice(state.cursor)], state.cursor);\n case 'backspace':\n if (state.cursor === 0) return state;\n return place(state, [...list.slice(0, state.cursor - 1), ...list.slice(state.cursor)], state.cursor - 1);\n case 'left':\n return { ...state, cursor: Math.max(0, state.cursor - 1) };\n case 'right':\n return { ...state, cursor: Math.min(list.length, state.cursor + 1) };\n case 'home':\n return { ...state, cursor: 0 };\n case 'end':\n return { ...state, cursor: list.length };\n case 'kill-line':\n return place(state, list.slice(state.cursor), 0);\n case 'kill-word': {\n let i = state.cursor;\n while (i > 0 && /\\s/.test(list[i - 1] as string)) i -= 1;\n while (i > 0 && !/\\s/.test(list[i - 1] as string)) i -= 1;\n return place(state, [...list.slice(0, i), ...list.slice(state.cursor)], i);\n }\n case 'set':\n return { ...state, value: action.value, cursor: chars(action.value).length, historyIndex: null };\n case 'clear':\n return { ...state, value: '', cursor: 0, historyIndex: null, draft: '' };\n case 'remember': {\n const value = action.value.trim();\n if (!value || state.history[state.history.length - 1] === value) return state;\n return { ...state, history: [...state.history, value].slice(-100) };\n }\n case 'history-prev': {\n if (state.history.length === 0) return state;\n const index = state.historyIndex === null ? state.history.length - 1 : Math.max(0, state.historyIndex - 1);\n const value = state.history[index] as string;\n return { ...state, value, cursor: chars(value).length, historyIndex: index, draft: state.historyIndex === null ? state.value : state.draft };\n }\n case 'history-next': {\n if (state.historyIndex === null) return state;\n const index = state.historyIndex + 1;\n if (index >= state.history.length) {\n return { ...state, value: state.draft, cursor: chars(state.draft).length, historyIndex: null };\n }\n const value = state.history[index] as string;\n return { ...state, value, cursor: chars(value).length, historyIndex: index };\n }\n default:\n return state;\n }\n}\n\nexport type EditorKeyResult = EditorAction | { type: 'submit' } | null;\n\n/**\n * Maps a keypress to an editor action. Enter submits unless the character\n * before the cursor is `\\` (then it becomes a newline); Ctrl+J inserts a\n * newline. Ink 6 reports the Backspace key as `delete`, so both erase.\n * Keys the editor does not own (Esc, Tab, Ctrl+C, \u2026) return null.\n */\nexport function editorKeyAction(state: EditorState, input: string, key: Partial<Key>): EditorKeyResult {\n if (key.return) {\n const list = chars(state.value);\n if (state.cursor > 0 && list[state.cursor - 1] === '\\\\') return { type: 'backslash-newline' };\n return { type: 'submit' };\n }\n if (input === '\\n' && !key.ctrl) return { type: 'newline' };\n if (key.backspace || key.delete) return { type: 'backspace' };\n if (key.leftArrow) return { type: 'left' };\n if (key.rightArrow) return { type: 'right' };\n if (key.upArrow) return { type: 'history-prev' };\n if (key.downArrow) return { type: 'history-next' };\n if (key.ctrl) {\n if (input === 'a') return { type: 'home' };\n if (input === 'e') return { type: 'end' };\n if (input === 'u') return { type: 'kill-line' };\n if (input === 'w') return { type: 'kill-word' };\n return null;\n }\n if (key.escape || key.tab || key.meta) return null;\n if (input) return { type: 'insert', text: input };\n return null;\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { memo, useMemo, useState } from 'react';\nimport { windowAround } from '../fuzzy';\nimport { theme } from '../theme';\nimport { displayWidth, truncate } from '../text';\nimport { KeyHints } from './KeyHints';\nimport { type SelectItem, type SelectState, initialSelectState, selectKeyAction, selectReducer, visibleItems } from './select-model';\n\nexport type { SelectItem } from './select-model';\n\nexport type SelectListProps = {\n items: readonly SelectItem[];\n width: number;\n /** Rows available for items (the filter line and hints are extra). */\n height: number;\n isActive: boolean;\n filterable?: boolean;\n emptyText?: string;\n showHints?: boolean;\n onSelect(item: SelectItem): void;\n onCancel(): void;\n onHighlight?(item: SelectItem | undefined): void;\n};\n\nconst Row = memo(function Row({ item, selected, width }: { item: SelectItem; selected: boolean; width: number }) {\n const meta = item.meta ? ` ${item.meta}` : '';\n const labelBudget = Math.max(4, width - 2 - displayWidth(meta));\n const label = truncate(item.label, labelBudget);\n const descBudget = labelBudget - displayWidth(label) - 2;\n const desc = item.description && descBudget > 6 ? ` ${truncate(item.description, descBudget)}` : '';\n const fill = ' '.repeat(Math.max(0, width - 2 - displayWidth(label) - displayWidth(desc) - displayWidth(meta)));\n return (\n <Text wrap=\"truncate-end\">\n {selected ? theme.accent(theme.symbols.pointer) : ' '} {selected ? theme.accent(label) : label}\n {theme.dim(desc)}\n {fill}\n {theme.dim(meta)}\n </Text>\n );\n});\n\n/** Filterable list (`/` filters with fuzzy match), j/k + arrows, Enter, q/Esc. */\nexport function SelectList(props: SelectListProps) {\n const { items, width, height, isActive, filterable = true, emptyText = 'Nothing here', showHints = true } = props;\n const [state, setState] = useState<SelectState>(initialSelectState);\n const shown = useMemo(() => visibleItems(items, state.query), [items, state.query]);\n const cursor = Math.min(state.cursor, Math.max(0, shown.length - 1));\n\n useInput(\n (input, key) => {\n const outcome = selectKeyAction(state, input, key, filterable);\n if (!outcome) return;\n if (outcome.type === 'select') {\n const item = shown[cursor];\n if (item) props.onSelect(item);\n return;\n }\n if (outcome.type === 'cancel') {\n props.onCancel();\n return;\n }\n const next = selectReducer(state, outcome, outcome.type === 'move' ? shown.length : visibleItems(items, state.query).length);\n setState(next);\n props.onHighlight?.(visibleItems(items, next.query)[next.cursor]);\n },\n { isActive },\n );\n\n const rows = Math.max(1, height);\n const { start, end } = windowAround(shown.length, cursor, rows);\n return (\n <Box flexDirection=\"column\" width={width}>\n {state.filtering ? (\n <Text>\n {theme.accent('/')} {state.query}\n {theme.accent(theme.symbols.cursor)}\n </Text>\n ) : null}\n {shown.length === 0 ? <Text>{theme.dim(` ${emptyText}`)}</Text> : null}\n {shown.slice(start, end).map((item, i) => (\n <Row key={item.id} item={item} selected={isActive && start + i === cursor} width={width} />\n ))}\n {shown.length > rows ? <Text>{theme.dim(` ${cursor + 1} of ${shown.length}`)}</Text> : null}\n {showHints ? (\n <KeyHints\n width={width}\n hints={[\n { key: theme.symbols.upDown, label: 'move' },\n { key: 'enter', label: 'open' },\n ...(filterable ? [{ key: '/', label: 'filter' }] : []),\n { key: 'esc', label: 'back' },\n ]}\n />\n ) : null}\n </Box>\n );\n}\n", "import type { Key } from 'ink';\nimport { fuzzyFilter } from '../fuzzy';\n\nexport type SelectItem = {\n id: string;\n label: string;\n description?: string;\n /** Dim text on the right (time, count). */\n meta?: string;\n};\n\nexport type SelectState = { cursor: number; query: string; filtering: boolean };\n\nexport const initialSelectState: SelectState = { cursor: 0, query: '', filtering: false };\n\nexport type SelectAction =\n | { type: 'move'; delta: number }\n | { type: 'start-filter' }\n | { type: 'type'; text: string }\n | { type: 'backspace' }\n | { type: 'stop-filter' };\n\nexport type SelectOutcome = SelectAction | { type: 'select' } | { type: 'cancel' } | null;\n\nexport function visibleItems(items: readonly SelectItem[], query: string): SelectItem[] {\n return fuzzyFilter(items, query, (item) => [item.label, item.description]);\n}\n\nexport function selectReducer(state: SelectState, action: SelectAction, count: number): SelectState {\n switch (action.type) {\n case 'move':\n return count === 0 ? { ...state, cursor: 0 } : { ...state, cursor: Math.max(0, Math.min(count - 1, state.cursor + action.delta)) };\n case 'start-filter':\n return { ...state, filtering: true };\n case 'type':\n return { ...state, query: state.query + action.text, cursor: 0 };\n case 'backspace':\n return state.query ? { ...state, query: [...state.query].slice(0, -1).join(''), cursor: 0 } : { ...state, filtering: false };\n case 'stop-filter':\n return { ...state, filtering: false, query: '', cursor: 0 };\n default:\n return state;\n }\n}\n\n/**\n * Keys (pure): \u2191\u2193 always move, j/k move outside filter mode, `/` starts\n * filtering (when filterable), Enter selects, Esc leaves filter mode and\n * then cancels, q cancels outside filter mode.\n */\nexport function selectKeyAction(state: SelectState, input: string, key: Partial<Key>, filterable: boolean): SelectOutcome {\n if (key.upArrow || (key.ctrl && input === 'p')) return { type: 'move', delta: -1 };\n if (key.downArrow || (key.ctrl && input === 'n')) return { type: 'move', delta: 1 };\n if (key.pageUp) return { type: 'move', delta: -10 };\n if (key.pageDown) return { type: 'move', delta: 10 };\n if (key.return) return { type: 'select' };\n if (key.escape) return state.filtering ? { type: 'stop-filter' } : { type: 'cancel' };\n if (state.filtering) {\n if (key.backspace || key.delete) return { type: 'backspace' };\n if (input && !key.ctrl && !key.meta && !key.tab) return { type: 'type', text: input };\n return null;\n }\n if (input === 'j') return { type: 'move', delta: 1 };\n if (input === 'k') return { type: 'move', delta: -1 };\n if (input === 'q') return { type: 'cancel' };\n if (input === '/' && filterable) return { type: 'start-filter' };\n return null;\n}\n", "import { Box, type Key, Text, useInput } from 'ink';\nimport { memo } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth, truncate } from '../text';\nimport { type EditorAction, type EditorState, editorKeyAction } from './editor-model';\n\nexport type TextInputProps = {\n editor: EditorState;\n dispatch(action: EditorAction): void;\n onSubmit(value: string): void;\n /** Runs first; return true when the parent handled the key (palette, Esc, \u2026). */\n onKey?(input: string, key: Key): boolean;\n isActive: boolean;\n width: number;\n placeholder?: string;\n boxed?: boolean;\n prompt?: string;\n};\n\nfunction cursorCell(char: string): string {\n if (theme.chalk.level > 0) return theme.inverse(char);\n return `${theme.symbols.cursor}${char === ' ' ? '' : char}`;\n}\n\n/**\n * The visible line (pure, for tests): newlines as a dim `\u21B5`, scrolled so the\n * cursor stays in view, cursor in inverse video (a `\u258D` without colour).\n */\nexport function renderComposerLine(state: EditorState, width: number, placeholder: string, showCursor: boolean): string {\n const budget = Math.max(4, width);\n const chars = [...state.value];\n if (chars.length === 0) {\n const hint = theme.dim(truncate(placeholder, Math.max(1, budget - 1)));\n return showCursor ? `${cursorCell(' ')}${hint}` : hint;\n }\n const cells = chars.map((char) => (char === '\\n' ? { text: theme.dim(theme.symbols.newline), width: displayWidth(theme.symbols.newline) } : { text: char, width: displayWidth(char) }));\n cells.push({ text: ' ', width: 1 });\n const cursor = Math.min(state.cursor, chars.length);\n let start = 0;\n let used = cells.slice(0, cursor + 1).reduce((sum, c) => sum + c.width, 0);\n while (used > budget - 1 && start < cursor) {\n used -= (cells[start] as { width: number }).width;\n start += 1;\n }\n let end = cursor + 1;\n let total = used;\n while (end < cells.length && total + (cells[end] as { width: number }).width <= budget - (start > 0 ? 1 : 0)) {\n total += (cells[end] as { width: number }).width;\n end += 1;\n }\n const out = cells.slice(start, end).map((cell, i) => {\n const index = start + i;\n if (index === cursor && showCursor) return cursorCell(index < chars.length && chars[index] !== '\\n' ? cell.text : ' ');\n return cell.text;\n });\n if (end === cells.length && !showCursor) out.pop();\n return `${start > 0 ? theme.dim(theme.symbols.ellipsis) : ''}${out.join('')}`;\n}\n\n/** Single-line, multi-line-safe composer (`\u203A` prompt; boxed = rounded dim border). */\nexport const TextInput = memo(function TextInput(props: TextInputProps) {\n const { editor, dispatch, onSubmit, onKey, isActive, width, placeholder = '', boxed = false, prompt } = props;\n\n useInput(\n (input, key) => {\n if (onKey?.(input, key)) return;\n const action = editorKeyAction(editor, input, key);\n if (!action) return;\n if (action.type === 'submit') onSubmit(editor.value);\n else dispatch(action);\n },\n { isActive },\n );\n\n const promptText = prompt ?? theme.symbols.pointer;\n const inner = boxed ? width - 4 : width;\n const line = renderComposerLine(editor, Math.max(4, inner - displayWidth(promptText) - 1), placeholder, isActive);\n const content = (\n <Text wrap=\"truncate-end\">\n {isActive ? theme.accent(promptText) : theme.dim(promptText)} {line}\n </Text>\n );\n if (!boxed) return content;\n return (\n <Box borderStyle={theme.boxStyle} borderDimColor paddingX={1} width={width}>\n {content}\n </Box>\n );\n});\n", "/**\n * `/login` inside Home and Chat: a small boxed step that runs one sign-in\n * method through `services.session` and hands the new account back to the\n * host. Esc (or Ctrl+C) cancels at any point: the browser listener is\n * aborted and a pending code prompt is rejected.\n */\nimport { Box, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useReducer, useRef } from 'react';\nimport { interruptedError, toCliError } from '../../../core/errors';\nimport { editorWith } from '../../components/editor-model';\nimport { formatHints } from '../../components/KeyHints';\nimport { Working } from '../../components/Spinner';\nimport { renderComposerLine } from '../../components/TextInput';\nimport { hyperlink } from '../../hyperlink';\nimport type { AccountChange, UiServices } from '../../services';\nimport { theme } from '../../theme';\nimport { padEnd } from '../../text';\nimport { LOGIN_CHOICES, type LoginStart, initialLoginPhase, inputDisplay, isEmail, loginReducer, waitingLabel } from './login-model';\n\nexport type LoginOutcome = { status: 'done'; change: AccountChange } | { status: 'cancelled' } | { status: 'failed'; message: string; hint?: string };\n\nexport type LoginPanelProps = {\n services: UiServices;\n start: LoginStart;\n width: number;\n isActive?: boolean;\n onDone(outcome: LoginOutcome): void;\n};\n\ntype Pending = { resolve(code: string): void; reject(error: Error): void };\n\nconst CHOICE_WIDTH = Math.max(...LOGIN_CHOICES.map((c) => c.label.length)) + 5;\n\nexport function LoginPanel(props: LoginPanelProps) {\n const { services, width, onDone, isActive = true } = props;\n const [phase, dispatch] = useReducer(loginReducer, props.start, (start) => initialLoginPhase(start, Date.now()));\n const abort = useRef<AbortController | null>(null);\n const pending = useRef<Pending | null>(null);\n const finished = useRef(false);\n const flow = useRef(false);\n\n const release = useCallback(() => {\n abort.current?.abort();\n pending.current?.reject(interruptedError('Login cancelled'));\n pending.current = null;\n }, []);\n\n const finish = useCallback(\n (outcome: LoginOutcome) => {\n if (finished.current) return;\n finished.current = true;\n release();\n onDone(outcome);\n },\n [onDone, release],\n );\n\n // Leaving the screen (quit, route change) cancels whatever is in flight.\n useEffect(\n () => () => {\n finished.current = true;\n release();\n },\n [release],\n );\n\n const run = useCallback(\n (work: Promise<AccountChange>) => {\n work.then(\n (change) => finish({ status: 'done', change }),\n (error: unknown) => {\n const cli = toCliError(error);\n finish(cli.exitCode === 130 ? { status: 'cancelled' } : { status: 'failed', message: cli.message, hint: cli.hint });\n },\n );\n },\n [finish],\n );\n\n const session = services.session;\n useEffect(() => {\n if (flow.current || finished.current) return;\n if (!session && phase.name !== 'choose') {\n finish({ status: 'failed', message: 'Signing in is not available here', hint: 'Run `tabbio login` in a terminal.' });\n return;\n }\n if (!session) return;\n if (phase.name === 'browser') {\n flow.current = true;\n const controller = new AbortController();\n abort.current = controller;\n run(session.loginWithBrowser({ signal: controller.signal, onWaiting: (url, opened) => dispatch({ type: 'browser-waiting', url, opened }) }));\n } else if (phase.name === 'email-sending') {\n flow.current = true;\n run(\n session.loginWithEmail({\n email: phase.email,\n promptCode: (attempt) =>\n new Promise<string>((resolve, reject) => {\n if (finished.current) return reject(interruptedError('Login cancelled'));\n pending.current = { resolve, reject };\n dispatch({ type: 'code-needed', attempt });\n }),\n onInvalidCode: (attemptsLeft) => dispatch({ type: 'code-rejected', attemptsLeft }),\n }),\n );\n }\n }, [phase, session, run, finish]);\n\n useInput(\n (input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n finish({ status: 'cancelled' });\n return;\n }\n if (phase.name === 'choose') {\n if (key.upArrow || input === 'k') dispatch({ type: 'move', delta: -1 });\n else if (key.downArrow || input === 'j') dispatch({ type: 'move', delta: 1 });\n const digit = /^[1-3]$/.test(input) ? Number(input) - 1 : null;\n const choice = LOGIN_CHOICES[digit ?? (key.return ? phase.index : -1)];\n if (choice) dispatch({ type: 'start', start: choice.method === 'email' ? { method: 'email' } : { method: choice.method }, now: Date.now() });\n return;\n }\n if (phase.name !== 'email-address' && phase.name !== 'email-code' && phase.name !== 'token-input') return;\n if (key.return) {\n const value = phase.value.trim();\n if (phase.name === 'email-address') {\n if (isEmail(value)) dispatch({ type: 'email-sending', email: value.toLowerCase(), now: Date.now() });\n else dispatch({ type: 'invalid', error: value ? `Not a valid email address: ${value}` : 'Type your email address' });\n } else if (phase.name === 'email-code') {\n if (value.length < 4) dispatch({ type: 'invalid', error: 'Enter the code from the email' });\n else {\n pending.current?.resolve(value);\n pending.current = null;\n dispatch({ type: 'verifying', now: Date.now() });\n }\n } else if (!value) dispatch({ type: 'invalid', error: 'Paste a token first' });\n else if (session) {\n dispatch({ type: 'token-checking', now: Date.now() });\n run(session.loginWithToken(value));\n }\n return;\n }\n if (key.backspace || key.delete) dispatch({ type: 'erase' });\n else if (!key.ctrl && !key.meta && !key.tab && !key.upArrow && !key.downArrow && !key.leftArrow && !key.rightArrow && input) {\n dispatch({ type: 'type', text: input });\n }\n },\n { isActive },\n );\n\n const inner = Math.max(10, width - 4);\n const hints = (list: Array<{ key: string; label: string }>) => <Text wrap=\"truncate-end\">{formatHints(list)}</Text>;\n const waiting = waitingLabel(phase);\n const display = inputDisplay(phase, theme.symbols.bullet);\n const error = 'error' in phase && phase.error ? <Text wrap=\"wrap\">{theme.attention(`${theme.symbols.attention} ${phase.error}`)}</Text> : null;\n\n return (\n <Box borderStyle={theme.boxStyle} borderDimColor paddingX={1} flexDirection=\"column\" width={width}>\n <Text>{theme.bold('Sign in to Tabbio')}</Text>\n {phase.name === 'choose' ? (\n <Box flexDirection=\"column\" marginTop={1}>\n {LOGIN_CHOICES.map((choice, i) => {\n const label = padEnd(`${i + 1} ${choice.label}`, CHOICE_WIDTH);\n return (\n <Text key={choice.method} wrap=\"truncate-end\">\n {i === phase.index ? theme.accent(`${theme.symbols.pointer} ${label}`) : ` ${label}`}\n {theme.dim(choice.hint)}\n </Text>\n );\n })}\n {hints([\n { key: theme.symbols.upDown, label: 'choose' },\n { key: 'enter', label: 'select' },\n { key: 'esc', label: 'cancel' },\n ])}\n </Box>\n ) : null}\n {waiting ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Working label={waiting} since={'since' in phase ? phase.since : Date.now()} />\n {phase.name === 'browser' && phase.url ? (\n <Box flexDirection=\"column\">\n <Text>{theme.dim(phase.opened ? 'If your browser did not open, visit:' : 'Open this link to continue:')}</Text>\n <Text wrap=\"wrap\">{theme.accent(services.hyperlinks ? hyperlink(phase.url, phase.url) : phase.url)}</Text>\n </Box>\n ) : null}\n {hints([{ key: 'esc', label: 'cancel' }])}\n </Box>\n ) : null}\n {display !== null ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text wrap=\"wrap\">\n {phase.name === 'email-address'\n ? 'Your email address'\n : phase.name === 'email-code'\n ? `Code sent to ${phase.email}. Enter it here:`\n : 'Paste a personal token (tabbio_mcp_...). It stays on this computer.'}\n </Text>\n <Text wrap=\"truncate-end\">\n {theme.accent(theme.symbols.pointer)} {renderComposerLine(editorWith(display), inner - 2, phase.name === 'email-address' ? 'you@example.com' : '', true)}\n </Text>\n {error}\n {hints([\n { key: 'enter', label: phase.name === 'email-address' ? 'send code' : phase.name === 'email-code' ? 'sign in' : 'check' },\n { key: 'esc', label: 'cancel' },\n ])}\n </Box>\n ) : null}\n </Box>\n );\n}\n", "/**\n * The in-app sign-in step (`/login` in Home and Chat), as a pure reducer:\n * a chooser (browser, email code, personal token), the inputs each method\n * needs, and the waiting states. The panel (LoginPanel.tsx) runs the flows\n * through `services.session`; nothing here does I/O.\n */\nexport type LoginMethod = 'browser' | 'email' | 'token';\n\nexport const LOGIN_CHOICES: ReadonlyArray<{ method: LoginMethod; label: string; hint: string }> = [\n { method: 'browser', label: 'Open the browser (recommended)', hint: 'Approve this computer in Tabbio' },\n { method: 'email', label: 'Email code', hint: 'A 6-digit code, for SSH and headless machines' },\n { method: 'token', label: 'Personal token', hint: 'tabbio_mcp_... from Settings; tools only' },\n];\n\nexport type LoginStart = { method: 'choose' } | { method: 'browser' } | { method: 'email'; email?: string } | { method: 'token' };\n\nexport const LOGIN_USAGE = 'Use /login, /login browser, /login email you@example.com or /login token';\n\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/** `/login [browser|email [address]|token|address]`. */\nexport function parseLoginArgs(arg: string): LoginStart | { error: string } {\n const [first = '', second = '', ...rest] = arg.trim().split(/\\s+/).filter(Boolean);\n const word = first.toLowerCase();\n if (!word) return { method: 'choose' };\n if (rest.length > 0) return { error: LOGIN_USAGE };\n if ((word === 'browser' || word === 'web') && !second) return { method: 'browser' };\n if (word === 'token' && !second) return { method: 'token' };\n if (word === 'email' || word === 'code') return second ? { method: 'email', email: second } : { method: 'email' };\n if (EMAIL.test(first) && !second) return { method: 'email', email: first };\n return { error: LOGIN_USAGE };\n}\n\nexport function isEmail(value: string): boolean {\n return EMAIL.test(value.trim());\n}\n\nexport type LoginPhase =\n | { name: 'choose'; index: number }\n | { name: 'browser'; since: number; url?: string; opened?: boolean }\n | { name: 'email-address'; value: string; error?: string }\n | { name: 'email-sending'; email: string; since: number }\n | { name: 'email-code'; email: string; value: string; attempt: number; error?: string }\n | { name: 'email-verifying'; email: string; since: number }\n | { name: 'token-input'; value: string; error?: string }\n | { name: 'token-checking'; since: number };\n\nexport type LoginAction =\n | { type: 'move'; delta: number }\n | { type: 'start'; start: LoginStart; now: number }\n | { type: 'type'; text: string }\n | { type: 'erase' }\n | { type: 'browser-waiting'; url: string; opened: boolean }\n | { type: 'email-sending'; email: string; now: number }\n | { type: 'code-needed'; attempt: number }\n | { type: 'code-rejected'; attemptsLeft: number }\n | { type: 'verifying'; now: number }\n | { type: 'token-checking'; now: number }\n | { type: 'invalid'; error: string };\n\nexport function initialLoginPhase(start: LoginStart, now: number): LoginPhase {\n return loginReducer({ name: 'choose', index: 0 }, { type: 'start', start, now });\n}\n\n/** Printable text only (a paste may carry a newline or control keys). */\nfunction printable(text: string): string {\n // eslint-disable-next-line no-control-regex\n return text.replace(/[\\u0000-\\u001f\\u007f]/g, '');\n}\n\nexport function loginReducer(phase: LoginPhase, action: LoginAction): LoginPhase {\n switch (action.type) {\n case 'move':\n if (phase.name !== 'choose') return phase;\n return { ...phase, index: (phase.index + action.delta + LOGIN_CHOICES.length) % LOGIN_CHOICES.length };\n case 'start':\n switch (action.start.method) {\n case 'choose':\n return { name: 'choose', index: 0 };\n case 'browser':\n return { name: 'browser', since: action.now };\n case 'token':\n return { name: 'token-input', value: '' };\n default:\n return action.start.email && isEmail(action.start.email)\n ? { name: 'email-sending', email: action.start.email.trim().toLowerCase(), since: action.now }\n : { name: 'email-address', value: action.start.email ?? '', ...(action.start.email ? { error: `Not a valid email address: ${action.start.email}` } : {}) };\n }\n case 'type': {\n const text = printable(action.text);\n if (!text) return phase;\n if (phase.name === 'email-address' || phase.name === 'token-input') return { ...phase, value: phase.value + text, error: undefined };\n if (phase.name === 'email-code') return { ...phase, value: (phase.value + text).replace(/\\s+/g, '').slice(0, 12), error: phase.error };\n return phase;\n }\n case 'erase':\n if (phase.name === 'email-address' || phase.name === 'token-input' || phase.name === 'email-code') {\n return { ...phase, value: [...phase.value].slice(0, -1).join('') };\n }\n return phase;\n case 'browser-waiting':\n return phase.name === 'browser' ? { ...phase, url: action.url, opened: action.opened } : phase;\n case 'email-sending':\n return { name: 'email-sending', email: action.email, since: action.now };\n case 'code-needed':\n if (phase.name === 'email-sending' || phase.name === 'email-verifying' || phase.name === 'email-code') {\n const error = phase.name === 'email-code' ? phase.error : undefined;\n return { name: 'email-code', email: phase.email, value: '', attempt: action.attempt, ...(error ? { error } : {}) };\n }\n return phase;\n case 'code-rejected':\n if (phase.name !== 'email-verifying' && phase.name !== 'email-code') return phase;\n return {\n name: 'email-code',\n email: phase.email,\n value: '',\n attempt: phase.name === 'email-code' ? phase.attempt : 1,\n error: `That code did not match. ${action.attemptsLeft} attempt${action.attemptsLeft === 1 ? '' : 's'} left.`,\n };\n case 'verifying':\n return phase.name === 'email-code' ? { name: 'email-verifying', email: phase.email, since: action.now } : phase;\n case 'token-checking':\n return phase.name === 'token-input' ? { name: 'token-checking', since: action.now } : phase;\n case 'invalid':\n if (phase.name === 'email-address' || phase.name === 'token-input' || phase.name === 'email-code') return { ...phase, error: action.error };\n return phase;\n default:\n return phase;\n }\n}\n\n/** What the input row shows: the token masked, everything else as typed. */\nexport function inputDisplay(phase: LoginPhase, mask: string): string | null {\n if (phase.name === 'token-input') return mask.repeat(Math.min(48, [...phase.value].length));\n if (phase.name === 'email-address' || phase.name === 'email-code') return phase.value;\n return null;\n}\n\n/** The status line of a waiting phase. */\nexport function waitingLabel(phase: LoginPhase): string | null {\n switch (phase.name) {\n case 'browser':\n return phase.url ? 'Waiting for you to approve in the browser' : 'Opening the browser';\n case 'email-sending':\n return `Sending a sign-in code to ${phase.email}`;\n case 'email-verifying':\n return 'Checking the code';\n case 'token-checking':\n return 'Checking the token';\n default:\n return null;\n }\n}\n", "import { Box, Text } from 'ink';\nimport { Fragment, memo } from 'react';\nimport { fuzzyFilter, windowAround } from '../fuzzy';\nimport { theme } from '../theme';\nimport { displayWidth, padEnd, truncate } from '../text';\n\nexport type PaletteCommand = {\n name: string;\n usage?: string;\n description: string;\n hint?: string;\n /** Fixed argument choices (`/research on`), completed in the palette after a space. */\n args?: ReadonlyArray<{ value: string; description: string }>;\n /** Set on an argument suggestion: the full text Tab completes to. */\n completion?: string;\n /** Rows of a group (server skills) get a dim group title above the first one. */\n group?: string;\n /** Set on a server skill: selecting it sends `/<skillId> <arg>` to the chat. */\n skillId?: string;\n};\n\n/** Commands matching a composer draft that starts with `/` and has no space yet. */\nexport function paletteMatches(commands: readonly PaletteCommand[], draft: string): PaletteCommand[] {\n if (!draft.startsWith('/') || /\\s/.test(draft)) return [];\n return fuzzyFilter(commands, draft.slice(1), (c) => [c.name, c.description]);\n}\n\n/**\n * Argument suggestions for a draft like `/research o`: the command's fixed\n * choices that start with what was typed (all of them after `/research `).\n * Empty once the draft has a second space or the command takes free text.\n */\nexport function paletteArgMatches(commands: readonly PaletteCommand[], draft: string): PaletteCommand[] {\n const match = /^\\/([a-z][\\w-]*) (\\S*)$/i.exec(draft);\n if (!match) return [];\n const command = commands.find((c) => c.name === (match[1] as string).toLowerCase());\n if (!command?.args?.length) return [];\n const typed = (match[2] ?? '').toLowerCase();\n return command.args\n .filter((arg) => arg.value.startsWith(typed))\n .map((arg) => ({\n name: `${command.name} ${arg.value}`,\n usage: `/${command.name} ${arg.value}`,\n description: arg.description,\n completion: `/${command.name} ${arg.value}`,\n }));\n}\n\n/** Parses `/name rest\u2026` (null when the text is not a slash command). */\nexport function parseSlash(text: string): { name: string; arg: string } | null {\n const match = /^\\/([a-z][\\w-]*)\\s*([\\s\\S]*)$/i.exec(text.trim());\n return match ? { name: (match[1] as string).toLowerCase(), arg: (match[2] ?? '').trim() } : null;\n}\n\n/**\n * Bottom-aligned command palette: `/name description`, selection in the\n * accent, a dim title above each group (Skills), and an optional dim footer\n * (\"Type a command, Esc to clear\", \"Loading skills...\").\n */\nexport const Palette = memo(function Palette(props: {\n commands: readonly PaletteCommand[];\n selected: number;\n width: number;\n maxRows?: number;\n footer?: string;\n}) {\n const { commands, selected, width, maxRows = 6, footer } = props;\n const footerRow = footer ? <Text wrap=\"truncate-end\">{theme.dim(` ${footer}`)}</Text> : null;\n if (commands.length === 0) {\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{theme.dim(' No commands match')}</Text>\n {footerRow}\n </Box>\n );\n }\n const nameWidth = Math.min(22, Math.max(8, ...commands.map((c) => displayWidth(c.usage ?? `/${c.name}`)))) + 2;\n const { start, end } = windowAround(commands.length, selected, maxRows);\n return (\n <Box flexDirection=\"column\" width={width}>\n {commands.slice(start, end).map((command, i) => {\n const index = start + i;\n const active = index === selected;\n const name = padEnd(truncate(command.usage ?? `/${command.name}`, nameWidth - 1), nameWidth);\n const title = command.group && (i === 0 || commands[index - 1]?.group !== command.group) ? command.group : null;\n return (\n <Fragment key={`${command.group ?? ''}:${command.name}`}>\n {title ? <Text wrap=\"truncate-end\">{theme.dim(` ${title}`)}</Text> : null}\n <Text wrap=\"truncate-end\">\n {active ? theme.accent(theme.symbols.pointer) : ' '} {active ? theme.accent(name) : name}\n {theme.dim(command.description)}\n {command.hint ? ` ${command.hint}` : ''}\n </Text>\n </Fragment>\n );\n })}\n {footerRow}\n </Box>\n );\n});\n", "/**\n * Pure palette logic shared by Home and Chat: which rows the palette shows\n * for a draft (local commands first, then the server's skills under a\n * \"Skills\" group), and what Enter does with a slash draft. A slash draft is\n * never sent to the agent unless it names a skill: a bare `/` keeps the\n * palette open, an unknown `/x` becomes a notice.\n */\nimport { fuzzyFilter } from '../fuzzy';\nimport { type PaletteCommand, paletteArgMatches, parseSlash } from './Palette';\n\n/** A server skill as the palette shows it: `/<id> <name>`. */\nexport type PaletteSkill = { id: string; name: string; description?: string };\n\nexport type SkillsState = { status: 'idle' | 'loading' | 'ready' | 'failed'; skills: PaletteSkill[]; error?: string };\n\nexport const SKILLS_GROUP = 'Skills';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction text(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n/** Slash ids the server parses: lowercase letters, digits, dots, dashes and underscores. */\nconst SKILL_ID = /^[a-z0-9][\\w.-]*$/i;\n\n/**\n * Reads `skills.list` defensively: an array, or `{ skills | items | data: [...] }`,\n * each with `skillId` / `slug` / `id` and `name` / `title`.\n */\nexport function parseSkillsResult(result: unknown): PaletteSkill[] {\n const list = Array.isArray(result)\n ? result\n : isRecord(result)\n ? ([result.skills, result.items, result.data, result.results].find(Array.isArray) as unknown[] | undefined) ?? []\n : [];\n const seen = new Set<string>();\n const out: PaletteSkill[] = [];\n for (const entry of list) {\n if (!isRecord(entry)) continue;\n const id = text(entry.skillId) ?? text(entry.slug) ?? text(entry.id);\n if (!id || !SKILL_ID.test(id)) continue;\n const key = id.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n const name = text(entry.name) ?? text(entry.title) ?? id;\n const description = text(entry.description);\n out.push({ id, name, ...(description ? { description } : {}) });\n }\n return out;\n}\n\n/** Palette rows for skills; ids that clash with a local command are left out (the command wins). */\nexport function skillCommands(skills: readonly PaletteSkill[], local: readonly PaletteCommand[]): PaletteCommand[] {\n const taken = new Set(local.map((c) => c.name.toLowerCase()));\n return skills\n .filter((s) => !taken.has(s.id.toLowerCase()))\n .map((s) => ({ name: s.id, description: s.name, group: SKILLS_GROUP, skillId: s.id }));\n}\n\n/** `/`, `/ ` or `/ anything`: a slash with no command name. */\nexport function isBareSlash(draft: string): boolean {\n return /^\\/(?:\\s[\\s\\S]*)?$/.test(draft.trimStart());\n}\n\nexport type PaletteView = {\n /** Rows to show (commands, then skills). */\n items: PaletteCommand[];\n /** The rows are argument choices (`/research o`). */\n args: boolean;\n /** A dim line under the rows. */\n footer?: string;\n /** The palette is open (it may have no rows: \"No commands match\"). */\n open: boolean;\n};\n\nexport const BARE_SLASH_HINT = 'Type a command, Esc to clear';\n\n/**\n * What the palette shows for a draft. `/` alone (or with spaces) lists every\n * command and skill and says how to leave; `/na` filters both; `/cmd a`\n * lists the command's argument choices.\n */\nexport function paletteView(\n commands: readonly PaletteCommand[],\n skills: SkillsState,\n draft: string,\n opts: { ellipsis?: string; separator?: string } = {},\n): PaletteView {\n if (!draft.startsWith('/')) return { items: [], args: false, open: false };\n const skillRows = skillCommands(skills.skills, commands);\n const loading = skills.status === 'loading' ? `Loading skills${opts.ellipsis ?? '...'}` : undefined;\n if (isBareSlash(draft)) {\n const more = skillRows.length ? ` ${opts.separator ?? '-'} ${skillRows.length} skill${skillRows.length === 1 ? '' : 's'} below, type to filter` : '';\n return { items: [...commands, ...skillRows], args: false, open: true, footer: loading ?? `${BARE_SLASH_HINT}${more}` };\n }\n if (!/\\s/.test(draft)) {\n const query = draft.slice(1);\n const local = fuzzyFilter(commands, query, (c) => [c.name, c.description]);\n const remote = fuzzyFilter(skillRows, query, (c) => [c.name, c.description]);\n return { items: [...local, ...remote], args: false, open: true, ...(loading ? { footer: loading } : {}) };\n }\n const args = paletteArgMatches(commands, draft);\n return { items: args, args: args.length > 0, open: args.length > 0 };\n}\n\nexport type SlashResolution =\n | { kind: 'message'; text: string }\n | { kind: 'empty' }\n /** `/` with no command: keep the palette open. */\n | { kind: 'bare' }\n | { kind: 'command'; name: string; arg: string; picked: boolean }\n /** A server skill: send `message` to the chat exactly as typed. */\n | { kind: 'skill'; id: string; arg: string; message: string }\n /** Not a command and skills are still loading. */\n | { kind: 'loading'; name: string }\n | { kind: 'unknown'; name: string };\n\nfunction skillMessage(id: string, arg: string): string {\n return arg ? `/${id} ${arg}` : `/${id}`;\n}\n\n/**\n * What Enter does with the composer text. `highlighted` is the palette row\n * under the pointer; `navigated` is true when the user moved it with the\n * arrows (then Enter on a bare `/` runs it).\n */\nexport function resolveSubmit(\n value: string,\n ctx: {\n commands: readonly PaletteCommand[];\n skills: SkillsState;\n highlighted?: PaletteCommand;\n navigated?: boolean;\n /** Extra local names (`/quit` for `/exit`). */\n aliases?: readonly string[];\n },\n): SlashResolution {\n const trimmed = value.trim();\n if (!trimmed) return { kind: 'empty' };\n if (!trimmed.startsWith('/')) return { kind: 'message', text: trimmed };\n const pick = (row: PaletteCommand, arg: string): SlashResolution =>\n row.skillId ? { kind: 'skill', id: row.skillId, arg, message: skillMessage(row.skillId, arg) } : { kind: 'command', name: row.name, arg, picked: true };\n if (isBareSlash(trimmed)) return ctx.highlighted && ctx.navigated ? pick(ctx.highlighted, '') : { kind: 'bare' };\n const slash = parseSlash(trimmed);\n if (!slash) return { kind: 'unknown', name: trimmed.slice(1).split(/\\s/, 1)[0] ?? '' };\n if (ctx.commands.some((c) => c.name === slash.name) || ctx.aliases?.includes(slash.name)) return { kind: 'command', name: slash.name, arg: slash.arg, picked: false };\n const skill = ctx.skills.skills.find((s) => s.id.toLowerCase() === slash.name);\n if (skill) return { kind: 'skill', id: skill.id, arg: slash.arg, message: skillMessage(skill.id, slash.arg) };\n if (!slash.arg && ctx.highlighted && !ctx.highlighted.completion) return pick(ctx.highlighted, '');\n if (ctx.skills.status === 'loading') return { kind: 'loading', name: slash.name };\n return { kind: 'unknown', name: slash.name };\n}\n", "/**\n * Loads the server's skills (`skills.list`, read-only) the first time the\n * palette opens, once per signed-in session (a new `services` after /login or\n * /logout starts over). Never blocks the composer: the palette shows a dim\n * \"Loading skills\" row meanwhile, and a failure just leaves the group out.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { toCliError } from '../../core/errors';\nimport type { UiServices } from '../services';\nimport type { SkillsState } from './palette-model';\n\nconst IDLE: SkillsState = { status: 'idle', skills: [] };\n\nexport function useSkills(services: UiServices, wanted: boolean): SkillsState {\n const [entry, setEntry] = useState<{ owner: UiServices; state: SkillsState }>({ owner: services, state: IDLE });\n const mounted = useRef(true);\n useEffect(\n () => () => {\n mounted.current = false;\n },\n [],\n );\n const current = entry.owner === services ? entry.state : IDLE;\n const load = services.account.signedIn ? services.loadSkills : undefined;\n\n useEffect(() => {\n if (!wanted || !load || current.status !== 'idle') return;\n const settle = (state: SkillsState) => {\n if (mounted.current) setEntry((e) => (e.owner === services ? { owner: services, state } : e));\n };\n setEntry({ owner: services, state: { status: 'loading', skills: [] } });\n load().then(\n (skills) => settle({ status: 'ready', skills }),\n (error: unknown) => settle({ status: 'failed', skills: [], error: toCliError(error).message }),\n );\n }, [wanted, load, current.status, services]);\n\n return current;\n}\n", "import { useInput } from 'ink';\nimport { memo } from 'react';\nimport { type ChatCapabilities, DEFAULT_CAPABILITIES } from '../../../core/capabilities';\nimport { useClockTick } from '../../components/Spinner';\nimport { StatusBar } from '../../components/StatusBar';\nimport { formatElapsed } from '../../text';\n\n/** The chat status bar: profile, mode, model, modes, thread, elapsed time, and the keys that apply now. */\nexport const ChatStatus = memo(function ChatStatus(props: {\n width: number;\n segments: string[];\n since: number | null;\n streaming: boolean;\n approval: boolean;\n overlay?: boolean;\n}) {\n useClockTick(props.since !== null);\n const elapsed = props.since !== null ? formatElapsed(Date.now() - props.since) : null;\n const hints = props.approval\n ? [\n { key: 'y', label: 'approve' },\n { key: 'n', label: 'reject' },\n { key: 'l', label: 'later' },\n ]\n : props.overlay\n ? [{ key: 'esc', label: 'close' }]\n : props.streaming\n ? [\n { key: 'enter', label: 'queue' },\n { key: 'esc', label: 'interrupt' },\n { key: '/', label: 'commands' },\n ]\n : [\n { key: 'enter', label: 'send' },\n { key: '/', label: 'commands' },\n { key: 'ctrl+c', label: 'quit' },\n ];\n return <StatusBar width={props.width} segments={[...props.segments, elapsed]} hints={hints} />;\n});\n\n/** Status bar: the Research / Image / Result modes changed from auto (seeker chats only). */\nexport function capabilitySegments(mode: string, capabilities: ChatCapabilities): string[] {\n if (mode === 'employer') return [];\n return (['research', 'image', 'result'] as const)\n .filter((key) => capabilities[key] !== DEFAULT_CAPABILITIES[key])\n .map((key) => `${key} ${capabilities[key]}`);\n}\n\n/** Esc/q closes an overlay that has no list of its own (loading or error). */\nexport function SelectEscape({ onClose }: { onClose(): void }) {\n useInput((input, key) => {\n if (key.escape || input === 'q') onClose();\n });\n return null;\n}\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth } from '../text';\nimport { type KeyHint, fitHints, formatHints } from './KeyHints';\n\nexport type StatusBarProps = {\n /** Ordered by priority: the last ones are dropped first when narrow. */\n segments: ReadonlyArray<string | null | undefined | false>;\n hints?: readonly KeyHint[];\n width: number;\n};\n\n/** Pure fit: hints shrink first (down to one), then segments drop from the end. */\nexport function fitStatusBar(\n segments: readonly string[],\n hints: readonly KeyHint[],\n width: number,\n): { left: string; right: string } {\n const sep = ` ${theme.symbols.middot} `;\n let segs = [...segments];\n let fitted = [...hints];\n const measure = () => displayWidth(segs.join(sep)) + (fitted.length ? displayWidth(formatHints(fitted)) + 2 : 0);\n while (measure() > width && fitted.length > 1) fitted = fitHints(fitted, displayWidth(formatHints(fitted)) - 1);\n while (measure() > width && segs.length > 1) segs = segs.slice(0, -1);\n if (measure() > width) fitted = [];\n return { left: theme.dim(segs.join(sep)), right: fitted.length ? formatHints(fitted) : '' };\n}\n\n/** `profile \u00B7 mode \u00B7 model \u00B7 thread \u00B7 elapsed` (dim) with hints on the right. One line. */\nexport const StatusBar = memo(function StatusBar({ segments, hints = [], width }: StatusBarProps) {\n const clean = segments.filter((s): s is string => typeof s === 'string' && s.length > 0);\n const { left, right } = fitStatusBar(clean, hints, width);\n return (\n <Box width={width}>\n <Box flexGrow={1}>\n <Text wrap=\"truncate-end\">{left}</Text>\n </Box>\n {right ? <Text wrap=\"truncate-end\">{right}</Text> : null}\n </Box>\n );\n});\n", "import type { AgentMode } from '@tabbio/types';\nimport { CAPABILITY_CHOICES, CAPABILITY_CHOICE_HELP, type CapabilityKey } from '../../../core/capabilities';\nimport type { PaletteCommand } from '../Palette';\n\nfunction choices(key: CapabilityKey): PaletteCommand['args'] {\n return CAPABILITY_CHOICES[key].map((value) => ({ value, description: CAPABILITY_CHOICE_HELP[key][value] ?? '' }));\n}\n\n/** The capability slash commands (seeker chats; employer chats ignore them, as the server does). */\nexport const CAPABILITY_COMMANDS: ReadonlySet<string> = new Set(['research', 'image', 'result']);\n\nexport function chatCommands(opts: { hostedByHome: boolean }): PaletteCommand[] {\n return [\n { name: 'new', description: 'Start a new chat' },\n { name: 'threads', description: 'Resume a recent chat' },\n {\n name: 'mode',\n usage: '/mode seeker|employer',\n description: 'Switch workspace',\n args: [\n { value: 'seeker', description: 'Your own career' },\n { value: 'employer', description: 'Hiring for a company' },\n ],\n },\n { name: 'model', usage: '/model <id|auto>', description: 'Pick the model' },\n { name: 'research', usage: '/research auto|on|off', description: 'Web research for the next messages', args: choices('research') },\n { name: 'image', usage: '/image auto|on|off', description: 'Image generation', args: choices('image') },\n { name: 'result', usage: '/result auto|summary|document|\u2026', description: 'What to make: answer, document, slides, page, image', args: choices('result') },\n { name: 'open', usage: '/open <n|id>', description: 'Open link n of the last result, or a file' },\n { name: 'apply', usage: '/apply <n>', description: 'Prepare an application for job n' },\n { name: 'save', usage: '/save <n|id> [folder]', description: 'Save a file Tabbio made (1 = newest)' },\n { name: 'show', usage: '/show <n|id>', description: 'Print a saved file here (1 = newest)' },\n { name: 'download', usage: '/download [cvId] [pdf|docx]', description: 'Save a CV (your main CV without an id)' },\n { name: 'help', description: 'Keys and commands' },\n { name: 'login', usage: '/login [email|token]', description: 'Sign in or switch account' },\n { name: 'logout', description: 'Sign out of this profile' },\n ...(opts.hostedByHome ? [{ name: 'home', description: 'Back to the home screen' }] : []),\n { name: 'exit', description: 'Quit tabbio' },\n ];\n}\n\nexport function parseMode(value: string): AgentMode | null {\n const v = value.trim().toLowerCase();\n return v === 'seeker' || v === 'employer' ? v : null;\n}\n\n/** `/help` in the chat; every line fits a 80-column terminal inside the transcript indent. */\nexport const CHAT_HELP = [\n 'Chat /new /threads /mode seeker|employer /model <id|auto>',\n ' /help /home /exit',\n 'Modes /research auto|on|off /image auto|on|off',\n ' /result auto|summary|document|slides|page|image',\n ' (saved for this profile; sent with every seeker message)',\n 'Results /open <n> opens link n of the last result',\n ' /apply <n> prepares the application for job n (no chat)',\n 'Files /show 1 prints the newest file of this chat, /show 2 the one',\n ' before; /save <n|id> [folder] /open <n|id> (ids work too)',\n ' /download [cvId] [pdf|docx|txt|md] (main CV without an id)',\n ' generated files are saved to ./tabbio-artifacts',\n 'Account /login /login email you@example.com /login token /logout',\n 'Skills type / to list your skills; enter runs /<skill> <details>',\n 'Keys enter send (queues while streaming) ctrl+j newline',\n ' esc interrupt, or back to home \u2191\u2193 history',\n ' shift+tab switch mode ctrl+o expand the last tool',\n ' ctrl+c twice quit',\n].join('\\n');\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport type { ChatTurn, LiveItem, TranscriptEntry } from '../../../core/chat';\nimport { ArtifactRow } from '../../components/ArtifactRow';\nimport { CardView, SavedFilesView } from '../../components/cards/CardView';\nimport { Markdown } from '../../components/Markdown';\nimport { Rail } from '../../components/Rail';\nimport { Spinner, useClockTick } from '../../components/Spinner';\nimport { SourcesList } from '../../components/SourcesList';\nimport { ToolCallDetail, ToolCallRow } from '../../components/ToolCallRow';\nimport { theme } from '../../theme';\nimport { displayWidth, estimateHeight, formatElapsed } from '../../text';\n\n/** Assistant content sits under `\u25CF Tabbio`, indented by two. */\nexport const ASSISTANT_INDENT = 2;\n/** Cards and saved files sit under their tool row's title. */\nconst CARD_INDENT = ASSISTANT_INDENT + 2;\nconst USER_MAX_LINES = 6;\nconst WAITING_AFTER_MS = 10_000;\n\nexport type StaticItem = TranscriptEntry | { kind: 'header'; id: string; text: string; right: string };\n\nfunction noticeGlyph(tone: Extract<TranscriptEntry, { kind: 'notice' }>['tone']): string {\n if (tone === 'error') return theme.error(theme.symbols.error);\n if (tone === 'success') return theme.success(theme.symbols.success);\n if (tone === 'attention') return theme.attention(theme.symbols.attention);\n return theme.dim(theme.symbols.dot);\n}\n\nfunction UserTurn({ text, width }: { text: string; width: number }) {\n const lines = text.split('\\n');\n const shown = lines.slice(0, USER_MAX_LINES);\n return (\n <Box marginTop={1}>\n <Rail tone=\"accent\" width={width}>\n {shown.map((line, i) => (\n <Text key={i} wrap=\"wrap\">\n {line || ' '}\n </Text>\n ))}\n {lines.length > USER_MAX_LINES ? <Text>{theme.dim(`+${lines.length - USER_MAX_LINES} lines`)}</Text> : null}\n </Rail>\n </Box>\n );\n}\n\n/** One committed transcript item, printed once through `<Static>`. */\nexport const EntryView = memo(function EntryView({ entry, width }: { entry: StaticItem; width: number }) {\n const inner = Math.max(10, width - ASSISTANT_INDENT);\n switch (entry.kind) {\n case 'header': {\n const fill = Math.max(1, width - displayWidth(entry.text) - displayWidth(entry.right));\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text wrap=\"truncate-end\">\n {entry.text}\n {' '.repeat(fill)}\n {theme.dim(entry.right)}\n </Text>\n <Text>{theme.dim(theme.symbols.line.repeat(width))}</Text>\n </Box>\n );\n }\n case 'user':\n return <UserTurn text={entry.text} width={width} />;\n case 'assistant':\n return (\n <Box marginTop={1}>\n <Text>\n {theme.accent(theme.symbols.dot)} {theme.bold('Tabbio')}\n </Text>\n </Box>\n );\n case 'markdown':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} marginTop={entry.gap ? 1 : 0} width={width}>\n <Markdown text={entry.text} width={inner} />\n </Box>\n );\n case 'tool':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} marginTop={entry.gap ? 1 : 0} width={width}>\n <ToolCallRow call={entry.call} width={inner} />\n </Box>\n );\n case 'tool-detail':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} flexDirection=\"column\" width={width}>\n <Text>{theme.dim(`${theme.symbols.expanded} ${entry.call.title}`)}</Text>\n <ToolCallDetail call={entry.call} width={inner} />\n </Box>\n );\n case 'artifact':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} width={width}>\n <ArtifactRow artifact={entry.artifact} width={inner} />\n </Box>\n );\n case 'card':\n return (\n <Box paddingLeft={CARD_INDENT} width={width}>\n <CardView card={entry.card} width={Math.max(10, width - CARD_INDENT)} />\n </Box>\n );\n case 'saved':\n return (\n <Box paddingLeft={CARD_INDENT} width={width}>\n <SavedFilesView saved={entry.saved} width={Math.max(10, width - CARD_INDENT)} />\n </Box>\n );\n case 'sources':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} marginTop={1} width={width}>\n <SourcesList sources={entry.sources} width={inner} />\n </Box>\n );\n case 'notice':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} marginTop={1} flexDirection=\"column\" width={width}>\n <Text wrap=\"wrap\">\n {noticeGlyph(entry.tone)} {entry.tone === 'error' ? theme.error(entry.text) : entry.tone === 'info' ? theme.dim(entry.text) : entry.text}\n </Text>\n {entry.hint ? <Text wrap=\"wrap\">{theme.dim(` ${theme.symbols.arrowRight} ${entry.hint}`)}</Text> : null}\n </Box>\n );\n default:\n return null;\n }\n});\n\n/** Keeps the end of a long live block so the live region never outgrows the terminal. */\nexport function clipLiveText(text: string, width: number, maxLines: number): { text: string; hidden: number } {\n if (estimateHeight(text, width) <= maxLines) return { text, hidden: 0 };\n const lines = text.split('\\n');\n const kept: string[] = [];\n let used = 1;\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n const h = estimateHeight(lines[i] as string, width);\n if (used + h > maxLines) break;\n kept.unshift(lines[i] as string);\n used += h;\n }\n return { text: kept.join('\\n'), hidden: lines.length - kept.length };\n}\n\nfunction WaitingLine({ turn }: { turn: ChatTurn }) {\n useClockTick(true);\n const idleFor = Date.now() - turn.lastEventAt;\n const empty = turn.items.length === 0;\n if (!empty && idleFor < WAITING_AFTER_MS) return null;\n const label = empty && idleFor < WAITING_AFTER_MS ? 'Thinking\u2026' : 'waiting for Tabbio\u2026';\n return (\n <Box paddingLeft={ASSISTANT_INDENT}>\n <Spinner label={theme.dim(`${label} ${formatElapsed(Date.now() - (empty ? turn.startedAt : turn.lastEventAt))}`)} />\n </Box>\n );\n}\n\n/** Blank line between a tool block and a text block, and between text blocks. */\nexport function liveGap(prev: 'label' | 'markdown' | 'tool' | 'text', item: LiveItem): boolean {\n if (item.kind === 'tool') return prev === 'markdown' || prev === 'text';\n return prev === 'tool' || prev === 'markdown' || item.committed > 0;\n}\n\nconst LiveItemView = memo(function LiveItemView(props: {\n item: LiveItem;\n width: number;\n expanded: boolean;\n cursor: boolean;\n maxLines: number;\n gap: boolean;\n /** Offset in the turn's text where a suspected repeat starts: not shown. */\n echoAt?: number;\n}) {\n const { item, width, expanded, cursor, maxLines, gap, echoAt } = props;\n if (item.kind === 'tool') {\n return (\n <Box marginTop={gap ? 1 : 0}>\n <ToolCallRow call={item.call} width={width} expanded={expanded} />\n </Box>\n );\n }\n const end = echoAt !== undefined && item.start !== undefined ? Math.max(item.committed, echoAt - item.start) : item.text.length;\n const pending = item.text.slice(item.committed, end);\n if (!pending && !cursor) return null;\n const clipped = clipLiveText(pending, width, maxLines);\n return (\n <Box flexDirection=\"column\" width={width} marginTop={gap ? 1 : 0}>\n {clipped.hidden > 0 ? <Text>{theme.dim(`${theme.symbols.ellipsis} ${clipped.hidden} more lines above (streaming)`)}</Text> : null}\n <Markdown text={clipped.text} width={width} trailing={cursor ? theme.accent(theme.symbols.cursor) : undefined} />\n </Box>\n );\n});\n\n/** The live tail of the current turn: running tools, streaming markdown with `\u258D`, waiting line. */\nexport function LiveTurn(props: { turn: ChatTurn; width: number; expandTools: boolean; maxLines: number; streaming: boolean }) {\n const { turn, width, expandTools, maxLines, streaming } = props;\n const inner = Math.max(10, width - ASSISTANT_INDENT);\n const last = turn.items[turn.items.length - 1];\n const tools = turn.items.filter((i) => i.kind === 'tool').length;\n const textBudget = Math.max(3, maxLines - tools - 1);\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box flexDirection=\"column\" paddingLeft={ASSISTANT_INDENT} width={width}>\n {expandTools\n ? (turn.hidden ?? []).map((call) => <ToolCallRow key={`hidden-${call.id}`} call={call} width={inner} expanded />)\n : null}\n {turn.items.map((item, i) => {\n const before = turn.items[i - 1];\n const prev = before ? (before.kind === 'tool' ? 'tool' : 'text') : turn.lastKind;\n return (\n <LiveItemView\n key={item.id}\n item={item}\n width={inner}\n expanded={expandTools}\n cursor={streaming && item === last && item.kind === 'text'}\n maxLines={textBudget}\n gap={liveGap(prev, item)}\n echoAt={turn.echoAt}\n />\n );\n })}\n </Box>\n {streaming ? <WaitingLine turn={turn} /> : null}\n </Box>\n );\n}\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { type ChatArtifact, type DraftProgress, draftSummary } from '../../core/chat-artifacts';\nimport { hyperlink } from '../hyperlink';\nimport { theme } from '../theme';\nimport { displayWidth, shortId, truncate } from '../text';\nimport { Spinner } from './Spinner';\n\nexport function kindGlyph(kind: string): string {\n switch (kind) {\n case 'document':\n return theme.symbols.kindDocument;\n case 'slides':\n return theme.symbols.kindSlides;\n case 'image':\n return theme.symbols.kindImage;\n case 'page':\n return theme.symbols.kindPage;\n default:\n return theme.symbols.kindFile;\n }\n}\n\nexport function kindLabel(kind: string): string {\n return kind === 'slides' ? 'Slides' : kind.charAt(0).toUpperCase() + kind.slice(1);\n}\n\n/** `rendering`, `ready`, `failed`, or the writer's progress while it builds. */\nexport function artifactStatusText(artifact: Pick<ChatArtifact, 'status' | 'previewAvailable'>, draft?: DraftProgress): string {\n if (artifact.status === 'pending') {\n if (draft && draft.phase !== 'end') return draftSummary(draft);\n return artifact.previewAvailable ? 'preview ready, rendering files' : 'rendering';\n }\n return artifact.status;\n}\n\nexport type ArtifactRowProps = {\n artifact: ChatArtifact;\n draft?: DraftProgress;\n width: number;\n /** Show the `tabbio artifacts open <id>` hint (off in narrow places). */\n hint?: boolean;\n};\n\n/**\n * One artifact card row (research \u00A75.7 grammar): status glyph, kind glyph,\n * title (an OSC 8 link to the preview once ready, when the terminal supports\n * it), then dim `kind \u00B7 status \u00B7 id \u00B7 tabbio artifacts open <id>`. A failed\n * card adds its reason on a second line.\n */\nexport const ArtifactRow = memo(function ArtifactRow({ artifact, draft, width, hint = true }: ArtifactRowProps) {\n const status = artifactStatusText(artifact, draft);\n const tone = artifact.status === 'failed' ? theme.error : artifact.status === 'ready' ? theme.success : theme.dim;\n const meta = [kindLabel(artifact.kind).toLowerCase(), status, shortId(artifact.id, 6, 4)];\n if (artifact.versionNumber && artifact.versionNumber > 1) meta.push(`v${artifact.versionNumber}`);\n const openHint = hint && artifact.status !== 'failed' ? `tabbio artifacts open ${artifact.id}` : '';\n const titleBudget = Math.max(8, Math.min(48, width - 4 - displayWidth(meta.join(' \u00B7 ')) - 6));\n const title = truncate(artifact.title || 'Untitled', titleBudget);\n const linked = artifact.status === 'ready' && artifact.previewUrl;\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box width={width}>\n {artifact.status === 'pending' ? (\n <Spinner />\n ) : (\n <Text>{artifact.status === 'ready' ? theme.success(theme.symbols.success) : theme.error(theme.symbols.error)}</Text>\n )}\n <Box flexShrink={0} marginLeft={1}>\n <Text>\n {theme.accent(kindGlyph(artifact.kind))} {linked ? hyperlink(theme.bold(title), artifact.previewUrl as string) : theme.bold(title)}\n </Text>\n </Box>\n <Box flexGrow={1} flexShrink={1}>\n <Text wrap=\"truncate-end\">\n {theme.dim(` ${theme.symbols.middot} `)}\n {tone(meta.join(` ${theme.symbols.middot} `))}\n {openHint ? theme.dim(` ${openHint}`) : ''}\n </Text>\n </Box>\n </Box>\n {artifact.failure?.message ? (\n <Text wrap=\"truncate-end\">{theme.dim(` ${theme.symbols.arrowRight} ${artifact.failure.message}`)}</Text>\n ) : null}\n </Box>\n );\n});\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport type { ChatCard } from '../../../core/chat-cards';\nimport type { SavedFiles } from '../../../core/chat-model';\nimport { supportsHyperlinks } from '../../hyperlink';\nimport { displayWidth } from '../../text';\nimport { cardLines, savedLines } from './card-lines';\n\n/**\n * One line. Everything is fitted to the width except plain URLs and\n * commands, which must stay whole to be copied: those overflow and the\n * terminal soft-wraps them instead of Ink breaking them with a newline.\n */\nfunction Line({ text, width }: { text: string; width: number }) {\n const cells = displayWidth(text);\n if (cells <= width) return <Text>{text}</Text>;\n return (\n <Box width={cells} flexShrink={0}>\n <Text wrap=\"truncate-end\">{text}</Text>\n </Box>\n );\n}\n\nexport type CardViewProps = {\n card: ChatCard;\n width: number;\n /** OSC 8 links on titles (default: what the terminal supports). The plain URL is printed either way. */\n links?: boolean;\n};\n\n/**\n * A tool result as the app's card, in the terminal: numbered rows with dim\n * meta, titles linked (OSC 8) with the plain URL after them, width-aware\n * truncation and the next step (`/open 1`, `/apply 2`, `/download cv_1`).\n */\nexport const CardView = memo(function CardView({ card, width, links }: CardViewProps) {\n const lines = cardLines(card, { width, links: links ?? supportsHyperlinks() });\n return (\n <Box flexDirection=\"column\" width={width}>\n {lines.map((line, i) => (\n <Line key={i} text={line} width={width} />\n ))}\n </Box>\n );\n});\n\n/** Files saved to disk: path and size, and the first lines of a text file. */\nexport const SavedFilesView = memo(function SavedFilesView({ saved, width }: { saved: SavedFiles; width: number }) {\n const lines = savedLines(saved, { width });\n return (\n <Box flexDirection=\"column\" width={width}>\n {lines.map((line, i) => (\n <Line key={i} text={line} width={width} />\n ))}\n </Box>\n );\n});\n", "import { Box, Text } from 'ink';\nimport { type Token, type Tokens, marked } from 'marked';\nimport { type ReactNode, memo, useMemo } from 'react';\nimport { theme } from '../theme';\nimport { stripAnsi } from '../text';\nimport { renderInline } from './markdown-inline';\nimport { Rail } from './Rail';\nimport { Table, type TableColumn } from './Table';\n\n/** Lexes without ever throwing (odd input falls back to one paragraph). */\nexport function lexMarkdown(text: string): Token[] {\n try {\n return marked.lexer(text.replace(/\\r\\n?/g, '\\n'), { gfm: true });\n } catch {\n return [{ type: 'paragraph', raw: text, text, tokens: [{ type: 'text', raw: text, text }] } as Tokens.Paragraph];\n }\n}\n\ntype RenderCtx = { width: number; trailing?: string };\n\nfunction tokensOf(token: Token): Token[] | undefined {\n const tokens = (token as { tokens?: unknown }).tokens;\n return Array.isArray(tokens) ? (tokens as Token[]) : undefined;\n}\n\nfunction textOf(token: Token): string {\n const text = (token as { text?: unknown }).text;\n return typeof text === 'string' ? text : typeof token.raw === 'string' ? token.raw : '';\n}\n\nfunction renderList(list: Tokens.List, ctx: RenderCtx, key: string, trailing = ''): ReactNode {\n const start = typeof list.start === 'number' ? list.start : 1;\n const markers = list.items.map((item, i) =>\n list.ordered ? `${start + i}.` : item.task ? (item.checked ? '[x]' : '[ ]') : theme.symbols.bullet,\n );\n const markerWidth = Math.max(...markers.map((m) => stripAnsi(m).length)) + 1;\n return (\n <Box key={key} flexDirection=\"column\">\n {list.items.map((item, i) => (\n <Box key={`${key}-${i}`}>\n <Box width={markerWidth} flexShrink={0}>\n <Text>{list.ordered ? markers[i] : theme.dim(markers[i] as string)}</Text>\n </Box>\n <Box flexDirection=\"column\" width={Math.max(8, ctx.width - markerWidth)}>\n {renderBlocks(\n item.tokens,\n { width: Math.max(8, ctx.width - markerWidth), trailing: i === list.items.length - 1 && trailing ? trailing : undefined },\n `${key}-${i}`,\n false,\n )}\n </Box>\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction renderTable(table: Tokens.Table, ctx: RenderCtx, key: string): ReactNode {\n const columns: TableColumn[] = table.header.map((cell, i) => ({\n key: String(i),\n header: stripAnsi(renderInline(cell.tokens, cell.text)),\n align: table.align[i] === 'right' ? 'right' : 'left',\n }));\n const rows = table.rows.map((row) => {\n const record: Record<string, string> = {};\n row.forEach((cell, i) => {\n record[String(i)] = stripAnsi(renderInline(cell.tokens, cell.text));\n });\n return record;\n });\n return <Table key={key} columns={columns} rows={rows} width={ctx.width} />;\n}\n\nfunction renderBlock(token: Token, ctx: RenderCtx, key: string, trailing: string): ReactNode {\n switch (token.type) {\n case 'heading':\n return (\n <Text key={key} bold>\n {renderInline(tokensOf(token), textOf(token))}\n {trailing}\n </Text>\n );\n case 'paragraph':\n case 'text':\n return (\n <Text key={key}>\n {renderInline(tokensOf(token), textOf(token))}\n {trailing}\n </Text>\n );\n case 'list':\n return renderList(token as Tokens.List, ctx, key, trailing);\n case 'code': {\n const lines = textOf(token).replace(/\\n$/, '').split('\\n');\n return (\n <Box\n key={key}\n flexDirection=\"column\"\n marginLeft={2}\n borderStyle={theme.unicode ? 'single' : 'classic'}\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderLeftDimColor\n paddingLeft={1}\n >\n {lines.map((line, i) => (\n <Text key={i}>{line || ' '}</Text>\n ))}\n </Box>\n );\n }\n case 'blockquote':\n return (\n <Rail key={key} tone=\"muted\">\n {renderBlocks(tokensOf(token) ?? [], { width: Math.max(8, ctx.width - 2) }, key, false)}\n </Rail>\n );\n case 'hr':\n return <Text key={key}>{theme.dim(theme.symbols.line.repeat(Math.max(3, Math.min(ctx.width, 60))))}</Text>;\n case 'table':\n return renderTable(token as Tokens.Table, ctx, key);\n case 'html':\n return <Text key={key}>{theme.dim(textOf(token).trim())}</Text>;\n case 'space':\n case 'def':\n return null;\n default:\n return <Text key={key}>{textOf(token)}</Text>;\n }\n}\n\nconst INLINE_TAIL = new Set(['paragraph', 'text', 'heading', 'list']);\n\n/** Renders block tokens with one blank line between blocks (tight inside list items). */\nfunction renderBlocks(tokens: Token[], ctx: RenderCtx, keyPrefix: string, spaced = true): ReactNode[] {\n const blocks = tokens.filter((t) => t.type !== 'space' && t.type !== 'def');\n const out: ReactNode[] = [];\n blocks.forEach((token, i) => {\n const isLast = i === blocks.length - 1;\n const trailing = isLast && ctx.trailing && INLINE_TAIL.has(token.type) ? ctx.trailing : '';\n let node: ReactNode;\n try {\n node = renderBlock(token, ctx, `${keyPrefix}-${i}`, trailing);\n } catch {\n node = <Text key={`${keyPrefix}-${i}`}>{token.raw}</Text>;\n }\n if (spaced && i > 0) out.push(<Text key={`${keyPrefix}-${i}-gap`}> </Text>);\n out.push(node);\n if (isLast && ctx.trailing && !trailing) out.push(<Text key={`${keyPrefix}-tail`}>{ctx.trailing}</Text>);\n });\n if (blocks.length === 0 && ctx.trailing) out.push(<Text key={`${keyPrefix}-tail`}>{ctx.trailing}</Text>);\n return out;\n}\n\nexport type MarkdownProps = {\n text: string;\n width: number;\n /** Appended to the last paragraph (the streaming cursor `\u258D`). */\n trailing?: string;\n};\n\n/**\n * Own renderer on the `marked@15` lexer (research \u00A75.10): headings bold, `\u2022`\n * and numbered lists, inline code in `theme.code`, fenced code indented with a\n * dim gutter, links as text + dim url, blockquotes on a rail, tables aligned.\n */\nexport const Markdown = memo(function Markdown({ text, width, trailing }: MarkdownProps) {\n const tokens = useMemo(() => lexMarkdown(text), [text]);\n return (\n <Box flexDirection=\"column\" width={width}>\n {renderBlocks(tokens, { width, trailing }, 'md')}\n </Box>\n );\n});\n", "/**\n * Inline markdown \u2192 one styled string (bold, italic, inline code, links as\n * text + dim url, strikethrough). Never throws: unknown tokens fall back to\n * their raw text.\n */\nimport type { Token, Tokens } from 'marked';\nimport { theme } from '../theme';\nimport { stripAnsi } from '../text';\n\nconst ENTITIES: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n '&apos;': \"'\",\n '&nbsp;': ' ',\n};\n\nexport function decodeEntities(text: string): string {\n return text\n .replace(/&(?:amp|lt|gt|quot|apos|nbsp|#39);/g, (m) => ENTITIES[m] ?? m)\n .replace(/&#(\\d{1,6});/g, (m, code: string) => {\n const n = Number(code);\n return n > 0 && n < 0x10ffff ? String.fromCodePoint(n) : m;\n });\n}\n\nfunction childTokens(token: Token): Token[] | undefined {\n const tokens = (token as { tokens?: unknown }).tokens;\n return Array.isArray(tokens) ? (tokens as Token[]) : undefined;\n}\n\nfunction textOf(token: Token): string {\n const text = (token as { text?: unknown }).text;\n if (typeof text === 'string') return text;\n const raw = (token as { raw?: unknown }).raw;\n return typeof raw === 'string' ? raw : '';\n}\n\nfunction renderLink(token: Tokens.Link): string {\n const label = renderInline(token.tokens, token.text);\n const href = token.href ?? '';\n const plain = stripAnsi(label).trim();\n if (!href || plain === href || `mailto:${plain}` === href) return theme.link(label || href);\n return `${label} ${theme.dim(`(${href})`)}`;\n}\n\nfunction renderToken(token: Token): string {\n switch (token.type) {\n case 'text': {\n const children = childTokens(token);\n return children ? renderInline(children, textOf(token)) : decodeEntities(textOf(token));\n }\n case 'escape':\n return textOf(token);\n case 'strong':\n return theme.bold(renderInline(childTokens(token), textOf(token)));\n case 'em':\n return theme.italic(renderInline(childTokens(token), textOf(token)));\n case 'del':\n return theme.strike(renderInline(childTokens(token), textOf(token)));\n case 'codespan':\n return theme.code(decodeEntities(textOf(token)));\n case 'br':\n return '\\n';\n case 'link':\n return renderLink(token as Tokens.Link);\n case 'image': {\n const image = token as Tokens.Image;\n return `${theme.dim('[image]')} ${image.text || ''}${image.href ? ` ${theme.dim(`(${image.href})`)}` : ''}`.trim();\n }\n case 'html': {\n const text = textOf(token);\n return /^<br\\s*\\/?>$/i.test(text.trim()) ? '\\n' : '';\n }\n case 'checkbox':\n return '';\n default:\n return decodeEntities(textOf(token));\n }\n}\n\n/** Styled string for a list of inline tokens; `fallback` when there are none. */\nexport function renderInline(tokens: Token[] | undefined, fallback = ''): string {\n if (!tokens || tokens.length === 0) return decodeEntities(fallback);\n let out = '';\n for (const token of tokens) {\n try {\n out += renderToken(token);\n } catch {\n out += textOf(token);\n }\n }\n return out;\n}\n", "import { Box, Text } from 'ink';\nimport { memo, useMemo } from 'react';\nimport { theme } from '../theme';\nimport { type TableColumn, formatTableHeader, formatTableRow, layoutTable } from './table-layout';\n\nexport type { TableColumn } from './table-layout';\n\nexport type TableProps = {\n columns: readonly TableColumn[];\n rows: ReadonlyArray<Record<string, string>>;\n width: number;\n /** First row index to show (scrolling) and how many. */\n offset?: number;\n limit?: number;\n};\n\n/** Aligned columns, dim header, one line per row, truncation instead of wrapping. */\nexport const Table = memo(function Table({ columns, rows, width, offset = 0, limit }: TableProps) {\n const layout = useMemo(() => layoutTable(columns, rows, width), [columns, rows, width]);\n const shown = rows.slice(offset, limit === undefined ? undefined : offset + limit);\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text wrap=\"truncate-end\">{theme.dim(formatTableHeader(layout))}</Text>\n {shown.map((row, i) => (\n <Text key={offset + i} wrap=\"truncate-end\">\n {formatTableRow(layout, row)}\n </Text>\n ))}\n </Box>\n );\n});\n", "/**\n * Pure table layout: natural widths, shrink-to-fit, then drop low-priority\n * columns. Rows are one line each; cells truncate with `\u2026`, never wrap.\n */\nimport { displayWidth, padEnd, padStart, truncate } from '../text';\n\nexport type TableColumn = {\n key: string;\n header: string;\n align?: 'left' | 'right';\n /** Cap on the natural width (default 48). */\n maxWidth?: number;\n};\n\nexport type TableLayout = { columns: TableColumn[]; widths: number[] };\n\nexport const TABLE_GAP = 2;\nconst MIN_CELL = 4;\n\nfunction minWidth(column: TableColumn): number {\n return Math.min(Math.max(MIN_CELL, displayWidth(column.header)), 10);\n}\n\nexport function layoutTable(\n columns: readonly TableColumn[],\n rows: ReadonlyArray<Record<string, string>>,\n width: number,\n gap = TABLE_GAP,\n): TableLayout {\n let visible = [...columns];\n const natural = (column: TableColumn) =>\n Math.min(\n column.maxWidth ?? 48,\n Math.max(displayWidth(column.header), ...rows.map((row) => displayWidth(row[column.key] ?? ''))),\n );\n let widths = visible.map(natural);\n const total = () => widths.reduce((a, b) => a + b, 0) + gap * Math.max(0, widths.length - 1);\n\n for (;;) {\n while (total() > width) {\n let widest = -1;\n for (let i = 0; i < widths.length; i += 1) {\n const column = visible[i] as TableColumn;\n if ((widths[i] as number) > minWidth(column) && (widest < 0 || (widths[i] as number) > (widths[widest] as number))) {\n widest = i;\n }\n }\n if (widest < 0) break;\n widths[widest] = (widths[widest] as number) - 1;\n }\n if (total() <= width || visible.length <= 1) break;\n // Still too wide at minimum widths: drop the last (lowest-priority) column and re-fit.\n visible = visible.slice(0, -1);\n widths = visible.map(natural);\n }\n if (visible.length === 1 && total() > width) widths = [Math.max(1, width)];\n return { columns: visible, widths };\n}\n\n/** One formatted row: padded, truncated, joined by the gap, right-trimmed. */\nexport function formatTableRow(\n layout: TableLayout,\n cells: Record<string, string>,\n gap = TABLE_GAP,\n): string {\n return layout.columns\n .map((column, i) => {\n const w = layout.widths[i] as number;\n const text = truncate((cells[column.key] ?? '').replace(/\\s+/g, ' '), w);\n return column.align === 'right' ? padStart(text, w) : padEnd(text, w);\n })\n .join(' '.repeat(gap))\n .trimEnd();\n}\n\nexport function formatTableHeader(layout: TableLayout, gap = TABLE_GAP): string {\n const cells: Record<string, string> = {};\n for (const column of layout.columns) cells[column.key] = column.header;\n return formatTableRow(layout, cells, gap);\n}\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport type { ChatSource } from '../../core/chat-artifacts';\nimport { hyperlink, supportsHyperlinks } from '../hyperlink';\nimport { theme } from '../theme';\nimport { displayWidth, truncate } from '../text';\n\nconst MAX_SOURCES = 8;\n\nfunction hostOf(source: ChatSource): string {\n if (source.domain) return source.domain;\n try {\n return new URL(source.url).host;\n } catch {\n return '';\n }\n}\n\n/**\n * The answer's research sources, numbered in the order research found them:\n * `1 Title \u00B7 domain`. The title links to the page where OSC 8 works;\n * elsewhere the URL follows, dim, so it can be copied.\n */\nexport const SourcesList = memo(function SourcesList(props: { sources: readonly ChatSource[]; width: number; links?: boolean }) {\n const { sources, width } = props;\n const links = props.links ?? supportsHyperlinks();\n const shown = sources.slice(0, MAX_SOURCES);\n const numberWidth = String(shown.length).length;\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{theme.dim('Sources')}</Text>\n {shown.map((source, i) => {\n const host = hostOf(source);\n const title = truncate(source.title, Math.max(10, Math.min(60, width - numberWidth - displayWidth(host) - 8)));\n return (\n <Box key={`${i}-${source.url}`} width={width}>\n <Box flexShrink={0}>\n <Text>\n {theme.dim(String(i + 1).padStart(numberWidth))} {links ? hyperlink(title, source.url) : title}\n </Text>\n </Box>\n <Box flexGrow={1} flexShrink={1}>\n <Text wrap=\"truncate-end\">\n {host && host !== source.title ? theme.dim(` ${theme.symbols.middot} ${host}`) : ''}\n {links ? '' : theme.dim(` ${source.url}`)}\n </Text>\n </Box>\n </Box>\n );\n })}\n {sources.length > shown.length ? <Text>{theme.dim(`+${sources.length - shown.length} more`)}</Text> : null}\n </Box>\n );\n});\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport type { ChatArtifact } from '../../core/chat-artifacts';\nimport type { ChatToolCall } from '../../core/chat-model';\nimport { theme } from '../theme';\nimport { clipLines, displayWidth, formatElapsed, safeJson, shortId, summarizeArgs } from '../text';\nimport { ArtifactRow } from './ArtifactRow';\nimport { Spinner, useClockTick } from './Spinner';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Top-level keys that make a result a list (`{ jobs: [...], total }`). */\nexport const LIST_RESULT_KEYS = ['jobs', 'cvs', 'items', 'skills', 'automations', 'results', 'applications'] as const;\n\n/**\n * Short right-hand summary of a tool result (`12 found`, `failed`). Only\n * list results count: a bare array, or one of `LIST_RESULT_KEYS` holding an\n * array (with `total` when the server reports more than it sent). A create,\n * update or get result has no count, whatever arrays it carries.\n */\nexport function resultSummary(result: unknown): string {\n if (Array.isArray(result)) return `${result.length} found`;\n if (!isRecord(result)) return '';\n if (result.ok === false || result.error === true) return 'failed';\n const key = LIST_RESULT_KEYS.find((k) => Array.isArray(result[k]));\n if (!key) return '';\n const shown = (result[key] as unknown[]).length;\n const total = typeof result.total === 'number' && Number.isFinite(result.total) ? result.total : undefined;\n return `${total !== undefined && total >= shown ? total : shown} found`;\n}\n\nfunction glyph(call: ChatToolCall) {\n if (call.decision === 'approve') return <Text>{theme.success(theme.symbols.success)}</Text>;\n if (call.decision === 'reject') return <Text>{theme.error(theme.symbols.error)}</Text>;\n if (call.left) return <Text>{theme.attention(theme.symbols.attention)}</Text>;\n switch (call.stage) {\n case 'running':\n return <Spinner />;\n case 'pending_approval':\n return <Text>{theme.attention(theme.symbols.attention)}</Text>;\n case 'completed':\n return <Text>{theme.success(theme.symbols.success)}</Text>;\n case 'failed':\n return <Text>{theme.error(theme.symbols.error)}</Text>;\n default:\n return <Text>{theme.dim(theme.symbols.error)}</Text>;\n }\n}\n\nfunction titleText(call: ChatToolCall): string {\n if (call.decision === 'approve') return `Approved ${call.title}`;\n if (call.decision === 'reject') return `Rejected ${call.title}`;\n if (call.left) return `Left pending ${call.title}`;\n if (call.stage === 'running') return `${call.title}${theme.symbols.ellipsis}`;\n if (call.stage === 'declined') return `${call.title} ${theme.dim('declined')}`;\n return call.title;\n}\n\n/** Finished duration: `<0.1s` only when it really was, else `0.8s`, `12s`, `1m 04s`; nothing when unmeasured. */\nexport function formatToolDuration(ms: number | undefined): string | null {\n if (ms === undefined) return null;\n return ms < 100 ? '<0.1s' : formatElapsed(ms);\n}\n\n/** While running, the time stays hidden for the first second, then counts on the shared clock. */\nexport const RunningTime = memo(function RunningTime({ since }: { since: number }) {\n useClockTick(true);\n const elapsed = Date.now() - since;\n return elapsed >= 1000 ? <Text>{theme.dim(formatElapsed(elapsed))}</Text> : null;\n});\n\nexport type ToolCallRowProps = { call: ChatToolCall; width: number; expanded?: boolean };\n\n/**\n * One line per tool call: glyph by stage, verb title, dim args summary,\n * right-aligned result summary and duration. `expanded` shows args/result JSON.\n */\nexport const ToolCallRow = memo(function ToolCallRow({ call, width, expanded = false }: ToolCallRowProps) {\n const card = cardOf(call);\n if (card && !(call.stage === 'pending_approval' && !call.decision)) {\n return (\n <Box flexDirection=\"column\" width={width}>\n <ArtifactRow artifact={card} draft={call.draft} width={width} />\n {expanded ? <ToolCallDetail call={call} width={width} /> : null}\n </Box>\n );\n }\n const waiting = call.stage === 'pending_approval' && !call.decision && !call.left;\n const summary = waiting\n ? theme.attention('waiting for approval')\n : call.left && call.approvalId\n ? theme.dim(shortId(call.approvalId))\n : theme.dim(call.denial ? 'unavailable' : call.stage === 'failed' ? 'failed' : call.research ? sourcesSummary(call) : resultSummary(call.result));\n const measured = formatToolDuration(call.durationMs);\n const duration = measured ? theme.dim(measured) : null;\n const running = call.stage === 'running' && call.endedAt === undefined;\n const rightWidth = displayWidth(summary) + 2 + (duration ? displayWidth(duration) : 6);\n const args = summarizeArgs(call.args, Math.max(8, width - displayWidth(titleText(call)) - rightWidth - 7));\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box width={width}>\n {glyph(call)}\n <Box flexGrow={1} flexShrink={1} marginLeft={1}>\n <Text wrap=\"truncate-end\">\n {titleText(call)}\n {args ? theme.dim(` ${theme.symbols.middot} ${args}`) : ''}\n </Text>\n </Box>\n <Box flexShrink={0} marginLeft={1}>\n {summary ? <Text>{summary} </Text> : null}\n {duration ? <Text>{duration}</Text> : running ? <RunningTime since={call.startedAt} /> : null}\n </Box>\n </Box>\n {call.denial ? (\n <Text wrap=\"truncate-end\">\n {theme.dim(` ${theme.symbols.arrowRight} ${call.denial.message}${call.denial.reason ? ` (${call.denial.reason})` : ''}`)}\n </Text>\n ) : null}\n {expanded ? <ToolCallDetail call={call} width={width} /> : null}\n </Box>\n );\n});\n\n/** The artifact card of a call: its result, or the writer's draft while it builds. */\nfunction cardOf(call: ChatToolCall): ChatArtifact | null {\n if (call.artifact) return call.artifact;\n if (!call.draft || call.stage !== 'running') return null;\n const title = typeof call.args.title === 'string' && call.args.title ? call.args.title : call.title;\n return { id: call.draft.artifactId, kind: call.draft.kind, title, status: 'pending' };\n}\n\nfunction sourcesSummary(call: ChatToolCall): string {\n const n = call.sources?.length ?? 0;\n if (call.stage === 'running') return '';\n return n ? `${n} ${n === 1 ? 'source' : 'sources'}` : 'no sources';\n}\n\n/** Research detail: the queries it ran and the sources it read. */\nfunction researchLines(call: ChatToolCall): string[] {\n const result = isRecord(call.result) ? call.result : {};\n const queries = Array.isArray(result.queries) ? result.queries.filter((q): q is string => typeof q === 'string') : [];\n const lines = queries.map((q) => `query ${q}`);\n (call.sources ?? []).forEach((source, i) => lines.push(`${i + 1} ${source.title} ${theme.dim(source.url)}`));\n return lines;\n}\n\n/** `ctrl+o` detail: args and result JSON, clipped with `+N lines`. */\nexport const ToolCallDetail = memo(function ToolCallDetail({ call, width }: { call: ChatToolCall; width: number }) {\n if (call.research && call.result !== undefined && !call.denial) {\n const { lines, hidden } = clipLines(researchLines(call).join('\\n'), 16);\n return (\n <Box flexDirection=\"column\" marginLeft={2} width={Math.max(10, width - 2)}>\n {lines.map((line, i) => (\n <Text key={i} wrap=\"truncate-end\">\n {theme.dim(theme.symbols.gutter)} {line}\n </Text>\n ))}\n {hidden > 0 ? <Text>{theme.dim(` +${hidden} lines`)}</Text> : null}\n </Box>\n );\n }\n const blocks: Array<[string, unknown]> = [['args', call.args]];\n if (call.result !== undefined) blocks.push(['result', call.result]);\n return (\n <Box flexDirection=\"column\" marginLeft={2} width={Math.max(10, width - 2)}>\n {blocks.map(([label, value]) => {\n const { lines, hidden } = clipLines(safeJson(value), 16);\n return (\n <Box key={label} flexDirection=\"column\">\n <Text>{theme.dim(label)}</Text>\n {lines.map((line, i) => (\n <Text key={i} wrap=\"truncate-end\">\n {theme.dim(theme.symbols.gutter)} {line}\n </Text>\n ))}\n {hidden > 0 ? <Text>{theme.dim(` +${hidden} lines`)}</Text> : null}\n </Box>\n );\n })}\n </Box>\n );\n});\n", "/**\n * Slash commands of the chat screen (`/new`, `/threads`, `/mode`, `/model`,\n * `/research`, `/image`, `/result`, `/help`, `/home`, `/exit`, and the\n * result, file and account commands `/open`, `/apply`, `/save`, `/show`,\n * `/download`, `/login`, `/logout`). The capability commands save the choice\n * for the profile (sticky, like the app's composer) and warn when the\n * account cannot use it.\n */\nimport { useCallback, useRef } from 'react';\nimport {\n type CapabilityAvailability,\n type CapabilityKey,\n type ChatCapabilities,\n parseCapabilityMode,\n unavailableNotices,\n} from '../../../core/capabilities';\nimport { toCliError } from '../../../core/errors';\nimport type { AccountChange, UiServices } from '../../services';\nimport { theme } from '../../theme';\nimport { type LoginStart, parseLoginArgs } from '../login/login-model';\nimport { CHAT_HELP, parseMode } from './commands';\nimport { useFileCommands } from './useFileCommands';\nimport type { ChatSession } from './useChatSession';\n\nexport type ChatCommandDeps = {\n session: ChatSession;\n services: UiServices;\n companyId?: string;\n hostedByHome: boolean;\n onExit(reason: 'exit' | 'home'): void;\n openThreads(): void;\n /** Opens the in-chat /login step. */\n openLogin(start: LoginStart): void;\n /** The host swaps the services after /login or /logout; absent, both are unavailable. */\n onAccountChange?(change: AccountChange): void;\n};\n\nexport function useChatCommands(deps: ChatCommandDeps): (name: string, arg: string) => void {\n const { session, services, companyId, hostedByHome, onExit, openThreads, openLogin, onAccountChange } = deps;\n const { state } = session;\n const availability = useRef<Promise<CapabilityAvailability | null> | null>(null);\n const runFileCommand = useFileCommands(session, services);\n\n const warnIfUnavailable = useCallback(\n (capabilities: ChatCapabilities) => {\n if (!services.loadCapabilities) return;\n availability.current ??= services.loadCapabilities().catch(() => null);\n void availability.current.then((answer) => {\n for (const text of unavailableNotices(capabilities, answer)) session.dispatch({ type: 'notice', tone: 'info', text });\n });\n },\n [services, session],\n );\n\n const setCapability = useCallback(\n (key: CapabilityKey, arg: string) => {\n if (!arg) {\n session.dispatch({ type: 'notice', tone: 'info', text: `${key} ${state.capabilities[key]} ${theme.symbols.middot} /${key} <mode> to change it` });\n return;\n }\n let value: ChatCapabilities[CapabilityKey];\n try {\n value = parseCapabilityMode(key, arg);\n } catch (error) {\n session.dispatch({ type: 'notice', tone: 'error', text: toCliError(error).message.replace(/^--/, '/') });\n return;\n }\n const next = { ...state.capabilities, [key]: value } as ChatCapabilities;\n session.dispatch({ type: 'set-capability', key, value });\n let saved = false;\n try {\n services.saveCapabilityPrefs?.(next);\n saved = Boolean(services.saveCapabilityPrefs);\n } catch {\n saved = false;\n }\n const scope = state.mode === 'employer' ? ' (employer chats ignore it)' : '';\n session.dispatch({\n type: 'notice',\n tone: 'info',\n text: `${key} ${value}${scope}${saved ? ` ${theme.symbols.middot} saved for profile ${services.profileName}` : ''}`,\n });\n if (state.mode !== 'employer') warnIfUnavailable(next);\n },\n [session, services, state.capabilities, state.mode, warnIfUnavailable],\n );\n\n return useCallback(\n (name: string, arg: string) => {\n switch (name) {\n case 'new':\n session.dispatch({ type: 'new-thread' });\n session.dispatch({ type: 'notice', tone: 'info', text: `New chat ${theme.symbols.middot} ${state.mode}` });\n return;\n case 'threads':\n openThreads();\n return;\n case 'mode': {\n const mode = parseMode(arg);\n if (!mode) session.dispatch({ type: 'notice', tone: 'error', text: 'Use /mode seeker or /mode employer' });\n else {\n session.dispatch({ type: 'set-mode', mode });\n session.dispatch({ type: 'notice', tone: 'info', text: `Mode ${mode} ${theme.symbols.middot} new chat` });\n }\n return;\n }\n case 'model': {\n if (!arg) {\n const current = state.modelId ?? 'auto';\n services\n .listModels({ mode: state.mode, companyId })\n .then(({ models }) => {\n const list = models.map((m) => `${m.id === current ? `${theme.symbols.pointer} ` : ' '}${m.id} ${m.displayName}${m.locked ? ` (${m.minimumTier} plan)` : ''}`);\n session.dispatch({ type: 'notice', tone: 'info', text: [`Model: ${current} \u00B7 /model <id> to switch`, ...list].join('\\n') });\n })\n .catch(() => session.dispatch({ type: 'notice', tone: 'info', text: `Model: ${current} ${theme.symbols.middot} /model <id> or /model auto` }));\n return;\n }\n const modelId = arg === 'auto' ? undefined : arg;\n session.dispatch({ type: 'set-model', modelId });\n session.dispatch({ type: 'notice', tone: 'info', text: `Model ${modelId ?? 'auto'} for the next messages` });\n return;\n }\n case 'research':\n case 'image':\n case 'result':\n setCapability(name, arg);\n return;\n case 'help':\n session.dispatch({ type: 'notice', tone: 'info', text: CHAT_HELP });\n return;\n case 'open':\n case 'apply':\n case 'save':\n case 'show':\n case 'download':\n runFileCommand(name, arg);\n return;\n case 'login': {\n const start = parseLoginArgs(arg);\n if ('error' in start) session.dispatch({ type: 'notice', tone: 'error', text: start.error });\n else if (!services.session || !onAccountChange) {\n session.dispatch({ type: 'notice', tone: 'error', text: 'Signing in is not available here', hint: 'Run `tabbio login` in a terminal.' });\n } else openLogin(start);\n return;\n }\n case 'logout': {\n const controls = services.session;\n if (!controls || !onAccountChange) {\n session.dispatch({ type: 'notice', tone: 'error', text: 'Signing out is not available here', hint: 'Run `tabbio logout` in a terminal.' });\n return;\n }\n session.interrupt();\n session.dispatch({ type: 'notice', tone: 'info', text: `Signing out${theme.symbols.ellipsis}` });\n controls.logout().then(onAccountChange, (error: unknown) => {\n const cli = toCliError(error);\n session.dispatch({ type: 'notice', tone: 'error', text: `Could not sign out: ${cli.message}`, hint: cli.hint });\n });\n return;\n }\n case 'home':\n onExit(hostedByHome ? 'home' : 'exit');\n return;\n case 'exit':\n case 'quit':\n onExit('exit');\n return;\n default:\n session.dispatch({ type: 'notice', tone: 'error', text: `Unknown command /${name}`, hint: 'Type / to see the commands.' });\n }\n },\n [session, state.mode, state.modelId, openThreads, onExit, hostedByHome, services, companyId, setCapability, runFileCommand, openLogin, onAccountChange],\n );\n}\n", "/**\n * The chat commands that act on results and files: `/open <n|id>`,\n * `/apply <n>`, `/save <n|id> [folder]`, `/show <n|id>` and\n * `/download [cvId]`. A number for a file is a file of this session\n * (1 = newest). `/apply` runs the prepare tool directly (a live tool row\n * that Esc stops); everything else answers with a transcript notice.\n */\nimport { homedir } from 'node:os';\nimport { extname, resolve as resolvePath } from 'node:path';\nimport { useCallback, useRef } from 'react';\nimport { type SavedFile, displayPath, isTextFile } from '../../../core/artifact-save';\nimport { toCliError } from '../../../core/errors';\nimport { hyperlink } from '../../hyperlink';\nimport type { UiServices } from '../../services';\nimport { theme } from '../../theme';\nimport { prepareApplicationTool } from './apply-command';\nimport {\n type TouchedFile,\n applySource,\n chatCards,\n parseDownloadArgs,\n parseSaveArgs,\n placedCards,\n previewBlock,\n recentFiles,\n resolveApply,\n resolveFileRef,\n resolveOpenTarget,\n savedLine,\n} from './card-commands';\nimport type { ChatSession } from './useChatSession';\n\n/** Lines `/show` prints (the file stays on disk in full). */\nexport const SHOW_MAX_LINES = 200;\n\nfunction looksLikePath(value: string): boolean {\n return /[\\\\/]/.test(value) || value.startsWith('.') || value.startsWith('~') || isTextFile(value) || Boolean(extname(value) && /\\.\\w{2,5}$/.test(value));\n}\n\nexport function useFileCommands(session: ChatSession, services: UiServices): (name: string, arg: string) => void {\n const { state, dispatch } = session;\n const touched = useRef<TouchedFile[]>([]);\n const touch = useCallback((id: string) => touched.current.push({ id, at: state.entries.length }), [state.entries.length]);\n\n const note = useCallback(\n (tone: 'info' | 'error' | 'success' | 'attention', text: string, hint?: string) =>\n dispatch({ type: 'notice', tone, text, ...(hint ? { hint } : {}) }),\n [dispatch],\n );\n const fail = useCallback(\n (prefix: string) => (error: unknown) => {\n const cli = toCliError(error);\n note('error', `${prefix}: ${cli.message}`, cli.hint);\n },\n [note],\n );\n\n const openLink = useCallback(\n async (url: string, label: string) => {\n const opened = services.openUrl ? await services.openUrl(url).catch(() => false) : false;\n // The plain URL stays visible (copy and paste); an OSC 8 terminal also makes it clickable.\n note(opened ? 'success' : 'info', opened ? `Opened ${label} in the browser` : `Open ${label}:`, services.hyperlinks ? hyperlink(url, url) : url);\n },\n [services, note],\n );\n\n const openArtifact = useCallback(\n async (id: string) => {\n if (!services.getArtifact || !services.artifactPreviewUrl) {\n note('error', 'Opening files is not available here', `Run \\`tabbio artifacts open ${id}\\`.`);\n return;\n }\n const artifact = await services.getArtifact(id);\n if (artifact.status === 'failed') {\n note('error', `${artifact.title} failed: ${artifact.error?.message ?? 'unknown error'}`);\n return;\n }\n if (artifact.status !== 'ready') {\n note('info', `${artifact.title} is still being created`, `Try /open ${id} again in a moment.`);\n return;\n }\n await openLink(await services.artifactPreviewUrl(id, artifact.kind), artifact.title);\n },\n [services, note, openLink],\n );\n\n const show = useCallback(\n async (target: string) => {\n let files: SavedFile[] | undefined;\n if (looksLikePath(target)) files = [{ path: resolvePath(target.replace(/^~(?=$|[\\\\/])/, homedir())), bytes: 0, kind: 'file' }];\n else {\n files = services.savedFiles?.(target);\n if (!files?.length) {\n if (!services.saveArtifact) {\n note('error', 'Saving files is not available here', `Run \\`tabbio artifacts download ${target}\\`.`);\n return;\n }\n files = await services.saveArtifact(target);\n if (files.length) note('success', savedLine(files));\n }\n }\n const text = files.find((f) => isTextFile(f.path));\n if (!text) {\n note(\n 'info',\n files.length ? `No text to print for ${files.map((f) => displayPath(f.path)).join(', ')}` : `Nothing saved for ${target} yet`,\n looksLikePath(target) ? undefined : `/open ${target} opens it in the browser`,\n );\n return;\n }\n if (!services.readSavedPreview) {\n note('error', 'Printing files is not available here');\n return;\n }\n const preview = await services.readSavedPreview(text.path, SHOW_MAX_LINES);\n note('info', previewBlock(text.path, preview, theme.symbols.gutter), looksLikePath(target) ? undefined : `/open ${target} opens it in the browser`);\n },\n [services, note],\n );\n\n return useCallback(\n (name: string, arg: string) => {\n const files = recentFiles(state, touched.current);\n /** A file id, or a number (1 = the newest file of this session); null after an error notice. */\n const fileId = (value: string): string | null => {\n const ref = resolveFileRef(value, files);\n if (ref.kind === 'error') note('error', ref.message);\n return ref.kind === 'id' ? ref.id : null;\n };\n switch (name) {\n case 'open': {\n const target = resolveOpenTarget(arg, placedCards(state), files);\n if (target.kind === 'error') note('error', target.message);\n else if (target.kind === 'link') void openLink(target.link.url, `${target.link.n}. ${target.link.label}`).catch(fail('Could not open the link'));\n else {\n touch(target.id);\n void openArtifact(target.id).catch(fail(`Could not open ${target.id}`));\n }\n return;\n }\n case 'apply': {\n const target = resolveApply(arg, chatCards(state));\n if (target.kind === 'error') return note('error', target.message);\n const started = session.runTool(prepareApplicationTool({ services, n: target.n, job: target.job, source: applySource(state) }));\n if (!started) note('attention', 'Tabbio is still answering', `Wait for the reply (esc stops it), then /apply ${target.n} again.`);\n return;\n }\n case 'save': {\n const parsed = parseSaveArgs(arg);\n if ('error' in parsed) return note('error', parsed.error);\n const id = fileId(parsed.id);\n if (!id) return;\n if (!services.saveArtifact) return note('error', 'Saving files is not available here', `Run \\`tabbio artifacts download ${id}\\`.`);\n note('info', `Saving ${id}${theme.symbols.ellipsis}`);\n services.saveArtifact(id, parsed.dir ? { dir: parsed.dir } : {}).then((saved) => {\n if (!saved.length) return note('attention', `Nothing was saved for ${id}`, 'It may still be rendering: try again in a moment.');\n touch(id);\n note('success', savedLine(saved), `/show ${id} prints it ${theme.symbols.middot} /open ${id} opens it in the browser`);\n }, fail(`Could not save ${id}`));\n return;\n }\n case 'show': {\n const value = arg.trim();\n if (!value) return note('error', 'Use /show <n> (1 = the newest file of this chat), /show <file id>, or a saved file path');\n const target = looksLikePath(value) ? value : fileId(value);\n if (!target) return;\n if (!looksLikePath(target)) touch(target);\n void show(target).catch(fail(`Could not show ${target}`));\n return;\n }\n case 'download': {\n const parsed = parseDownloadArgs(arg);\n if ('error' in parsed) return note('error', parsed.error);\n const label = !parsed.cvId || /^(master|main)$/i.test(parsed.cvId) ? 'your main CV' : parsed.cvId;\n if (!services.saveCvExport) return note('error', 'Saving CVs is not available here');\n note('info', `Exporting ${label} as ${parsed.format.toUpperCase()}${theme.symbols.ellipsis}`);\n services.saveCvExport(parsed.cvId, { format: parsed.format }).then((file) => note('success', savedLine([file])), fail(`Could not export ${label}`));\n return;\n }\n default:\n note('error', `Unknown command /${name}`);\n }\n },\n [state, session, services, note, fail, openLink, openArtifact, show, touch],\n );\n}\n", "/**\n * `/apply <n>` without the model: calls `catalog.applyPrepare` (catalog jobs)\n * or `application.prepare` (jobs posted on Tabbio) over MCP and shows the\n * result as the app's application card, under a normal tool row.\n */\nimport { cardFromToolResult } from '../../../core/chat-cards';\nimport { PRODUCTION_APP_URL } from '../../../core/config';\nimport { ExitCode } from '../../../core/errors';\nimport type { ToolCallResult } from '../../../core/mcp';\nimport type { UiServices } from '../../services';\nimport type { DirectNote, DirectTool } from './useChatSession';\n\nconst CARD_TYPE = 'application-preview';\n\nfunction notFound(result: ToolCallResult): boolean {\n return !result.ok && (result.error.exitCode === ExitCode.NotFound || /not found/i.test(result.error.message));\n}\n\n/** The notice under the card when the employer's own page takes the application. */\nexport function applyNotes(result: unknown, tool: string, appUrl: string): DirectNote[] {\n const record = typeof result === 'object' && result !== null ? (result as Record<string, unknown>) : {};\n if (record.redirectRequired !== true) return [];\n const card = cardFromToolResult({ id: 'apply', name: tool, args: {}, result, cardType: CARD_TYPE }, { appUrl });\n const link = card?.links[0];\n return link ? [{ tone: 'info', text: `/open ${link.n} opens the employer's application page` }] : [];\n}\n\n/**\n * The direct tool for `/apply <n>`. `source` is where the job came from:\n * catalog ids go to `catalog.applyPrepare`, app job ids to\n * `application.prepare`; unknown tries the catalog first.\n */\nexport function prepareApplicationTool(opts: {\n services: UiServices;\n n: number;\n job: { id: string; title: string };\n source?: 'catalog' | 'jobs';\n}): DirectTool {\n const { services, job, source } = opts;\n const tool = source === 'jobs' ? 'applicationPrepare' : 'catalogApplyPrepare';\n const appUrl = services.appUrl ?? PRODUCTION_APP_URL;\n return {\n text: `/apply ${opts.n}`,\n name: tool,\n title: 'Prepare application',\n cardType: CARD_TYPE,\n args: { job: job.title, ...(source === 'jobs' ? { jobId: job.id } : { catalogJobId: job.id }) },\n async run(signal) {\n if (source === 'jobs') return services.callTool('application.prepare', { jobId: job.id }, { signal });\n const first = await services.callTool('catalog.applyPrepare', { catalogJobId: job.id }, { signal });\n if (source === undefined && notFound(first)) return services.callTool('application.prepare', { jobId: job.id }, { signal });\n return first;\n },\n after: (result) => applyNotes(result, tool, appUrl),\n };\n}\n", "/**\n * Pure helpers for the chat commands that act on result cards and saved\n * files: `/open <n|id>`, `/apply <n>`, `/save`, `/show`, `/download`. The\n * cards and their lookups come from package Y (`core/chat-cards`,\n * `cardsInTranscript`); this file only turns arguments into targets and\n * messages.\n */\nimport { homedir } from 'node:os';\nimport { CV_EXPORT_FORMATS, type SavedFile, displayPath, formatBytes } from '../../../core/artifact-save';\nimport type { ChatState } from '../../../core/chat';\nimport { type CardLink, type ChatCard, findCardJob, findCardLink, latestCardLinks } from '../../../core/chat-cards';\n\n/** A card with the tool that made it and its position in the chat (live items after the entries). */\nexport type PlacedCard = { card: ChatCard; tool?: string; at: number };\n\n/** Every card of the chat, oldest first: the transcript's, then the live turn's tool cards. */\nexport function placedCards(state: Pick<ChatState, 'entries' | 'turn'>): PlacedCard[] {\n const toolNames = new Map<string, string>();\n const placed: PlacedCard[] = [];\n state.entries.forEach((entry, at) => {\n if (entry.kind === 'tool') toolNames.set(entry.call.id, entry.call.name);\n if (entry.kind === 'card') placed.push({ card: entry.card, tool: toolNames.get(entry.toolCallId), at });\n });\n (state.turn?.items ?? []).forEach((item, i) => {\n if (item.kind === 'tool' && item.call.card) placed.push({ card: item.call.card, tool: item.call.name, at: state.entries.length + i });\n });\n return placed;\n}\n\nexport function chatCards(state: Pick<ChatState, 'entries' | 'turn'>): ChatCard[] {\n return placedCards(state).map((p) => p.card);\n}\n\n/** Which prepare tool fits the jobs of the newest job card: catalog ids, app job ids, or unknown. */\nexport function applySource(state: Pick<ChatState, 'entries' | 'turn'>): 'catalog' | 'jobs' | undefined {\n const withJobs = placedCards(state).filter((p) => p.card.rows.some((row) => row.job));\n const tool = withJobs[withJobs.length - 1]?.tool;\n if (!tool) return undefined;\n if (tool.startsWith('catalog')) return 'catalog';\n if (/^(job|application)[A-Z]/.test(tool)) return 'jobs';\n return undefined;\n}\n\n/** A file this session touched by id (`/save`, `/show`, `/open`), and where in the chat that happened. */\nexport type TouchedFile = { id: string; at: number };\n\n/**\n * The files of this session, newest first: artifacts that became ready or\n * were saved (transcript order), and ids used with `/save`, `/show` or\n * `/open`. `/show 1` is the first one.\n */\nexport function recentFiles(state: Pick<ChatState, 'entries' | 'turn'>, touched: readonly TouchedFile[] = []): Array<{ id: string; at: number }> {\n const seen: Array<{ id: string; at: number }> = [];\n const add = (id: string | undefined, at: number) => {\n if (id) seen.push({ id, at });\n };\n state.entries.forEach((entry, at) => {\n if (entry.kind === 'tool') {\n if (entry.call.artifact?.status === 'ready') add(entry.call.artifact.id, at);\n if (entry.call.saved?.files.length) add(entry.call.saved.artifactId, at);\n } else if (entry.kind === 'artifact' && entry.artifact.status === 'ready') add(entry.artifact.id, at);\n else if (entry.kind === 'saved' && entry.saved.files.length) add(entry.saved.artifactId, at);\n });\n (state.turn?.items ?? []).forEach((item, i) => {\n if (item.kind === 'tool' && item.call.artifact?.status === 'ready') add(item.call.artifact.id, state.entries.length + i);\n });\n for (const t of touched) add(t.id, t.at);\n const newest = new Map<string, number>();\n for (const { id, at } of seen) newest.set(id, Math.max(at, newest.get(id) ?? -1));\n return [...newest.entries()].map(([id, at]) => ({ id, at })).sort((a, b) => b.at - a.at);\n}\n\nexport type FileRef = { kind: 'id'; id: string } | { kind: 'error'; message: string };\n\n/** `/show 1`, `/save 2`: a number is a file of this session (1 = newest); anything else is an id. */\nexport function resolveFileRef(arg: string, files: ReadonlyArray<{ id: string }>): FileRef {\n const value = arg.trim();\n if (!/^\\d+$/.test(value)) return { kind: 'id', id: value };\n const n = Number(value);\n const file = n >= 1 ? files[n - 1] : undefined;\n if (file) return { kind: 'id', id: file.id };\n return {\n kind: 'error',\n message: files.length\n ? `There is no file ${n}: this chat has ${files.length} file${files.length === 1 ? '' : 's'} (${range(files.length)}, 1 is the newest)`\n : `There is no file ${n}: no file in this chat yet (use the file id)`,\n };\n}\n\nfunction range(count: number): string {\n return count === 1 ? '1' : `1 to ${count}`;\n}\n\nexport type OpenTarget = { kind: 'link'; link: CardLink } | { kind: 'artifact'; id: string } | { kind: 'error'; message: string };\n\nexport const ARTIFACT_ID = /^[A-Za-z][\\w-]{5,}$/;\n\n/**\n * `/open 2`: link 2 of the newest card with links, or, when a file is newer\n * than that card, file 2 of this session (1 = newest). `/open <id>` opens\n * that file's preview.\n */\nexport function resolveOpenTarget(arg: string, placed: readonly PlacedCard[], files: ReadonlyArray<{ id: string; at: number }> = []): OpenTarget {\n const linkCards = placed.filter((p) => p.card.links.length > 0);\n const newestLinks = linkCards[linkCards.length - 1];\n const plain = placed.map((p) => p.card);\n const count = latestCardLinks(plain).length;\n const value = arg.trim();\n const filesFirst = files.length > 0 && (!newestLinks || (files[0] as { at: number }).at > newestLinks.at);\n if (!value) {\n return {\n kind: 'error',\n message: filesFirst\n ? `Use /open <n> (${range(files.length)}, 1 is the newest file) or /open <file id>`\n : count\n ? `Use /open <n> (${range(count)}) or /open <file id>`\n : 'Use /open <n> after a result with links, or /open <file id>',\n };\n }\n if (/^\\d+$/.test(value)) {\n if (filesFirst) {\n const ref = resolveFileRef(value, files);\n return ref.kind === 'id' ? { kind: 'artifact', id: ref.id } : ref;\n }\n const n = Number(value);\n const link = findCardLink(plain, n);\n if (link) return { kind: 'link', link };\n return {\n kind: 'error',\n message: count ? `There is no link ${n}: the last result has ${count} link${count === 1 ? '' : 's'} (${range(count)})` : `There is no link ${n}: no result with links yet`,\n };\n }\n if (ARTIFACT_ID.test(value)) return { kind: 'artifact', id: value };\n return { kind: 'error', message: `Not a link number or a file id: ${value}` };\n}\n\nexport type ApplyTarget = { kind: 'apply'; n: number; job: { id: string; title: string } } | { kind: 'error'; message: string };\n\n/** How many jobs the newest job result lists (what `findCardJob` numbers). */\nfunction jobCount(cards: readonly ChatCard[]): number {\n for (let i = cards.length - 1; i >= 0; i -= 1) {\n const rows = (cards[i] as ChatCard).rows.filter((row) => row.job);\n if (rows.length) return rows.length;\n }\n return 0;\n}\n\n/** `/apply 2`: job 2 of the newest job result. */\nexport function resolveApply(arg: string, cards: readonly ChatCard[]): ApplyTarget {\n const count = jobCount(cards);\n const value = arg.trim();\n if (!/^\\d+$/.test(value)) {\n return { kind: 'error', message: count ? `Use /apply <n> (${range(count)})` : 'Use /apply <n> after a job search result' };\n }\n const n = Number(value);\n const job = findCardJob(cards, n);\n if (!job) {\n return {\n kind: 'error',\n message: count ? `There is no job ${n}: the last result lists ${count} job${count === 1 ? '' : 's'} (${range(count)})` : `There is no job ${n}: no job result yet`,\n };\n }\n return { kind: 'apply', n, job };\n}\n\n/** \"Saved ./tabbio-artifacts/page-1a2b.html (12 KB), ./...pdf (80 KB)\". */\nexport function savedLine(files: readonly SavedFile[], cwd?: string): string {\n return `Saved ${files.map((f) => `${displayPath(f.path, cwd)} (${formatBytes(f.bytes)})`).join(', ')}`;\n}\n\n/** The dim code block `/show` prints: a header, the lines behind a gutter, and what was left out. */\nexport function previewBlock(path: string, preview: { lines: string[]; total: number }, gutter: string, cwd?: string): string {\n const shown = displayPath(path, cwd);\n const body = preview.lines.map((line) => `${gutter} ${line.replace(/\\t/g, ' ')}`);\n const more = preview.total > preview.lines.length ? [`+${preview.total - preview.lines.length} more lines in ${shown}`] : [];\n return [`${shown} (${preview.total} line${preview.total === 1 ? '' : 's'})`, ...body, ...more].join('\\n');\n}\n\nconst FORMATS: readonly string[] = CV_EXPORT_FORMATS;\n\n/** `/download [cvId] [pdf|docx|txt|md]`: no id (or `master`) is the main CV. */\nexport function parseDownloadArgs(arg: string): { cvId: string | null; format: string } | { error: string } {\n const words = arg.trim().split(/\\s+/).filter(Boolean);\n if (words.length > 2) return { error: `Use /download [cvId] [${FORMATS.join('|')}]` };\n const [first, second] = words;\n const firstIsFormat = first !== undefined && second === undefined && FORMATS.includes(first.toLowerCase());\n const cvId = firstIsFormat ? null : (first ?? null);\n const format = (firstIsFormat ? first : (second ?? 'pdf')).toLowerCase();\n if (!FORMATS.includes(format)) return { error: `Unknown format ${second ?? first}: use ${FORMATS.join(', ')}` };\n return { cvId, format };\n}\n\n/** `/save <id> [dir]`. */\nexport function parseSaveArgs(arg: string): { id: string; dir?: string } | { error: string } {\n const match = /^(\\S+)(?:\\s+(.+))?$/.exec(arg.trim());\n if (!match) return { error: 'Use /save <file id> [folder]' };\n const dir = match[2]\n ?.trim()\n .replace(/^[\"']|[\"']$/g, '')\n .replace(/^~(?=$|[\\\\/])/, homedir());\n return { id: match[1] as string, ...(dir ? { dir } : {}) };\n}\n", "/**\n * Chat controller: owns the transcript reducer, the in-flight stream (with\n * its AbortController), the 50 ms event flush + stable-block promotion, the\n * follow-up queue and approval decisions. Rendering lives in Chat.tsx.\n */\nimport type { AgentMode } from '@tabbio/types';\nimport { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport { type ChatCapabilities, DEFAULT_CAPABILITIES, capabilityRequestFields } from '../../../core/capabilities';\nimport {\n type ApprovalChoice,\n type ChatAction,\n type NoticeTone,\n type PendingApproval,\n type ToolEventPayload,\n chatReducer,\n initialChatState,\n messageText,\n} from '../../../core/chat';\nimport { isCliError, toCliError } from '../../../core/errors';\nimport type { ToolCallResult } from '../../../core/mcp';\nimport type { UiServices } from '../../services';\nimport { useArtifactFollowUp } from './useArtifactFollowUp';\n\nexport const FLUSH_INTERVAL_MS = 50;\nconst HISTORY_LIMIT = 20;\n\nexport type ChatSessionOptions = {\n services: UiServices;\n mode: AgentMode;\n companyId?: string;\n threadId?: string;\n modelId?: string;\n initialMessage?: string;\n /** Research / Image / Result; defaults to the profile's saved choice. */\n capabilities?: ChatCapabilities;\n /**\n * Save generated files (artifacts, CV exports) into the artifacts dir\n * (default true; `chat --no-save` or TABBIO_NO_ARTIFACT_SAVE=1 turn it off).\n */\n saveArtifacts?: boolean;\n};\n\nexport type DirectNote = { tone: NoticeTone; text: string; hint?: string };\n\n/** One tool run without the model (`/apply`), shown like a tool call of a normal reply. */\nexport type DirectTool = {\n /** The command, shown as the user's line (`/apply 2`). */\n text: string;\n /** Tool name for the row and the card (`catalogApplyPrepare`). */\n name: string;\n /** Row title (`Prepare application`). */\n title: string;\n /** Row arguments (what the dim summary after the title shows). */\n args: Record<string, unknown>;\n cardType?: string;\n run(signal: AbortSignal): Promise<ToolCallResult>;\n /** Notices printed under the row and its card, from the result. */\n after?(result: unknown): DirectNote[];\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** A result that is a refusal (`{ ok: false, error }`) although the call itself worked. */\nfunction resultFailure(result: unknown): DirectNote | null {\n if (!isRecord(result) || result.ok !== false) return null;\n const error = isRecord(result.error) ? result.error : {};\n const text = typeof error.message === 'string' ? error.message : typeof result.message === 'string' ? result.message : 'The tool refused this request';\n return { tone: 'error', text };\n}\n\nexport function useChatSession(opts: ChatSessionOptions) {\n const { services, companyId } = opts;\n const [state, dispatch] = useReducer(chatReducer, opts, (o) =>\n initialChatState({\n mode: o.mode,\n threadId: o.threadId,\n modelId: o.modelId,\n capabilities: o.capabilities ?? o.services.capabilityPrefs ?? DEFAULT_CAPABILITIES,\n links: Boolean(o.services.hyperlinks),\n appUrl: o.services.appUrl,\n }),\n );\n const stateRef = useRef(state);\n stateRef.current = state;\n const buffer = useRef<ChatAction[]>([]);\n const abortRef = useRef<AbortController | null>(null);\n const mounted = useRef(true);\n const [queue, setQueue] = useState<string[]>([]);\n const [deciding, setDeciding] = useState<ApprovalChoice | null>(null);\n const [loading, setLoading] = useState<{ label: string; since: number } | null>(\n opts.threadId ? { label: 'Loading the thread\u2026', since: Date.now() } : null,\n );\n\n const flush = useCallback(() => {\n const events = buffer.current.splice(0);\n for (const event of events) dispatch(event);\n }, []);\n\n // Stream events are buffered and applied every 50 ms, then stable blocks are promoted.\n useEffect(() => {\n if (!state.streaming) return undefined;\n const id = setInterval(() => {\n flush();\n dispatch({ type: 'tick' });\n }, FLUSH_INTERVAL_MS);\n return () => clearInterval(id);\n }, [state.streaming, flush]);\n\n useEffect(\n () => () => {\n mounted.current = false;\n abortRef.current?.abort();\n },\n [],\n );\n\n const send = useCallback(\n (text: string) => {\n const message = text.trim();\n if (!message) return;\n if (stateRef.current.streaming) {\n setQueue((q) => [...q, message]);\n return;\n }\n dispatch({ type: 'submit', text: message, at: Date.now() });\n const controller = new AbortController();\n abortRef.current = controller;\n const { mode, threadId, modelId, capabilities } = stateRef.current;\n void (async () => {\n try {\n const request = { mode, message, threadId, modelId, companyId, ...capabilityRequestFields(mode, capabilities) };\n const stream = services.streamChat(request, controller.signal);\n for await (const event of stream) buffer.current.push({ ...event, at: Date.now() });\n if (!mounted.current) return;\n flush();\n dispatch({ type: 'tick' });\n } catch (error) {\n if (!mounted.current) return;\n flush();\n const cancelled = controller.signal.aborted || (isCliError(error) && error.exitCode === 130);\n const cli = toCliError(error);\n dispatch({\n type: 'stream-failed',\n message: cancelled ? 'Stopped' : cli.message,\n hint: cancelled ? undefined : cli.hint,\n cancelled,\n at: Date.now(),\n });\n } finally {\n if (abortRef.current === controller) abortRef.current = null;\n }\n })();\n },\n [services, companyId, flush],\n );\n\n /**\n * Runs one tool directly (no model turn): the command as the user's line,\n * a live row (spinner and elapsed time, then the glyph and duration), the\n * card the app would show, then any notices. Esc interrupts it like a\n * reply. False (nothing happens) while a reply is still streaming.\n */\n const runTool = useCallback(\n (spec: DirectTool): boolean => {\n if (stateRef.current.streaming) return false;\n const started = Date.now();\n dispatch({ type: 'submit', text: spec.text, at: started });\n const controller = new AbortController();\n abortRef.current = controller;\n const payload: ToolEventPayload = {\n id: `direct-${started}`,\n name: spec.name,\n args: spec.args,\n display: { title: spec.title },\n ...(spec.cardType ? { cardType: spec.cardType } : {}),\n };\n dispatch({ type: 'tool-call', payload: { ...payload, status: 'running', stage: 'running' }, at: started });\n // The row settles, the turn finishes (row and card go to the scrollback), then the notices.\n const settle = (event: ToolEventPayload, notes: DirectNote[]) => {\n if (!mounted.current) return;\n const at = Date.now();\n dispatch({ type: 'tool-result', payload: event, at });\n dispatch({ type: 'finish', payload: { finishReason: 'stop' }, at });\n for (const note of notes) dispatch({ type: 'notice', ...note });\n };\n void (async () => {\n try {\n const outcome = await spec.run(controller.signal);\n if (controller.signal.aborted) throw new Error('aborted');\n if (!outcome.ok) {\n const failed = { ...payload, status: 'failed', stage: 'failed', result: { ok: false, error: { code: outcome.error.code, message: outcome.error.message } } };\n settle(failed, [{ tone: 'error', text: outcome.error.message, ...(outcome.error.hint ? { hint: outcome.error.hint } : {}) }]);\n return;\n }\n if (outcome.approval) {\n const waiting = { ...payload, status: 'failed', stage: 'failed', result: { ok: false, error: { code: 'APPROVAL_REQUIRED', message: outcome.approval.message } } };\n const hint = `Approve it with \\`tabbio approvals approve ${outcome.approval.approvalId}\\`, in /approvals on the home screen, or in the app.`;\n settle(waiting, [{ tone: 'attention', text: outcome.approval.message, hint }]);\n return;\n }\n const refused = resultFailure(outcome.result);\n const completed = { ...payload, status: refused ? 'failed' : 'completed', stage: refused ? 'failed' : 'completed', result: outcome.result };\n settle(completed, refused ? [refused] : (spec.after?.(outcome.result) ?? []));\n } catch (error) {\n const cancelled = controller.signal.aborted || (isCliError(error) && error.exitCode === 130);\n const cli = toCliError(error);\n const failed = { ...payload, status: 'failed', stage: 'failed', result: { ok: false, error: { code: cli.code, message: cancelled ? 'Stopped' : cli.message } } };\n const note: DirectNote = cancelled ? { tone: 'attention', text: 'Stopped' } : { tone: 'error', text: cli.message, ...(cli.hint ? { hint: cli.hint } : {}) };\n settle(failed, [note]);\n } finally {\n if (abortRef.current === controller) abortRef.current = null;\n }\n })();\n return true;\n },\n [],\n );\n\n const interrupt = useCallback((): boolean => {\n if (!abortRef.current) return false;\n abortRef.current.abort();\n return true;\n }, []);\n\n // Queued follow-ups go out once the turn and any approval are done.\n useEffect(() => {\n if (state.streaming || state.approvals.length > 0 || queue.length === 0) return;\n const [next, ...rest] = queue;\n setQueue(rest);\n if (next) send(next);\n }, [state.streaming, state.approvals.length, queue, send]);\n\n const decide = useCallback(\n async (approval: PendingApproval, decision: ApprovalChoice) => {\n if (decision === 'leave') {\n dispatch({ type: 'approval-decided', approvalId: approval.approvalId, decision, at: Date.now() });\n return;\n }\n setDeciding(decision);\n try {\n const data = await services.decideApproval(approval.approvalId, decision, { mode: stateRef.current.mode, companyId });\n if (!mounted.current) return;\n dispatch({ type: 'approval-decided', approvalId: approval.approvalId, decision, text: data.assistant?.text, at: Date.now() });\n } catch (error) {\n if (!mounted.current) return;\n const cli = toCliError(error);\n dispatch({\n type: 'approval-decided',\n approvalId: approval.approvalId,\n decision,\n error: cli.hint ? `${cli.message}. ${cli.hint}` : cli.message,\n at: Date.now(),\n });\n } finally {\n if (mounted.current) setDeciding(null);\n }\n },\n [services, companyId],\n );\n\n const resume = useCallback(\n async (threadId: string, title?: string) => {\n setLoading({ label: 'Loading the thread\u2026', since: Date.now() });\n try {\n const data = await services.getThreadMessages(threadId, { mode: stateRef.current.mode, companyId });\n if (!mounted.current) return;\n const messages = data.messages\n .map((m) => ({ role: m.role, text: messageText(m.content) }))\n .filter((m) => m.text.trim())\n .slice(-HISTORY_LIMIT);\n dispatch({ type: 'notice', tone: 'info', text: `Resumed ${title ? `\u201C${title}\u201D` : 'thread'} \u00B7 last ${messages.length} messages` });\n dispatch({ type: 'history', threadId, messages });\n } catch (error) {\n if (!mounted.current) return;\n const cli = toCliError(error);\n dispatch({ type: 'notice', tone: 'error', text: `Could not load the thread: ${cli.message}`, hint: cli.hint });\n } finally {\n if (mounted.current) setLoading(null);\n }\n },\n [services, companyId],\n );\n\n // Mount: resume the thread (if any), then send the first message (if any).\n const booted = useRef(false);\n useEffect(() => {\n if (booted.current) return;\n booted.current = true;\n void (async () => {\n if (opts.threadId) await resume(opts.threadId);\n if (opts.initialMessage && mounted.current) send(opts.initialMessage);\n })();\n }, [opts.threadId, opts.initialMessage, resume, send]);\n\n const saveArtifacts = opts.saveArtifacts !== false;\n useArtifactFollowUp(state, dispatch, services, { save: saveArtifacts });\n\n return { state, dispatch, send, runTool, interrupt, decide, deciding, queue, setQueue, resume, loading, saveArtifacts };\n}\n\nexport type ChatSession = ReturnType<typeof useChatSession>;\n", "/**\n * Follows the artifact cards of the live turn (PR #512): a `pending` card is\n * polled (`GET /api/artifacts/:id`, 2 s backing off to 5 s, up to 5 min)\n * until it is ready or failed; a ready card gets a signed preview URL for\n * its OSC 8 title link. Results go back to the reducer as `artifact-status`\n * actions; a card that never settles is released so the transcript moves on.\n *\n * It also runs the chat auto-save (`useAutoSave`): ready artifacts and CV\n * exports go to disk unless `opts.save` is false or\n * `TABBIO_NO_ARTIFACT_SAVE=1`.\n */\nimport { type Dispatch, useEffect, useRef } from 'react';\nimport { autoSaveDisabled } from '../../../core/artifact-save';\nimport { waitForArtifact } from '../../../core/artifacts';\nimport type { ChatAction, ChatState } from '../../../core/chat';\nimport type { ChatArtifact } from '../../../core/chat-artifacts';\nimport type { UiServices } from '../../services';\nimport { useAutoSave } from './useAutoSave';\n\nconst FOLLOW_TIMEOUT_MS = 5 * 60_000;\n\nfunction liveArtifacts(state: ChatState): ChatArtifact[] {\n const items = state.turn?.items ?? [];\n return items.flatMap((item) => (item.kind === 'tool' && item.call.artifact ? [item.call.artifact] : []));\n}\n\nexport type ArtifactFollowUpOptions = {\n /** Save ready artifacts and CV exports to disk (default true; `chat --no-save` passes false). */\n save?: boolean;\n};\n\nexport function useArtifactFollowUp(\n state: ChatState,\n dispatch: Dispatch<ChatAction>,\n services: UiServices,\n opts: ArtifactFollowUpOptions = {},\n): void {\n useAutoSave(state, dispatch, services, opts.save !== false && !autoSaveDisabled());\n const followed = useRef(new Map<string, 'poll' | 'link'>());\n const alive = useRef(true);\n useEffect(\n () => () => {\n alive.current = false;\n },\n [],\n );\n\n const cards = liveArtifacts(state);\n const key = cards.map((c) => `${c.id}:${c.status}:${c.linkPending ? 1 : 0}:${c.released ? 1 : 0}`).join('|');\n\n useEffect(() => {\n const send = (action: ChatAction) => {\n if (alive.current) dispatch(action);\n };\n const mintLink = async (card: ChatArtifact) => {\n try {\n const url = services.artifactPreviewUrl ? await services.artifactPreviewUrl(card.id, card.kind) : undefined;\n send({ type: 'artifact-status', artifactId: card.id, ...(url ? { previewUrl: url } : {}) });\n } catch {\n send({ type: 'artifact-status', artifactId: card.id });\n }\n };\n for (const card of cards) {\n if (card.released) continue;\n const task = followed.current.get(card.id);\n if (card.status === 'pending' && task !== 'poll') {\n followed.current.set(card.id, 'poll');\n const getArtifact = services.getArtifact;\n if (!getArtifact) {\n send({ type: 'artifact-status', artifactId: card.id, release: true });\n continue;\n }\n void (async () => {\n try {\n const { artifact, timedOut } = await waitForArtifact(() => getArtifact(card.id), { timeoutMs: FOLLOW_TIMEOUT_MS });\n if (!artifact || timedOut) {\n send({ type: 'artifact-status', artifactId: card.id, release: true });\n return;\n }\n const url =\n artifact.status === 'ready' && services.hyperlinks && services.artifactPreviewUrl\n ? await services.artifactPreviewUrl(card.id, card.kind).catch(() => undefined)\n : undefined;\n send({\n type: 'artifact-status',\n artifactId: card.id,\n status: artifact.status,\n title: artifact.title,\n ...(!card.versionId && artifact.currentVersion?.id ? { versionId: artifact.currentVersion.id, versionNumber: artifact.currentVersion.number } : {}),\n ...(url ? { previewUrl: url } : {}),\n ...(artifact.error ? { failure: artifact.error } : {}),\n });\n } catch {\n send({ type: 'artifact-status', artifactId: card.id, release: true });\n }\n })();\n } else if (card.status === 'ready' && card.linkPending && !task) {\n followed.current.set(card.id, 'link');\n void mintLink(card);\n }\n }\n // `key` summarizes the cards; the list itself is recomputed every render.\n }, [key, dispatch, services]);\n}\n", "/**\n * Chat auto-save: a ready artifact (page, document, deck, image) and a CV\n * export are written to `./tabbio-artifacts` (or `TABBIO_ARTIFACTS_DIR`) as\n * soon as they exist, and the transcript says where, with the first lines\n * of a text file. `chat --no-save` / `TABBIO_NO_ARTIFACT_SAVE=1` turn it off.\n */\nimport { type Dispatch, useEffect, useMemo } from 'react';\nimport { type SavedFile, isTextFile, readSavedPreview } from '../../../core/artifact-save';\nimport type { ChatAction, ChatState, SavedFiles } from '../../../core/chat';\nimport { type SaveTarget, saveTargets } from '../../../core/chat-save-targets';\nimport { toCliError } from '../../../core/errors';\nimport type { UiServices } from '../../services';\n\n/** Lines of a saved text file shown inline. */\nexport const PREVIEW_LINES = 12;\n\nasync function previewOf(services: UiServices, files: SavedFile[]): Promise<SavedFiles['preview']> {\n const text = files.find((file) => isTextFile(file.path));\n if (!text) return undefined;\n try {\n const read = services.readSavedPreview ?? readSavedPreview;\n const { lines, total } = await read(text.path, PREVIEW_LINES);\n return { path: text.path, lines, total };\n } catch {\n return undefined;\n }\n}\n\nasync function save(services: UiServices, target: SaveTarget, signal: AbortSignal): Promise<SavedFiles> {\n if (target.type === 'artifact') {\n const base = { artifactId: target.artifactId, title: target.title, kind: target.kind };\n try {\n if (!services.saveArtifact) return { ...base, files: [] };\n const files = await services.saveArtifact(target.artifactId, { versionId: target.versionId, signal });\n if (signal.aborted) return { ...base, files: [] };\n const preview = await previewOf(services, files);\n return { ...base, files, ...(preview ? { preview } : {}) };\n } catch (error) {\n return { ...base, files: [], error: toCliError(error).message };\n }\n }\n const base = { cvId: target.cvId, title: target.title, kind: 'cv' };\n try {\n if (!services.saveCvExport) return { ...base, files: [] };\n const file = await services.saveCvExport(target.cvId, { format: target.format, signal });\n if (signal.aborted) return { ...base, files: [] };\n return { ...base, files: [file] };\n } catch (error) {\n return { ...base, files: [], error: toCliError(error).message };\n }\n}\n\nexport function useAutoSave(state: ChatState, dispatch: Dispatch<ChatAction>, services: UiServices, enabled: boolean): void {\n const started = useMemo(() => new Set<string>(), [services]);\n const controller = useMemo(() => new AbortController(), [services]);\n useEffect(() => () => controller.abort(), [controller]);\n\n const targets = enabled && (services.saveArtifact || services.saveCvExport) ? saveTargets(state) : [];\n const fresh = targets.filter((target) => !started.has(target.key));\n const key = fresh.map((target) => target.key).join('|');\n\n useEffect(() => {\n for (const target of fresh) {\n if (started.has(target.key)) continue;\n started.add(target.key);\n void save(services, target, controller.signal).then((saved) => {\n if (controller.signal.aborted || (!saved.files.length && !saved.error)) return;\n dispatch({ type: 'files-saved', ...(target.toolCallId ? { toolCallId: target.toolCallId } : {}), saved });\n });\n }\n // `key` lists the targets not started yet; the list itself is rebuilt every render.\n }, [key, dispatch, services, started, controller]);\n}\n", "import type { AgentMode } from '@tabbio/types';\nimport { Box, type Key, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react';\nimport type { CatalogTool } from '../../../core/catalog';\nimport { toCliError } from '../../../core/errors';\nimport { relativeTime } from '../../../core/io';\nimport { editorReducer, emptyEditor } from '../../components/editor-model';\nimport { KeyHints } from '../../components/KeyHints';\nimport { KeyValue } from '../../components/KeyValue';\nimport { Working } from '../../components/Spinner';\nimport { type AccountChange, type StatusRow, type UiServices, accountIdentity } from '../../services';\nimport { theme } from '../../theme';\nimport { Approvals } from '../Approvals';\nimport { Chat } from '../chat/Chat';\nimport { LoginPanel, type LoginOutcome } from '../login/LoginPanel';\nimport { type LoginStart, parseLoginArgs } from '../login/login-model';\nimport { paletteView, resolveSubmit } from '../palette-model';\nimport { ToolBrowser } from '../ToolBrowser';\nimport { useSkills } from '../useSkills';\nimport { HOME_COMMAND_NAMES, HOME_HELP_ROWS, type HomeData, emptyHomeData, homeCommands, homeGate } from './home-model';\nimport { HomeView } from './HomeView';\n\ntype Route =\n | { name: 'home' }\n | { name: 'chat'; initialMessage?: string; threadId?: string }\n | { name: 'tools'; since: number; tools?: CatalogTool[]; error?: string }\n | { name: 'approvals' }\n | { name: 'status'; since: number; rows?: StatusRow[]; error?: string }\n | { name: 'help' };\n\nexport type HomeProps = {\n services: UiServices;\n width: number;\n height: number;\n mode?: AgentMode;\n companyId?: string;\n /** Skip the network calls (tests, smoke renders). */\n initialData?: HomeData;\n /** Shown on the first frame (e.g. \"Signed out\" after /logout in a chat). */\n initialNotice?: string;\n /** Chats started here save generated files (default on). */\n saveArtifacts?: boolean;\n onExit(): void;\n};\n\nconst DOUBLE_PRESS_MS = 2000;\nconst NOTICE_MS = 6000;\n\n/** Back/quit keys for the simple sub-views (status, help, loading, errors). */\nfunction BackKeys({ onBack }: { onBack(): void }) {\n useInput((input, key) => {\n if (key.escape || input === 'q' || key.return) onBack();\n });\n return null;\n}\n\n/** \"\u2713 Signed in as ...\" plus any warnings, one per line. */\nexport function accountNotice(change: Pick<AccountChange, 'message' | 'warnings'>): string {\n return [theme.success(`${theme.symbols.success} ${change.message}`), ...(change.warnings ?? []).map((w) => theme.attention(`${theme.symbols.attention} ${w}`))].join('\\n');\n}\n\nexport function Home(props: HomeProps) {\n const { width, height, onExit, mode = 'seeker', saveArtifacts = true } = props;\n const [services, setServices] = useState(props.services);\n const [route, setRoute] = useState<Route>({ name: 'home' });\n const [data, setData] = useState<HomeData>(props.initialData ?? emptyHomeData);\n const [editor, dispatchEditor] = useReducer(editorReducer, emptyEditor);\n const [paletteIndex, setPaletteIndex] = useState(0);\n const [navigated, setNavigated] = useState(false);\n const [focus, setFocus] = useState<'composer' | 'recent'>('composer');\n const [notice, setNotice] = useState<string | null>(props.initialNotice ?? null);\n const [login, setLogin] = useState<LoginStart | null>(null);\n const lastCtrlC = useRef(0);\n const mounted = useRef(true);\n useEffect(\n () => () => {\n mounted.current = false;\n },\n [],\n );\n const { signedIn, hasSession } = services.account;\n const access = useMemo(() => ({ signedIn, hasSession }), [signedIn, hasSession]);\n\n const loadData = useCallback(async () => {\n if ((props.initialData && services === props.services) || !services.account.hasSession) return;\n const [plan, approvals, threads] = await Promise.allSettled([\n services.loadPlan(),\n services.loadPendingApprovals(),\n services.listThreads({ mode, companyId: props.companyId }),\n ]);\n if (!mounted.current) return;\n setData({\n plan: plan.status === 'fulfilled' ? plan.value : null,\n pendingApprovals: approvals.status === 'fulfilled' ? approvals.value.length : null,\n recent:\n threads.status === 'fulfilled'\n ? threads.value.slice(0, 5).map((t) => ({\n id: t.id,\n title: t.title?.trim() || 'Untitled chat',\n when: relativeTime(new Date(t.lastMessageAt ?? t.updatedAt)),\n }))\n : null,\n error: threads.status === 'rejected' ? toCliError(threads.reason).message : undefined,\n });\n }, [props.initialData, props.services, props.companyId, services, mode]);\n\n useEffect(() => {\n if (route.name === 'home') void loadData();\n }, [route.name, loadData]);\n\n useEffect(() => {\n if (!notice) return undefined;\n const timer = setTimeout(() => setNotice(null), NOTICE_MS);\n return () => clearTimeout(timer);\n }, [notice]);\n\n useEffect(() => setNavigated(false), [editor.value]);\n\n const commands = useMemo(() => homeCommands(data, services.cachedToolCount, access), [data, services.cachedToolCount, access]);\n const skills = useSkills(services, hasSession && editor.value.startsWith('/'));\n const view = paletteView(commands, hasSession ? skills : { status: 'idle', skills: [] }, editor.value, { ellipsis: theme.symbols.ellipsis, separator: theme.symbols.middot });\n const matches = view.items;\n const selected = Math.min(paletteIndex, Math.max(0, matches.length - 1));\n const goHome = useCallback(() => setRoute({ name: 'home' }), []);\n const warn = useCallback((text: string) => setNotice(theme.attention(`${theme.symbols.attention} ${text}`)), []);\n\n /** A finished /login or /logout: new services, fresh home data. */\n const applyAccount = useCallback((change: AccountChange, opts: { stay?: boolean } = {}) => {\n const switched = accountIdentity(services) !== accountIdentity(change.services);\n setServices(change.services);\n setData(emptyHomeData);\n if (opts.stay && switched) setRoute({ name: 'chat' });\n if (!opts.stay) {\n setRoute({ name: 'home' });\n setNotice(accountNotice(change));\n }\n }, [services]);\n\n const onLoginDone = useCallback(\n (outcome: LoginOutcome) => {\n setLogin(null);\n if (outcome.status === 'done') applyAccount(outcome.change);\n else if (outcome.status === 'cancelled') setNotice(theme.dim('Sign-in cancelled'));\n else setNotice([theme.error(`${theme.symbols.error} ${outcome.message}`), ...(outcome.hint ? [theme.dim(` ${outcome.hint}`)] : [])].join('\\n'));\n },\n [applyAccount],\n );\n\n const open = useCallback(\n (name: string, arg = '') => {\n const gate = homeGate(name, access);\n if (gate) {\n warn(gate);\n return;\n }\n switch (name) {\n case 'chat':\n setRoute({ name: 'chat' });\n return;\n case 'tools': {\n const since = Date.now();\n setRoute({ name: 'tools', since });\n services\n .listTools()\n .then((tools) => mounted.current && setRoute((r) => (r.name === 'tools' ? { ...r, tools } : r)))\n .catch((error: unknown) => mounted.current && setRoute((r) => (r.name === 'tools' ? { ...r, error: toCliError(error).message } : r)));\n return;\n }\n case 'approvals':\n setRoute({ name: 'approvals' });\n return;\n case 'status': {\n setRoute({ name: 'status', since: Date.now() });\n services\n .loadStatus()\n .then((rows) => mounted.current && setRoute((r) => (r.name === 'status' ? { ...r, rows } : r)))\n .catch((error: unknown) => mounted.current && setRoute((r) => (r.name === 'status' ? { ...r, error: toCliError(error).message } : r)));\n return;\n }\n case 'login': {\n const start = parseLoginArgs(arg);\n if ('error' in start) setNotice(theme.error(`${theme.symbols.error} ${start.error}`));\n else {\n setNotice(null);\n setLogin(start);\n }\n return;\n }\n case 'logout': {\n const session = services.session;\n if (!session) {\n warn('Signing out is not available here. Run `tabbio logout`.');\n return;\n }\n setNotice(theme.dim(`Signing out${theme.symbols.ellipsis}`));\n session.logout().then(\n (change) => mounted.current && applyAccount(change),\n (error: unknown) => mounted.current && setNotice(theme.error(`${theme.symbols.error} ${toCliError(error).message}`)),\n );\n return;\n }\n case 'help':\n setRoute({ name: 'help' });\n return;\n case 'exit':\n case 'quit':\n onExit();\n return;\n default:\n setNotice(theme.error(`${theme.symbols.error} Unknown command /${name}`));\n }\n },\n [access, services, onExit, warn, applyAccount],\n );\n\n const submit = useCallback(\n (value: string) => {\n const res = resolveSubmit(value, { commands, skills, highlighted: matches[selected], navigated, aliases: HOME_COMMAND_NAMES });\n if (res.kind === 'empty' || res.kind === 'bare') return;\n if (res.kind === 'loading') {\n warn(`Skills are still loading. Press enter again in a moment.`);\n return;\n }\n dispatchEditor({ type: 'remember', value: value.trim() });\n dispatchEditor({ type: 'clear' });\n setPaletteIndex(0);\n if (res.kind === 'unknown') {\n setNotice([theme.error(`${theme.symbols.error} Unknown command /${res.name}`), theme.dim(' Type / to see the commands.')].join('\\n'));\n return;\n }\n if (res.kind === 'command') {\n open(res.name, res.arg);\n return;\n }\n const gate = homeGate(res.kind, access);\n if (gate) warn(gate);\n else setRoute({ name: 'chat', initialMessage: res.kind === 'skill' ? res.message : res.text });\n },\n [commands, skills, matches, selected, navigated, open, access, warn],\n );\n\n const onComposerKey = useCallback(\n (input: string, key: Key): boolean => {\n if (key.ctrl && input === 'c') return true;\n if (matches.length > 0 && (key.upArrow || key.downArrow)) {\n setPaletteIndex((i) => (key.upArrow ? Math.max(0, i - 1) : Math.min(matches.length - 1, i + 1)));\n setNavigated(true);\n return true;\n }\n if (key.tab) {\n const choice = matches[selected];\n if (choice) dispatchEditor({ type: 'set', value: `/${choice.name}${choice.usage || choice.skillId ? ' ' : ''}` });\n else if (data.recent?.length && hasSession) setFocus('recent');\n return true;\n }\n if (key.escape) {\n dispatchEditor({ type: 'clear' });\n return true;\n }\n return false;\n },\n [matches, selected, data.recent, hasSession],\n );\n\n // Ctrl+C: everywhere except chat (which owns it), press twice to quit.\n useInput(\n (input, key) => {\n if (!(key.ctrl && input === 'c')) return;\n const now = Date.now();\n if (now - lastCtrlC.current < DOUBLE_PRESS_MS) {\n onExit();\n return;\n }\n lastCtrlC.current = now;\n if (editor.value) dispatchEditor({ type: 'clear' });\n setNotice(theme.attention('Press ctrl+c again to quit.'));\n },\n { isActive: route.name !== 'chat' },\n );\n\n switch (route.name) {\n case 'chat':\n return (\n <Chat\n key={accountIdentity(services)}\n services={services}\n mode={mode}\n companyId={props.companyId}\n threadId={route.threadId}\n initialMessage={route.initialMessage}\n saveArtifacts={saveArtifacts}\n width={width}\n height={height}\n hostedByHome\n onAccountChange={(change) => applyAccount(change, { stay: !change.signedOut })}\n onExit={(reason) => (reason === 'home' ? goHome() : onExit())}\n />\n );\n case 'tools':\n if (route.tools) return <ToolBrowser tools={route.tools} services={services} width={width} height={height} onExit={goHome} />;\n return (\n <Box flexDirection=\"column\" width={width}>\n {route.error ? <Text>{theme.error(`${theme.symbols.error} ${route.error}`)}</Text> : <Working label=\"Loading tools\u2026\" since={route.since} />}\n <KeyHints width={width} hints={[{ key: 'esc', label: 'back' }]} />\n <BackKeys onBack={goHome} />\n </Box>\n );\n case 'approvals':\n return <Approvals services={services} width={width} height={height} onExit={goHome} />;\n case 'status':\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{theme.bold('Status')}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n {route.rows ? (\n <KeyValue rows={route.rows} width={width} />\n ) : route.error ? (\n <Text>{theme.error(`${theme.symbols.error} ${route.error}`)}</Text>\n ) : (\n <Working label=\"Checking\u2026\" since={route.since} />\n )}\n </Box>\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'q', label: 'back' }]} />\n </Box>\n <BackKeys onBack={goHome} />\n </Box>\n );\n case 'help':\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{theme.bold('Keys and commands')}</Text>\n <Box marginTop={1}>\n <KeyValue rows={HOME_HELP_ROWS.map(([label, value]) => ({ label, value }))} width={width} />\n </Box>\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'q', label: 'back' }]} />\n </Box>\n <BackKeys onBack={goHome} />\n </Box>\n );\n default:\n return (\n <HomeView\n services={services}\n data={data}\n commands={commands}\n matches={matches}\n paletteOpen={view.open}\n paletteFooter={view.footer}\n paletteIndex={selected}\n editor={editor}\n dispatchEditor={dispatchEditor}\n onSubmit={submit}\n onComposerKey={onComposerKey}\n focus={focus}\n onRecentSelect={(id) => {\n setFocus('composer');\n setRoute({ name: 'chat', threadId: id });\n }}\n onRecentCancel={() => setFocus('composer')}\n modal={login ? <LoginPanel services={services} start={login} width={width} onDone={onLoginDone} /> : null}\n notice={notice}\n width={width}\n height={height}\n />\n );\n }\n}\n", "/**\n * The real `services.session`: `/login` and `/logout` inside the app, built\n * on the same flows and credential store as `tabbio login` / `tabbio logout`\n * (core/auth + the save steps exported by commands/login). Every success\n * returns fresh services on a fresh command context, so the account line,\n * the plan, the catalog and the chat all follow the new credentials.\n */\nimport open from 'open';\nimport { describeUser, saveAppSession, saveTokenSession } from '../commands/login';\nimport { hasDisplay, loginWithBrowser, loginWithEmailOtp, logoutProfile } from '../core/auth';\nimport { type CommandContext, createCommandContext } from '../core/context';\nimport { loadStoredCredentials } from '../core/credentials';\nimport { ApiClient, type TokenPayload } from '../core/http';\nimport { debug, deviceLabel } from '../core/runtime';\nimport type { AccountChange, SessionControls, UiServices, UiServicesOptions } from './services';\nimport { theme } from './theme';\n\nconst CATALOG_RELOAD_MS = 8_000;\n\nexport type SessionControlDeps = {\n ctx: CommandContext;\n build(ctx: CommandContext, opts?: UiServicesOptions): UiServices;\n /** Tests: fetch for the auth endpoints and MCP. */\n fetch?: typeof fetch;\n openUrl?(url: string): Promise<boolean>;\n /** A context for the new account state (default: from the global flags). */\n newContext?(): CommandContext;\n /** Loads the catalog for the new account; resolves the visible tool count. */\n reloadCatalog?(ctx: CommandContext): Promise<number | null>;\n};\n\n/** Contexts created by sign-in changes; `closeUiContexts()` closes their MCP sessions. */\nconst created = new Set<CommandContext>();\n\nexport async function closeUiContexts(): Promise<void> {\n const all = [...created];\n created.clear();\n await Promise.all(all.map((ctx) => ctx.close().catch(() => undefined)));\n}\n\n/** Opens a URL in the browser (never over SSH); false when none could be launched. */\nexport async function openInBrowser(url: string): Promise<boolean> {\n if (!hasDisplay()) return false;\n try {\n await open(url);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function defaultReload(ctx: CommandContext): Promise<number | null> {\n const load = (async () => (await (await ctx.mcp()).listTools({ refresh: true })).filter((t) => !t.hidden).length)();\n const timeout = new Promise<null>((resolve) => setTimeout(() => resolve(null), CATALOG_RELOAD_MS).unref());\n return Promise.race([load, timeout]).catch((error: Error) => {\n debug(`catalog reload after sign-in failed: ${error.message}`);\n return null;\n });\n}\n\nfunction envNote(): string | undefined {\n return process.env.TABBIO_TOKEN || process.env.TABBIO_ACCESS_TOKEN ? 'TABBIO_TOKEN / TABBIO_ACCESS_TOKEN is set and still wins for tool calls.' : undefined;\n}\n\nexport function createSessionControls(deps: SessionControlDeps): SessionControls {\n const { ctx } = deps;\n const authClient = () => new ApiClient(ctx.profile, null, { persist: false, fetch: deps.fetch });\n const nextContext = () => {\n const next = deps.newContext ? deps.newContext() : createCommandContext();\n created.add(next);\n return next;\n };\n\n const adopt = async (toolCount?: number | null): Promise<UiServices> => {\n await ctx.close().catch(() => undefined);\n const next = nextContext();\n const count = toolCount !== undefined ? toolCount : await (deps.reloadCatalog ?? defaultReload)(next);\n return deps.build(next, count === null ? {} : { toolCount: count });\n };\n\n const signedIn = async (payload: TokenPayload): Promise<AccountChange> => {\n const creds = await saveAppSession(ctx, payload, { fetch: deps.fetch });\n const note = envNote();\n return {\n services: await adopt(),\n message: `Signed in as ${describeUser(creds.user)}`,\n ...(note ? { warnings: [note] } : {}),\n signedOut: false,\n };\n };\n\n return {\n async loginWithBrowser({ signal, onWaiting }) {\n const payload = await loginWithBrowser(authClient(), {\n device: deviceLabel(),\n signal,\n openUrl: deps.openUrl ?? openInBrowser,\n onWaiting: (url, opened) => onWaiting(url, opened),\n });\n return signedIn(payload);\n },\n async loginWithEmail({ email, promptCode, onInvalidCode }) {\n const payload = await loginWithEmailOtp(authClient(), { email, promptCode, onInvalidCode });\n return signedIn(payload);\n },\n async loginWithToken(token) {\n const { visibleTools } = await saveTokenSession(ctx, token, { fetch: deps.fetch });\n const note = envNote();\n return {\n services: await adopt(visibleTools),\n message: `Token accepted ${theme.symbols.middot} ${visibleTools} tools. Chat and approvals need /login with the browser or an email code.`,\n ...(note ? { warnings: [note] } : {}),\n signedOut: false,\n };\n },\n async logout() {\n const stored = loadStoredCredentials(ctx.profile.name);\n const result = stored ? await logoutProfile(ctx.profile, stored, { fetch: deps.fetch }) : { warnings: [], revokedSession: false };\n const note = envNote();\n const warnings = [...result.warnings, ...(note ? [note] : [])];\n return {\n services: await adopt(null),\n message: stored ? `Signed out of profile ${ctx.profile.name}` : `Not signed in (profile ${ctx.profile.name})`,\n ...(warnings.length ? { warnings } : {}),\n signedOut: true,\n };\n },\n };\n}\n", "/**\n * Everything the screens need from the outside world, behind one seam so\n * tests and `scripts/ui-smoke.mjs` can render every screen with fakes.\n * `createUiServices(ctx)` is the real implementation.\n */\nimport type { AgentModelsResponse, AgentThreadSummary, SubscriptionStateResult } from '@tabbio/types';\nimport { type SavedFile, readSavedPreview, saveArtifactToDisk, saveCvExportToDisk } from '../core/artifact-save';\nimport { type ArtifactSummary, getArtifact, previewUrl } from '../core/artifacts';\nimport { type McpPendingApproval, getMcpAccessState } from '../core/auth';\nimport {\n type CapabilityAvailability,\n type ChatCapabilities,\n loadCapabilityPrefs,\n saveCapabilityPrefs,\n} from '../core/capabilities';\nimport { previewVariantFor } from '../core/chat-artifacts';\nimport type { CatalogTool } from '../core/catalog';\nimport {\n type AgentStreamEvent,\n type ApprovalDecisionResult,\n type ChatRequest,\n type ChatScope,\n type ThreadMessages,\n confirmApproval,\n getThreadMessages,\n listModels,\n listThreads,\n rejectApproval,\n streamChat,\n} from '../core/chat';\nimport type { CommandContext } from '../core/context';\nimport { type CallToolOptions, type ToolCallResult, readCachedCatalog } from '../core/mcp';\nimport { CLI_VERSION } from '../core/version';\nimport { supportsHyperlinks } from './hyperlink';\nimport { type PaletteSkill, parseSkillsResult } from './screens/palette-model';\nimport { createSessionControls, openInBrowser } from './session-controls';\n\nexport type UiAccount = {\n name?: string | null;\n email?: string | null;\n signedIn: boolean;\n /** An app session (JWT): chat, approvals and plan need it. */\n hasSession: boolean;\n /** Filled into workflow `userId` inputs, like `tabbio run`. */\n userId?: string;\n};\n\n/** Changes only when the account or credential kind behind a chat changes. */\nexport function accountIdentity(services: Pick<UiServices, 'profileName' | 'account'>): string {\n const account = services.account;\n return `${services.profileName}:${account.signedIn ? account.hasSession ? 'app' : 'token' : 'signed-out'}:${account.userId ?? account.email ?? account.name ?? ''}`;\n}\n\nexport type TimedToolResult = ToolCallResult & { durationMs: number; requestId?: string };\n\nexport type StatusRow = { label: string; value: string };\n\n/** A finished `/login` or `/logout`: the services for the new account state. */\nexport type AccountChange = {\n services: UiServices;\n /** \"Signed in as Sara Ahmed <sara@acme.ae>\", \"Signed out\". */\n message: string;\n warnings?: string[];\n signedOut: boolean;\n};\n\n/** Sign-in and sign-out from inside the app (core/auth flows, the same credential store as `tabbio login`). */\nexport type SessionControls = {\n /** Browser hand-off: opens the connect page, waits on the loopback; abort cancels. */\n loginWithBrowser(opts: { signal: AbortSignal; onWaiting(url: string, opened: boolean): void }): Promise<AccountChange>;\n /** Sends the code, then asks `promptCode` (up to 3 attempts). */\n loginWithEmail(opts: { email: string; promptCode(attempt: number): Promise<string>; onInvalidCode(attemptsLeft: number): void }): Promise<AccountChange>;\n /** Checks a personal token with MCP `tools/list`, then stores it. */\n loginWithToken(token: string): Promise<AccountChange>;\n /** Revokes the refresh token and deletes the profile's credentials. */\n logout(): Promise<AccountChange>;\n};\n\nexport type UiServices = {\n version: string;\n profileName: string;\n apiHost: string;\n account: UiAccount;\n /** Tool count from the on-disk catalog cache (no network), if any. */\n cachedToolCount: number | null;\n loadPlan(): Promise<string | null>;\n loadPendingApprovals(): Promise<McpPendingApproval[]>;\n listThreads(scope: ChatScope): Promise<AgentThreadSummary[]>;\n listModels(scope: ChatScope): Promise<AgentModelsResponse>;\n getThreadMessages(threadId: string, scope: ChatScope): Promise<ThreadMessages>;\n streamChat(request: ChatRequest, signal: AbortSignal): AsyncIterable<AgentStreamEvent>;\n decideApproval(approvalId: string, decision: 'approve' | 'reject', scope?: Partial<ChatScope>): Promise<ApprovalDecisionResult>;\n listTools(opts?: { refresh?: boolean }): Promise<CatalogTool[]>;\n callTool(toolId: string, input: Record<string, unknown>, opts?: CallToolOptions): Promise<TimedToolResult>;\n loadStatus(): Promise<StatusRow[]>;\n // PR #512 (optional so older fakes and scripts keep working).\n /** The profile's saved Research / Image / Result choice. */\n capabilityPrefs?: ChatCapabilities;\n saveCapabilityPrefs?(capabilities: ChatCapabilities): void;\n /** `GET /api/agent/capabilities`: what this account may use. */\n loadCapabilities?(): Promise<CapabilityAvailability>;\n /** `GET /api/artifacts/:id` (status polling for chat cards). */\n getArtifact?(artifactId: string): Promise<ArtifactSummary>;\n /** A 15-minute preview URL for an OSC 8 link on a ready card. */\n artifactPreviewUrl?(artifactId: string, kind: string): Promise<string>;\n /** The terminal shows OSC 8 hyperlinks. */\n hyperlinks?: boolean;\n /** The profile's web app URL (public job pages on result cards). */\n appUrl?: string;\n // CLI end-to-end hardening (optional so fakes and scripts keep working).\n /** `/login` and `/logout` inside the app. */\n session?: SessionControls;\n /** The server's skills (`skills.list`), fetched once per services instance. */\n loadSkills?(): Promise<PaletteSkill[]>;\n /** Opens a URL in the browser; false when none could be launched. */\n openUrl?(url: string): Promise<boolean>;\n /** Saves a ready artifact into the artifacts dir (or `dir`); remembered for `savedFiles`. */\n saveArtifact?(artifactId: string, opts?: { dir?: string; versionId?: string; signal?: AbortSignal }): Promise<SavedFile[]>;\n /** Files already saved for an artifact in this session. */\n savedFiles?(artifactId: string): SavedFile[] | undefined;\n /** Saves a CV export (pdf, docx, txt, md) into the artifacts dir; a null id is the main CV. */\n saveCvExport?(cvId: string | null, opts?: { format?: string; dir?: string; signal?: AbortSignal }): Promise<SavedFile>;\n /** The first lines of a saved text file. */\n readSavedPreview?(path: string, maxLines?: number): Promise<{ lines: string[]; total: number }>;\n};\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return url;\n }\n}\n\nexport type UiServicesOptions = {\n /** Tool count after a fresh catalog load (the cache may not be written yet). */\n toolCount?: number | null;\n};\n\nexport function createUiServices(ctx: CommandContext, opts: UiServicesOptions = {}): UiServices {\n const creds = ctx.api.credentials ?? ctx.credentials;\n const cached = readCachedCatalog(ctx.profile, creds);\n const saved = new Map<string, SavedFile[]>();\n let skills: Promise<PaletteSkill[]> | null = null;\n return {\n version: CLI_VERSION,\n profileName: ctx.profile.name,\n apiHost: hostOf(ctx.profile.apiUrl),\n account: {\n name: creds?.user?.name ?? null,\n email: creds?.user?.email ?? null,\n signedIn: Boolean(creds?.accessToken || creds?.mcpToken),\n hasSession: Boolean(creds?.accessToken),\n userId: creds?.user?.id,\n },\n cachedToolCount: opts.toolCount ?? (cached ? cached.tools.filter((t) => !t.hidden).length : null),\n async loadPlan() {\n if (!creds?.accessToken) return null;\n const state = await ctx.api.json<SubscriptionStateResult>('/api/subscription/state');\n return state?.snapshot?.tier ?? null;\n },\n async loadPendingApprovals() {\n const state = await getMcpAccessState(ctx.api);\n return state?.pendingApprovals ?? [];\n },\n listThreads: (scope) => listThreads(ctx, scope),\n listModels: (scope) => listModels(ctx, scope),\n getThreadMessages: (threadId, scope) => getThreadMessages(ctx, threadId, scope),\n streamChat: (request, signal) => streamChat(ctx, request, { signal }),\n decideApproval: (approvalId, decision, scope) =>\n decision === 'approve' ? confirmApproval(ctx, approvalId, scope) : rejectApproval(ctx, approvalId, scope),\n async listTools(opts) {\n const session = await ctx.mcp();\n return session.listTools(opts);\n },\n async callTool(toolId, input, opts) {\n const session = await ctx.mcp();\n const started = Date.now();\n const result = await session.callTool(toolId, input, opts);\n return { ...result, durationMs: Date.now() - started };\n },\n capabilityPrefs: loadCapabilityPrefs(ctx.profile.name),\n saveCapabilityPrefs: (capabilities) => saveCapabilityPrefs(ctx.profile.name, capabilities),\n loadCapabilities: () => ctx.api.json<CapabilityAvailability>('/api/agent/capabilities'),\n getArtifact: (artifactId) => getArtifact(ctx.api, artifactId),\n async artifactPreviewUrl(artifactId, kind) {\n return (await previewUrl(ctx.api, artifactId, { variant: previewVariantFor(kind) })).url;\n },\n hyperlinks: supportsHyperlinks(),\n appUrl: ctx.profile.appUrl,\n session: createSessionControls({ ctx, build: createUiServices }),\n loadSkills() {\n skills ??= (async () => {\n const session = await ctx.mcp();\n const result = await session.callTool('skills.list', { limit: 50 });\n if (!result.ok) throw result.error;\n return parseSkillsResult(result.result);\n })().catch((error: unknown) => {\n skills = null; // a later palette open may retry\n throw error;\n });\n return skills;\n },\n openUrl: (url) => openInBrowser(url),\n async saveArtifact(artifactId, saveOpts) {\n const files = await saveArtifactToDisk(ctx, artifactId, saveOpts ?? {});\n if (files.length) saved.set(artifactId, files);\n return files;\n },\n savedFiles: (artifactId) => saved.get(artifactId),\n saveCvExport: (cvId, exportOpts) => saveCvExportToDisk(ctx, cvId, exportOpts ?? {}),\n readSavedPreview: (path, maxLines) => readSavedPreview(path, maxLines),\n async loadStatus() {\n const { collectStatus } = await import('../commands/status');\n const report = await collectStatus(ctx);\n const who = report.user ? (report.user.name ? `${report.user.name} <${report.user.email}>` : report.user.email) : 'not signed in';\n const rows: Array<[string, string | null | undefined]> = [\n ['Profile', `${report.profile.name} (${report.profile.source})`],\n ['API', report.profile.apiUrl],\n ['Account', who],\n ['Plan', report.plan],\n ['Session', report.session ? `${report.session.token}${report.session.refreshable ? ' \u00B7 auto-refresh' : ''}` : null],\n ['Tools via', report.mcp?.label],\n ['Approvals', report.pendingApprovals === null ? null : `${report.pendingApprovals} pending`],\n ['Catalog', report.catalog ? `${report.catalog.tools} tools${report.catalog.fresh ? '' : ' (stale)'}` : null],\n ...report.problems.map((p): [string, string] => ['Problem', p]),\n ];\n return rows.filter((r): r is [string, string] => Boolean(r[1])).map(([label, value]) => ({ label, value }));\n },\n };\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { McpPendingApproval } from '../../core/auth';\nimport { type ApprovalChoice, isDestructiveTool } from '../../core/chat-model';\nimport { toCliError } from '../../core/errors';\nimport { relativeTime } from '../../core/io';\nimport { ApprovalCard } from '../components/ApprovalCard';\nimport { approvalOutcomeText } from '../components/approval-model';\nimport { KeyHints } from '../components/KeyHints';\nimport { SelectList } from '../components/SelectList';\nimport { Working } from '../components/Spinner';\nimport type { UiServices } from '../services';\nimport { theme } from '../theme';\nimport { sentenceCase, shortId, summarizeArgs } from '../text';\nimport { ResultPanel } from './ResultPanel';\n\ntype Phase =\n | { name: 'loading'; since: number }\n | { name: 'list'; items: McpPendingApproval[] }\n | { name: 'card'; items: McpPendingApproval[]; item: McpPendingApproval; shownAt: number; busy: ApprovalChoice | null; error: string | null }\n | { name: 'done'; item: McpPendingApproval; decision: ApprovalChoice; result: unknown; durationMs: number }\n | { name: 'failed'; message: string; hint?: string };\n\nexport type ApprovalsProps = { services: UiServices; width: number; height: number; onExit(): void };\n\nfunction argsOf(item: McpPendingApproval): Record<string, unknown> {\n return typeof item.args === 'object' && item.args !== null && !Array.isArray(item.args) ? (item.args as Record<string, unknown>) : {};\n}\n\n/** Pending MCP approvals (`GET /api/integrations/mcp`) \u2192 card \u2192 confirm/reject. */\nexport function Approvals({ services, width, height, onExit }: ApprovalsProps) {\n const [phase, setPhase] = useState<Phase>({ name: 'loading', since: Date.now() });\n const mounted = useRef(true);\n useEffect(\n () => () => {\n mounted.current = false;\n },\n [],\n );\n\n const load = useCallback(async () => {\n if (!services.account.hasSession) {\n setPhase({ name: 'failed', message: 'Approvals need a full sign-in', hint: 'Run `tabbio login`; a personal MCP token cannot approve.' });\n return;\n }\n setPhase({ name: 'loading', since: Date.now() });\n try {\n const items = await services.loadPendingApprovals();\n if (mounted.current) setPhase({ name: 'list', items });\n } catch (error) {\n const cli = toCliError(error);\n if (mounted.current) setPhase({ name: 'failed', message: cli.message, hint: cli.hint });\n }\n }, [services]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const decide = useCallback(\n async (decision: ApprovalChoice) => {\n if (phase.name !== 'card') return;\n if (decision === 'leave') {\n setPhase({ name: 'list', items: phase.items });\n return;\n }\n setPhase({ ...phase, busy: decision, error: null });\n try {\n const data = await services.decideApproval(phase.item.id, decision);\n if (!mounted.current) return;\n setPhase({\n name: 'done',\n item: phase.item,\n decision,\n result: decision === 'approve' ? (data.mcp?.result ?? data.assistant?.text ?? null) : null,\n durationMs: Date.now() - phase.shownAt,\n });\n } catch (error) {\n if (mounted.current) setPhase({ ...phase, busy: null, error: toCliError(error).message });\n }\n },\n [phase, services],\n );\n\n useInput(\n (input, key) => {\n if (phase.name === 'done' && phase.decision !== 'approve' && (key.return || key.escape || input === 'q')) void load();\n else if (phase.name === 'failed' && (key.escape || input === 'q' || key.return)) onExit();\n else if (phase.name === 'loading' && (key.escape || input === 'q')) onExit();\n },\n { isActive: (phase.name === 'done' && phase.decision !== 'approve') || phase.name === 'failed' || phase.name === 'loading' },\n );\n\n const count = phase.name === 'list' || phase.name === 'card' ? phase.items.length : null;\n const header = (\n <Box marginBottom={1}>\n <Text>\n {theme.bold('Approvals')}\n {count !== null ? theme.dim(` ${theme.symbols.middot} ${count} waiting`) : ''}\n </Text>\n </Box>\n );\n\n switch (phase.name) {\n case 'loading':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Working label=\"Loading approvals\u2026\" since={phase.since} />\n </Box>\n );\n case 'failed':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Text>{theme.error(`${theme.symbols.error} ${phase.message}`)}</Text>\n {phase.hint ? <Text wrap=\"wrap\">{theme.dim(` ${theme.symbols.arrowRight} ${phase.hint}`)}</Text> : null}\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'q', label: 'back' }]} />\n </Box>\n </Box>\n );\n case 'list':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <SelectList\n items={phase.items.map((item) => ({\n id: item.id,\n label: `${theme.symbols.attention} ${sentenceCase(item.toolName)}`,\n description: summarizeArgs(argsOf(item), 40),\n meta: `${relativeTime(new Date(item.createdAt))} ${shortId(item.id)}`,\n }))}\n width={width}\n height={Math.max(3, height - 5)}\n isActive\n emptyText=\"No approvals waiting\"\n onSelect={(selected) => {\n const item = phase.items.find((i) => i.id === selected.id);\n if (item) setPhase({ name: 'card', items: phase.items, item, shownAt: Date.now(), busy: null, error: null });\n }}\n onCancel={onExit}\n />\n </Box>\n );\n case 'card':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <ApprovalCard\n approvalId={phase.item.id}\n title={sentenceCase(phase.item.toolName)}\n args={argsOf(phase.item)}\n destructive={isDestructiveTool(phase.item.toolName)}\n context={`Requested over MCP ${theme.symbols.middot} ${relativeTime(new Date(phase.item.createdAt))} ${theme.symbols.middot} profile ${services.profileName}`}\n busy={phase.busy}\n error={phase.error}\n isActive={!phase.busy}\n width={width}\n onDecision={(decision) => void decide(decision)}\n />\n </Box>\n );\n case 'done':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n {phase.decision === 'approve' ? (\n <ResultPanel\n title={sentenceCase(phase.item.toolName)}\n result={phase.result}\n durationMs={phase.durationMs}\n note={approvalOutcomeText('approve', sentenceCase(phase.item.toolName), phase.item.id, phase.durationMs)}\n width={width}\n height={Math.max(6, height - 2)}\n interactive\n onBack={() => void load()}\n />\n ) : (\n <Box flexDirection=\"column\">\n <Text>{approvalOutcomeText(phase.decision, sentenceCase(phase.item.toolName), phase.item.id, phase.durationMs)}</Text>\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'enter', label: 'back to approvals' }]} />\n </Box>\n </Box>\n )}\n </Box>\n );\n }\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { useMemo, useState } from 'react';\nimport type { CliError } from '../../core/errors';\nimport { KeyHints, type KeyHint } from '../components/KeyHints';\nimport { KeyValue } from '../components/KeyValue';\nimport { Markdown } from '../components/Markdown';\nimport { Panel } from '../components/Panel';\nimport { Table } from '../components/Table';\nimport { type ResultBody, bodyLength, describeResult } from '../result-model';\nimport { theme } from '../theme';\nimport { formatElapsed, safeJson, shortId } from '../text';\n\nexport type ResultPanelProps = {\n /** Tool label for the header (`cv list`). */\n title: string;\n result?: unknown;\n error?: CliError | null;\n durationMs: number;\n requestId?: string;\n /** One-row note above the body (e.g. an approval outcome). */\n note?: string;\n width: number;\n /** Rows available; only used when interactive (static output prints everything). */\n height: number;\n interactive: boolean;\n onBack?(): void;\n onRerun?(): void;\n onEdit?(): void;\n};\n\nfunction summaryLine(body: ResultBody): string {\n switch (body.kind) {\n case 'table':\n return [`${body.total} result${body.total === 1 ? '' : 's'}`, ...body.summary].join(` ${theme.symbols.middot} `);\n case 'kv':\n return `${body.rows.length} field${body.rows.length === 1 ? '' : 's'}`;\n case 'text':\n return 'Text result';\n default:\n return 'No output';\n }\n}\n\nfunction ErrorBody({ error }: { error: CliError }) {\n return (\n <Box flexDirection=\"column\">\n {error.hint ? <Text wrap=\"wrap\">{theme.dim(`${theme.symbols.arrowRight} ${error.hint}`)}</Text> : null}\n <Text>\n {theme.dim([error.requestId ? `request id ${error.requestId}` : null, `exit ${error.exitCode}`].filter(Boolean).join(` ${theme.symbols.middot} `))}\n </Text>\n </Box>\n );\n}\n\n/**\n * Tool result (research \u00A75.7): header box with glyph, tool, duration and\n * request id; body as table / key-value / text; `j` toggles raw JSON.\n * Non-interactive (hook `showResult`) prints the whole body once.\n */\nexport function ResultPanel(props: ResultPanelProps) {\n const { title, result, error, durationMs, requestId, note, width, height, interactive } = props;\n const body = useMemo(() => describeResult(result), [result]);\n const jsonLines = useMemo(() => safeJson(result ?? null).split('\\n'), [result]);\n const [view, setView] = useState<'human' | 'json'>('human');\n const [offset, setOffset] = useState(0);\n\n const total = view === 'json' ? jsonLines.length : bodyLength(body);\n const chrome = 3 + (note ? 1 : 0) + 3;\n const window = interactive ? Math.max(3, height - chrome - (body.kind === 'table' ? 1 : 0)) : total;\n const maxOffset = Math.max(0, total - window);\n const clamped = Math.min(offset, maxOffset);\n\n useInput(\n (input, key) => {\n if (key.escape || input === 'q') props.onBack?.();\n else if (input === 'j') {\n setView((v) => (v === 'json' ? 'human' : 'json'));\n setOffset(0);\n } else if (input === 'r') props.onRerun?.();\n else if (input === 'e') props.onEdit?.();\n else if (key.upArrow) setOffset((o) => Math.max(0, Math.min(o, maxOffset) - 1));\n else if (key.downArrow) setOffset((o) => Math.min(maxOffset, o + 1));\n else if (key.pageUp) setOffset((o) => Math.max(0, Math.min(o, maxOffset) - window));\n else if (key.pageDown) setOffset((o) => Math.min(maxOffset, o + window));\n else if (input === 'g') setOffset(0);\n else if (input === 'G') setOffset(maxOffset);\n },\n { isActive: interactive },\n );\n\n const ok = !error;\n const heading = `${ok ? theme.success(theme.symbols.success) : theme.error(theme.symbols.error)} ${theme.bold(title)}`;\n const right = [formatElapsed(durationMs), requestId ? `req ${shortId(requestId, 4, 3)}` : null].filter(Boolean).join(` ${theme.symbols.middot} `);\n const inner = Math.max(10, width - 4);\n const hints: KeyHint[] = [\n { key: 'j', label: view === 'json' ? 'table' : 'json' },\n ...(props.onRerun ? [{ key: 'r', label: 're-run' }] : []),\n ...(props.onEdit ? [{ key: 'e', label: 'edit input' }] : []),\n ...(total > window ? [{ key: theme.symbols.upDown, label: 'scroll' }] : []),\n { key: 'q', label: 'back' },\n ];\n\n return (\n <Box flexDirection=\"column\" width={width}>\n <Panel title={heading} right={right} width={width} tone={ok ? 'muted' : 'danger'}>\n <Text wrap=\"truncate-end\">{error ? theme.error(error.message) : theme.dim(summaryLine(body))}</Text>\n </Panel>\n {note ? <Text wrap=\"truncate-end\">{note}</Text> : null}\n <Box flexDirection=\"column\" paddingLeft={2} width={width}>\n {error ? (\n <ErrorBody error={error} />\n ) : view === 'json' ? (\n jsonLines.slice(clamped, clamped + window).map((line, i) => (\n <Text key={clamped + i} wrap=\"truncate-end\">\n {line}\n </Text>\n ))\n ) : body.kind === 'table' ? (\n <Table columns={body.columns} rows={body.rows} width={inner} offset={clamped} limit={window} />\n ) : body.kind === 'kv' ? (\n <KeyValue rows={body.rows.slice(clamped, clamped + window)} width={inner} />\n ) : body.kind === 'text' ? (\n interactive ? (\n body.text\n .split('\\n')\n .slice(clamped, clamped + window)\n .map((line, i) => (\n <Text key={clamped + i} wrap=\"truncate-end\">\n {line}\n </Text>\n ))\n ) : (\n <Markdown text={body.text} width={inner} />\n )\n ) : (\n <Text>{theme.dim('No output')}</Text>\n )}\n {interactive && total > window ? (\n <Text>{theme.dim(`${clamped + 1}\u2013${Math.min(total, clamped + window)} of ${total}`)}</Text>\n ) : null}\n </Box>\n {interactive ? (\n <Box marginTop={1}>\n <KeyHints width={width} hints={hints} />\n </Box>\n ) : null}\n </Box>\n );\n}\n", "import { Box, Text } from 'ink';\nimport type { ReactNode } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth, truncate } from '../text';\n\nexport type PanelTone = 'muted' | 'accent' | 'success' | 'danger' | 'attention';\n\nconst BORDER = {\n round: { tl: '\u256D', tr: '\u256E', h: '\u2500' },\n classic: { tl: '+', tr: '+', h: '-' },\n} as const;\n\nfunction toneColor(tone: PanelTone): string | undefined {\n if (tone === 'accent') return theme.accentInk;\n if (tone === 'success') return 'green';\n if (tone === 'danger') return 'red';\n if (tone === 'attention') return 'yellow';\n return undefined;\n}\n\nfunction paintBorder(tone: PanelTone, text: string): string {\n if (tone === 'accent') return theme.accent(text);\n if (tone === 'success') return theme.success(text);\n if (tone === 'danger') return theme.danger(text);\n if (tone === 'attention') return theme.attention(text);\n return theme.dim(text);\n}\n\n/**\n * The top border with an inline title and right-hand meta:\n * `\u256D\u2500 \u2713 jobs search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 0.84s \u00B7 req 7f3a\u2026c21 \u2500\u256E`. Pure, for tests.\n * `title` may carry ANSI styling; `right` is plain (painted dim).\n */\nexport function panelTopLine(width: number, title = '', right = '', tone: PanelTone = 'muted'): string {\n const chars = BORDER[theme.boxStyle];\n const inner = Math.max(0, width - 2);\n const titleText = title ? ` ${title} ` : '';\n let rightText = right ? ` ${right} ` : '';\n // The title wins: the right-hand meta goes first when both do not fit.\n if (2 + displayWidth(titleText) + displayWidth(rightText) > inner) rightText = '';\n const fittedTitle =\n titleText && 2 + displayWidth(titleText) > inner ? ` ${truncate(title, Math.max(1, inner - 4))} ` : titleText;\n const used = 1 + displayWidth(fittedTitle) + displayWidth(rightText) + 1;\n const fill = chars.h.repeat(Math.max(0, inner - used));\n return (\n paintBorder(tone, `${chars.tl}${chars.h}`) +\n fittedTitle +\n paintBorder(tone, fill) +\n (rightText ? theme.dim(rightText) : '') +\n paintBorder(tone, `${chars.h}${chars.tr}`)\n );\n}\n\n/** Rounded box (classic without Unicode) with a title in the top border. No fill. */\nexport function Panel({\n title,\n right,\n width,\n tone = 'muted',\n children,\n}: {\n title?: string;\n right?: string;\n width: number;\n tone?: PanelTone;\n children?: ReactNode;\n}) {\n const color = toneColor(tone);\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{panelTopLine(width, title, right, tone)}</Text>\n <Box\n borderStyle={theme.boxStyle}\n borderTop={false}\n borderColor={color}\n borderDimColor={tone === 'muted'}\n paddingX={1}\n flexDirection=\"column\"\n width={width}\n >\n {children}\n </Box>\n </Box>\n );\n}\n", "/**\n * Shapes a tool result for the result panel. Column choice and cell text\n * come from `core/output.ts` so the panel matches `--output table`.\n */\nimport { findListWrapper, getPath, humanCell, pickColumns } from '../core/output';\nimport type { KeyValueRow } from './components/KeyValue';\nimport type { TableColumn } from './components/table-layout';\nimport { safeJson } from './text';\n\nexport type ResultBody =\n | { kind: 'table'; columns: TableColumn[]; rows: Array<Record<string, string>>; total: number; summary: string[] }\n | { kind: 'kv'; rows: KeyValueRow[] }\n | { kind: 'text'; text: string }\n | { kind: 'empty' };\n\ntype Row = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is Row {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isRowList(value: unknown): value is Row[] {\n return Array.isArray(value) && value.length > 0 && value.every(isRecord);\n}\n\nfunction tableBody(rows: Row[], summary: string[], now: number): ResultBody {\n const picked = pickColumns(rows);\n const columns: TableColumn[] = picked.map((c) => ({ key: c.key, header: c.label, align: c.align }));\n const cells = rows.map((row) => {\n const record: Record<string, string> = {};\n for (const column of picked) record[column.key] = humanCell(getPath(row, column.key), now);\n return record;\n });\n return { kind: 'table', columns, rows: cells, total: rows.length, summary };\n}\n\nfunction kvValue(value: unknown, now: number): string {\n if (Array.isArray(value) && value.some((v) => typeof v === 'object' && v !== null)) {\n return `${value.length} item${value.length === 1 ? '' : 's'}`;\n }\n if (isRecord(value)) {\n const json = safeJson(value, 0);\n return json.length > 100 ? `${json.slice(0, 99)}\u2026` : json;\n }\n return humanCell(value, now);\n}\n\nexport function describeResult(result: unknown, now = Date.now()): ResultBody {\n if (result === null || result === undefined || result === '') return { kind: 'empty' };\n if (typeof result === 'string') return { kind: 'text', text: result };\n if (typeof result !== 'object') return { kind: 'text', text: String(result) };\n if (isRowList(result)) return tableBody(result, [], now);\n if (Array.isArray(result)) {\n return result.length === 0 ? { kind: 'empty' } : { kind: 'text', text: result.map((v) => humanCell(v, now)).join('\\n') };\n }\n const wrapper = findListWrapper(result);\n if (wrapper) {\n const summary = Object.entries(result as Row)\n .filter(([key, value]) => key !== wrapper.key && (typeof value !== 'object' || value === null) && value !== undefined)\n .map(([key, value]) => `${key} ${humanCell(value, now)}`);\n if (wrapper.rows.length === 0) return { kind: 'kv', rows: [{ label: wrapper.key, value: 'none' }] };\n return tableBody(wrapper.rows, summary, now);\n }\n const rows = Object.entries(result as Row)\n .filter(([, value]) => value !== undefined)\n .map(([label, value]) => ({ label, value: kvValue(value, now) }));\n return rows.length ? { kind: 'kv', rows } : { kind: 'empty' };\n}\n\n/** Line count of the human body (for scrolling budgets). */\nexport function bodyLength(body: ResultBody): number {\n switch (body.kind) {\n case 'table':\n return body.rows.length;\n case 'kv':\n return body.rows.length;\n case 'text':\n return body.text.split('\\n').length;\n default:\n return 1;\n }\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { memo, useMemo, useState } from 'react';\nimport type { CatalogTool } from '../../core/catalog';\nimport { describeSchema, exampleInvocation } from '../../core/schema-flags';\nimport { KeyHints } from '../components/KeyHints';\nimport { windowAround } from '../fuzzy';\nimport { fromTerminal } from '../layout';\nimport type { UiServices } from '../services';\nimport { theme } from '../theme';\nimport { displayWidth, oneLine, padEnd, truncate, wrapWords } from '../text';\nimport { ToolRun } from './ToolRun';\nimport { type BrowserRow, type BrowserState, applyBrowserAction, browserKeyAction, browserRows, initialBrowserState } from './tool-browser-model';\n\nexport type ToolBrowserProps = {\n tools: readonly CatalogTool[];\n services: UiServices;\n width: number;\n height: number;\n initialQuery?: string;\n initialGroup?: string;\n onExit(): void;\n};\n\n/** Two panes from 90 terminal columns (research \u00A75.6). */\nexport const TWO_PANE_MIN = fromTerminal(90);\n\nfunction badge(tool: CatalogTool): string {\n if (tool.kind === 'workflow') return theme.dim('workflow');\n if (tool.kind === 'agent') return theme.dim('agent');\n if (tool.annotations.destructiveHint === true) return theme.danger('write');\n return tool.readOnly ? theme.dim('read') : 'write';\n}\n\nconst ListRow = memo(function ListRow({ row, selected, width }: { row: BrowserRow; selected: boolean; width: number }) {\n const pointer = selected ? theme.accent(theme.symbols.pointer) : ' ';\n if (row.kind === 'group') {\n const glyph = row.expanded ? theme.symbols.expanded : theme.symbols.collapsed;\n const count = theme.dim(row.matched === row.total ? String(row.total) : `${row.matched} of ${row.total}`);\n const name = truncate(row.group, Math.max(4, width - 12));\n const fill = Math.max(1, width - 4 - displayWidth(name) - displayWidth(count));\n return (\n <Text wrap=\"truncate-end\">\n {pointer} {theme.dim(glyph)} {selected ? theme.accent(theme.bold(name)) : theme.bold(name)}\n {' '.repeat(fill)}\n {count}\n </Text>\n );\n }\n const label = row.tool.kind === 'workflow' ? row.tool.action : row.tool.commandPath.join(' ');\n const tag = badge(row.tool);\n const labelWidth = Math.max(4, width - 4 - displayWidth(tag) - 1);\n const text = padEnd(truncate(label, labelWidth), labelWidth);\n return (\n <Text wrap=\"truncate-end\">\n {pointer} {selected ? theme.accent(text) : text} {tag}\n </Text>\n );\n});\n\n/** Right pane (or bottom block): title, description, flags table, example. */\nexport const ToolDetail = memo(function ToolDetail({ tool, width, height }: { tool: CatalogTool; width: number; height: number }) {\n const flags = useMemo(() => describeSchema(tool.inputSchema), [tool]);\n const example = useMemo(() => exampleInvocation(tool, tool.inputSchema), [tool]);\n const flagWidth = Math.min(28, Math.max(8, ...flags.map((f) => displayWidth(`${f.flag} <${f.type}>`))));\n const descLines = Math.max(1, Math.min(4, height - flags.length - 8));\n const lines = wrapWords(tool.description, width, descLines);\n const shownFlags = flags.slice(0, Math.max(1, height - 7 - lines.length));\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box width={width}>\n <Box flexGrow={1}>\n <Text wrap=\"truncate-end\">{theme.bold(tool.commandPath.join(' '))}</Text>\n </Box>\n <Text>{badge(tool)}</Text>\n </Box>\n <Text wrap=\"truncate-end\">{oneLine(tool.title)}</Text>\n <Text> </Text>\n {lines.map((line, i) => (\n <Text key={i} wrap=\"truncate-end\">\n {theme.dim(line)}\n </Text>\n ))}\n <Text> </Text>\n <Text>{theme.dim('FLAGS')}</Text>\n {flags.length === 0 ? <Text>{theme.dim(' none')}</Text> : null}\n {shownFlags.map((flag) => (\n <Text key={flag.flag} wrap=\"truncate-end\">\n {' '}\n {padEnd(truncate(`${flag.flag} <${flag.type}>`, flagWidth), flagWidth)} {flag.required ? theme.attention('required') : ' '}{' '}\n {theme.dim(flag.description)}\n </Text>\n ))}\n {flags.length > shownFlags.length ? <Text>{theme.dim(` +${flags.length - shownFlags.length} more`)}</Text> : null}\n <Text> </Text>\n <Text>{theme.dim('EXAMPLE')}</Text>\n <Text wrap=\"truncate-end\"> {example}</Text>\n </Box>\n );\n});\n\n/**\n * Tool browser (research \u00A75.6): filter box + grouped list with read/write\n * badges on the left, detail on the right (one pane below 90 columns).\n * Enter opens the form, then runs the tool and shows the result panel.\n */\nexport function ToolBrowser(props: ToolBrowserProps) {\n const { tools, services, width, height, onExit } = props;\n const [state, setState] = useState<BrowserState>(() => {\n const initial = initialBrowserState({ query: props.initialQuery, group: props.initialGroup });\n return initial.query ? applyBrowserAction(tools, { ...initial, query: '' }, { type: 'type', text: initial.query }) : initial;\n });\n const [running, setRunning] = useState<CatalogTool | null>(null);\n const rows = useMemo(() => browserRows(tools, state), [tools, state]);\n const cursor = Math.min(state.cursor, Math.max(0, rows.length - 1));\n const current = rows[cursor];\n\n useInput(\n (input, key) => {\n const outcome = browserKeyAction({ ...state, cursor }, input, key, rows);\n if (!outcome) return;\n if (outcome.type === 'exit') onExit();\n else if (outcome.type === 'open') setRunning(outcome.tool);\n else setState((s) => applyBrowserAction(tools, { ...s, cursor }, outcome));\n },\n { isActive: !running },\n );\n\n if (running) {\n return <ToolRun tool={running} services={services} width={width} height={height} start=\"form\" onExit={() => setRunning(null)} />;\n }\n\n const visibleCount = tools.filter((t) => !t.hidden).length;\n const groupCount = new Set(tools.filter((t) => !t.hidden).map((t) => t.group)).size;\n const twoPane = width >= TWO_PANE_MIN;\n const leftWidth = twoPane ? Math.min(46, Math.floor(width * 0.42)) : width;\n const rightWidth = width - leftWidth - 3;\n const listHeight = Math.max(3, height - (twoPane ? 5 : 9));\n const { start, end } = windowAround(rows.length, cursor, listHeight);\n const filter = `${theme.dim('filter')} ${theme.accent(theme.symbols.pointer)} ${state.query}${theme.accent(theme.symbols.cursor)}`;\n const title = `${theme.bold('Tools')} ${theme.dim(`${theme.symbols.middot} ${visibleCount} in ${groupCount} groups`)}`;\n const rule = theme.dim(\n twoPane ? `${theme.symbols.line.repeat(leftWidth + 1)}\u252C${theme.symbols.line.repeat(Math.max(0, rightWidth + 1))}` : theme.symbols.line.repeat(width),\n );\n const detailTool = current?.kind === 'tool' ? current.tool : null;\n\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box width={width}>\n <Box flexGrow={1}>\n <Text wrap=\"truncate-end\">{title}</Text>\n </Box>\n <Text wrap=\"truncate-end\">{filter}</Text>\n </Box>\n <Text wrap=\"truncate-end\">{theme.unicode ? rule : theme.dim('-'.repeat(width))}</Text>\n <Box width={width}>\n <Box flexDirection=\"column\" width={leftWidth}>\n {rows.length === 0 ? <Text>{theme.dim(` No tools match \"${state.query}\"`)}</Text> : null}\n {rows.slice(start, end).map((row, i) => (\n <ListRow\n key={row.kind === 'group' ? `g:${row.group}` : `t:${row.tool.id}`}\n row={row}\n selected={start + i === cursor}\n width={leftWidth}\n />\n ))}\n </Box>\n {twoPane ? (\n <Box flexDirection=\"column\" marginLeft={1} paddingLeft={1} borderStyle={theme.unicode ? 'single' : 'classic'} borderTop={false} borderRight={false} borderBottom={false} borderDimColor width={rightWidth + 2}>\n {detailTool ? (\n <ToolDetail tool={detailTool} width={rightWidth} height={listHeight} />\n ) : (\n <Text>{theme.dim(current?.kind === 'group' ? `${current.group}: enter or \u2192 to open the group` : 'Select a tool')}</Text>\n )}\n </Box>\n ) : null}\n </Box>\n {!twoPane && detailTool ? (\n <Box marginTop={1}>\n <Text wrap=\"truncate-end\">{theme.dim(oneLine(detailTool.description || detailTool.title))}</Text>\n </Box>\n ) : null}\n <Text wrap=\"truncate-end\">{theme.dim(theme.symbols.line.repeat(width))}</Text>\n <KeyHints\n width={width}\n hints={[\n { key: theme.symbols.upDown, label: 'move' },\n { key: theme.symbols.leftRight, label: 'fold' },\n { key: 'enter', label: 'run' },\n { key: 'type', label: 'filter' },\n { key: 'esc', label: state.query ? 'clear' : 'back' },\n ]}\n />\n </Box>\n );\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ApprovalChoice } from '../../core/chat-model';\nimport { isDestructiveTool } from '../../core/chat-model';\nimport type { CatalogTool } from '../../core/catalog';\nimport { type CliError, toCliError } from '../../core/errors';\nimport type { ApprovalInfo } from '../../core/mcp';\nimport { autoFilledProperties } from '../../core/schema-flags';\nimport { ApprovalCard } from '../components/ApprovalCard';\nimport { approvalOutcomeText } from '../components/approval-model';\nimport { Form } from '../components/Form';\nimport { createFormState } from '../components/form-model';\nimport { KeyHints } from '../components/KeyHints';\nimport { Working } from '../components/Spinner';\nimport type { UiServices } from '../services';\nimport { theme } from '../theme';\nimport { oneLine, sentenceCase, shortId } from '../text';\nimport { ResultPanel } from './ResultPanel';\n\ntype Input = Record<string, unknown>;\n\ntype Phase =\n | { name: 'form'; input: Input }\n | { name: 'running'; input: Input; startedAt: number }\n | { name: 'approval'; input: Input; approval: ApprovalInfo; requestedAt: number; busy: ApprovalChoice | null; error: string | null }\n | { name: 'result'; input: Input; result: unknown; durationMs: number; requestId?: string; note?: string }\n | { name: 'error'; input: Input; error: CliError; durationMs: number }\n | { name: 'left'; input: Input; approval: ApprovalInfo };\n\nexport type ToolRunProps = {\n tool: CatalogTool;\n services: UiServices;\n width: number;\n height: number;\n initialInput?: Input;\n /** Open the form first, or run straight away with `initialInput`. */\n start: 'form' | 'run';\n onExit(): void;\n};\n\nexport function toolLabel(tool: CatalogTool): string {\n return tool.commandPath.join(' ') || tool.id;\n}\n\n/** Form \u2192 run \u2192 (approval) \u2192 result, with re-run and edit from the result. */\nexport function ToolRun({ tool, services, width, height, initialInput = {}, start, onExit }: ToolRunProps) {\n const [phase, setPhase] = useState<Phase>({ name: 'form', input: initialInput });\n const mounted = useRef(true);\n const controller = useRef<AbortController | null>(null);\n useEffect(\n () => () => {\n mounted.current = false;\n controller.current?.abort();\n },\n [],\n );\n\n const withDefaults = useCallback(\n (input: Input): Input =>\n autoFilledProperties(tool, tool.inputSchema).includes('userId') && input.userId === undefined && services.account.userId\n ? { ...input, userId: services.account.userId }\n : input,\n [tool, services.account.userId],\n );\n\n const run = useCallback(\n async (input: Input) => {\n const startedAt = Date.now();\n controller.current?.abort();\n const abort = new AbortController();\n controller.current = abort;\n setPhase({ name: 'running', input, startedAt });\n try {\n const outcome = await services.callTool(tool.id, withDefaults(input), { signal: abort.signal });\n if (!mounted.current || abort.signal.aborted) return;\n if (!outcome.ok) setPhase({ name: 'error', input, error: outcome.error, durationMs: outcome.durationMs });\n else if (outcome.approval) {\n setPhase(\n services.account.hasSession\n ? { name: 'approval', input, approval: outcome.approval, requestedAt: Date.now(), busy: null, error: null }\n : { name: 'left', input, approval: outcome.approval },\n );\n } else setPhase({ name: 'result', input, result: outcome.result, durationMs: outcome.durationMs, requestId: outcome.requestId });\n } catch (error) {\n if (!mounted.current || abort.signal.aborted) return;\n setPhase({ name: 'error', input, error: toCliError(error), durationMs: Date.now() - startedAt });\n }\n },\n [services, tool.id, withDefaults],\n );\n\n // Run once on mount when asked to (later runs come from the form or `r`).\n const started = useRef(false);\n useEffect(() => {\n if (started.current || start !== 'run') return;\n started.current = true;\n void run(initialInput);\n }, [start, run, initialInput]);\n\n const decide = useCallback(\n async (decision: ApprovalChoice) => {\n if (phase.name !== 'approval') return;\n const { approval, input, requestedAt } = phase;\n const title = sentenceCase(approval.toolName || tool.title);\n if (decision === 'leave') {\n setPhase({ name: 'left', input, approval });\n return;\n }\n setPhase({ ...phase, busy: decision, error: null });\n try {\n const data = await services.decideApproval(approval.approvalId, decision);\n if (!mounted.current) return;\n setPhase({\n name: 'result',\n input,\n result: decision === 'approve' ? (data.mcp?.result ?? data.assistant?.text ?? null) : null,\n durationMs: Date.now() - requestedAt,\n note: approvalOutcomeText(decision, title, approval.approvalId, Date.now() - requestedAt),\n });\n } catch (error) {\n if (!mounted.current) return;\n setPhase({ ...phase, busy: null, error: toCliError(error).message });\n }\n },\n [phase, services, tool.title],\n );\n\n useInput(\n (input, key) => {\n if (phase.name === 'running' && key.escape) {\n controller.current?.abort();\n setPhase({ name: 'form', input: phase.input });\n } else if (phase.name === 'error' || phase.name === 'left') {\n if (key.escape || input === 'q') onExit();\n else if (input === 'r') void run(phase.input);\n else if (input === 'e') setPhase({ name: 'form', input: phase.input });\n }\n },\n { isActive: phase.name === 'running' || phase.name === 'error' || phase.name === 'left' },\n );\n\n const label = toolLabel(tool);\n const header = (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text wrap=\"truncate-end\">\n {theme.bold(label)} {theme.dim(`${theme.symbols.middot} ${oneLine(tool.title)}`)}\n </Text>\n {tool.description ? <Text wrap=\"truncate-end\">{theme.dim(oneLine(tool.description))}</Text> : null}\n </Box>\n );\n\n switch (phase.name) {\n case 'form':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Form\n initial={createFormState(tool.inputSchema, phase.input, { skip: autoFilledProperties(tool, tool.inputSchema) })}\n width={width}\n height={Math.max(3, height - 6)}\n isActive\n onSubmit={(input) => void run(input)}\n onCancel={onExit}\n />\n </Box>\n );\n case 'running':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Working label={`Running ${label}${theme.symbols.ellipsis}`} since={phase.startedAt} />\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'esc', label: 'cancel' }]} />\n </Box>\n </Box>\n );\n case 'approval':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <ApprovalCard\n approvalId={phase.approval.approvalId}\n title={sentenceCase(phase.approval.toolName || tool.title)}\n message={phase.approval.message}\n args={withDefaults(phase.input)}\n destructive={isDestructiveTool(phase.approval.toolName || tool.id)}\n context={`Writes to your account ${theme.symbols.middot} profile ${services.profileName}`}\n busy={phase.busy}\n error={phase.error}\n isActive={!phase.busy}\n width={width}\n onDecision={(decision) => void decide(decision)}\n />\n </Box>\n );\n case 'result':\n return (\n <ResultPanel\n title={label}\n result={phase.result}\n durationMs={phase.durationMs}\n requestId={phase.requestId}\n note={phase.note}\n width={width}\n height={height}\n interactive\n onBack={onExit}\n onRerun={() => void run(phase.input)}\n onEdit={() => setPhase({ name: 'form', input: phase.input })}\n />\n );\n case 'error':\n return (\n <Box flexDirection=\"column\" width={width}>\n <ResultPanel title={label} error={phase.error} durationMs={phase.durationMs} width={width} height={height} interactive={false} />\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'r', label: 'retry' }, { key: 'e', label: 'edit input' }, { key: 'q', label: 'back' }]} />\n </Box>\n </Box>\n );\n case 'left':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Text>{approvalOutcomeText('leave', sentenceCase(phase.approval.toolName || tool.title), phase.approval.approvalId)}</Text>\n <Text wrap=\"wrap\">\n {theme.dim(\n services.account.hasSession\n ? 'Decide later in the Tabbio app or with `tabbio approvals`.'\n : `Approve it in the Tabbio app, or run \\`tabbio approvals wait ${shortId(phase.approval.approvalId, 12, 4)}\\`.`,\n )}\n </Text>\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'r', label: 'run again' }, { key: 'e', label: 'edit input' }, { key: 'q', label: 'back' }]} />\n </Box>\n </Box>\n );\n }\n}\n", "/**\n * Tool browser state (pure, for tests): filter-as-you-type across id, title\n * and description with per-group match counts; groups fold with \u2190\u2192.\n */\nimport type { Key } from 'ink';\nimport type { CatalogTool } from '../../core/catalog';\nimport { rankMatch } from '../fuzzy';\n\nexport type BrowserRow =\n | { kind: 'group'; group: string; matched: number; total: number; expanded: boolean }\n | { kind: 'tool'; tool: CatalogTool; group: string };\n\nexport type BrowserState = {\n query: string;\n cursor: number;\n /** Explicit fold state per group; unset = collapsed without a query, expanded with one. */\n expanded: Record<string, boolean>;\n};\n\nexport type BrowserAction =\n | { type: 'type'; text: string }\n | { type: 'backspace' }\n | { type: 'clear' }\n | { type: 'move'; delta: number }\n | { type: 'fold'; expand: boolean };\n\nexport type BrowserOutcome = BrowserAction | { type: 'open'; tool: CatalogTool } | { type: 'exit' } | null;\n\nexport function initialBrowserState(opts: { query?: string; group?: string } = {}): BrowserState {\n return { query: opts.query ?? '', cursor: 0, expanded: opts.group ? { [opts.group]: true } : {} };\n}\n\n/**\n * Rank of a tool for a filter (lower is better, null = no match):\n * 0 exact group name / command path / id \u00B7 1 prefix of the group, action or\n * path \u00B7 2 word-boundary \u00B7 3 substring \u00B7 4 subsequence fuzz \u00B7 5 description.\n * Typing `cv` therefore lists the `cv` group before `candidate view`.\n */\nexport function toolRank(tool: CatalogTool, query: string): number | null {\n const q = query.trim().toLowerCase();\n if (!q) return 0;\n const group = tool.group.toLowerCase();\n const path = tool.commandPath.join(' ').toLowerCase();\n const id = tool.id.toLowerCase();\n if (q === group || q === path || q === id) return 0;\n if (group.startsWith(q) || tool.action.toLowerCase().startsWith(q) || path.startsWith(q) || id.startsWith(q)) return 1;\n const ranks = [rankMatch(q, path), rankMatch(q, id), rankMatch(q, tool.title, tool.description)].filter(\n (r): r is number => r !== null,\n );\n return ranks.length ? Math.max(2, Math.min(...ranks)) : null;\n}\n\n/** Rows to display: groups (sorted) and, for expanded groups, their matching tools. */\nexport function browserRows(tools: readonly CatalogTool[], state: BrowserState): BrowserRow[] {\n const visible = tools.filter((t) => !t.hidden);\n const groups = new Map<string, { total: number; hits: Array<{ tool: CatalogTool; rank: number }> }>();\n for (const tool of visible) {\n const entry = groups.get(tool.group) ?? { total: 0, hits: [] };\n entry.total += 1;\n const rank = toolRank(tool, state.query);\n if (rank !== null) entry.hits.push({ tool, rank });\n groups.set(tool.group, entry);\n }\n const filtering = state.query.trim().length > 0;\n const rows: BrowserRow[] = [];\n // While filtering, groups follow their best match (exact group name first); otherwise A\u2013Z.\n const best = (group: string) => Math.min(...(groups.get(group)?.hits.map((h) => h.rank) ?? [Infinity]));\n const names = [...groups.keys()].sort((a, b) => (filtering ? best(a) - best(b) : 0) || a.localeCompare(b));\n for (const group of names) {\n const entry = groups.get(group) as { total: number; hits: Array<{ tool: CatalogTool; rank: number }> };\n if (filtering && entry.hits.length === 0) continue;\n const expanded = state.expanded[group] ?? filtering;\n rows.push({ kind: 'group', group, matched: entry.hits.length, total: entry.total, expanded });\n if (!expanded) continue;\n const hits = filtering ? [...entry.hits].sort((a, b) => a.rank - b.rank) : entry.hits;\n for (const hit of hits) rows.push({ kind: 'tool', tool: hit.tool, group });\n }\n return rows;\n}\n\nexport function browserReducer(state: BrowserState, action: BrowserAction, rows: readonly BrowserRow[]): BrowserState {\n switch (action.type) {\n case 'type':\n return { ...state, query: state.query + action.text, cursor: 0, expanded: {} };\n case 'backspace':\n return { ...state, query: [...state.query].slice(0, -1).join(''), cursor: 0, expanded: {} };\n case 'clear':\n return { ...state, query: '', cursor: 0, expanded: {} };\n case 'move':\n return { ...state, cursor: Math.max(0, Math.min(rows.length - 1, state.cursor + action.delta)) };\n case 'fold': {\n const row = rows[state.cursor];\n if (!row) return state;\n const group = row.group;\n const expanded = { ...state.expanded, [group]: action.expand };\n // Collapsing from a tool row moves the cursor to its group row.\n const groupIndex = rows.findIndex((r) => r.kind === 'group' && r.group === group);\n return { ...state, expanded, cursor: !action.expand && groupIndex >= 0 ? groupIndex : state.cursor };\n }\n default:\n return state;\n }\n}\n\n/**\n * Reducer plus cursor snapping: after the filter changes, the cursor lands on\n * the best-matching tool so Enter runs it (instead of folding its group).\n */\nexport function applyBrowserAction(tools: readonly CatalogTool[], state: BrowserState, action: BrowserAction): BrowserState {\n const next = browserReducer(state, action, browserRows(tools, state));\n if (action.type !== 'type' && action.type !== 'backspace' && action.type !== 'clear') return next;\n if (!next.query) return next;\n const index = browserRows(tools, next).findIndex((row) => row.kind === 'tool');\n return index >= 0 ? { ...next, cursor: index } : next;\n}\n\n/**\n * Keys: typing filters, \u2191\u2193 move, \u2190\u2192 fold, Enter opens a tool or toggles a\n * group, Esc clears the filter then leaves, `q` leaves when the filter is empty.\n */\nexport function browserKeyAction(state: BrowserState, input: string, key: Partial<Key>, rows: readonly BrowserRow[]): BrowserOutcome {\n const row = rows[Math.min(state.cursor, rows.length - 1)];\n if (key.upArrow) return { type: 'move', delta: -1 };\n if (key.downArrow) return { type: 'move', delta: 1 };\n if (key.pageUp) return { type: 'move', delta: -10 };\n if (key.pageDown) return { type: 'move', delta: 10 };\n if (key.leftArrow) return { type: 'fold', expand: false };\n if (key.rightArrow) return { type: 'fold', expand: true };\n if (key.return) {\n if (!row) return null;\n if (row.kind === 'tool') return { type: 'open', tool: row.tool };\n return { type: 'fold', expand: !row.expanded };\n }\n if (key.escape) return state.query ? { type: 'clear' } : { type: 'exit' };\n if (key.backspace || key.delete) return { type: 'backspace' };\n if (key.ctrl && input === 'u') return { type: 'clear' };\n if (key.ctrl || key.meta || key.tab) return null;\n if (input === 'q' && !state.query) return { type: 'exit' };\n return input ? { type: 'type', text: input } : null;\n}\n", "import type { PaletteCommand } from '../Palette';\n\nexport type HomeCommand = 'chat' | 'tools' | 'approvals' | 'status' | 'login' | 'logout' | 'help' | 'exit';\n\nexport type HomeData = {\n plan: string | null;\n pendingApprovals: number | null;\n recent: Array<{ id: string; title: string; when: string }> | null;\n error?: string;\n};\n\nexport const emptyHomeData: HomeData = { plan: null, pendingApprovals: null, recent: null };\n\nexport type HomeAccess = { signedIn: boolean; hasSession: boolean };\n\n/** Commands of the Home palette. Signed out, only /login, /help and /exit are offered. */\nexport function homeCommands(data: HomeData, toolCount: number | null, access: HomeAccess = { signedIn: true, hasSession: true }): Array<PaletteCommand & { name: HomeCommand }> {\n if (!access.signedIn) {\n return [\n { name: 'login', usage: '/login [email|token]', description: 'Sign in (browser, email code or token)' },\n { name: 'help', description: 'Keys and commands' },\n { name: 'exit', description: 'Quit tabbio' },\n ];\n }\n const waiting = data.pendingApprovals;\n return [\n { name: 'chat', description: 'Chat with Tabbio' },\n { name: 'tools', description: toolCount ? `Browse ${toolCount} tools` : 'Browse every tool' },\n { name: 'approvals', description: waiting === null ? 'Approve or reject actions' : waiting > 0 ? `${waiting} waiting` : 'None waiting' },\n { name: 'status', description: 'Account, tokens, catalog' },\n { name: 'help', description: 'Keys and commands' },\n { name: 'login', usage: '/login [email|token]', description: access.hasSession ? 'Switch account' : 'Full sign-in for chat and approvals' },\n { name: 'logout', description: 'Sign out of this profile' },\n { name: 'exit', description: 'Quit tabbio' },\n ];\n}\n\n/** The quick list under START: the palette without the account and quit rows. */\nexport function startCommands(commands: readonly PaletteCommand[], signedIn: boolean): PaletteCommand[] {\n return commands.filter((c) => c.name !== 'exit' && (!signedIn || (c.name !== 'login' && c.name !== 'logout')));\n}\n\n/** Every Home command name, offered or not (signed out, /chat is known and asks for a sign-in). */\nexport const HOME_COMMAND_NAMES: readonly string[] = ['chat', 'tools', 'approvals', 'status', 'login', 'logout', 'help', 'exit', 'quit'];\n\nexport function isHomeCommand(name: string): name is HomeCommand {\n return HOME_COMMAND_NAMES.includes(name);\n}\n\nexport const SIGN_IN_FIRST = 'Sign in first: /login';\n\n/**\n * Why a Home command cannot run for this account, or null when it can.\n * Signed out, everything but /login, /help and /exit asks for a sign-in;\n * with a personal token only, chat and approvals ask for a full sign-in.\n */\nexport function homeGate(name: string, access: HomeAccess): string | null {\n if (name === 'login' || name === 'help' || name === 'exit' || name === 'quit') return null;\n if (!access.signedIn) return SIGN_IN_FIRST;\n if ((name === 'chat' || name === 'approvals' || name === 'message' || name === 'skill') && !access.hasSession) {\n return `${name === 'approvals' ? 'Approvals need' : 'Chat needs'} a full sign-in: /login (browser or email code)`;\n }\n return null;\n}\n\nexport const HOME_HELP_ROWS: ReadonlyArray<[string, string]> = [\n ['type + enter', 'Start a chat with that message'],\n ['/', 'Command palette: /chat /tools /approvals /status /login /logout /help /exit'],\n ['/login', 'Sign in here: browser, /login email you@x.com, or /login token'],\n ['/logout', 'Sign out of this profile (ends the session on the server)'],\n ['/<skill>', 'Your Tabbio skills are listed in the palette; enter runs one in a chat'],\n ['tab', 'Jump to recent chats'],\n ['esc', 'Close, go back, or clear the composer'],\n ['q', 'Back from lists and help'],\n ['ctrl+j', 'New line in the composer (or \\\\ then enter)'],\n ['\u2191 \u2193', 'Composer history, or move in lists'],\n ['ctrl+c twice', 'Quit'],\n];\n", "import { Box, type Key, Text } from 'ink';\nimport { type ReactNode, memo } from 'react';\nimport type { EditorAction, EditorState } from '../../components/editor-model';\nimport { Header, WIDE_HEADER_MIN, capitalize } from '../../components/Header';\nimport { KeyHints } from '../../components/KeyHints';\nimport { SelectList } from '../../components/SelectList';\nimport { TextInput } from '../../components/TextInput';\nimport { fromTerminal } from '../../layout';\nimport type { UiServices } from '../../services';\nimport { theme } from '../../theme';\nimport { displayWidth, padEnd, truncate } from '../../text';\nimport { Palette, type PaletteCommand } from '../Palette';\nimport { type HomeData, startCommands } from './home-model';\n\n/** START and RECENT side by side from 100 terminal columns; stacked below. */\nexport const TWO_COLUMN_MIN = fromTerminal(100);\n\nexport type HomeViewProps = {\n services: UiServices;\n data: HomeData;\n commands: PaletteCommand[];\n matches: PaletteCommand[];\n /** The draft starts with `/` (the palette shows, possibly \"No commands match\"). */\n paletteOpen?: boolean;\n paletteFooter?: string;\n paletteIndex: number;\n editor: EditorState;\n dispatchEditor(action: EditorAction): void;\n onSubmit(value: string): void;\n onComposerKey(input: string, key: Key): boolean;\n focus: 'composer' | 'recent';\n onRecentSelect(id: string, title: string): void;\n onRecentCancel(): void;\n /** Replaces the palette and composer (the /login step). */\n modal?: ReactNode;\n notice: string | null;\n width: number;\n height: number;\n};\n\nfunction AccountLine({ services, plan, width }: { services: UiServices; plan: string | null; width: number }) {\n const { account } = services;\n const sep = theme.dim(` ${theme.symbols.middot} `);\n const who = account.signedIn\n ? [account.name, account.email, plan ? capitalize(plan) : null].filter(Boolean).join(sep) || theme.dim('personal MCP token')\n : theme.attention('Not signed in');\n const left = `${account.signedIn ? theme.success(theme.symbols.dot) : theme.attention(theme.symbols.dot)} ${who}`;\n const right = theme.dim(`profile ${services.profileName} ${theme.symbols.middot} ${services.apiHost}`);\n const fill = width - displayWidth(left) - displayWidth(right);\n return <Text wrap=\"truncate-end\">{fill >= 2 ? `${left}${' '.repeat(fill)}${right}` : left}</Text>;\n}\n\nconst QuickActions = memo(function QuickActions(props: { commands: PaletteCommand[]; width: number; pending: number | null; signedIn: boolean }) {\n const { commands, width, pending, signedIn } = props;\n const nameWidth = 13;\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{theme.dim('START')}</Text>\n {startCommands(commands, signedIn).map((c) => (\n <Text key={c.name} wrap=\"truncate-end\">\n {theme.accent(padEnd(`/${c.name}`, nameWidth))}\n {truncate(c.description, Math.max(4, width - nameWidth - 3))}\n {c.name === 'approvals' && pending ? ` ${theme.attention(theme.symbols.dot)}` : ''}\n </Text>\n ))}\n </Box>\n );\n});\n\nfunction Recent(props: Pick<HomeViewProps, 'data' | 'focus' | 'onRecentSelect' | 'onRecentCancel' | 'services'> & { width: number; rows: number }) {\n const { data, focus, width, rows, services } = props;\n const title = <Text>{theme.dim('RECENT CHATS')}</Text>;\n if (!services.account.hasSession) {\n return (\n <Box flexDirection=\"column\" width={width}>\n {title}\n <Text wrap=\"truncate-end\">\n {theme.dim(services.account.signedIn ? 'Chats need a full sign-in: /login' : 'Type /login to see your chats')}\n </Text>\n </Box>\n );\n }\n if (data.recent === null) {\n return (\n <Box flexDirection=\"column\" width={width}>\n {title}\n <Text>{theme.dim(data.error ? `Could not load: ${data.error}` : `Loading${theme.symbols.ellipsis}`)}</Text>\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" width={width}>\n {title}\n {data.recent.length === 0 ? <Text>{theme.dim('No chats yet. Type below to start one.')}</Text> : null}\n {data.recent.length > 0 ? (\n <SelectList\n items={data.recent.map((r) => ({ id: r.id, label: r.title, meta: r.when }))}\n width={width}\n height={rows}\n isActive={focus === 'recent'}\n filterable={false}\n showHints={false}\n onSelect={(item) => props.onRecentSelect(item.id, item.label)}\n onCancel={props.onRecentCancel}\n />\n ) : null}\n </Box>\n );\n}\n\nfunction composerPlaceholder(signedOut: boolean, width: number): string {\n if (signedOut) return 'Type /login to sign in, or / for commands';\n return width < WIDE_HEADER_MIN ? 'Ask Tabbio anything, or / for commands' : 'Ask Tabbio anything, or type / for commands';\n}\n\n/** Composer-first home (research \u00A75.5): header, account, START + RECENT, composer, hints. */\nexport function HomeView(props: HomeViewProps) {\n const { services, data, commands, matches, width, height } = props;\n const wide = width >= TWO_COLUMN_MIN;\n const tall = height >= 26;\n const showWordmark = width >= WIDE_HEADER_MIN && tall;\n const showAccount = width >= WIDE_HEADER_MIN;\n const signedOut = !services.account.signedIn;\n const recentRows = signedOut ? 0 : wide ? 5 : height >= 30 ? 3 : 0;\n const colWidth = wide && recentRows > 0 ? Math.floor((width - 4) / 2) : width;\n const account = { name: services.account.name, email: services.account.email, plan: data.plan };\n\n return (\n <Box flexDirection=\"column\" width={width}>\n {showWordmark ? (\n <Header version={services.version} profile={services.profileName} width={width} account={account} />\n ) : (\n <Header version={services.version} profile={services.profileName} width={Math.min(width, WIDE_HEADER_MIN - 1)} account={account} />\n )}\n {showAccount ? (\n <Box marginTop={1} flexDirection=\"column\">\n <AccountLine services={services} plan={data.plan} width={width} />\n {signedOut ? <Text wrap=\"truncate-end\">{theme.dim(' Type /login to sign in')}</Text> : null}\n </Box>\n ) : signedOut ? (\n <Box marginTop={1}>\n <Text wrap=\"truncate-end\">\n {theme.attention('Not signed in')} {theme.dim('Type /login to sign in')}\n </Text>\n </Box>\n ) : null}\n <Box marginTop={1} flexDirection={wide ? 'row' : 'column'} width={width}>\n <QuickActions commands={commands} width={colWidth} pending={data.pendingApprovals} signedIn={!signedOut} />\n {recentRows > 0 ? (\n <Box marginLeft={wide ? 4 : 0} marginTop={wide ? 0 : 1}>\n <Recent {...props} width={colWidth} rows={recentRows} />\n </Box>\n ) : null}\n </Box>\n {props.modal ? <Box marginTop={1}>{props.modal}</Box> : null}\n {!props.modal && (matches.length > 0 || props.paletteOpen) ? (\n <Box marginTop={1}>\n <Palette commands={matches} selected={props.paletteIndex} width={width} footer={props.paletteFooter} />\n </Box>\n ) : null}\n {props.modal ? null : (\n <Box marginTop={1}>\n <TextInput\n editor={props.editor}\n dispatch={props.dispatchEditor}\n onSubmit={props.onSubmit}\n onKey={props.onComposerKey}\n isActive={props.focus === 'composer'}\n width={width}\n placeholder={composerPlaceholder(signedOut, width)}\n boxed\n />\n </Box>\n )}\n {props.notice\n ? props.notice.split('\\n').map((line, i) => (\n <Text key={i} wrap=\"wrap\">\n {line}\n </Text>\n ))\n : null}\n <KeyHints\n width={width}\n hints={\n props.modal\n ? [{ key: 'esc', label: 'cancel sign-in' }]\n : signedOut\n ? [\n { key: '/login', label: 'sign in' },\n { key: '/', label: 'commands' },\n { key: 'ctrl+c', label: 'quit' },\n ]\n : [\n { key: 'enter', label: 'send' },\n { key: '/', label: 'commands' },\n ...(services.account.hasSession && recentRows > 0 ? [{ key: 'tab', label: 'recent chats' }] : []),\n { key: 'ctrl+c', label: 'quit' },\n ]\n }\n />\n </Box>\n );\n}\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { fromTerminal } from '../layout';\nimport { theme } from '../theme';\nimport { WORDMARK_WIDTH, Wordmark } from './Wordmark';\n\nexport type HeaderAccount = { name?: string | null; email?: string | null; plan?: string | null };\n\nexport type HeaderProps = {\n version: string;\n profile: string;\n width: number;\n account?: HeaderAccount | null;\n tagline?: string;\n};\n\n/** Wordmark + version from 60 terminal columns with Unicode; otherwise one line. */\nexport const WIDE_HEADER_MIN = fromTerminal(60);\n\nexport function oneLineHeader({ version, profile, account }: Omit<HeaderProps, 'width'>): string {\n const sep = theme.dim(` ${theme.symbols.middot} `);\n const who = account?.name || account?.email;\n const parts = [\n theme.accentBold(`tabbio ${version}`),\n who ?? null,\n account?.plan ? capitalize(account.plan) : null,\n theme.dim(profile),\n ].filter((p): p is string => Boolean(p));\n return parts.join(sep);\n}\n\nexport function capitalize(value: string): string {\n return value ? value.charAt(0).toUpperCase() + value.slice(1) : value;\n}\n\nexport const Header = memo(function Header(props: HeaderProps) {\n const { version, width, tagline = 'Your career, from the terminal' } = props;\n if (width < WIDE_HEADER_MIN || !theme.unicode) {\n return <Text wrap=\"truncate-end\">{oneLineHeader(props)}</Text>;\n }\n const showTagline = width >= WORDMARK_WIDTH + 3 + tagline.length;\n return (\n <Box>\n <Wordmark />\n <Box flexDirection=\"column\" marginLeft={3}>\n <Text> </Text>\n <Text>{theme.bold(`tabbio ${version}`)}</Text>\n <Text wrap=\"truncate-end\">{showTagline ? theme.dim(tagline) : ''}</Text>\n </Box>\n </Box>\n );\n});\n", "import { Box, Text } from 'ink';\nimport Gradient from 'ink-gradient';\nimport { theme } from '../theme';\n\n/** Hand-drawn half-block wordmark (research \u00A75.4), 25 columns \u00D7 3 rows. */\nexport const WORDMARK_ROWS = [\n ' \u2588 \u2588 \u2588 \u2580',\n '\u2580\u2588\u2580 \u2584\u2580\u2580\u2588 \u2588\u2580\u2580\u2584 \u2588\u2580\u2580\u2584 \u2588 \u2584\u2580\u2580\u2584',\n ' \u2588\u2584 \u2580\u2584\u2584\u2588 \u2588\u2584\u2584\u2580 \u2588\u2584\u2584\u2580 \u2588 \u2580\u2584\u2584\u2580',\n] as const;\nexport const WORDMARK_WIDTH = 25;\n\n/**\n * The wordmark needs Unicode; below that the caller shows the one-line\n * variant. Gradient only on truecolor with a known background, solid accent\n * otherwise (hex values come from theme.ts).\n */\nexport function Wordmark() {\n if (!theme.unicode) return <Text>{theme.accentBold('tabbio')}</Text>;\n const rows = WORDMARK_ROWS.map((row) => row.padEnd(WORDMARK_WIDTH));\n const gradient = theme.wordmarkGradient;\n if (gradient) {\n return (\n <Gradient colors={[...gradient]}>\n <Text>{rows.join('\\n')}</Text>\n </Gradient>\n );\n }\n return (\n <Box flexDirection=\"column\">\n {rows.map((row, i) => (\n <Text key={i}>{theme.accent(row)}</Text>\n ))}\n </Box>\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Box", "Static", "Text", "useEffect", "useState", "Box", "Text", "KeyHints", "Text", "memo", "jsx", "memo", "KeyValue", "Text", "Box", "jsx", "Box", "jsx", "jsxs", "Box", "Text", "Box", "Text", "useInput", "memo", "useEffect", "text", "jsx", "jsxs", "focused", "text", "memo", "FieldRow", "Box", "Text", "useInput", "useEffect", "Box", "Text", "useInput", "useCallback", "useEffect", "useMemo", "useReducer", "useRef", "useState", "text", "Box", "Text", "useInput", "memo", "useState", "jsx", "jsxs", "memo", "Row", "Text", "useState", "useInput", "Box", "Box", "Text", "useInput", "memo", "jsx", "jsxs", "chars", "memo", "TextInput", "useInput", "Text", "Box", "Box", "Text", "useInput", "useEffect", "useReducer", "text", "jsx", "jsxs", "useReducer", "useEffect", "error", "useInput", "Text", "Box", "Box", "Text", "memo", "jsx", "jsxs", "text", "memo", "Palette", "jsx", "Text", "jsxs", "Box", "isRecord", "useEffect", "useRef", "useState", "useState", "useRef", "useEffect", "useInput", "memo", "Box", "Text", "memo", "jsx", "jsxs", "memo", "StatusBar", "Box", "Text", "jsx", "memo", "ChatStatus", "useInput", "choices", "choices", "Box", "Text", "memo", "Box", "Text", "memo", "jsx", "jsxs", "memo", "ArtifactRow", "Box", "Text", "Box", "Text", "memo", "jsx", "text", "Text", "Box", "memo", "CardView", "SavedFilesView", "Box", "Text", "memo", "useMemo", "text", "Box", "Text", "memo", "useMemo", "text", "jsx", "jsxs", "memo", "Table", "useMemo", "Box", "Text", "jsx", "jsxs", "text", "textOf", "Box", "Text", "memo", "Markdown", "useMemo", "Box", "Text", "memo", "jsx", "jsxs", "memo", "SourcesList", "Box", "Text", "Box", "Text", "memo", "jsx", "jsxs", "isRecord", "Text", "memo", "RunningTime", "ToolCallRow", "Box", "ToolCallDetail", "jsx", "jsxs", "text", "Box", "Text", "memo", "EntryView", "LiveItemView", "useCallback", "useRef", "homedir", "useCallback", "useRef", "useRef", "useCallback", "text", "homedir", "useRef", "useCallback", "text", "useCallback", "useEffect", "useReducer", "useRef", "useState", "useEffect", "useRef", "useEffect", "useMemo", "text", "base", "useMemo", "useEffect", "useRef", "useEffect", "getArtifact", "isRecord", "text", "useReducer", "useRef", "useState", "useCallback", "useEffect", "jsx", "jsxs", "useReducer", "useState", "useRef", "useMemo", "useEffect", "useCallback", "submit", "argRows", "text", "useInput", "Box", "Text", "Box", "Text", "useInput", "useCallback", "useEffect", "useMemo", "useReducer", "useRef", "useState", "hostOf", "opts", "Box", "Text", "useInput", "useCallback", "useEffect", "useRef", "useState", "Box", "Text", "useInput", "useMemo", "useState", "Box", "Text", "jsx", "jsxs", "text", "chars", "titleText", "Box", "Text", "isRecord", "jsx", "jsxs", "Box", "Text", "useMemo", "useState", "useInput", "jsx", "jsxs", "useState", "useRef", "useEffect", "useCallback", "useInput", "Box", "Text", "Box", "Text", "useInput", "memo", "useMemo", "useState", "Box", "Text", "useInput", "useCallback", "useEffect", "useRef", "useState", "jsx", "jsxs", "useState", "useRef", "useEffect", "useCallback", "useInput", "Box", "Text", "jsx", "jsxs", "memo", "ListRow", "glyph", "Text", "text", "ToolDetail", "useMemo", "Box", "useState", "useInput", "Box", "Text", "memo", "Box", "Text", "memo", "Box", "Text", "jsx", "Text", "Box", "jsx", "jsxs", "memo", "Header", "Text", "Box", "jsx", "jsxs", "Text", "memo", "QuickActions", "Box", "jsx", "jsxs", "DOUBLE_PRESS_MS", "useInput", "useState", "useReducer", "useRef", "useEffect", "useMemo", "useCallback", "text", "open", "submit", "Box", "Text", "jsx", "jsxs", "Box", "Text", "useEffect", "Static", "useState"]
7
+ }