@dmrlzz/davecode 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/bin/davecode.js +0 -0
- package/dist/{ChatApp-FO5SABXB.js → ChatApp-BO7QMBWD.js} +289 -137
- package/dist/ChatApp-BO7QMBWD.js.map +1 -0
- package/dist/{RunnerView-DLVR7C22.js → RunnerView-A7JSPUW5.js} +5 -5
- package/dist/account-UGNLJPQ4.js +23 -0
- package/dist/accounts-NM7IWP53.js +37 -0
- package/dist/{budget-RBHCEDPP.js → budget-INAW6FXD.js} +6 -6
- package/dist/chat-U4QJQ7M6.js +359 -0
- package/dist/chat-U4QJQ7M6.js.map +1 -0
- package/dist/{chunk-C7FDRA3U.js → chunk-3Q2KCXLN.js} +660 -139
- package/dist/chunk-3Q2KCXLN.js.map +1 -0
- package/dist/{chunk-BOLFK3BH.js → chunk-5LKOJBUL.js} +2 -2
- package/dist/{accounts-MTMGYKEP.js → chunk-CWBVNS3L.js} +24 -17
- package/dist/chunk-CWBVNS3L.js.map +1 -0
- package/dist/{chunk-PIIJ3RSI.js → chunk-DZ2FDABF.js} +1269 -1265
- package/dist/chunk-DZ2FDABF.js.map +1 -0
- package/dist/{chunk-OYEYNDOO.js → chunk-GE22VBCY.js} +3 -3
- package/dist/chunk-GHDOUII5.js +144 -0
- package/dist/chunk-GHDOUII5.js.map +1 -0
- package/dist/{chunk-MSLLH5XP.js → chunk-GZJ6JSO7.js} +4 -4
- package/dist/{chunk-VVCXGQMY.js → chunk-MC7RIPL7.js} +17 -8
- package/dist/chunk-MC7RIPL7.js.map +1 -0
- package/dist/{chunk-23KTE7IK.js → chunk-MOK5D3XJ.js} +2 -2
- package/dist/{chunk-OXRMGR72.js → chunk-PGPXE6LF.js} +2 -2
- package/dist/chunk-QA3O6RA2.js +81 -0
- package/dist/chunk-QA3O6RA2.js.map +1 -0
- package/dist/chunk-ROIUTNQV.js +20 -0
- package/dist/chunk-ROIUTNQV.js.map +1 -0
- package/dist/{chunk-IVZHKUCD.js → chunk-Z6NQDJEN.js} +3 -3
- package/dist/{config-FRMY5OHG.js → config-YEAPBMBX.js} +5 -5
- package/dist/dashboard/assets/Accounts-CeVyX4a3.js +1 -0
- package/dist/dashboard/assets/Badge-CGY6DgGx.js +55 -0
- package/dist/dashboard/assets/{Callout-B9g_wPDi.js → Callout-DauCk_cW.js} +1 -1
- package/dist/dashboard/assets/{Field-BfabPEcY.js → Field-OXMnT9Tb.js} +1 -1
- package/dist/dashboard/assets/{Goals-BsV-6m94.js → Goals-DH-KDh8M.js} +1 -1
- package/dist/dashboard/assets/{Library-CEA9P1m-.js → Library-C15szLjZ.js} +1 -1
- package/dist/dashboard/assets/{Markdown-ClRsddnB.js → Markdown-Xhao3sgL.js} +7 -7
- package/dist/dashboard/assets/Panel-Du40pM7n.js +1 -0
- package/dist/dashboard/assets/{RoutesPage-Dh-BJ3ir.js → RoutesPage-Cj1OelGO.js} +1 -1
- package/dist/dashboard/assets/{Runner-C_e9l5l2.js → Runner-BK1-ZF7h.js} +1 -1
- package/dist/dashboard/assets/{Settings-C6Yc1Gjg.js → Settings-C1nzQQhe.js} +1 -1
- package/dist/dashboard/assets/{Switch-CUpOJjUT.js → Switch-bwtIJ00H.js} +1 -1
- package/dist/dashboard/assets/Tasks-x4s8IiPG.js +2 -0
- package/dist/dashboard/assets/{Traffic-CE6wZSMr.js → Traffic-CV7TaTid.js} +1 -1
- package/dist/dashboard/assets/{Workspace-CxFxvkA6.js → Workspace-DAL-MBc0.js} +1 -1
- package/dist/dashboard/assets/arrow-up-goM9r-I9.js +1 -0
- package/dist/dashboard/assets/{forms-D6UIYgC5.js → forms-DtpfI65-.js} +1 -1
- package/dist/dashboard/assets/index-BCi-Vuvh.js +104 -0
- package/dist/dashboard/assets/{index-1iH716Xy.css → index-CcJFhc98.css} +1 -1
- package/dist/dashboard/assets/{task-errors-CE4oEr8H.js → task-errors-B2pgjUGN.js} +1 -1
- package/dist/dashboard/assets/{trash-CWqeZ7eg.js → trash-BVojETtF.js} +1 -1
- package/dist/dashboard/favicon.svg +1 -7
- package/dist/dashboard/index.html +4 -4
- package/dist/{dist-ZPXEVBEC.js → dist-RRQGUBL3.js} +24 -2
- package/dist/dist-RRQGUBL3.js.map +1 -0
- package/dist/{doctor-7RUD4D3A.js → doctor-MQYK44S2.js} +5 -5
- package/dist/{goal-JFRNPBSD.js → goal-6NUX4AIT.js} +5 -5
- package/dist/index.js +48 -30
- package/dist/index.js.map +1 -1
- package/dist/{init-NFYNO3A3.js → init-AXYIWAB3.js} +6 -6
- package/dist/{prompts-L37J72YW.js → prompts-TZ7UC42M.js} +9 -5
- package/dist/prompts-TZ7UC42M.js.map +1 -0
- package/dist/{run-ARUPXFFB.js → run-QRTLHFB3.js} +10 -10
- package/dist/runtime.js +18 -0
- package/dist/runtime.js.map +1 -0
- package/dist/{start-CFPOVIAR.js → start-O5I5TSO2.js} +5 -5
- package/dist/{status-E4EACVE2.js → status-LEA3RVUX.js} +6 -6
- package/dist/status-LEA3RVUX.js.map +1 -0
- package/dist/{tasks-ZIK6BVEX.js → tasks-XOTVICVZ.js} +6 -6
- package/package.json +21 -15
- package/dist/ChatApp-FO5SABXB.js.map +0 -1
- package/dist/accounts-MTMGYKEP.js.map +0 -1
- package/dist/chat-ZDXX3N6X.js +0 -95
- package/dist/chat-ZDXX3N6X.js.map +0 -1
- package/dist/chunk-C7FDRA3U.js.map +0 -1
- package/dist/chunk-DYQ56FBT.js +0 -47
- package/dist/chunk-DYQ56FBT.js.map +0 -1
- package/dist/chunk-PIIJ3RSI.js.map +0 -1
- package/dist/chunk-VVCXGQMY.js.map +0 -1
- package/dist/dashboard/assets/Accounts-BR3ZfVk4.js +0 -1
- package/dist/dashboard/assets/Badge-B-qzNRrZ.js +0 -55
- package/dist/dashboard/assets/Panel-B9tSgX6l.js +0 -1
- package/dist/dashboard/assets/Tasks-CTku0rR3.js +0 -2
- package/dist/dashboard/assets/arrow-up-DL3CuFOO.js +0 -1
- package/dist/dashboard/assets/index-BMWr9EKo.js +0 -104
- package/dist/prompts-L37J72YW.js.map +0 -1
- /package/dist/{RunnerView-DLVR7C22.js.map → RunnerView-A7JSPUW5.js.map} +0 -0
- /package/dist/{dist-ZPXEVBEC.js.map → account-UGNLJPQ4.js.map} +0 -0
- /package/dist/{status-E4EACVE2.js.map → accounts-NM7IWP53.js.map} +0 -0
- /package/dist/{budget-RBHCEDPP.js.map → budget-INAW6FXD.js.map} +0 -0
- /package/dist/{chunk-BOLFK3BH.js.map → chunk-5LKOJBUL.js.map} +0 -0
- /package/dist/{chunk-OYEYNDOO.js.map → chunk-GE22VBCY.js.map} +0 -0
- /package/dist/{chunk-MSLLH5XP.js.map → chunk-GZJ6JSO7.js.map} +0 -0
- /package/dist/{chunk-23KTE7IK.js.map → chunk-MOK5D3XJ.js.map} +0 -0
- /package/dist/{chunk-OXRMGR72.js.map → chunk-PGPXE6LF.js.map} +0 -0
- /package/dist/{chunk-IVZHKUCD.js.map → chunk-Z6NQDJEN.js.map} +0 -0
- /package/dist/{config-FRMY5OHG.js.map → config-YEAPBMBX.js.map} +0 -0
- /package/dist/{doctor-7RUD4D3A.js.map → doctor-MQYK44S2.js.map} +0 -0
- /package/dist/{goal-JFRNPBSD.js.map → goal-6NUX4AIT.js.map} +0 -0
- /package/dist/{init-NFYNO3A3.js.map → init-AXYIWAB3.js.map} +0 -0
- /package/dist/{run-ARUPXFFB.js.map → run-QRTLHFB3.js.map} +0 -0
- /package/dist/{start-CFPOVIAR.js.map → start-O5I5TSO2.js.map} +0 -0
- /package/dist/{tasks-ZIK6BVEX.js.map → tasks-XOTVICVZ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tui/ChatApp.tsx","../src/tui/chat-state.ts","../src/tui/components/InputBox.tsx","../src/tui/editor.ts","../src/tui/components/Picker.tsx","../src/tui/components/StatusLine.tsx","../src/tui/components/Transcript.tsx","../src/tui/slash.ts","../src/tui/slash-actions.ts"],"sourcesContent":["import type { Usage } from '@davecode/core';\nimport { Box, Static, useApp, useInput, usePaste, useStdout, useWindowSize } from 'ink';\nimport { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport { brandBanner } from '../ui/banner';\nimport type { Theme } from '../ui/theme';\nimport type { ChatBackend } from './backend';\nimport { chatReducer, initialChatState } from './chat-state';\nimport { InputBox, SlashHints } from './components/InputBox';\nimport { Picker, type PickerOption } from './components/Picker';\nimport { StatusLine } from './components/StatusLine';\nimport { EntryView, StreamingView } from './components/Transcript';\nimport * as ed from './editor';\nimport { parseSlash, slashSuggestions } from './slash';\nimport {\n accountsText,\n helpText,\n modelsText,\n routesText,\n statusText,\n tasksText,\n} from './slash-actions';\nimport { ThemeProvider, useTheme } from './theme-context';\n\nexport interface ChatAppProps {\n backend: ChatBackend;\n theme: Theme;\n model: string;\n version: string;\n /** DaveCode account actions for /login, /logout and /account (absent when accounts are off). */\n account?: {\n status(): Promise<string>;\n login(notify: (text: string) => void): Promise<string>;\n logout(): Promise<string>;\n };\n /**\n * /connect: the agents to offer, and what to do with the one picked. The chat closes so the\n * vendor's own login can use the terminal; the caller opens it again afterwards.\n */\n connect?: {\n agents(): Promise<PickerOption[]>;\n choose(provider: string): void;\n };\n /** Where the conversation runs, shown once in the banner (e.g. `~/code/app`). */\n project?: string;\n /** Health polling interval (tests use a short one). */\n pollMs?: number;\n /** Time source (tests). */\n now?: () => number;\n}\n\nconst PLACEHOLDER = 'Ask anything, or type / for commands';\nconst EXIT_WINDOW_MS = 2000;\n\nfunction errorText(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction Chat({\n backend,\n model,\n version,\n project,\n account,\n connect,\n pollMs = 10_000,\n now = Date.now,\n}: ChatAppProps) {\n const theme = useTheme();\n const { exit } = useApp();\n const { write } = useStdout();\n const { columns } = useWindowSize();\n const width = Math.max(20, columns);\n // The banner is drawn once; it reads the width at mount without redrawing on resize.\n const widthRef = useRef(width);\n widthRef.current = width;\n\n const [state, dispatch] = useReducer(chatReducer, model, initialChatState);\n const [editor, setEditor] = useState<ed.EditorState>(ed.emptyEditor);\n const [historyIndex, setHistoryIndex] = useState<number | undefined>();\n const [notice, setNotice] = useState<string | undefined>();\n const [clock, setClock] = useState(now());\n const [slashIndex, setSlashIndex] = useState(0);\n const [picker, setPicker] = useState<\n | { title: string; options: PickerOption[]; index: number; pick: (value: string) => void }\n | undefined\n >();\n\n const abortRef = useRef<AbortController | undefined>(undefined);\n const exitArmedAt = useRef<number | undefined>(undefined);\n const labels = useRef(new Map<string, string>());\n const stateRef = useRef(state);\n stateRef.current = state;\n\n // --- lifecycle -----------------------------------------------------------\n\n useEffect(() => {\n dispatch({\n type: 'banner',\n text: brandBanner(\n theme,\n [\n `${theme.bold('DaveCode')} ${theme.dim(`v${version}`)}`,\n ...(project ? [theme.dim(project)] : []),\n ],\n widthRef.current,\n ).join('\\n'),\n });\n let alive = true;\n const check = async () => {\n const health = await backend.health();\n if (alive) dispatch({ type: 'connection', connection: health ? 'online' : 'offline' });\n };\n void check();\n backend\n .accounts()\n .then((accounts) => {\n for (const a of accounts) labels.current.set(a.id, a.label);\n })\n .catch(() => {});\n const timer = setInterval(() => void check(), pollMs);\n return () => {\n alive = false;\n clearInterval(timer);\n abortRef.current?.abort();\n };\n }, [backend, pollMs, project, theme, version]);\n\n // Elapsed-time display while a reply is streaming.\n useEffect(() => {\n if (!state.streaming) return;\n const timer = setInterval(() => setClock(now()), 250);\n return () => clearInterval(timer);\n }, [state.streaming, now]);\n\n useEffect(() => {\n if (!notice) return;\n const timer = setTimeout(() => setNotice(undefined), EXIT_WINDOW_MS);\n return () => clearTimeout(timer);\n }, [notice]);\n\n // --- actions -------------------------------------------------------------\n\n const refreshQuota = useCallback(\n async (accountId: string) => {\n try {\n const usage = (await backend.usage()).find((u) => u.accountId === accountId);\n const window = usage?.windows['5h'];\n const limited =\n window && (window.tokenLimit !== undefined || window.requestLimit !== undefined);\n dispatch({\n type: 'quota',\n accountId,\n utilization: limited ? window.utilization : undefined,\n });\n } catch {\n // Quota is decoration; ignore failures.\n }\n },\n [backend],\n );\n\n const send = useCallback(\n async (text: string) => {\n dispatch({ type: 'user', text });\n const conversation = [\n ...stateRef.current.conversation,\n { role: 'user' as const, content: text },\n ];\n const controller = new AbortController();\n abortRef.current = controller;\n dispatch({ type: 'stream-start', now: now() });\n let usage: Usage | undefined;\n let accountId: string | undefined;\n try {\n const { meta, chunks } = await backend.stream(\n { model: stateRef.current.model, messages: conversation },\n controller.signal,\n );\n accountId = meta.accountId;\n dispatch({\n type: 'stream-meta',\n failovers: meta.failovers,\n ...(meta.accountId ? { accountId: meta.accountId } : {}),\n ...(meta.provider ? { provider: meta.provider } : {}),\n ...(meta.accountId && labels.current.has(meta.accountId)\n ? { accountLabel: labels.current.get(meta.accountId)! }\n : {}),\n });\n dispatch({ type: 'connection', connection: 'online' });\n for await (const chunk of chunks) {\n if (controller.signal.aborted) break;\n const delta = chunk.choices[0]?.delta?.content;\n if (typeof delta === 'string' && delta) dispatch({ type: 'stream-delta', text: delta });\n if (chunk.usage) usage = chunk.usage;\n }\n dispatch({\n type: 'stream-end',\n now: now(),\n ...(usage ? { usage } : {}),\n ...(controller.signal.aborted ? { cancelled: true } : {}),\n });\n } catch (err) {\n if (controller.signal.aborted) {\n dispatch({ type: 'stream-end', now: now(), cancelled: true });\n } else {\n const status = (err as { status?: number }).status;\n if (status === 0) dispatch({ type: 'connection', connection: 'offline' });\n let text = errorText(err);\n // A lost agent login is fixed from here: point at /connect, not a shell command.\n if (connect)\n text = text.replace(/Run: davecode accounts login \\S+/, 'Type /connect to sign in.');\n dispatch({ type: 'stream-end', now: now(), error: text });\n }\n } finally {\n if (abortRef.current === controller) abortRef.current = undefined;\n }\n if (accountId) void refreshQuota(accountId);\n },\n [backend, connect, now, refreshQuota],\n );\n\n const runSlash = useCallback(\n async (input: string) => {\n const parsed = parseSlash(input);\n if (parsed.kind === 'unknown') {\n dispatch({\n type: 'error',\n text: `Unknown command /${parsed.name}. Type /help for the list.`,\n });\n return;\n }\n if (parsed.kind !== 'command') return;\n const { command, args } = parsed;\n try {\n switch (command.name) {\n case 'help':\n dispatch({ type: 'info', text: helpText(theme) });\n break;\n case 'exit':\n abortRef.current?.abort();\n exit();\n break;\n case 'clear':\n abortRef.current?.abort();\n write('\\u001b[2J\\u001b[3J\\u001b[H');\n dispatch({ type: 'clear' });\n break;\n case 'model': {\n const choose = (id: string) => {\n dispatch({ type: 'set-model', model: id });\n dispatch({ type: 'info', text: `Model set to ${theme.accent(id)}` });\n };\n if (args) {\n choose(args);\n break;\n }\n const ids = (await backend.models())\n .map((m) => m.id)\n .sort(\n (a, b) =>\n Number(!a.startsWith('davecode/')) - Number(!b.startsWith('davecode/')) ||\n a.localeCompare(b),\n );\n if (ids.length === 0) {\n dispatch({\n type: 'info',\n text: await modelsText(theme, backend, stateRef.current.model),\n });\n break;\n }\n const current = stateRef.current.model;\n setPicker({\n title: 'Choose a model',\n options: ids.map((id) => ({\n value: id,\n label: id,\n ...(id === current ? { hint: '(current)' } : {}),\n })),\n index: Math.max(0, ids.indexOf(current)),\n pick: choose,\n });\n break;\n }\n case 'connect': {\n if (!connect) {\n dispatch({ type: 'info', text: 'Connect agents with davecode accounts add.' });\n break;\n }\n setPicker({\n title: 'Connect an agent',\n options: await connect.agents(),\n index: 0,\n pick: (provider) => {\n abortRef.current?.abort();\n connect.choose(provider);\n exit();\n },\n });\n break;\n }\n case 'route':\n dispatch({ type: 'info', text: await routesText(theme, backend) });\n break;\n case 'accounts': {\n const accounts = await backend.accounts();\n for (const a of accounts) labels.current.set(a.id, a.label);\n dispatch({ type: 'info', text: await accountsText(theme, backend, width - 4) });\n break;\n }\n case 'tasks':\n dispatch({ type: 'info', text: await tasksText(theme, backend, width - 4) });\n break;\n case 'status':\n dispatch({\n type: 'info',\n text: await statusText(theme, backend, stateRef.current.model),\n });\n break;\n case 'login':\n case 'logout':\n case 'account': {\n if (!account) {\n dispatch({\n type: 'info',\n text: 'DaveCode accounts are not available in this build.',\n });\n break;\n }\n const text =\n command.name === 'login'\n ? await account.login((note) => dispatch({ type: 'info', text: theme.dim(note) }))\n : command.name === 'logout'\n ? await account.logout()\n : await account.status();\n dispatch({ type: 'info', text });\n break;\n }\n }\n } catch (err) {\n dispatch({ type: 'error', text: `/${command.name} failed: ${errorText(err)}` });\n }\n },\n [account, backend, connect, exit, theme, width, write],\n );\n\n const submit = useCallback(() => {\n const text = ed.textOf(editor).trim();\n if (!text) return;\n if (parseSlash(text).kind !== 'none') {\n setEditor(ed.emptyEditor);\n setHistoryIndex(undefined);\n void runSlash(text);\n return;\n }\n if (stateRef.current.streaming) {\n setNotice('Wait for the reply, or press Esc to cancel it');\n return;\n }\n setEditor(ed.emptyEditor);\n setHistoryIndex(undefined);\n void send(text);\n }, [editor, runSlash, send]);\n\n // --- keyboard --------------------------------------------------------------\n\n const recall = (direction: -1 | 1) => {\n const { history } = stateRef.current;\n if (history.length === 0) return;\n const current = historyIndex ?? history.length;\n const next = Math.min(history.length, Math.max(0, current + direction));\n setHistoryIndex(next === history.length ? undefined : next);\n setEditor(next === history.length ? ed.emptyEditor : ed.fromText(history[next]!));\n };\n\n useInput((input, key) => {\n if (key.ctrl && input === 'c') {\n const armed =\n exitArmedAt.current !== undefined && now() - exitArmedAt.current < EXIT_WINDOW_MS;\n if (armed) {\n abortRef.current?.abort();\n exit();\n return;\n }\n exitArmedAt.current = now();\n if (stateRef.current.streaming) abortRef.current?.abort();\n else if (editor.chars.length > 0) setEditor(ed.emptyEditor);\n setNotice('Press Ctrl+C again to exit');\n return;\n }\n exitArmedAt.current = undefined;\n\n // An open picker takes the keyboard: arrows or a number choose, Esc closes it.\n if (picker) {\n const count = picker.options.length;\n const move = (index: number) => setPicker({ ...picker, index });\n if (key.escape) return setPicker(undefined);\n if (key.upArrow) return move((picker.index - 1 + count) % count);\n if (key.downArrow) return move((picker.index + 1) % count);\n const digit = count <= 9 && /^[1-9]$/.test(input) ? Number(input) - 1 : undefined;\n if (key.return || (digit !== undefined && digit < count)) {\n const option = picker.options[digit ?? picker.index];\n setPicker(undefined);\n if (option) picker.pick(option.value);\n }\n return;\n }\n\n // While the slash menu is open, arrows move through it and Enter/Tab act on the highlight.\n const menu = slashSuggestions(ed.textOf(editor));\n if (menu.length > 0) {\n const selected = menu[Math.min(slashIndex, menu.length - 1)]!;\n if (key.upArrow) return setSlashIndex((i) => (i - 1 + menu.length) % menu.length);\n if (key.downArrow) return setSlashIndex((i) => (i + 1) % menu.length);\n if (key.escape) return setEditor(ed.emptyEditor);\n if (key.tab) {\n setEditor(ed.fromText(`/${selected.name}${selected.args ? ' ' : ''}`));\n return;\n }\n if (key.return && !key.shift && !key.meta) {\n setEditor(ed.emptyEditor);\n setHistoryIndex(undefined);\n void runSlash(`/${selected.name}`);\n return;\n }\n }\n\n if (key.escape) {\n if (stateRef.current.streaming) abortRef.current?.abort();\n return;\n }\n // New line: Ctrl+J (LF), Shift/Alt+Enter where the terminal reports it, or \"\\\" + Enter.\n if ((input === '\\n' && !key.return) || (key.ctrl && input === 'j')) {\n setEditor((e) => ed.insert(e, '\\n'));\n return;\n }\n if (key.return) {\n if (key.shift || key.meta) setEditor((e) => ed.insert(e, '\\n'));\n else if (ed.continuesLine(editor)) setEditor((e) => ed.newlineAfterBackslash(e));\n else submit();\n return;\n }\n if (key.tab) return;\n if (key.upArrow) {\n const moved = ed.up(editor);\n if (moved) setEditor(moved);\n else recall(-1);\n return;\n }\n if (key.downArrow) {\n const moved = ed.down(editor);\n if (moved) setEditor(moved);\n else if (historyIndex !== undefined) recall(1);\n return;\n }\n if (key.leftArrow) return setEditor(ed.left);\n if (key.rightArrow) return setEditor(ed.right);\n if (key.home || (key.ctrl && input === 'a')) return setEditor(ed.lineStart);\n if (key.end || (key.ctrl && input === 'e')) return setEditor(ed.lineEnd);\n if (key.backspace) return setEditor(ed.backspace);\n if (key.delete) return setEditor(ed.deleteForward);\n if (key.ctrl && input === 'u') return setEditor(ed.killToLineStart);\n if (key.ctrl && input === 'k') return setEditor(ed.killToLineEnd);\n if (key.ctrl && input === 'w') return setEditor(ed.deleteWordBack);\n if (key.ctrl && input === 'l') {\n write('\\u001b[2J\\u001b[H');\n return;\n }\n if (key.ctrl || key.meta || !input) return;\n setEditor((e) => ed.insert(e, input));\n });\n\n usePaste((text) => {\n setEditor((e) => ed.insert(e, text));\n });\n\n // --- render ----------------------------------------------------------------\n\n const text = ed.textOf(editor);\n const suggestions = slashSuggestions(text);\n // A new prefix starts the menu from the top.\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset whenever the typed text changes\n useEffect(() => setSlashIndex(0), [text]);\n return (\n <Box flexDirection=\"column\" width={width}>\n <Static key={state.epoch} items={state.entries}>\n {(entry) => <EntryView key={entry.id} entry={entry} />}\n </Static>\n {state.streaming ? <StreamingView streaming={state.streaming} now={clock} /> : null}\n {picker ? (\n <Picker title={picker.title} options={picker.options} index={picker.index} />\n ) : (\n <>\n <InputBox editor={editor} width={width} placeholder={PLACEHOLDER} />\n <SlashHints\n commands={suggestions}\n width={width}\n selected={Math.min(slashIndex, Math.max(0, suggestions.length - 1))}\n />\n </>\n )}\n {!picker && suggestions.length === 0 ? (\n <StatusLine state={state} width={width} info={notice ? { notice } : {}} />\n ) : null}\n </Box>\n );\n}\n\n/** The chat TUI. Render with `render(<ChatApp …/>, { exitOnCtrlC: false })`. */\nexport function ChatApp(props: ChatAppProps) {\n return (\n <ThemeProvider theme={props.theme}>\n <Chat {...props} />\n </ThemeProvider>\n );\n}\n","import type { ChatMessage, ProviderKind, Usage } from '@davecode/core';\n\n/** Pure state machine behind the chat TUI (rendering lives in ChatApp). */\n\nexport type EntryKind = 'banner' | 'user' | 'assistant' | 'info' | 'error';\n\nexport interface EntryMeta {\n accountId?: string;\n accountLabel?: string;\n provider?: string;\n model?: string;\n failovers?: number;\n tokens?: number;\n /** Token count is an estimate (the upstream sent no usage). */\n estimated?: boolean;\n latencyMs?: number;\n cancelled?: boolean;\n}\n\nexport interface Entry {\n id: number;\n kind: EntryKind;\n text: string;\n meta?: EntryMeta;\n}\n\nexport type Connection = 'connecting' | 'online' | 'offline';\n\nexport interface StreamingState {\n id: number;\n text: string;\n startedAt: number;\n model: string;\n accountId?: string;\n provider?: string;\n failovers?: number;\n}\n\nexport interface ChatState {\n /** Finalised transcript entries (rendered once, above the live area). */\n entries: Entry[];\n /** The assistant reply being streamed, if any. */\n streaming?: StreamingState;\n /** Messages sent to the gateway on the next turn. */\n conversation: ChatMessage[];\n model: string;\n connection: Connection;\n /** Account that served the last reply. */\n lastAccount?: { id: string; label?: string; provider?: string };\n /** Failover hops of the last reply and across the session. */\n lastFailovers: number;\n totalFailovers: number;\n tokens: { prompt: number; completion: number };\n /** 5h-window utilization of the last account (undefined when unknown or unlimited). */\n quota5h?: number;\n /** Bumped by /clear so the transcript re-mounts. */\n epoch: number;\n /** Submitted inputs, oldest first, for ↑/↓ recall. */\n history: string[];\n nextId: number;\n}\n\nexport type ChatAction =\n | { type: 'banner'; text: string }\n | { type: 'info'; text: string }\n | { type: 'error'; text: string }\n | { type: 'user'; text: string }\n | { type: 'stream-start'; now: number }\n | {\n type: 'stream-meta';\n accountId?: string;\n provider?: ProviderKind | string;\n failovers?: number;\n accountLabel?: string;\n }\n | { type: 'stream-delta'; text: string }\n | {\n type: 'stream-end';\n now: number;\n usage?: Usage;\n cancelled?: boolean;\n error?: string;\n }\n | { type: 'set-model'; model: string }\n | { type: 'connection'; connection: Connection }\n | { type: 'quota'; accountId: string; utilization: number | undefined }\n | { type: 'clear' };\n\nexport function initialChatState(model: string): ChatState {\n return {\n entries: [],\n conversation: [],\n model,\n connection: 'connecting',\n lastFailovers: 0,\n totalFailovers: 0,\n tokens: { prompt: 0, completion: 0 },\n epoch: 0,\n history: [],\n nextId: 1,\n };\n}\n\n/** chars/4, the same fallback the gateway uses when a provider omits usage. */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nfunction push(state: ChatState, kind: EntryKind, text: string, meta?: EntryMeta): ChatState {\n const entry: Entry = { id: state.nextId, kind, text };\n if (meta) entry.meta = meta;\n return { ...state, entries: [...state.entries, entry], nextId: state.nextId + 1 };\n}\n\nexport function chatReducer(state: ChatState, action: ChatAction): ChatState {\n switch (action.type) {\n case 'banner':\n return push(state, 'banner', action.text);\n case 'info':\n return push(state, 'info', action.text);\n case 'error':\n return push(state, 'error', action.text);\n case 'user': {\n const next = push(state, 'user', action.text);\n const history =\n state.history[state.history.length - 1] === action.text\n ? state.history\n : [...state.history, action.text].slice(-200);\n return {\n ...next,\n history,\n conversation: [...state.conversation, { role: 'user', content: action.text }],\n };\n }\n case 'stream-start':\n return {\n ...state,\n streaming: { id: state.nextId, text: '', startedAt: action.now, model: state.model },\n nextId: state.nextId + 1,\n };\n case 'stream-meta': {\n if (!state.streaming) return state;\n const streaming = { ...state.streaming };\n if (action.accountId) streaming.accountId = action.accountId;\n if (action.provider) streaming.provider = action.provider;\n if (action.failovers !== undefined) streaming.failovers = action.failovers;\n const lastAccount = action.accountId\n ? {\n id: action.accountId,\n ...(action.accountLabel ? { label: action.accountLabel } : {}),\n ...(action.provider ? { provider: action.provider } : {}),\n }\n : state.lastAccount;\n return {\n ...state,\n streaming,\n ...(lastAccount ? { lastAccount } : {}),\n ...(action.failovers !== undefined\n ? {\n lastFailovers: action.failovers,\n totalFailovers: state.totalFailovers + action.failovers,\n }\n : {}),\n };\n }\n case 'stream-delta':\n if (!state.streaming) return state;\n return {\n ...state,\n streaming: { ...state.streaming, text: state.streaming.text + action.text },\n };\n case 'stream-end': {\n const live = state.streaming;\n if (!live) return state;\n const prompt =\n action.usage?.prompt_tokens ??\n estimateTokens(\n state.conversation\n .map((m) => (typeof m.content === 'string' ? m.content : ''))\n .join('\\n'),\n );\n const completion = action.usage?.completion_tokens ?? estimateTokens(live.text);\n const meta: EntryMeta = {\n model: live.model,\n latencyMs: action.now - live.startedAt,\n tokens: prompt + completion,\n ...(action.usage ? {} : { estimated: true }),\n ...(live.accountId ? { accountId: live.accountId } : {}),\n ...(state.lastAccount?.id === live.accountId && state.lastAccount?.label\n ? { accountLabel: state.lastAccount.label }\n : {}),\n ...(live.provider ? { provider: live.provider } : {}),\n ...(live.failovers ? { failovers: live.failovers } : {}),\n ...(action.cancelled ? { cancelled: true } : {}),\n };\n let next: ChatState = { ...state };\n delete next.streaming;\n const answered = live.text.length > 0;\n if (answered || action.cancelled) next = push(next, 'assistant', live.text, meta);\n if (action.error) next = push(next, 'error', action.error);\n // Only complete exchanges stay in the conversation the model sees next time; a cancelled\n // or failed turn drops its question too, so roles keep alternating.\n if (answered && !action.cancelled && !action.error) {\n next.conversation = [...next.conversation, { role: 'assistant', content: live.text }];\n } else if (next.conversation[next.conversation.length - 1]?.role === 'user') {\n next.conversation = next.conversation.slice(0, -1);\n }\n if (answered || action.usage) {\n next.tokens = {\n prompt: state.tokens.prompt + prompt,\n completion: state.tokens.completion + completion,\n };\n }\n return next;\n }\n case 'set-model':\n return { ...state, model: action.model };\n case 'connection':\n return state.connection === action.connection\n ? state\n : { ...state, connection: action.connection };\n case 'quota': {\n if (state.lastAccount?.id !== action.accountId) return state;\n const next = { ...state };\n if (action.utilization === undefined) delete next.quota5h;\n else next.quota5h = action.utilization;\n return next;\n }\n case 'clear': {\n const next: ChatState = {\n ...state,\n entries: [],\n conversation: [],\n epoch: state.epoch + 1,\n };\n delete next.streaming;\n return next;\n }\n default:\n return state;\n }\n}\n","import { Box, Text } from 'ink';\nimport { type EditorState, lines, position } from '../editor';\nimport type { SlashCommand } from '../slash';\nimport { useTheme } from '../theme-context';\n\n/** Split a line around the cursor so the cursor cell can be drawn inverted. */\nexport function cursorParts(\n line: string[],\n column: number | undefined,\n): { before: string; at: string; after: string } {\n if (column === undefined) return { before: line.join(''), at: '', after: '' };\n return {\n before: line.slice(0, column).join(''),\n at: line[column] ?? ' ',\n after: line.slice(column + 1).join(''),\n };\n}\n\nexport function InputBox({\n editor,\n width,\n placeholder,\n disabled,\n}: {\n editor: EditorState;\n width: number;\n placeholder: string;\n disabled?: boolean;\n}) {\n const theme = useTheme();\n const all = lines(editor);\n const cursor = position(editor);\n const empty = editor.chars.length === 0;\n return (\n <Box\n borderStyle={theme.unicode ? 'round' : 'classic'}\n borderDimColor={theme.ink.dim}\n flexDirection=\"column\"\n paddingX={1}\n width={width}\n >\n {all.map((line, i) => {\n const parts = cursorParts(line, !disabled && i === cursor.line ? cursor.column : undefined);\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: lines have no identity beyond position\n <Box key={i}>\n <Box width={2} flexShrink={0}>\n <Text color={i === 0 ? theme.ink.accent : undefined}>\n {i === 0 ? theme.glyph.prompt : ''}\n </Text>\n </Box>\n {empty && i === 0 ? (\n <Text>\n {disabled ? null : <Text inverse> </Text>}\n <Text dimColor={theme.ink.dim}>{placeholder}</Text>\n </Text>\n ) : (\n <Text>\n {parts.before}\n {parts.at ? <Text inverse>{parts.at}</Text> : null}\n {parts.after}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n\n/** The slash menu under the input: ↑/↓ move the highlighted row, Enter runs it, Tab fills it. */\nexport function SlashHints({\n commands,\n width,\n selected = 0,\n}: {\n commands: SlashCommand[];\n width: number;\n selected?: number;\n}) {\n const theme = useTheme();\n if (commands.length === 0) return null;\n const nameWidth =\n Math.max(...commands.map((c) => c.name.length + (c.args ? c.args.length + 1 : 0))) + 3;\n return (\n <Box flexDirection=\"column\" paddingX={1} width={width}>\n {commands.map((c, i) => {\n const active = i === selected;\n return (\n <Text key={c.name} wrap=\"truncate-end\">\n <Text bold={active} dimColor={!active && theme.ink.dim}>\n {`${active ? theme.glyph.prompt : ' '} ${`/${c.name}${c.args ? ` ${c.args}` : ''}`.padEnd(nameWidth)}`}\n </Text>\n <Text dimColor={theme.ink.dim}>{c.description}</Text>\n </Text>\n );\n })}\n </Box>\n );\n}\n","/**\n * Pure multiline text-editing model for the chat input. Positions are indexes into the array\n * of code points so emoji and other astral characters move as one unit.\n */\n\nexport interface EditorState {\n /** Code points of the buffer. */\n chars: string[];\n /** Cursor position, 0..chars.length. */\n cursor: number;\n}\n\nexport const emptyEditor: EditorState = { chars: [], cursor: 0 };\n\nexport function fromText(text: string): EditorState {\n const chars = [...text];\n return { chars, cursor: chars.length };\n}\n\nexport function textOf(state: EditorState): string {\n return state.chars.join('');\n}\n\n/** Normalise pasted or typed text: CRLF/CR → LF, tabs → two spaces, other controls dropped. */\nexport function normalizeInput(text: string): string {\n return (\n text\n .replace(/\\r\\n?/g, '\\n')\n .replace(/\\t/g, ' ')\n // biome-ignore lint/suspicious/noControlCharactersInRegex: dropping control characters\n .replace(/[\\u0000-\\u0009\\u000b-\\u001f\\u007f]/g, '')\n );\n}\n\nexport function insert(state: EditorState, text: string): EditorState {\n const add = [...normalizeInput(text)];\n if (add.length === 0) return state;\n const chars = [...state.chars.slice(0, state.cursor), ...add, ...state.chars.slice(state.cursor)];\n return { chars, cursor: state.cursor + add.length };\n}\n\nexport function backspace(state: EditorState): EditorState {\n if (state.cursor === 0) return state;\n const chars = [...state.chars.slice(0, state.cursor - 1), ...state.chars.slice(state.cursor)];\n return { chars, cursor: state.cursor - 1 };\n}\n\nexport function deleteForward(state: EditorState): EditorState {\n if (state.cursor >= state.chars.length) return state;\n const chars = [...state.chars.slice(0, state.cursor), ...state.chars.slice(state.cursor + 1)];\n return { chars, cursor: state.cursor };\n}\n\nexport function left(state: EditorState): EditorState {\n return { ...state, cursor: Math.max(0, state.cursor - 1) };\n}\n\nexport function right(state: EditorState): EditorState {\n return { ...state, cursor: Math.min(state.chars.length, state.cursor + 1) };\n}\n\n/** Line and column of the cursor. */\nexport function position(state: EditorState): { line: number; column: number } {\n let line = 0;\n let column = 0;\n for (let i = 0; i < state.cursor; i++) {\n if (state.chars[i] === '\\n') {\n line++;\n column = 0;\n } else {\n column++;\n }\n }\n return { line, column };\n}\n\nexport function lines(state: EditorState): string[][] {\n const out: string[][] = [[]];\n for (const ch of state.chars) {\n if (ch === '\\n') out.push([]);\n else out[out.length - 1]!.push(ch);\n }\n return out;\n}\n\nfunction offsetOf(all: string[][], line: number, column: number): number {\n let offset = 0;\n for (let i = 0; i < line; i++) offset += all[i]!.length + 1;\n return offset + Math.min(column, all[line]!.length);\n}\n\nexport function lineCount(state: EditorState): number {\n return lines(state).length;\n}\n\n/** Move up one line, keeping the column. Returns `undefined` on the first line. */\nexport function up(state: EditorState): EditorState | undefined {\n const { line, column } = position(state);\n if (line === 0) return undefined;\n return { ...state, cursor: offsetOf(lines(state), line - 1, column) };\n}\n\n/** Move down one line, keeping the column. Returns `undefined` on the last line. */\nexport function down(state: EditorState): EditorState | undefined {\n const all = lines(state);\n const { line, column } = position(state);\n if (line >= all.length - 1) return undefined;\n return { ...state, cursor: offsetOf(all, line + 1, column) };\n}\n\nexport function lineStart(state: EditorState): EditorState {\n const { line } = position(state);\n return { ...state, cursor: offsetOf(lines(state), line, 0) };\n}\n\nexport function lineEnd(state: EditorState): EditorState {\n const all = lines(state);\n const { line } = position(state);\n return { ...state, cursor: offsetOf(all, line, all[line]!.length) };\n}\n\n/** Ctrl+U: delete from the start of the line to the cursor. */\nexport function killToLineStart(state: EditorState): EditorState {\n const start = lineStart(state).cursor;\n if (start === state.cursor) return state;\n return {\n chars: [...state.chars.slice(0, start), ...state.chars.slice(state.cursor)],\n cursor: start,\n };\n}\n\n/** Ctrl+K: delete from the cursor to the end of the line. */\nexport function killToLineEnd(state: EditorState): EditorState {\n const end = lineEnd(state).cursor;\n return {\n chars: [...state.chars.slice(0, state.cursor), ...state.chars.slice(end)],\n cursor: state.cursor,\n };\n}\n\n/** Ctrl+W: delete the word before the cursor (and the spaces after it). */\nexport function deleteWordBack(state: EditorState): EditorState {\n let i = state.cursor;\n while (i > 0 && /[ \\t]/.test(state.chars[i - 1]!)) i--;\n while (i > 0 && !/[\\s]/.test(state.chars[i - 1]!)) i--;\n if (i === state.cursor) return backspace(state);\n return { chars: [...state.chars.slice(0, i), ...state.chars.slice(state.cursor)], cursor: i };\n}\n\n/**\n * Enter at the end of a line that ends with a backslash continues on a new line instead of\n * submitting (the Claude Code convention for terminals that cannot send Shift+Enter).\n */\nexport function continuesLine(state: EditorState): boolean {\n return state.cursor > 0 && state.chars[state.cursor - 1] === '\\\\';\n}\n\nexport function newlineAfterBackslash(state: EditorState): EditorState {\n return insert(backspace(state), '\\n');\n}\n","import { Box, Text } from 'ink';\nimport { useTheme } from '../theme-context';\n\nexport interface PickerOption {\n value: string;\n label: string;\n hint?: string;\n}\n\n/** An inline list chosen with ↑/↓ and Enter, or a number; replaces the input box while open. */\nexport function Picker({\n title,\n options,\n index,\n}: {\n title: string;\n options: readonly PickerOption[];\n index: number;\n}) {\n const theme = useTheme();\n const numbered = options.length <= 9;\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>{title}</Text>\n {options.map((option, i) => {\n const on = i === index;\n return (\n <Text key={option.value} dimColor={!on && theme.ink.dim}>\n {on ? '› ' : ' '}\n {numbered ? `${i + 1}. ` : ''}\n <Text bold={on}>{option.label}</Text>\n {option.hint ? <Text dimColor={theme.ink.dim}> {option.hint}</Text> : null}\n </Text>\n );\n })}\n <Text dimColor={theme.ink.dim}>\n ↑↓ select · enter choose{numbered ? ' · 1-9' : ''} · esc cancel\n </Text>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport { bar, formatTokens, levelStyle, percent, visibleWidth } from '../../ui/format';\nimport type { Theme } from '../../ui/theme';\nimport type { ChatState } from '../chat-state';\nimport { useTheme } from '../theme-context';\n\nexport interface StatusInfo {\n /** Transient message (e.g. \"Press Ctrl+C again to exit\"). */\n notice?: string;\n}\n\n/**\n * Left: model · account · failovers · tokens · 5h quota, each shown only once it says\n * something. Right: a notice, or the connection when it is not healthy.\n * Segments are dropped from the end of the left side until the line fits.\n */\nexport function statusSegments(\n theme: Theme,\n state: ChatState,\n info: StatusInfo,\n width: number,\n): { left: string; right: string } {\n const sep = theme.dim(' · ');\n // [priority, text]: lower priorities are dropped first in narrow terminals.\n const left: Array<[number, string]> = [[9, theme.accent(state.model)]];\n if (state.lastAccount) {\n const name = state.lastAccount.label ?? state.lastAccount.id;\n left.push([\n 8,\n `${name}${state.lastAccount.provider ? theme.dim(` (${state.lastAccount.provider})`) : ''}`,\n ]);\n }\n if (state.totalFailovers > 0) {\n left.push([7, theme.warn(`${state.lastFailovers}/${state.totalFailovers} failovers`)]);\n }\n if (state.tokens.prompt + state.tokens.completion > 0) {\n const arrows = theme.unicode ? ['↑', '↓'] : ['in', 'out'];\n left.push([\n 5,\n theme.dim(\n `${formatTokens(state.tokens.prompt)}${arrows[0]} ${formatTokens(state.tokens.completion)}${arrows[1]}`,\n ),\n ]);\n }\n if (state.quota5h !== undefined) {\n left.push([\n 6,\n `${theme.dim('5h')} ${bar(theme, state.quota5h, 6)} ${levelStyle(theme, state.quota5h)(percent(state.quota5h))}`,\n ]);\n }\n\n let right = '';\n if (info.notice) right = theme.warn(info.notice);\n else if (state.connection === 'connecting') right = theme.dim('connecting');\n else if (state.connection === 'offline') right = theme.error('offline');\n\n let kept = left;\n const render = () => kept.map(([, text]) => text).join(sep);\n while (kept.length > 1 && visibleWidth(render()) + visibleWidth(right) + 2 > width) {\n const lowest = Math.min(...kept.map(([p]) => p));\n kept = kept.filter(([p]) => p !== lowest);\n }\n return { left: render(), right };\n}\n\nexport function StatusLine({\n state,\n info,\n width,\n}: {\n state: ChatState;\n info: StatusInfo;\n width: number;\n}) {\n const theme = useTheme();\n const { left, right } = statusSegments(theme, state, info, width - 2);\n return (\n <Box width={width} justifyContent=\"space-between\" paddingX={1}>\n <Text wrap=\"truncate-end\">{left}</Text>\n <Text wrap=\"truncate-start\">{right}</Text>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport { formatTokens } from '../../ui/format';\nimport type { Entry, EntryMeta, StreamingState } from '../chat-state';\nimport { useTheme } from '../theme-context';\nimport { Spinner } from './Spinner';\n\n/** `claude-cli · work · 1.2k tok · 830ms · 1 failover` under an assistant reply. */\nexport function metaLine(meta: EntryMeta): string {\n const parts: string[] = [];\n if (meta.accountLabel ?? meta.accountId) {\n parts.push([meta.provider, meta.accountLabel ?? meta.accountId].filter(Boolean).join(' · '));\n }\n if (meta.model) parts.push(meta.model);\n if (meta.tokens !== undefined)\n parts.push(`${meta.estimated ? '~' : ''}${formatTokens(meta.tokens)} tok`);\n if (meta.latencyMs !== undefined) parts.push(`${(meta.latencyMs / 1000).toFixed(1)}s`);\n if (meta.failovers) parts.push(`${meta.failovers} failover${meta.failovers === 1 ? '' : 's'}`);\n if (meta.cancelled) parts.push('cancelled');\n return parts.join(' · ');\n}\n\nfunction Marker({ color, glyph }: { color: string | undefined; glyph: string }) {\n return (\n <Box width={2} flexShrink={0}>\n <Text color={color}>{glyph}</Text>\n </Box>\n );\n}\n\nexport function EntryView({ entry }: { entry: Entry }) {\n const theme = useTheme();\n switch (entry.kind) {\n case 'banner':\n return (\n <Box marginBottom={1}>\n <Text>{entry.text}</Text>\n </Box>\n );\n case 'user':\n return (\n <Box marginBottom={1}>\n <Marker color={theme.ink.accent} glyph={theme.glyph.prompt} />\n <Text dimColor={theme.ink.dim}>{entry.text}</Text>\n </Box>\n );\n case 'assistant':\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Marker color={theme.ink.accent} glyph={theme.glyph.dot} />\n <Text>\n {entry.text || (entry.meta?.cancelled ? '(cancelled before any output)' : '')}\n </Text>\n </Box>\n {entry.meta ? (\n <Box paddingLeft={2}>\n <Text dimColor={theme.ink.dim}>{metaLine(entry.meta)}</Text>\n </Box>\n ) : null}\n </Box>\n );\n case 'error':\n return (\n <Box marginBottom={1}>\n <Marker color={theme.ink.error} glyph={theme.glyph.fail} />\n <Text color={theme.ink.error}>{entry.text}</Text>\n </Box>\n );\n default:\n return (\n <Box marginBottom={1} paddingLeft={2}>\n <Text>{entry.text}</Text>\n </Box>\n );\n }\n}\n\n/** The reply being streamed: spinner until the first token, then the growing text. */\nexport function StreamingView({ streaming, now }: { streaming: StreamingState; now: number }) {\n const theme = useTheme();\n const seconds = Math.max(0, (now - streaming.startedAt) / 1000).toFixed(0);\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {streaming.text ? (\n <Box>\n <Marker color={theme.ink.accent} glyph={theme.glyph.dot} />\n <Text>{streaming.text}</Text>\n </Box>\n ) : null}\n <Box paddingLeft={streaming.text ? 2 : 0}>\n <Spinner />\n <Text dimColor={theme.ink.dim}>\n {' '}\n {streaming.text ? 'streaming' : 'thinking'} {seconds}s · esc to cancel\n </Text>\n </Box>\n </Box>\n );\n}\n","/** Slash commands understood by the chat TUI. */\n\nexport type SlashName =\n | 'help'\n | 'model'\n | 'connect'\n | 'route'\n | 'accounts'\n | 'tasks'\n | 'status'\n | 'login'\n | 'logout'\n | 'account'\n | 'clear'\n | 'exit';\n\nexport interface SlashCommand {\n name: SlashName;\n args?: string;\n description: string;\n aliases?: string[];\n}\n\nexport const SLASH_COMMANDS: readonly SlashCommand[] = [\n { name: 'model', args: '[id]', description: 'show models or switch, e.g. /model davecode/auto' },\n {\n name: 'connect',\n description: 'connect Claude Code, Codex or Antigravity, or sign in to one again',\n },\n { name: 'route', description: 'routes and their failover targets' },\n { name: 'accounts', description: 'accounts with 5h quota usage' },\n { name: 'tasks', description: 'the project task graph' },\n { name: 'status', description: 'model, agents and whether they are signed in' },\n { name: 'login', description: 'sign in to your DaveCode account in the browser' },\n { name: 'logout', description: 'sign out of your DaveCode account' },\n { name: 'account', description: 'the signed-in DaveCode account' },\n { name: 'clear', description: 'clear the transcript and start a new conversation' },\n { name: 'help', description: 'commands and keyboard shortcuts', aliases: ['?'] },\n { name: 'exit', description: 'quit DaveCode', aliases: ['quit', 'q'] },\n];\n\nexport type SlashParse =\n | { kind: 'command'; command: SlashCommand; args: string }\n | { kind: 'unknown'; name: string }\n | { kind: 'none' };\n\n/** `/model gpt-5` → the model command with args `gpt-5`. Text without a leading `/` is a prompt. */\nexport function parseSlash(input: string): SlashParse {\n const text = input.trim();\n if (!text.startsWith('/') || text.startsWith('//')) return { kind: 'none' };\n const [head = '', ...rest] = text.slice(1).split(/\\s+/);\n const name = head.toLowerCase();\n if (!name) return { kind: 'unknown', name: '' };\n const command = SLASH_COMMANDS.find((c) => c.name === name || c.aliases?.includes(name));\n if (!command) return { kind: 'unknown', name };\n return { kind: 'command', command, args: rest.join(' ').trim() };\n}\n\n/** Commands matching what has been typed so far (only while typing the command name). */\nexport function slashSuggestions(input: string): SlashCommand[] {\n if (!input.startsWith('/') || /\\s/.test(input)) return [];\n const prefix = input.slice(1).toLowerCase();\n return SLASH_COMMANDS.filter(\n (c) => c.name.startsWith(prefix) || c.aliases?.some((a) => a.startsWith(prefix) && prefix),\n );\n}\n\nexport const KEY_HINTS: ReadonlyArray<[string, string]> = [\n ['Enter', 'send'],\n ['Shift+Enter, Ctrl+J or \\\\ Enter', 'new line'],\n ['↑ / ↓', 'move between lines, then through history'],\n ['/', 'command menu: ↑ / ↓ to choose, Enter to run, Tab to fill, Esc to close'],\n ['Esc', 'cancel the response in flight'],\n ['Ctrl+U / Ctrl+K / Ctrl+W', 'delete to line start / line end / previous word'],\n ['Ctrl+C twice', 'exit'],\n];\n","import { emptyUsage, renderAccounts } from '../commands/status';\nimport { formatTaskTree, summaryLine } from '../lib/task-tree';\nimport { padEnd } from '../ui/format';\nimport type { Theme } from '../ui/theme';\nimport type { ChatBackend } from './backend';\nimport { KEY_HINTS, SLASH_COMMANDS } from './slash';\n\n/** Text produced by the informational slash commands (ANSI-styled, rendered as-is by Ink). */\n\nexport function helpText(theme: Theme): string {\n const width = Math.max(...SLASH_COMMANDS.map((c) => c.name.length + (c.args?.length ?? 0))) + 4;\n const commands = SLASH_COMMANDS.map(\n (c) =>\n `${theme.accent(padEnd(`/${c.name}${c.args ? ` ${c.args}` : ''}`, width))}${theme.dim(c.description)}`,\n );\n const keyWidth = Math.max(...KEY_HINTS.map(([k]) => k.length)) + 2;\n const keys = KEY_HINTS.map(([k, v]) => `${padEnd(k, keyWidth)}${theme.dim(v)}`);\n return [theme.bold('Commands'), ...commands, '', theme.bold('Keys'), ...keys].join('\\n');\n}\n\nexport async function modelsText(theme: Theme, backend: ChatBackend, current: string) {\n const models = await backend.models();\n const ids = models\n .map((m) => m.id)\n .sort((a, b) => {\n const da = a.startsWith('davecode/') ? 0 : 1;\n const db = b.startsWith('davecode/') ? 0 : 1;\n return da - db || a.localeCompare(b);\n });\n if (ids.length === 0)\n return theme.dim('No models yet. Add an account with `davecode accounts add`.');\n const shown = ids.slice(0, 40);\n const lines = shown.map((id) =>\n id === current ? `${theme.accent(theme.glyph.dot)} ${theme.accent(id)}` : ` ${id}`,\n );\n if (ids.length > shown.length) lines.push(theme.dim(` … and ${ids.length - shown.length} more`));\n lines.push('', theme.dim('Switch with /model <id>'));\n return lines.join('\\n');\n}\n\nexport async function routesText(theme: Theme, backend: ChatBackend) {\n const { defaultRoute, routes } = await backend.routes();\n if (routes.length === 0) {\n return [\n `${theme.dim('No routes configured.')} davecode/${defaultRoute} uses every account with a default model.`,\n theme.dim('Define routes under routing.routes in ~/.davecode/config.json.'),\n ].join('\\n');\n }\n const lines: string[] = [];\n for (const route of routes) {\n const mark = route.name === defaultRoute ? theme.dim(' (default)') : '';\n lines.push(\n `${theme.accent(`davecode/${route.name}`)}${mark}${route.description ? theme.dim(` ${route.description}`) : ''}`,\n );\n route.targets.forEach((t, i) => {\n lines.push(\n ` ${theme.dim(`${i + 1}.`)} ${t.provider}/${t.model}${t.accountId ? theme.dim(` @${t.accountId}`) : ''}`,\n );\n });\n }\n return lines.join('\\n');\n}\n\nexport async function accountsText(theme: Theme, backend: ChatBackend, columns: number) {\n const [accounts, usage] = await Promise.all([backend.accounts(), backend.usage()]);\n if (accounts.length === 0)\n return theme.dim('No accounts yet. Add one with `davecode accounts add`.');\n const byId = new Map(usage.map((u) => [u.accountId, u]));\n return renderAccounts(\n theme,\n accounts.map((account) => ({ account, usage: byId.get(account.id) ?? emptyUsage(account.id) })),\n columns,\n ).join('\\n');\n}\n\nexport async function tasksText(theme: Theme, backend: ChatBackend, columns: number) {\n const { project, graph } = await backend.tasks();\n if (!project)\n return theme.dim('No project brain is being served. Start DaveCode inside a repository.');\n if (graph.tasks.length === 0) {\n return theme.dim(`${project.name}: no tasks yet. Add one with \\`davecode tasks add\\`.`);\n }\n return [\n `${theme.bold(project.name)} ${summaryLine(theme, graph)}`,\n '',\n ...formatTaskTree(theme, graph, { width: columns }),\n ].join('\\n');\n}\n\nexport async function statusText(theme: Theme, backend: ChatBackend, model: string) {\n const health = await backend.health();\n if (!health) return theme.error('DaveCode is not answering. Restart it with davecode.');\n const [accounts, runner] = await Promise.all([\n backend.accounts(),\n backend.runner().catch(() => undefined),\n ]);\n const state = (status: string) =>\n status === 'error'\n ? theme.error('needs sign-in · /connect')\n : status === 'cooldown'\n ? theme.warn('cooling down')\n : status === 'disabled'\n ? theme.dim('off')\n : theme.ok('ready');\n const lines = [`${theme.dim('model ')} ${model}`];\n if (accounts.length === 0) lines.push(`${theme.dim('agents')} none yet · /connect`);\n for (const [i, account] of accounts.entries()) {\n lines.push(\n `${theme.dim(i === 0 ? 'agents' : ' ')} ${account.label} ${state(account.status)}`,\n );\n }\n lines.push(`${theme.dim('runner')} ${runner ? runner.state : 'unknown'}`);\n return lines.join('\\n');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,OAAAA,MAAK,QAAQ,QAAQ,UAAU,UAAU,WAAW,qBAAqB;AAClF,SAAS,aAAa,WAAW,YAAY,QAAQ,gBAAgB;;;ACsF9D,SAAS,iBAAiB,OAA0B;AACzD,SAAO;AAAA,IACL,SAAS,CAAC;AAAA,IACV,cAAc,CAAC;AAAA,IACf;AAAA,IACA,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,QAAQ,EAAE,QAAQ,GAAG,YAAY,EAAE;AAAA,IACnC,OAAO;AAAA,IACP,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,EACV;AACF;AAGO,SAAS,eAAe,MAAsB;AACnD,SAAO,KAAK,KAAK,KAAK,SAAS,CAAC;AAClC;AAEA,SAAS,KAAK,OAAkB,MAAiB,MAAc,MAA6B;AAC1F,QAAM,QAAe,EAAE,IAAI,MAAM,QAAQ,MAAM,KAAK;AACpD,MAAI,KAAM,OAAM,OAAO;AACvB,SAAO,EAAE,GAAG,OAAO,SAAS,CAAC,GAAG,MAAM,SAAS,KAAK,GAAG,QAAQ,MAAM,SAAS,EAAE;AAClF;AAEO,SAAS,YAAY,OAAkB,QAA+B;AAC3E,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,KAAK,OAAO,UAAU,OAAO,IAAI;AAAA,IAC1C,KAAK;AACH,aAAO,KAAK,OAAO,QAAQ,OAAO,IAAI;AAAA,IACxC,KAAK;AACH,aAAO,KAAK,OAAO,SAAS,OAAO,IAAI;AAAA,IACzC,KAAK,QAAQ;AACX,YAAM,OAAO,KAAK,OAAO,QAAQ,OAAO,IAAI;AAC5C,YAAM,UACJ,MAAM,QAAQ,MAAM,QAAQ,SAAS,CAAC,MAAM,OAAO,OAC/C,MAAM,UACN,CAAC,GAAG,MAAM,SAAS,OAAO,IAAI,EAAE,MAAM,IAAI;AAChD,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,cAAc,CAAC,GAAG,MAAM,cAAc,EAAE,MAAM,QAAQ,SAAS,OAAO,KAAK,CAAC;AAAA,MAC9E;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW,EAAE,IAAI,MAAM,QAAQ,MAAM,IAAI,WAAW,OAAO,KAAK,OAAO,MAAM,MAAM;AAAA,QACnF,QAAQ,MAAM,SAAS;AAAA,MACzB;AAAA,IACF,KAAK,eAAe;AAClB,UAAI,CAAC,MAAM,UAAW,QAAO;AAC7B,YAAM,YAAY,EAAE,GAAG,MAAM,UAAU;AACvC,UAAI,OAAO,UAAW,WAAU,YAAY,OAAO;AACnD,UAAI,OAAO,SAAU,WAAU,WAAW,OAAO;AACjD,UAAI,OAAO,cAAc,OAAW,WAAU,YAAY,OAAO;AACjE,YAAM,cAAc,OAAO,YACvB;AAAA,QACE,IAAI,OAAO;AAAA,QACX,GAAI,OAAO,eAAe,EAAE,OAAO,OAAO,aAAa,IAAI,CAAC;AAAA,QAC5D,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,MACzD,IACA,MAAM;AACV,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACrC,GAAI,OAAO,cAAc,SACrB;AAAA,UACE,eAAe,OAAO;AAAA,UACtB,gBAAgB,MAAM,iBAAiB,OAAO;AAAA,QAChD,IACA,CAAC;AAAA,MACP;AAAA,IACF;AAAA,IACA,KAAK;AACH,UAAI,CAAC,MAAM,UAAW,QAAO;AAC7B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW,EAAE,GAAG,MAAM,WAAW,MAAM,MAAM,UAAU,OAAO,OAAO,KAAK;AAAA,MAC5E;AAAA,IACF,KAAK,cAAc;AACjB,YAAM,OAAO,MAAM;AACnB,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,SACJ,OAAO,OAAO,iBACd;AAAA,QACE,MAAM,aACH,IAAI,CAAC,MAAO,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU,EAAG,EAC3D,KAAK,IAAI;AAAA,MACd;AACF,YAAM,aAAa,OAAO,OAAO,qBAAqB,eAAe,KAAK,IAAI;AAC9E,YAAM,OAAkB;AAAA,QACtB,OAAO,KAAK;AAAA,QACZ,WAAW,OAAO,MAAM,KAAK;AAAA,QAC7B,QAAQ,SAAS;AAAA,QACjB,GAAI,OAAO,QAAQ,CAAC,IAAI,EAAE,WAAW,KAAK;AAAA,QAC1C,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,QACtD,GAAI,MAAM,aAAa,OAAO,KAAK,aAAa,MAAM,aAAa,QAC/D,EAAE,cAAc,MAAM,YAAY,MAAM,IACxC,CAAC;AAAA,QACL,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACnD,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,QACtD,GAAI,OAAO,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,MAChD;AACA,UAAI,OAAkB,EAAE,GAAG,MAAM;AACjC,aAAO,KAAK;AACZ,YAAM,WAAW,KAAK,KAAK,SAAS;AACpC,UAAI,YAAY,OAAO,UAAW,QAAO,KAAK,MAAM,aAAa,KAAK,MAAM,IAAI;AAChF,UAAI,OAAO,MAAO,QAAO,KAAK,MAAM,SAAS,OAAO,KAAK;AAGzD,UAAI,YAAY,CAAC,OAAO,aAAa,CAAC,OAAO,OAAO;AAClD,aAAK,eAAe,CAAC,GAAG,KAAK,cAAc,EAAE,MAAM,aAAa,SAAS,KAAK,KAAK,CAAC;AAAA,MACtF,WAAW,KAAK,aAAa,KAAK,aAAa,SAAS,CAAC,GAAG,SAAS,QAAQ;AAC3E,aAAK,eAAe,KAAK,aAAa,MAAM,GAAG,EAAE;AAAA,MACnD;AACA,UAAI,YAAY,OAAO,OAAO;AAC5B,aAAK,SAAS;AAAA,UACZ,QAAQ,MAAM,OAAO,SAAS;AAAA,UAC9B,YAAY,MAAM,OAAO,aAAa;AAAA,QACxC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,IACzC,KAAK;AACH,aAAO,MAAM,eAAe,OAAO,aAC/B,QACA,EAAE,GAAG,OAAO,YAAY,OAAO,WAAW;AAAA,IAChD,KAAK,SAAS;AACZ,UAAI,MAAM,aAAa,OAAO,OAAO,UAAW,QAAO;AACvD,YAAM,OAAO,EAAE,GAAG,MAAM;AACxB,UAAI,OAAO,gBAAgB,OAAW,QAAO,KAAK;AAAA,UAC7C,MAAK,UAAU,OAAO;AAC3B,aAAO;AAAA,IACT;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,OAAkB;AAAA,QACtB,GAAG;AAAA,QACH,SAAS,CAAC;AAAA,QACV,cAAc,CAAC;AAAA,QACf,OAAO,MAAM,QAAQ;AAAA,MACvB;AACA,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;;;ACjPA,SAAS,KAAK,YAAY;;;ACYnB,IAAM,cAA2B,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAE;AAExD,SAAS,SAAS,MAA2B;AAClD,QAAM,QAAQ,CAAC,GAAG,IAAI;AACtB,SAAO,EAAE,OAAO,QAAQ,MAAM,OAAO;AACvC;AAEO,SAAS,OAAO,OAA4B;AACjD,SAAO,MAAM,MAAM,KAAK,EAAE;AAC5B;AAGO,SAAS,eAAe,MAAsB;AACnD,SACE,KACG,QAAQ,UAAU,IAAI,EACtB,QAAQ,OAAO,IAAI,EAEnB,QAAQ,uCAAuC,EAAE;AAExD;AAEO,SAAS,OAAO,OAAoB,MAA2B;AACpE,QAAM,MAAM,CAAC,GAAG,eAAe,IAAI,CAAC;AACpC,MAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,QAAM,QAAQ,CAAC,GAAG,MAAM,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC;AAChG,SAAO,EAAE,OAAO,QAAQ,MAAM,SAAS,IAAI,OAAO;AACpD;AAEO,SAAS,UAAU,OAAiC;AACzD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,QAAQ,CAAC,GAAG,MAAM,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC;AAC5F,SAAO,EAAE,OAAO,QAAQ,MAAM,SAAS,EAAE;AAC3C;AAEO,SAAS,cAAc,OAAiC;AAC7D,MAAI,MAAM,UAAU,MAAM,MAAM,OAAQ,QAAO;AAC/C,QAAM,QAAQ,CAAC,GAAG,MAAM,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,GAAG,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC,CAAC;AAC5F,SAAO,EAAE,OAAO,QAAQ,MAAM,OAAO;AACvC;AAEO,SAAS,KAAK,OAAiC;AACpD,SAAO,EAAE,GAAG,OAAO,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE;AAC3D;AAEO,SAAS,MAAM,OAAiC;AACrD,SAAO,EAAE,GAAG,OAAO,QAAQ,KAAK,IAAI,MAAM,MAAM,QAAQ,MAAM,SAAS,CAAC,EAAE;AAC5E;AAGO,SAAS,SAAS,OAAsD;AAC7E,MAAI,OAAO;AACX,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,QAAI,MAAM,MAAM,CAAC,MAAM,MAAM;AAC3B;AACA,eAAS;AAAA,IACX,OAAO;AACL;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,MAAM,OAAO;AACxB;AAEO,SAAS,MAAM,OAAgC;AACpD,QAAM,MAAkB,CAAC,CAAC,CAAC;AAC3B,aAAW,MAAM,MAAM,OAAO;AAC5B,QAAI,OAAO,KAAM,KAAI,KAAK,CAAC,CAAC;AAAA,QACvB,KAAI,IAAI,SAAS,CAAC,EAAG,KAAK,EAAE;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,SAAS,KAAiB,MAAc,QAAwB;AACvE,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,IAAK,WAAU,IAAI,CAAC,EAAG,SAAS;AAC1D,SAAO,SAAS,KAAK,IAAI,QAAQ,IAAI,IAAI,EAAG,MAAM;AACpD;AAOO,SAAS,GAAG,OAA6C;AAC9D,QAAM,EAAE,MAAM,OAAO,IAAI,SAAS,KAAK;AACvC,MAAI,SAAS,EAAG,QAAO;AACvB,SAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,EAAE;AACtE;AAGO,SAAS,KAAK,OAA6C;AAChE,QAAM,MAAM,MAAM,KAAK;AACvB,QAAM,EAAE,MAAM,OAAO,IAAI,SAAS,KAAK;AACvC,MAAI,QAAQ,IAAI,SAAS,EAAG,QAAO;AACnC,SAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,KAAK,OAAO,GAAG,MAAM,EAAE;AAC7D;AAEO,SAAS,UAAU,OAAiC;AACzD,QAAM,EAAE,KAAK,IAAI,SAAS,KAAK;AAC/B,SAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE;AAC7D;AAEO,SAAS,QAAQ,OAAiC;AACvD,QAAM,MAAM,MAAM,KAAK;AACvB,QAAM,EAAE,KAAK,IAAI,SAAS,KAAK;AAC/B,SAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,KAAK,MAAM,IAAI,IAAI,EAAG,MAAM,EAAE;AACpE;AAGO,SAAS,gBAAgB,OAAiC;AAC/D,QAAM,QAAQ,UAAU,KAAK,EAAE;AAC/B,MAAI,UAAU,MAAM,OAAQ,QAAO;AACnC,SAAO;AAAA,IACL,OAAO,CAAC,GAAG,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC;AAAA,IAC1E,QAAQ;AAAA,EACV;AACF;AAGO,SAAS,cAAc,OAAiC;AAC7D,QAAM,MAAM,QAAQ,KAAK,EAAE;AAC3B,SAAO;AAAA,IACL,OAAO,CAAC,GAAG,MAAM,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,GAAG,MAAM,MAAM,MAAM,GAAG,CAAC;AAAA,IACxE,QAAQ,MAAM;AAAA,EAChB;AACF;AAGO,SAAS,eAAe,OAAiC;AAC9D,MAAI,IAAI,MAAM;AACd,SAAO,IAAI,KAAK,QAAQ,KAAK,MAAM,MAAM,IAAI,CAAC,CAAE,EAAG;AACnD,SAAO,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,MAAM,IAAI,CAAC,CAAE,EAAG;AACnD,MAAI,MAAM,MAAM,OAAQ,QAAO,UAAU,KAAK;AAC9C,SAAO,EAAE,OAAO,CAAC,GAAG,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC,GAAG,QAAQ,EAAE;AAC9F;AAMO,SAAS,cAAc,OAA6B;AACzD,SAAO,MAAM,SAAS,KAAK,MAAM,MAAM,MAAM,SAAS,CAAC,MAAM;AAC/D;AAEO,SAAS,sBAAsB,OAAiC;AACrE,SAAO,OAAO,UAAU,KAAK,GAAG,IAAI;AACtC;;;ADhHc,cAKA,YALA;AAzCP,SAAS,YACd,MACA,QAC+C;AAC/C,MAAI,WAAW,OAAW,QAAO,EAAE,QAAQ,KAAK,KAAK,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG;AAC5E,SAAO;AAAA,IACL,QAAQ,KAAK,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE;AAAA,IACrC,IAAI,KAAK,MAAM,KAAK;AAAA,IACpB,OAAO,KAAK,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE;AAAA,EACvC;AACF;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,QAAQ,SAAS;AACvB,QAAM,MAAM,MAAM,MAAM;AACxB,QAAM,SAAS,SAAS,MAAM;AAC9B,QAAM,QAAQ,OAAO,MAAM,WAAW;AACtC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAa,MAAM,UAAU,UAAU;AAAA,MACvC,gBAAgB,MAAM,IAAI;AAAA,MAC1B,eAAc;AAAA,MACd,UAAU;AAAA,MACV;AAAA,MAEC,cAAI,IAAI,CAAC,MAAM,MAAM;AACpB,cAAM,QAAQ,YAAY,MAAM,CAAC,YAAY,MAAM,OAAO,OAAO,OAAO,SAAS,MAAS;AAC1F;AAAA;AAAA,UAEE,qBAAC,OACC;AAAA,gCAAC,OAAI,OAAO,GAAG,YAAY,GACzB,8BAAC,QAAK,OAAO,MAAM,IAAI,MAAM,IAAI,SAAS,QACvC,gBAAM,IAAI,MAAM,MAAM,SAAS,IAClC,GACF;AAAA,YACC,SAAS,MAAM,IACd,qBAAC,QACE;AAAA,yBAAW,OAAO,oBAAC,QAAK,SAAO,MAAC,eAAC;AAAA,cAClC,oBAAC,QAAK,UAAU,MAAM,IAAI,KAAM,uBAAY;AAAA,eAC9C,IAEA,qBAAC,QACE;AAAA,oBAAM;AAAA,cACN,MAAM,KAAK,oBAAC,QAAK,SAAO,MAAE,gBAAM,IAAG,IAAU;AAAA,cAC7C,MAAM;AAAA,eACT;AAAA,eAhBM,CAkBV;AAAA;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;AAGO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAIG;AACD,QAAM,QAAQ,SAAS;AACvB,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAM,YACJ,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,UAAU,EAAE,OAAO,EAAE,KAAK,SAAS,IAAI,EAAE,CAAC,IAAI;AACvF,SACE,oBAAC,OAAI,eAAc,UAAS,UAAU,GAAG,OACtC,mBAAS,IAAI,CAAC,GAAG,MAAM;AACtB,UAAM,SAAS,MAAM;AACrB,WACE,qBAAC,QAAkB,MAAK,gBACtB;AAAA,0BAAC,QAAK,MAAM,QAAQ,UAAU,CAAC,UAAU,MAAM,IAAI,KAChD,aAAG,SAAS,MAAM,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,IAAI,KAAK,EAAE,GAAG,OAAO,SAAS,CAAC,IACtG;AAAA,MACA,oBAAC,QAAK,UAAU,MAAM,IAAI,KAAM,YAAE,aAAY;AAAA,SAJrC,EAAE,IAKb;AAAA,EAEJ,CAAC,GACH;AAEJ;;;AEnGA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAuBpB,gBAAAC,MAQqB,QAAAC,aARrB;AAbC,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQ,SAAS;AACvB,QAAM,WAAW,QAAQ,UAAU;AACnC,SACE,gBAAAA,MAACC,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,oBAAAF,KAACG,OAAA,EAAK,MAAI,MAAE,iBAAM;AAAA,IACjB,QAAQ,IAAI,CAAC,QAAQ,MAAM;AAC1B,YAAM,KAAK,MAAM;AACjB,aACE,gBAAAF,MAACE,OAAA,EAAwB,UAAU,CAAC,MAAM,MAAM,IAAI,KACjD;AAAA,aAAK,YAAO;AAAA,QACZ,WAAW,GAAG,IAAI,CAAC,OAAO;AAAA,QAC3B,gBAAAH,KAACG,OAAA,EAAK,MAAM,IAAK,iBAAO,OAAM;AAAA,QAC7B,OAAO,OAAO,gBAAAF,MAACE,OAAA,EAAK,UAAU,MAAM,IAAI,KAAK;AAAA;AAAA,UAAE,OAAO;AAAA,WAAK,IAAU;AAAA,WAJ7D,OAAO,KAKlB;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAAF,MAACE,OAAA,EAAK,UAAU,MAAM,IAAI,KAAK;AAAA;AAAA,MACJ,WAAW,cAAW;AAAA,MAAG;AAAA,OACpD;AAAA,KACF;AAEJ;;;ACxCA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AA6EtB,SACE,OAAAC,MADF,QAAAC,aAAA;AA7DG,SAAS,eACd,OACA,OACA,MACA,OACiC;AACjC,QAAM,MAAM,MAAM,IAAI,QAAK;AAE3B,QAAMC,QAAgC,CAAC,CAAC,GAAG,MAAM,OAAO,MAAM,KAAK,CAAC,CAAC;AACrE,MAAI,MAAM,aAAa;AACrB,UAAM,OAAO,MAAM,YAAY,SAAS,MAAM,YAAY;AAC1D,IAAAA,MAAK,KAAK;AAAA,MACR;AAAA,MACA,GAAG,IAAI,GAAG,MAAM,YAAY,WAAW,MAAM,IAAI,KAAK,MAAM,YAAY,QAAQ,GAAG,IAAI,EAAE;AAAA,IAC3F,CAAC;AAAA,EACH;AACA,MAAI,MAAM,iBAAiB,GAAG;AAC5B,IAAAA,MAAK,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,MAAM,aAAa,IAAI,MAAM,cAAc,YAAY,CAAC,CAAC;AAAA,EACvF;AACA,MAAI,MAAM,OAAO,SAAS,MAAM,OAAO,aAAa,GAAG;AACrD,UAAM,SAAS,MAAM,UAAU,CAAC,UAAK,QAAG,IAAI,CAAC,MAAM,KAAK;AACxD,IAAAA,MAAK,KAAK;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,GAAG,aAAa,MAAM,OAAO,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,aAAa,MAAM,OAAO,UAAU,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,MACvG;AAAA,IACF,CAAC;AAAA,EACH;AACA,MAAI,MAAM,YAAY,QAAW;AAC/B,IAAAA,MAAK,KAAK;AAAA,MACR;AAAA,MACA,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,MAAM,SAAS,CAAC,CAAC,IAAI,WAAW,OAAO,MAAM,OAAO,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC;AAAA,IAChH,CAAC;AAAA,EACH;AAEA,MAAIC,SAAQ;AACZ,MAAI,KAAK,OAAQ,CAAAA,SAAQ,MAAM,KAAK,KAAK,MAAM;AAAA,WACtC,MAAM,eAAe,aAAc,CAAAA,SAAQ,MAAM,IAAI,YAAY;AAAA,WACjE,MAAM,eAAe,UAAW,CAAAA,SAAQ,MAAM,MAAM,SAAS;AAEtE,MAAI,OAAOD;AACX,QAAM,SAAS,MAAM,KAAK,IAAI,CAAC,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,KAAK,GAAG;AAC1D,SAAO,KAAK,SAAS,KAAK,aAAa,OAAO,CAAC,IAAI,aAAaC,MAAK,IAAI,IAAI,OAAO;AAClF,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/C,WAAO,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,MAAM;AAAA,EAC1C;AACA,SAAO,EAAE,MAAM,OAAO,GAAG,OAAAA,OAAM;AACjC;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQ,SAAS;AACvB,QAAM,EAAE,MAAAD,OAAM,OAAAC,OAAM,IAAI,eAAe,OAAO,OAAO,MAAM,QAAQ,CAAC;AACpE,SACE,gBAAAF,MAACG,MAAA,EAAI,OAAc,gBAAe,iBAAgB,UAAU,GAC1D;AAAA,oBAAAJ,KAACK,OAAA,EAAK,MAAK,gBAAgB,UAAAH,OAAK;AAAA,IAChC,gBAAAF,KAACK,OAAA,EAAK,MAAK,kBAAkB,UAAAF,QAAM;AAAA,KACrC;AAEJ;;;AClFA,SAAS,OAAAG,MAAK,QAAAC,aAAY;AAwBpB,gBAAAC,MAgBE,QAAAC,aAhBF;AAjBC,SAAS,SAAS,MAAyB;AAChD,QAAM,QAAkB,CAAC;AACzB,MAAI,KAAK,gBAAgB,KAAK,WAAW;AACvC,UAAM,KAAK,CAAC,KAAK,UAAU,KAAK,gBAAgB,KAAK,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,CAAC;AAAA,EAC7F;AACA,MAAI,KAAK,MAAO,OAAM,KAAK,KAAK,KAAK;AACrC,MAAI,KAAK,WAAW;AAClB,UAAM,KAAK,GAAG,KAAK,YAAY,MAAM,EAAE,GAAG,aAAa,KAAK,MAAM,CAAC,MAAM;AAC3E,MAAI,KAAK,cAAc,OAAW,OAAM,KAAK,IAAI,KAAK,YAAY,KAAM,QAAQ,CAAC,CAAC,GAAG;AACrF,MAAI,KAAK,UAAW,OAAM,KAAK,GAAG,KAAK,SAAS,YAAY,KAAK,cAAc,IAAI,KAAK,GAAG,EAAE;AAC7F,MAAI,KAAK,UAAW,OAAM,KAAK,WAAW;AAC1C,SAAO,MAAM,KAAK,QAAK;AACzB;AAEA,SAAS,OAAO,EAAE,OAAO,MAAM,GAAiD;AAC9E,SACE,gBAAAD,KAACE,MAAA,EAAI,OAAO,GAAG,YAAY,GACzB,0BAAAF,KAACG,OAAA,EAAK,OAAe,iBAAM,GAC7B;AAEJ;AAEO,SAAS,UAAU,EAAE,MAAM,GAAqB;AACrD,QAAM,QAAQ,SAAS;AACvB,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE,gBAAAH,KAACE,MAAA,EAAI,cAAc,GACjB,0BAAAF,KAACG,OAAA,EAAM,gBAAM,MAAK,GACpB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAF,MAACC,MAAA,EAAI,cAAc,GACjB;AAAA,wBAAAF,KAAC,UAAO,OAAO,MAAM,IAAI,QAAQ,OAAO,MAAM,MAAM,QAAQ;AAAA,QAC5D,gBAAAA,KAACG,OAAA,EAAK,UAAU,MAAM,IAAI,KAAM,gBAAM,MAAK;AAAA,SAC7C;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UAAS,cAAc,GACxC;AAAA,wBAAAD,MAACC,MAAA,EACC;AAAA,0BAAAF,KAAC,UAAO,OAAO,MAAM,IAAI,QAAQ,OAAO,MAAM,MAAM,KAAK;AAAA,UACzD,gBAAAA,KAACG,OAAA,EACE,gBAAM,SAAS,MAAM,MAAM,YAAY,kCAAkC,KAC5E;AAAA,WACF;AAAA,QACC,MAAM,OACL,gBAAAH,KAACE,MAAA,EAAI,aAAa,GAChB,0BAAAF,KAACG,OAAA,EAAK,UAAU,MAAM,IAAI,KAAM,mBAAS,MAAM,IAAI,GAAE,GACvD,IACE;AAAA,SACN;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAF,MAACC,MAAA,EAAI,cAAc,GACjB;AAAA,wBAAAF,KAAC,UAAO,OAAO,MAAM,IAAI,OAAO,OAAO,MAAM,MAAM,MAAM;AAAA,QACzD,gBAAAA,KAACG,OAAA,EAAK,OAAO,MAAM,IAAI,OAAQ,gBAAM,MAAK;AAAA,SAC5C;AAAA,IAEJ;AACE,aACE,gBAAAH,KAACE,MAAA,EAAI,cAAc,GAAG,aAAa,GACjC,0BAAAF,KAACG,OAAA,EAAM,gBAAM,MAAK,GACpB;AAAA,EAEN;AACF;AAGO,SAAS,cAAc,EAAE,WAAW,IAAI,GAA+C;AAC5F,QAAM,QAAQ,SAAS;AACvB,QAAM,UAAU,KAAK,IAAI,IAAI,MAAM,UAAU,aAAa,GAAI,EAAE,QAAQ,CAAC;AACzE,SACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UAAS,cAAc,GACvC;AAAA,cAAU,OACT,gBAAAD,MAACC,MAAA,EACC;AAAA,sBAAAF,KAAC,UAAO,OAAO,MAAM,IAAI,QAAQ,OAAO,MAAM,MAAM,KAAK;AAAA,MACzD,gBAAAA,KAACG,OAAA,EAAM,oBAAU,MAAK;AAAA,OACxB,IACE;AAAA,IACJ,gBAAAF,MAACC,MAAA,EAAI,aAAa,UAAU,OAAO,IAAI,GACrC;AAAA,sBAAAF,KAAC,WAAQ;AAAA,MACT,gBAAAC,MAACE,OAAA,EAAK,UAAU,MAAM,IAAI,KACvB;AAAA;AAAA,QACA,UAAU,OAAO,cAAc;AAAA,QAAW;AAAA,QAAE;AAAA,QAAQ;AAAA,SACvD;AAAA,OACF;AAAA,KACF;AAEJ;;;AC3EO,IAAM,iBAA0C;AAAA,EACrD,EAAE,MAAM,SAAS,MAAM,QAAQ,aAAa,mDAAmD;AAAA,EAC/F;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,EAAE,MAAM,SAAS,aAAa,oCAAoC;AAAA,EAClE,EAAE,MAAM,YAAY,aAAa,+BAA+B;AAAA,EAChE,EAAE,MAAM,SAAS,aAAa,yBAAyB;AAAA,EACvD,EAAE,MAAM,UAAU,aAAa,+CAA+C;AAAA,EAC9E,EAAE,MAAM,SAAS,aAAa,kDAAkD;AAAA,EAChF,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,EACnE,EAAE,MAAM,WAAW,aAAa,iCAAiC;AAAA,EACjE,EAAE,MAAM,SAAS,aAAa,oDAAoD;AAAA,EAClF,EAAE,MAAM,QAAQ,aAAa,mCAAmC,SAAS,CAAC,GAAG,EAAE;AAAA,EAC/E,EAAE,MAAM,QAAQ,aAAa,iBAAiB,SAAS,CAAC,QAAQ,GAAG,EAAE;AACvE;AAQO,SAAS,WAAW,OAA2B;AACpD,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI,CAAC,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,IAAI,EAAG,QAAO,EAAE,MAAM,OAAO;AAC1E,QAAM,CAAC,OAAO,IAAI,GAAG,IAAI,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,KAAK;AACtD,QAAM,OAAO,KAAK,YAAY;AAC9B,MAAI,CAAC,KAAM,QAAO,EAAE,MAAM,WAAW,MAAM,GAAG;AAC9C,QAAM,UAAU,eAAe,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,SAAS,SAAS,IAAI,CAAC;AACvF,MAAI,CAAC,QAAS,QAAO,EAAE,MAAM,WAAW,KAAK;AAC7C,SAAO,EAAE,MAAM,WAAW,SAAS,MAAM,KAAK,KAAK,GAAG,EAAE,KAAK,EAAE;AACjE;AAGO,SAAS,iBAAiB,OAA+B;AAC9D,MAAI,CAAC,MAAM,WAAW,GAAG,KAAK,KAAK,KAAK,KAAK,EAAG,QAAO,CAAC;AACxD,QAAM,SAAS,MAAM,MAAM,CAAC,EAAE,YAAY;AAC1C,SAAO,eAAe;AAAA,IACpB,CAAC,MAAM,EAAE,KAAK,WAAW,MAAM,KAAK,EAAE,SAAS,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,KAAK,MAAM;AAAA,EAC3F;AACF;AAEO,IAAM,YAA6C;AAAA,EACxD,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,mCAAmC,UAAU;AAAA,EAC9C,CAAC,mBAAS,0CAA0C;AAAA,EACpD,CAAC,KAAK,kFAAwE;AAAA,EAC9E,CAAC,OAAO,+BAA+B;AAAA,EACvC,CAAC,4BAA4B,iDAAiD;AAAA,EAC9E,CAAC,gBAAgB,MAAM;AACzB;;;AClEO,SAAS,SAAS,OAAsB;AAC7C,QAAM,QAAQ,KAAK,IAAI,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,EAAE,CAAC,IAAI;AAC9F,QAAM,WAAW,eAAe;AAAA,IAC9B,CAAC,MACC,GAAG,MAAM,OAAO,OAAO,IAAI,EAAE,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,GAAG,MAAM,IAAI,EAAE,WAAW,CAAC;AAAA,EACxG;AACA,QAAM,WAAW,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI;AACjE,QAAM,OAAO,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,EAAE;AAC9E,SAAO,CAAC,MAAM,KAAK,UAAU,GAAG,GAAG,UAAU,IAAI,MAAM,KAAK,MAAM,GAAG,GAAG,IAAI,EAAE,KAAK,IAAI;AACzF;AAEA,eAAsB,WAAW,OAAc,SAAsB,SAAiB;AACpF,QAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,QAAM,MAAM,OACT,IAAI,CAAC,MAAM,EAAE,EAAE,EACf,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,KAAK,EAAE,WAAW,WAAW,IAAI,IAAI;AAC3C,UAAM,KAAK,EAAE,WAAW,WAAW,IAAI,IAAI;AAC3C,WAAO,KAAK,MAAM,EAAE,cAAc,CAAC;AAAA,EACrC,CAAC;AACH,MAAI,IAAI,WAAW;AACjB,WAAO,MAAM,IAAI,6DAA6D;AAChF,QAAM,QAAQ,IAAI,MAAM,GAAG,EAAE;AAC7B,QAAMC,SAAQ,MAAM;AAAA,IAAI,CAAC,OACvB,OAAO,UAAU,GAAG,MAAM,OAAO,MAAM,MAAM,GAAG,CAAC,IAAI,MAAM,OAAO,EAAE,CAAC,KAAK,KAAK,EAAE;AAAA,EACnF;AACA,MAAI,IAAI,SAAS,MAAM,OAAQ,CAAAA,OAAM,KAAK,MAAM,IAAI,gBAAW,IAAI,SAAS,MAAM,MAAM,OAAO,CAAC;AAChG,EAAAA,OAAM,KAAK,IAAI,MAAM,IAAI,yBAAyB,CAAC;AACnD,SAAOA,OAAM,KAAK,IAAI;AACxB;AAEA,eAAsB,WAAW,OAAc,SAAsB;AACnE,QAAM,EAAE,cAAc,OAAO,IAAI,MAAM,QAAQ,OAAO;AACtD,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,MACL,GAAG,MAAM,IAAI,uBAAuB,CAAC,aAAa,YAAY;AAAA,MAC9D,MAAM,IAAI,gEAAgE;AAAA,IAC5E,EAAE,KAAK,IAAI;AAAA,EACb;AACA,QAAMA,SAAkB,CAAC;AACzB,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,MAAM,SAAS,eAAe,MAAM,IAAI,YAAY,IAAI;AACrE,IAAAA,OAAM;AAAA,MACJ,GAAG,MAAM,OAAO,YAAY,MAAM,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,MAAM,cAAc,MAAM,IAAI,KAAK,MAAM,WAAW,EAAE,IAAI,EAAE;AAAA,IACjH;AACA,UAAM,QAAQ,QAAQ,CAAC,GAAG,MAAM;AAC9B,MAAAA,OAAM;AAAA,QACJ,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,KAAK,GAAG,EAAE,YAAY,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE;AAAA,MACzG;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAOA,OAAM,KAAK,IAAI;AACxB;AAEA,eAAsB,aAAa,OAAc,SAAsB,SAAiB;AACtF,QAAM,CAAC,UAAU,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC,QAAQ,SAAS,GAAG,QAAQ,MAAM,CAAC,CAAC;AACjF,MAAI,SAAS,WAAW;AACtB,WAAO,MAAM,IAAI,wDAAwD;AAC3E,QAAM,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;AACvD,SAAO;AAAA,IACL;AAAA,IACA,SAAS,IAAI,CAAC,aAAa,EAAE,SAAS,OAAO,KAAK,IAAI,QAAQ,EAAE,KAAK,WAAW,QAAQ,EAAE,EAAE,EAAE;AAAA,IAC9F;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAsB,UAAU,OAAc,SAAsB,SAAiB;AACnF,QAAM,EAAE,SAAS,MAAM,IAAI,MAAM,QAAQ,MAAM;AAC/C,MAAI,CAAC;AACH,WAAO,MAAM,IAAI,uEAAuE;AAC1F,MAAI,MAAM,MAAM,WAAW,GAAG;AAC5B,WAAO,MAAM,IAAI,GAAG,QAAQ,IAAI,sDAAsD;AAAA,EACxF;AACA,SAAO;AAAA,IACL,GAAG,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,YAAY,OAAO,KAAK,CAAC;AAAA,IACzD;AAAA,IACA,GAAG,eAAe,OAAO,OAAO,EAAE,OAAO,QAAQ,CAAC;AAAA,EACpD,EAAE,KAAK,IAAI;AACb;AAEA,eAAsB,WAAW,OAAc,SAAsB,OAAe;AAClF,QAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,MAAI,CAAC,OAAQ,QAAO,MAAM,MAAM,sDAAsD;AACtF,QAAM,CAAC,UAAU,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,QAAQ,SAAS;AAAA,IACjB,QAAQ,OAAO,EAAE,MAAM,MAAM,MAAS;AAAA,EACxC,CAAC;AACD,QAAM,QAAQ,CAAC,WACb,WAAW,UACP,MAAM,MAAM,6BAA0B,IACtC,WAAW,aACT,MAAM,KAAK,cAAc,IACzB,WAAW,aACT,MAAM,IAAI,KAAK,IACf,MAAM,GAAG,OAAO;AAC1B,QAAMA,SAAQ,CAAC,GAAG,MAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,EAAE;AACjD,MAAI,SAAS,WAAW,EAAG,CAAAA,OAAM,KAAK,GAAG,MAAM,IAAI,QAAQ,CAAC,0BAAuB;AACnF,aAAW,CAAC,GAAG,OAAO,KAAK,SAAS,QAAQ,GAAG;AAC7C,IAAAA,OAAM;AAAA,MACJ,GAAG,MAAM,IAAI,MAAM,IAAI,WAAW,QAAQ,CAAC,KAAK,QAAQ,KAAK,KAAK,MAAM,QAAQ,MAAM,CAAC;AAAA,IACzF;AAAA,EACF;AACA,EAAAA,OAAM,KAAK,GAAG,MAAM,IAAI,QAAQ,CAAC,KAAK,SAAS,OAAO,QAAQ,SAAS,EAAE;AACzE,SAAOA,OAAM,KAAK,IAAI;AACxB;;;ARoXoB,SAMZ,UANY,OAAAC,MAMZ,QAAAC,aANY;AAnbpB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AAEvB,SAAS,UAAU,KAAsB;AACvC,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;AAEA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,MAAM,KAAK;AACb,GAAiB;AACf,QAAM,QAAQ,SAAS;AACvB,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,EAAE,MAAM,IAAI,UAAU;AAC5B,QAAM,EAAE,QAAQ,IAAI,cAAc;AAClC,QAAM,QAAQ,KAAK,IAAI,IAAI,OAAO;AAElC,QAAM,WAAW,OAAO,KAAK;AAC7B,WAAS,UAAU;AAEnB,QAAM,CAAC,OAAO,QAAQ,IAAI,WAAW,aAAa,OAAO,gBAAgB;AACzE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA4B,WAAW;AACnE,QAAM,CAAC,cAAc,eAAe,IAAI,SAA6B;AACrE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA6B;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,IAAI,CAAC;AACxC,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,CAAC;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAG1B;AAEF,QAAM,WAAW,OAAoC,MAAS;AAC9D,QAAM,cAAc,OAA2B,MAAS;AACxD,QAAM,SAAS,OAAO,oBAAI,IAAoB,CAAC;AAC/C,QAAM,WAAW,OAAO,KAAK;AAC7B,WAAS,UAAU;AAInB,YAAU,MAAM;AACd,aAAS;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,GAAG,MAAM,KAAK,UAAU,CAAC,IAAI,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;AAAA,UACrD,GAAI,UAAU,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;AAAA,QACxC;AAAA,QACA,SAAS;AAAA,MACX,EAAE,KAAK,IAAI;AAAA,IACb,CAAC;AACD,QAAI,QAAQ;AACZ,UAAM,QAAQ,YAAY;AACxB,YAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,UAAI,MAAO,UAAS,EAAE,MAAM,cAAc,YAAY,SAAS,WAAW,UAAU,CAAC;AAAA,IACvF;AACA,SAAK,MAAM;AACX,YACG,SAAS,EACT,KAAK,CAAC,aAAa;AAClB,iBAAW,KAAK,SAAU,QAAO,QAAQ,IAAI,EAAE,IAAI,EAAE,KAAK;AAAA,IAC5D,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC;AACjB,UAAM,QAAQ,YAAY,MAAM,KAAK,MAAM,GAAG,MAAM;AACpD,WAAO,MAAM;AACX,cAAQ;AACR,oBAAc,KAAK;AACnB,eAAS,SAAS,MAAM;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,SAAS,OAAO,OAAO,CAAC;AAG7C,YAAU,MAAM;AACd,QAAI,CAAC,MAAM,UAAW;AACtB,UAAM,QAAQ,YAAY,MAAM,SAAS,IAAI,CAAC,GAAG,GAAG;AACpD,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,MAAM,WAAW,GAAG,CAAC;AAEzB,YAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,QAAQ,WAAW,MAAM,UAAU,MAAS,GAAG,cAAc;AACnE,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,MAAM,CAAC;AAIX,QAAM,eAAe;AAAA,IACnB,OAAO,cAAsB;AAC3B,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,cAAc,SAAS;AAC3E,cAAM,SAAS,OAAO,QAAQ,IAAI;AAClC,cAAM,UACJ,WAAW,OAAO,eAAe,UAAa,OAAO,iBAAiB;AACxE,iBAAS;AAAA,UACP,MAAM;AAAA,UACN;AAAA,UACA,aAAa,UAAU,OAAO,cAAc;AAAA,QAC9C,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,OAAO;AAAA,IACX,OAAOC,UAAiB;AACtB,eAAS,EAAE,MAAM,QAAQ,MAAAA,MAAK,CAAC;AAC/B,YAAM,eAAe;AAAA,QACnB,GAAG,SAAS,QAAQ;AAAA,QACpB,EAAE,MAAM,QAAiB,SAASA,MAAK;AAAA,MACzC;AACA,YAAM,aAAa,IAAI,gBAAgB;AACvC,eAAS,UAAU;AACnB,eAAS,EAAE,MAAM,gBAAgB,KAAK,IAAI,EAAE,CAAC;AAC7C,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,cAAM,EAAE,MAAM,OAAO,IAAI,MAAM,QAAQ;AAAA,UACrC,EAAE,OAAO,SAAS,QAAQ,OAAO,UAAU,aAAa;AAAA,UACxD,WAAW;AAAA,QACb;AACA,oBAAY,KAAK;AACjB,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,WAAW,KAAK;AAAA,UAChB,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,UACtD,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,UACnD,GAAI,KAAK,aAAa,OAAO,QAAQ,IAAI,KAAK,SAAS,IACnD,EAAE,cAAc,OAAO,QAAQ,IAAI,KAAK,SAAS,EAAG,IACpD,CAAC;AAAA,QACP,CAAC;AACD,iBAAS,EAAE,MAAM,cAAc,YAAY,SAAS,CAAC;AACrD,yBAAiB,SAAS,QAAQ;AAChC,cAAI,WAAW,OAAO,QAAS;AAC/B,gBAAM,QAAQ,MAAM,QAAQ,CAAC,GAAG,OAAO;AACvC,cAAI,OAAO,UAAU,YAAY,MAAO,UAAS,EAAE,MAAM,gBAAgB,MAAM,MAAM,CAAC;AACtF,cAAI,MAAM,MAAO,SAAQ,MAAM;AAAA,QACjC;AACA,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,KAAK,IAAI;AAAA,UACT,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,UACzB,GAAI,WAAW,OAAO,UAAU,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,QACzD,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,YAAI,WAAW,OAAO,SAAS;AAC7B,mBAAS,EAAE,MAAM,cAAc,KAAK,IAAI,GAAG,WAAW,KAAK,CAAC;AAAA,QAC9D,OAAO;AACL,gBAAM,SAAU,IAA4B;AAC5C,cAAI,WAAW,EAAG,UAAS,EAAE,MAAM,cAAc,YAAY,UAAU,CAAC;AACxE,cAAIA,QAAO,UAAU,GAAG;AAExB,cAAI;AACF,YAAAA,QAAOA,MAAK,QAAQ,oCAAoC,2BAA2B;AACrF,mBAAS,EAAE,MAAM,cAAc,KAAK,IAAI,GAAG,OAAOA,MAAK,CAAC;AAAA,QAC1D;AAAA,MACF,UAAE;AACA,YAAI,SAAS,YAAY,WAAY,UAAS,UAAU;AAAA,MAC1D;AACA,UAAI,UAAW,MAAK,aAAa,SAAS;AAAA,IAC5C;AAAA,IACA,CAAC,SAAS,SAAS,KAAK,YAAY;AAAA,EACtC;AAEA,QAAM,WAAW;AAAA,IACf,OAAO,UAAkB;AACvB,YAAM,SAAS,WAAW,KAAK;AAC/B,UAAI,OAAO,SAAS,WAAW;AAC7B,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM,oBAAoB,OAAO,IAAI;AAAA,QACvC,CAAC;AACD;AAAA,MACF;AACA,UAAI,OAAO,SAAS,UAAW;AAC/B,YAAM,EAAE,SAAS,KAAK,IAAI;AAC1B,UAAI;AACF,gBAAQ,QAAQ,MAAM;AAAA,UACpB,KAAK;AACH,qBAAS,EAAE,MAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,CAAC;AAChD;AAAA,UACF,KAAK;AACH,qBAAS,SAAS,MAAM;AACxB,iBAAK;AACL;AAAA,UACF,KAAK;AACH,qBAAS,SAAS,MAAM;AACxB,kBAAM,sBAA4B;AAClC,qBAAS,EAAE,MAAM,QAAQ,CAAC;AAC1B;AAAA,UACF,KAAK,SAAS;AACZ,kBAAM,SAAS,CAAC,OAAe;AAC7B,uBAAS,EAAE,MAAM,aAAa,OAAO,GAAG,CAAC;AACzC,uBAAS,EAAE,MAAM,QAAQ,MAAM,gBAAgB,MAAM,OAAO,EAAE,CAAC,GAAG,CAAC;AAAA,YACrE;AACA,gBAAI,MAAM;AACR,qBAAO,IAAI;AACX;AAAA,YACF;AACA,kBAAM,OAAO,MAAM,QAAQ,OAAO,GAC/B,IAAI,CAAC,MAAM,EAAE,EAAE,EACf;AAAA,cACC,CAAC,GAAG,MACF,OAAO,CAAC,EAAE,WAAW,WAAW,CAAC,IAAI,OAAO,CAAC,EAAE,WAAW,WAAW,CAAC,KACtE,EAAE,cAAc,CAAC;AAAA,YACrB;AACF,gBAAI,IAAI,WAAW,GAAG;AACpB,uBAAS;AAAA,gBACP,MAAM;AAAA,gBACN,MAAM,MAAM,WAAW,OAAO,SAAS,SAAS,QAAQ,KAAK;AAAA,cAC/D,CAAC;AACD;AAAA,YACF;AACA,kBAAM,UAAU,SAAS,QAAQ;AACjC,sBAAU;AAAA,cACR,OAAO;AAAA,cACP,SAAS,IAAI,IAAI,CAAC,QAAQ;AAAA,gBACxB,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,GAAI,OAAO,UAAU,EAAE,MAAM,YAAY,IAAI,CAAC;AAAA,cAChD,EAAE;AAAA,cACF,OAAO,KAAK,IAAI,GAAG,IAAI,QAAQ,OAAO,CAAC;AAAA,cACvC,MAAM;AAAA,YACR,CAAC;AACD;AAAA,UACF;AAAA,UACA,KAAK,WAAW;AACd,gBAAI,CAAC,SAAS;AACZ,uBAAS,EAAE,MAAM,QAAQ,MAAM,6CAA6C,CAAC;AAC7E;AAAA,YACF;AACA,sBAAU;AAAA,cACR,OAAO;AAAA,cACP,SAAS,MAAM,QAAQ,OAAO;AAAA,cAC9B,OAAO;AAAA,cACP,MAAM,CAAC,aAAa;AAClB,yBAAS,SAAS,MAAM;AACxB,wBAAQ,OAAO,QAAQ;AACvB,qBAAK;AAAA,cACP;AAAA,YACF,CAAC;AACD;AAAA,UACF;AAAA,UACA,KAAK;AACH,qBAAS,EAAE,MAAM,QAAQ,MAAM,MAAM,WAAW,OAAO,OAAO,EAAE,CAAC;AACjE;AAAA,UACF,KAAK,YAAY;AACf,kBAAM,WAAW,MAAM,QAAQ,SAAS;AACxC,uBAAW,KAAK,SAAU,QAAO,QAAQ,IAAI,EAAE,IAAI,EAAE,KAAK;AAC1D,qBAAS,EAAE,MAAM,QAAQ,MAAM,MAAM,aAAa,OAAO,SAAS,QAAQ,CAAC,EAAE,CAAC;AAC9E;AAAA,UACF;AAAA,UACA,KAAK;AACH,qBAAS,EAAE,MAAM,QAAQ,MAAM,MAAM,UAAU,OAAO,SAAS,QAAQ,CAAC,EAAE,CAAC;AAC3E;AAAA,UACF,KAAK;AACH,qBAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,MAAM,WAAW,OAAO,SAAS,SAAS,QAAQ,KAAK;AAAA,YAC/D,CAAC;AACD;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK,WAAW;AACd,gBAAI,CAAC,SAAS;AACZ,uBAAS;AAAA,gBACP,MAAM;AAAA,gBACN,MAAM;AAAA,cACR,CAAC;AACD;AAAA,YACF;AACA,kBAAMA,QACJ,QAAQ,SAAS,UACb,MAAM,QAAQ,MAAM,CAAC,SAAS,SAAS,EAAE,MAAM,QAAQ,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,IAC/E,QAAQ,SAAS,WACf,MAAM,QAAQ,OAAO,IACrB,MAAM,QAAQ,OAAO;AAC7B,qBAAS,EAAE,MAAM,QAAQ,MAAAA,MAAK,CAAC;AAC/B;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,iBAAS,EAAE,MAAM,SAAS,MAAM,IAAI,QAAQ,IAAI,YAAY,UAAU,GAAG,CAAC,GAAG,CAAC;AAAA,MAChF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,SAAS,SAAS,MAAM,OAAO,OAAO,KAAK;AAAA,EACvD;AAEA,QAAM,SAAS,YAAY,MAAM;AAC/B,UAAMA,QAAU,OAAO,MAAM,EAAE,KAAK;AACpC,QAAI,CAACA,MAAM;AACX,QAAI,WAAWA,KAAI,EAAE,SAAS,QAAQ;AACpC,gBAAa,WAAW;AACxB,sBAAgB,MAAS;AACzB,WAAK,SAASA,KAAI;AAClB;AAAA,IACF;AACA,QAAI,SAAS,QAAQ,WAAW;AAC9B,gBAAU,+CAA+C;AACzD;AAAA,IACF;AACA,cAAa,WAAW;AACxB,oBAAgB,MAAS;AACzB,SAAK,KAAKA,KAAI;AAAA,EAChB,GAAG,CAAC,QAAQ,UAAU,IAAI,CAAC;AAI3B,QAAM,SAAS,CAAC,cAAsB;AACpC,UAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,QAAI,QAAQ,WAAW,EAAG;AAC1B,UAAM,UAAU,gBAAgB,QAAQ;AACxC,UAAM,OAAO,KAAK,IAAI,QAAQ,QAAQ,KAAK,IAAI,GAAG,UAAU,SAAS,CAAC;AACtE,oBAAgB,SAAS,QAAQ,SAAS,SAAY,IAAI;AAC1D,cAAU,SAAS,QAAQ,SAAY,cAAiB,SAAS,QAAQ,IAAI,CAAE,CAAC;AAAA,EAClF;AAEA,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ,UAAU,KAAK;AAC7B,YAAM,QACJ,YAAY,YAAY,UAAa,IAAI,IAAI,YAAY,UAAU;AACrE,UAAI,OAAO;AACT,iBAAS,SAAS,MAAM;AACxB,aAAK;AACL;AAAA,MACF;AACA,kBAAY,UAAU,IAAI;AAC1B,UAAI,SAAS,QAAQ,UAAW,UAAS,SAAS,MAAM;AAAA,eAC/C,OAAO,MAAM,SAAS,EAAG,WAAa,WAAW;AAC1D,gBAAU,4BAA4B;AACtC;AAAA,IACF;AACA,gBAAY,UAAU;AAGtB,QAAI,QAAQ;AACV,YAAM,QAAQ,OAAO,QAAQ;AAC7B,YAAM,OAAO,CAAC,UAAkB,UAAU,EAAE,GAAG,QAAQ,MAAM,CAAC;AAC9D,UAAI,IAAI,OAAQ,QAAO,UAAU,MAAS;AAC1C,UAAI,IAAI,QAAS,QAAO,MAAM,OAAO,QAAQ,IAAI,SAAS,KAAK;AAC/D,UAAI,IAAI,UAAW,QAAO,MAAM,OAAO,QAAQ,KAAK,KAAK;AACzD,YAAM,QAAQ,SAAS,KAAK,UAAU,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI,IAAI;AACxE,UAAI,IAAI,UAAW,UAAU,UAAa,QAAQ,OAAQ;AACxD,cAAM,SAAS,OAAO,QAAQ,SAAS,OAAO,KAAK;AACnD,kBAAU,MAAS;AACnB,YAAI,OAAQ,QAAO,KAAK,OAAO,KAAK;AAAA,MACtC;AACA;AAAA,IACF;AAGA,UAAM,OAAO,iBAAoB,OAAO,MAAM,CAAC;AAC/C,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,WAAW,KAAK,KAAK,IAAI,YAAY,KAAK,SAAS,CAAC,CAAC;AAC3D,UAAI,IAAI,QAAS,QAAO,cAAc,CAAC,OAAO,IAAI,IAAI,KAAK,UAAU,KAAK,MAAM;AAChF,UAAI,IAAI,UAAW,QAAO,cAAc,CAAC,OAAO,IAAI,KAAK,KAAK,MAAM;AACpE,UAAI,IAAI,OAAQ,QAAO,UAAa,WAAW;AAC/C,UAAI,IAAI,KAAK;AACX,kBAAa,SAAS,IAAI,SAAS,IAAI,GAAG,SAAS,OAAO,MAAM,EAAE,EAAE,CAAC;AACrE;AAAA,MACF;AACA,UAAI,IAAI,UAAU,CAAC,IAAI,SAAS,CAAC,IAAI,MAAM;AACzC,kBAAa,WAAW;AACxB,wBAAgB,MAAS;AACzB,aAAK,SAAS,IAAI,SAAS,IAAI,EAAE;AACjC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,UAAI,SAAS,QAAQ,UAAW,UAAS,SAAS,MAAM;AACxD;AAAA,IACF;AAEA,QAAK,UAAU,QAAQ,CAAC,IAAI,UAAY,IAAI,QAAQ,UAAU,KAAM;AAClE,gBAAU,CAAC,MAAS,OAAO,GAAG,IAAI,CAAC;AACnC;AAAA,IACF;AACA,QAAI,IAAI,QAAQ;AACd,UAAI,IAAI,SAAS,IAAI,KAAM,WAAU,CAAC,MAAS,OAAO,GAAG,IAAI,CAAC;AAAA,eAClD,cAAc,MAAM,EAAG,WAAU,CAAC,MAAS,sBAAsB,CAAC,CAAC;AAAA,UAC1E,QAAO;AACZ;AAAA,IACF;AACA,QAAI,IAAI,IAAK;AACb,QAAI,IAAI,SAAS;AACf,YAAM,QAAW,GAAG,MAAM;AAC1B,UAAI,MAAO,WAAU,KAAK;AAAA,UACrB,QAAO,EAAE;AACd;AAAA,IACF;AACA,QAAI,IAAI,WAAW;AACjB,YAAM,QAAW,KAAK,MAAM;AAC5B,UAAI,MAAO,WAAU,KAAK;AAAA,eACjB,iBAAiB,OAAW,QAAO,CAAC;AAC7C;AAAA,IACF;AACA,QAAI,IAAI,UAAW,QAAO,UAAa,IAAI;AAC3C,QAAI,IAAI,WAAY,QAAO,UAAa,KAAK;AAC7C,QAAI,IAAI,QAAS,IAAI,QAAQ,UAAU,IAAM,QAAO,UAAa,SAAS;AAC1E,QAAI,IAAI,OAAQ,IAAI,QAAQ,UAAU,IAAM,QAAO,UAAa,OAAO;AACvE,QAAI,IAAI,UAAW,QAAO,UAAa,SAAS;AAChD,QAAI,IAAI,OAAQ,QAAO,UAAa,aAAa;AACjD,QAAI,IAAI,QAAQ,UAAU,IAAK,QAAO,UAAa,eAAe;AAClE,QAAI,IAAI,QAAQ,UAAU,IAAK,QAAO,UAAa,aAAa;AAChE,QAAI,IAAI,QAAQ,UAAU,IAAK,QAAO,UAAa,cAAc;AACjE,QAAI,IAAI,QAAQ,UAAU,KAAK;AAC7B,YAAM,eAAmB;AACzB;AAAA,IACF;AACA,QAAI,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAO;AACpC,cAAU,CAAC,MAAS,OAAO,GAAG,KAAK,CAAC;AAAA,EACtC,CAAC;AAED,WAAS,CAACA,UAAS;AACjB,cAAU,CAAC,MAAS,OAAO,GAAGA,KAAI,CAAC;AAAA,EACrC,CAAC;AAID,QAAM,OAAU,OAAO,MAAM;AAC7B,QAAM,cAAc,iBAAiB,IAAI;AAGzC,YAAU,MAAM,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AACxC,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAH,KAAC,UAAyB,OAAO,MAAM,SACpC,WAAC,UAAU,gBAAAA,KAAC,aAAyB,SAAV,MAAM,EAAkB,KADzC,MAAM,KAEnB;AAAA,IACC,MAAM,YAAY,gBAAAA,KAAC,iBAAc,WAAW,MAAM,WAAW,KAAK,OAAO,IAAK;AAAA,IAC9E,SACC,gBAAAA,KAAC,UAAO,OAAO,OAAO,OAAO,SAAS,OAAO,SAAS,OAAO,OAAO,OAAO,IAE3E,gBAAAC,MAAA,YACE;AAAA,sBAAAD,KAAC,YAAS,QAAgB,OAAc,aAAa,aAAa;AAAA,MAClE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU;AAAA,UACV;AAAA,UACA,UAAU,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,YAAY,SAAS,CAAC,CAAC;AAAA;AAAA,MACpE;AAAA,OACF;AAAA,IAED,CAAC,UAAU,YAAY,WAAW,IACjC,gBAAAA,KAAC,cAAW,OAAc,OAAc,MAAM,SAAS,EAAE,OAAO,IAAI,CAAC,GAAG,IACtE;AAAA,KACN;AAEJ;AAGO,SAAS,QAAQ,OAAqB;AAC3C,SACE,gBAAAA,KAAC,iBAAc,OAAO,MAAM,OAC1B,0BAAAA,KAAC,QAAM,GAAG,OAAO,GACnB;AAEJ;","names":["Box","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","left","right","Box","Text","Box","Text","jsx","jsxs","Box","Text","lines","jsx","jsxs","text","Box"]}
|
|
@@ -3,16 +3,16 @@ import {
|
|
|
3
3
|
RunnerView,
|
|
4
4
|
logText,
|
|
5
5
|
pipelineText
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GE22VBCY.js";
|
|
7
7
|
import "./chunk-FRFSJMN4.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-5LKOJBUL.js";
|
|
9
|
+
import "./chunk-PGPXE6LF.js";
|
|
10
10
|
import "./chunk-SF5ZEAP4.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-MC7RIPL7.js";
|
|
12
12
|
export {
|
|
13
13
|
RunnerApp,
|
|
14
14
|
RunnerView,
|
|
15
15
|
logText,
|
|
16
16
|
pipelineText
|
|
17
17
|
};
|
|
18
|
-
//# sourceMappingURL=RunnerView-
|
|
18
|
+
//# sourceMappingURL=RunnerView-A7JSPUW5.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
accountCommand,
|
|
3
|
+
accountsEnabled,
|
|
4
|
+
chatAccountActions,
|
|
5
|
+
currentAccount,
|
|
6
|
+
describeUser,
|
|
7
|
+
loginCommand,
|
|
8
|
+
logoutCommand,
|
|
9
|
+
signIn
|
|
10
|
+
} from "./chunk-GHDOUII5.js";
|
|
11
|
+
import "./chunk-7XVXEO7U.js";
|
|
12
|
+
import "./chunk-3Q2KCXLN.js";
|
|
13
|
+
export {
|
|
14
|
+
accountCommand,
|
|
15
|
+
accountsEnabled,
|
|
16
|
+
chatAccountActions,
|
|
17
|
+
currentAccount,
|
|
18
|
+
describeUser,
|
|
19
|
+
loginCommand,
|
|
20
|
+
logoutCommand,
|
|
21
|
+
signIn
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=account-UGNLJPQ4.js.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
accountsAdd,
|
|
3
|
+
accountsConnect,
|
|
4
|
+
accountsList,
|
|
5
|
+
accountsLogin,
|
|
6
|
+
accountsPlan,
|
|
7
|
+
accountsRemove,
|
|
8
|
+
accountsSetEnabled,
|
|
9
|
+
describeConnection,
|
|
10
|
+
describeSubscription,
|
|
11
|
+
loginArgs,
|
|
12
|
+
renderAccountList,
|
|
13
|
+
subscriptionFromFlags
|
|
14
|
+
} from "./chunk-CWBVNS3L.js";
|
|
15
|
+
import "./chunk-Z6NQDJEN.js";
|
|
16
|
+
import "./chunk-IC3TDONV.js";
|
|
17
|
+
import "./chunk-SF5ZEAP4.js";
|
|
18
|
+
import "./chunk-QA3O6RA2.js";
|
|
19
|
+
import "./chunk-DZ2FDABF.js";
|
|
20
|
+
import "./chunk-7XVXEO7U.js";
|
|
21
|
+
import "./chunk-3Q2KCXLN.js";
|
|
22
|
+
import "./chunk-MC7RIPL7.js";
|
|
23
|
+
export {
|
|
24
|
+
accountsAdd,
|
|
25
|
+
accountsConnect,
|
|
26
|
+
accountsList,
|
|
27
|
+
accountsLogin,
|
|
28
|
+
accountsPlan,
|
|
29
|
+
accountsRemove,
|
|
30
|
+
accountsSetEnabled,
|
|
31
|
+
describeConnection,
|
|
32
|
+
describeSubscription,
|
|
33
|
+
loginArgs,
|
|
34
|
+
renderAccountList,
|
|
35
|
+
subscriptionFromFlags
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=accounts-NM7IWP53.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
openAccounts
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Z6NQDJEN.js";
|
|
4
4
|
import {
|
|
5
5
|
bar,
|
|
6
6
|
levelStyle,
|
|
@@ -10,15 +10,15 @@ import {
|
|
|
10
10
|
} from "./chunk-SF5ZEAP4.js";
|
|
11
11
|
import {
|
|
12
12
|
printJson
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-VVCXGQMY.js";
|
|
13
|
+
} from "./chunk-QA3O6RA2.js";
|
|
15
14
|
import {
|
|
16
15
|
detectProjectRoot
|
|
17
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-DZ2FDABF.js";
|
|
18
17
|
import {
|
|
19
18
|
EXIT
|
|
20
19
|
} from "./chunk-7XVXEO7U.js";
|
|
21
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-3Q2KCXLN.js";
|
|
21
|
+
import "./chunk-MC7RIPL7.js";
|
|
22
22
|
|
|
23
23
|
// src/commands/budget.ts
|
|
24
24
|
function planCell(theme, budget) {
|
|
@@ -112,4 +112,4 @@ export {
|
|
|
112
112
|
budgetCommand,
|
|
113
113
|
renderBudget
|
|
114
114
|
};
|
|
115
|
-
//# sourceMappingURL=budget-
|
|
115
|
+
//# sourceMappingURL=budget-INAW6FXD.js.map
|